scx/c/xlib/region.c

173 lines
5.6 KiB
C
Raw Normal View History

2001-09-25 08:45:12 -04:00
#include "xlib.h"
2003-10-19 12:50:33 -04:00
/*** create or destroy regions *************************************/
s48_value scx_Create_Region() {
return scx_enter_region(XCreateRegion());
}
s48_value scx_Set_Region(s48_value display, s48_value gc, s48_value r) {
XSetRegion(scx_extract_display(display), scx_extract_gc(gc),
scx_extract_region(r));
2001-09-25 08:45:12 -04:00
return S48_UNSPECIFIC;
}
2003-10-19 12:50:33 -04:00
s48_value scx_Destroy_Region(s48_value r) {
XDestroyRegion(scx_extract_region(r));
return S48_UNSPECIFIC;
2001-09-25 08:45:12 -04:00
}
2003-10-19 12:50:33 -04:00
/*** determine if regions are empty or equal ***********************/
2001-09-25 08:45:12 -04:00
2003-10-19 12:50:33 -04:00
s48_value scx_Empty_Region(s48_value r) {
return S48_ENTER_BOOLEAN(XEmptyRegion(scx_extract_region(r)));
}
2001-09-25 08:45:12 -04:00
2003-10-19 12:50:33 -04:00
s48_value scx_Equal_Region(s48_value r1, s48_value r2) {
Bool res;
2003-10-19 12:50:33 -04:00
S48_DECLARE_GC_PROTECT_2(r1, r2);
res = XEqualRegion(scx_extract_region(r1),
scx_extract_region(r2));
2003-10-19 12:50:33 -04:00
S48_GC_RETURN(S48_ENTER_BOOLEAN(res));
2001-09-25 08:45:12 -04:00
}
2003-10-19 12:50:33 -04:00
s48_value scx_Point_In_Region(s48_value r, s48_value x, s48_value y) {
Bool res;
2003-10-19 12:50:33 -04:00
S48_DECLARE_GC_PROTECT_3(r, x, y);
res = XPointInRegion(scx_extract_region(r),
s48_extract_integer(x),
s48_extract_integer(y));
2003-10-19 12:50:33 -04:00
S48_GC_RETURN(S48_ENTER_BOOLEAN(res));
2001-09-25 08:45:12 -04:00
}
s48_value scx_rect_in_region_type_binding = S48_FALSE;
s48_value scx_rect_in_region_types_binding = S48_FALSE;
2003-10-19 12:50:33 -04:00
#define scx_extract_rect_in_region_type(x) \
S48_EXTRACT_ENUM(x, scx_rect_in_region_type_binding)
#define scx_enter_rect_in_region_type(x) \
S48_ENTER_ENUM(x, scx_rect_in_region_types_binding)
s48_value scx_Rect_In_Region(s48_value r, s48_value x, s48_value y,
s48_value w, s48_value h) {
int res;
S48_DECLARE_GC_PROTECT_5(r, x, y, w, h);
res = XRectInRegion(scx_extract_region(r),
s48_extract_integer(x),
s48_extract_integer(y),
s48_extract_integer(w),
s48_extract_integer(h));
S48_GC_RETURN(scx_enter_rect_in_region_type(res));
2001-09-25 08:45:12 -04:00
}
2003-10-19 12:50:33 -04:00
/*** region arithmetic *********************************************/
s48_value scx_Intersect_Region(s48_value sra, s48_value srb, s48_value dr) {
S48_DECLARE_GC_PROTECT_3(sra, srb, dr);
XIntersectRegion(scx_extract_region(sra), scx_extract_region(srb),
scx_extract_region(dr));
S48_GC_RETURN(S48_UNSPECIFIC);
2001-09-25 08:45:12 -04:00
}
2003-10-19 12:50:33 -04:00
s48_value scx_Union_Region(s48_value sra, s48_value srb, s48_value dr) {
S48_DECLARE_GC_PROTECT_3(sra, srb, dr);
XUnionRegion(scx_extract_region(sra), scx_extract_region(srb),
scx_extract_region(dr));
S48_GC_RETURN(S48_UNSPECIFIC);
}
s48_value scx_Union_Rect_With_Region(s48_value x, s48_value y, s48_value w,
s48_value h, s48_value src,
s48_value dest) {
XRectangle r;
S48_DECLARE_GC_PROTECT_6(x, y, w, h, src, dest);
r.x = s48_extract_integer(x);
r.y = s48_extract_integer(y);
r.width = s48_extract_integer(w);
r.height = s48_extract_integer(h);
2001-09-25 08:45:12 -04:00
2003-10-19 12:50:33 -04:00
XUnionRectWithRegion(&r, scx_extract_region(src), scx_extract_region(dest));
S48_GC_RETURN(S48_UNSPECIFIC);
2001-09-25 08:45:12 -04:00
}
2003-10-19 12:50:33 -04:00
s48_value scx_Subtract_Region(s48_value sra, s48_value srb, s48_value dr) {
S48_DECLARE_GC_PROTECT_3(sra, srb, dr);
XSubtractRegion(scx_extract_region(sra), scx_extract_region(srb),
scx_extract_region(dr));
S48_GC_RETURN(S48_UNSPECIFIC);
2001-09-25 08:45:12 -04:00
}
2003-10-19 12:50:33 -04:00
s48_value scx_Xor_Region(s48_value sra, s48_value srb, s48_value dr) {
S48_DECLARE_GC_PROTECT_3(sra, srb, dr);
XXorRegion(scx_extract_region(sra), scx_extract_region(srb),
scx_extract_region(dr));
S48_GC_RETURN(S48_UNSPECIFIC);
2001-09-25 08:45:12 -04:00
}
2003-10-19 12:50:33 -04:00
s48_value scx_Offset_Region(s48_value r, s48_value dx, s48_value dy) {
S48_DECLARE_GC_PROTECT_3(r, dx, dy);
XOffsetRegion(scx_extract_region(r), s48_extract_integer(dx),
2001-09-25 08:45:12 -04:00
s48_extract_integer(dy));
2003-10-19 12:50:33 -04:00
S48_GC_RETURN(S48_UNSPECIFIC);
2001-09-25 08:45:12 -04:00
}
2003-10-19 12:50:33 -04:00
s48_value scx_Shrink_Region(s48_value r, s48_value dx, s48_value dy) {
S48_DECLARE_GC_PROTECT_3(r, dx, dy);
XShrinkRegion(scx_extract_region(r), s48_extract_integer(dx),
2001-09-25 08:45:12 -04:00
s48_extract_integer(dy));
2003-10-19 12:50:33 -04:00
S48_GC_RETURN(S48_UNSPECIFIC);
2001-09-25 08:45:12 -04:00
}
2003-10-19 12:50:33 -04:00
/*** generate regions **********************************************/
2001-09-25 08:45:12 -04:00
2003-10-19 12:50:33 -04:00
extern s48_value scx_fill_rule_binding; /* from gcontext.c */
#define scx_extract_fill_rule(x) S48_EXTRACT_ENUM(x, scx_fill_rule_binding)
2001-09-25 08:45:12 -04:00
2003-10-19 12:50:33 -04:00
s48_value scx_Polygon_Region(s48_value points, s48_value fill_rule) {
int i, n = s48_list_length(points);
Region r;
2001-09-25 08:45:12 -04:00
XPoint ps[n];
2003-10-19 12:50:33 -04:00
S48_DECLARE_GC_PROTECT_2(points, fill_rule);
for (i = 0; i < n; i++) {
ps[i].x = s48_extract_integer(S48_CAR(S48_CAR(points)));
ps[i].y = s48_extract_integer(S48_CDR(S48_CAR(points)));
points = S48_CDR(points);
2001-09-25 08:45:12 -04:00
}
2003-10-19 12:50:33 -04:00
r = XPolygonRegion(ps, n, scx_extract_fill_rule(fill_rule));
S48_GC_RETURN(scx_enter_region(r));
2003-10-19 12:50:33 -04:00
}
s48_value scx_Clip_Box(s48_value r) {
XRectangle rect;
s48_value l = S48_NULL;
S48_DECLARE_GC_PROTECT_2(r, l);
XClipBox(scx_extract_region(r), &rect);
l = s48_cons(s48_enter_integer(rect.height), l);
l = s48_cons(s48_enter_integer(rect.width), l);
l = s48_cons(s48_enter_integer(rect.y), l);
l = s48_cons(s48_enter_integer(rect.x), l);
S48_GC_RETURN(l);
2001-09-25 08:45:12 -04:00
}
void scx_init_region(void) {
2003-10-19 12:50:33 -04:00
SCX_PRO_IMP(scx_rect_in_region_type_binding, "scx-rect-in-region-type");
SCX_PRO_IMP(scx_rect_in_region_types_binding, "scx-rect-in-region-types");
2001-09-25 08:45:12 -04:00
S48_EXPORT_FUNCTION(scx_Destroy_Region);
S48_EXPORT_FUNCTION(scx_Create_Region);
S48_EXPORT_FUNCTION(scx_Clip_Box);
2003-10-19 12:50:33 -04:00
S48_EXPORT_FUNCTION(scx_Empty_Region);
S48_EXPORT_FUNCTION(scx_Equal_Region);
2001-09-25 08:45:12 -04:00
S48_EXPORT_FUNCTION(scx_Point_In_Region);
S48_EXPORT_FUNCTION(scx_Rect_In_Region);
S48_EXPORT_FUNCTION(scx_Intersect_Region);
S48_EXPORT_FUNCTION(scx_Union_Region);
S48_EXPORT_FUNCTION(scx_Union_Rect_With_Region);
S48_EXPORT_FUNCTION(scx_Subtract_Region);
S48_EXPORT_FUNCTION(scx_Xor_Region);
S48_EXPORT_FUNCTION(scx_Offset_Region);
S48_EXPORT_FUNCTION(scx_Shrink_Region);
S48_EXPORT_FUNCTION(scx_Polygon_Region);
S48_EXPORT_FUNCTION(scx_Set_Region);
}