1 #include "ecore_xcb_private.h"
11 EAPI Ecore_X_XRegion *
14 pixman_region16_t *region;
16 region = (pixman_region16_t *)malloc(sizeof(pixman_region16_t));
17 if (!region) return NULL;
19 pixman_region_init(region);
21 return (Ecore_X_XRegion *)region;
25 ecore_x_xregion_free(Ecore_X_XRegion *region)
29 pixman_region_fini(region);
34 ecore_x_xregion_set(Ecore_X_XRegion *region,
37 xcb_rectangle_t *rects;
38 pixman_box16_t *boxes;
43 if (!region) return EINA_FALSE;
45 boxes = pixman_region_rectangles((pixman_region16_t *)region, &num);
46 if ((!boxes) || (num == 0)) return EINA_FALSE;
48 rects = (xcb_rectangle_t *)malloc(sizeof(xcb_rectangle_t) * num);
49 if (!rects) return EINA_FALSE;
51 for (i = 0; i < num; i++)
53 rects[i].x = boxes[i].x1;
54 rects[i].y = boxes[i].y1;
55 rects[i].width = boxes[i].x2 - boxes[i].x1 + 1;
56 rects[i].height = boxes[i].y2 - boxes[i].y1 + 1;
59 xcb_set_clip_rectangles(_ecore_xcb_conn, XCB_CLIP_ORDERING_YX_BANDED,
60 gc, 0, 0, num, rects);
67 ecore_x_xregion_translate(Ecore_X_XRegion *region,
73 pixman_region_translate((pixman_region16_t *)region, x, y);
77 ecore_x_xregion_intersect(Ecore_X_XRegion *dst,
81 return pixman_region_intersect((pixman_region16_t *)dst,
82 (pixman_region16_t *)r1,
83 (pixman_region16_t *)r2);
87 ecore_x_xregion_union(Ecore_X_XRegion *dst,
91 return pixman_region_union((pixman_region16_t *)dst,
92 (pixman_region16_t *)r1,
93 (pixman_region16_t *)r2);
97 ecore_x_xregion_union_rect(Ecore_X_XRegion *dst,
99 Ecore_X_Rectangle *rect)
101 return pixman_region_union_rect((pixman_region16_t *)dst,
102 (pixman_region16_t *)src,
103 rect->x, rect->y, rect->width, rect->height);
107 ecore_x_xregion_subtract(Ecore_X_XRegion *dst,
111 return pixman_region_subtract((pixman_region16_t *)dst,
112 (pixman_region16_t *)rm,
113 (pixman_region16_t *)rs);
117 ecore_x_xregion_is_empty(Ecore_X_XRegion *region)
119 if (!region) return EINA_TRUE;
121 return !pixman_region_not_empty((pixman_region16_t *)region);
125 ecore_x_xregion_is_equal(Ecore_X_XRegion *r1,
128 if ((!r1) || (!r2)) return EINA_FALSE;
130 return pixman_region_equal((pixman_region16_t *)r1,
131 (pixman_region16_t *)r2);
135 ecore_x_xregion_point_contain(Ecore_X_XRegion *region,
139 if (!region) return EINA_FALSE;
141 return pixman_region_contains_point((pixman_region16_t *)region, x, y, NULL);
145 ecore_x_xregion_rect_contain(Ecore_X_XRegion *region,
146 Ecore_X_Rectangle *rect)
150 if ((!region) || (!rect)) return EINA_FALSE;
154 box.x2 = rect->x + rect->width - 1;
155 box.y2 = rect->y + rect->height - 1;
157 return pixman_region_contains_rectangle((pixman_region16_t *)region, &box);