IoObject *IoGLScissor_set(IoGLScissor *self, IoObject *locals, IoMessage *m) { vec2f o = IoSeq_vec2f(IoBox_rawOrigin(DATA(self)->rect)); vec2f s = IoSeq_vec2f(IoBox_rawSize(DATA(self)->rect)); glScissor((GLint)o.x, (GLint)o.y, (GLsizei)s.x, (GLsizei)s.y); return self; }
IoObject *IoBox_containsPoint(IoBox *self, IoObject *locals, IoMessage *m) { /*doc Box containsPoint(aPoint) Returns true if aPoint is within the receiver's bounds, false otherwise. */ int result; IoVector *otherPoint = IoMessage_locals_pointArgAt_(m, locals, 0); UArray *bo = IoSeq_rawUArray(IoBox_rawOrigin(self)); UArray *bs = IoSeq_rawUArray(IoBox_rawSize(self)); UArray *p = IoSeq_rawUArray(otherPoint); // do a malloc since the vectors might be large UArray *b1 = UArray_clone(bo); UArray *b2 = UArray_clone(bs); // make bo2 the box endpoint UArray_add_(b2, b1); // ensure bo1 is on the left bottom and bo2 is on the top right UArray_Min(b1, b2); UArray_Max(b2, bo); result = UArray_greaterThanOrEqualTo_(p, b1) && UArray_greaterThanOrEqualTo_(b2, p); UArray_free(b1); UArray_free(b2); return IOBOOL(self, result); }
UArray *IoBox_rawResizeBy(IoBox *self, UArray *d, int resizeWidth, int resizeHeight, UArray *minSize, UArray *maxSize) { double x, w, y, h; UArray *position = IoSeq_rawUArray(IoBox_rawOrigin(self)); UArray *size = IoSeq_rawUArray(IoBox_rawSize(self)); UArray *outd = UArray_new(); UArray_setItemType_(outd, CTYPE_float32_t); UArray_setSize_(outd, 2); x = resizeXFunc(resizeWidth, UArray_x(d), UArray_x(position)); w = resizeWFunc(resizeWidth, UArray_x(d), UArray_x(size)); y = resizeXFunc(resizeHeight, UArray_y(d), UArray_y(position)); h = resizeWFunc(resizeHeight, UArray_y(d), UArray_y(size)); if (minSize) { w = max(w, UArray_x(minSize)); h = max(h, UArray_y(minSize)); } if (maxSize) { w = min(w, UArray_x(maxSize)); h = min(h, UArray_y(maxSize)); } UArray_setXY(outd, w - UArray_x(size), h - UArray_y(size)); UArray_setXY(position, x, y); UArray_setXY(size, w, h); UArray_round(position); UArray_round(size); return outd; }