svn update: 48958 (latest:48959)
[framework/uifw/ecore.git] / src / lib / ecore_x / xcb / ecore_xcb_region.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #ifdef HAVE_CONFIG_H
6 # include <config.h>
7 #endif
8
9 #include "ecore_x_private.h"
10
11
12 /*
13  * [x] XCreateRegion
14  * [ ] XPolygonRegion
15  * [x] XSetRegion
16  * [x] XDestroyRegion
17  *
18  * [x] XOffsetRegion
19  * [ ] XShrinkRegion
20  *
21  * [ ] XClipBox
22  * [x] XIntersectRegion
23  * [x] XUnionRegion
24  * [x] XUnionRectWithRegion
25  * [x] XSubtractRegion
26  * [ ] XXorRegion
27  *
28  * [x] XEmptyRegion
29  * [x] XEqualRegion
30  *
31  * [x] XPointInRegion
32  * [x] XRectInRegion
33  */
34
35 EAPI Ecore_X_XRegion *
36 ecore_x_xregion_new()
37 {
38    pixman_region16_t *region;
39
40    region =  (pixman_region16_t *)malloc (sizeof (pixman_region16_t));
41    if (!region)
42      return NULL;
43
44    pixman_region_init(region);
45
46    return (Ecore_X_XRegion *)region;
47 }
48
49 EAPI void
50 ecore_x_xregion_free(Ecore_X_XRegion *region)
51 {
52    if (!region)
53      return;
54
55    pixman_region_fini(region);
56    free(region);
57 }
58
59 EAPI int
60 ecore_x_xregion_set(Ecore_X_XRegion *region, Ecore_X_GC gc)
61 {
62    xcb_rectangle_t *rects;
63    pixman_box16_t  *boxes;
64    int              num;
65
66    if (!region)
67      return 0;
68
69    boxes = pixman_region_rectangles ((pixman_region16_t *)region, &num);
70
71    if (!boxes || (num == 0))
72      return 0;
73
74    rects = (xcb_rectangle_t *)malloc(sizeof(xcb_rectangle_t) * num);
75    if (!rects)
76      return 0;
77
78    for (i = 0; i < num; i++)
79      {
80         rects[i].x = boxes[i].x1;
81         rects[i].y = boxes[i].y1;
82         rects[i].width = boxes[i].x2 - boxes[i].x1 + 1;
83         rects[i].height = boxes[i].y2 - boxes[i].y1 + 1;
84      }
85
86    xcb_set_clip_rectangles(_ecore_x_connection,
87                            XCB_CLIP_ORDERING_YX_BANDED,
88                            gc,
89                            0, 0,
90                            num,
91                            rects);
92    return 1;
93 }
94
95 EAPI void
96 ecore_x_xregion_translate(Ecore_X_XRegion *region, int x, int y)
97 {
98    if (!region)
99      return;
100
101    pixman_region_translate((pixman_region16_t *)region, x, y);
102 }
103
104 EAPI int
105 ecore_x_xregion_intersect(Ecore_X_XRegion *dst, Ecore_X_XRegion *r1, Ecore_X_XRegion *r2)
106 {
107    return pixman_region_intersect((pixman_region16_t *)dst, (pixman_region16_t *)r1, (pixman_region16_t *)r2);
108 }
109
110 EAPI int
111 ecore_x_xregion_union(Ecore_X_XRegion *dst, Ecore_X_XRegion *r1, Ecore_X_XRegion *r2)
112 {
113    return pixman_region_union((pixman_region16_t *)dst, (pixman_region16_t *)r1, (pixman_region16_t *)r2);
114 }
115
116 EAPI int
117 ecore_x_xregion_union_rect(Ecore_X_XRegion *dst, Ecore_X_XRegion *src, Ecore_X_Rectangle *rect)
118 {
119    return pixman_region_union_rect((pixman_region16_t *)dst, (pixman_region16_t *)src,
120                                    rect->x, rect->y, rect->width, rect->height);
121 }
122
123 EAPI int
124 ecore_x_xregion_subtract(Ecore_X_XRegion *dst, Ecore_X_XRegion *r1, Ecore_X_XRegion *r2)
125 {
126    return pixman_region_subtract((pixman_region16_t *)dst, (pixman_region16_t *)rm, (pixman_region16_t *)rs);
127 }
128
129 EAPI int
130 ecore_x_xregion_is_empty(Ecore_X_XRegion *region)
131 {
132    if (!region)
133      return 1;
134
135    return !pixman_region_not_empty((pixman_region16_t *)region);
136 }
137
138 EAPI int
139 ecore_x_xregion_is_equal(Ecore_X_XRegion *r1, Ecore_X_XRegion *r2)
140 {
141    if (!r1 || !r2)
142      return 0;
143
144    return pixman_region_equal((pixman_region16_t *)r1, (pixman_region16_t *)r2);
145 }
146
147 EAPI int
148 ecore_x_xregion_point_contain(Ecore_X_XRegion *region, int x, int y)
149 {
150    if (!region)
151      return 0;
152
153    return pixman_region_contains_point((pixman_region16_t *)region, x, y);
154 }
155
156 EAPI int
157 ecore_x_xregion_rect_contain(Ecore_X_XRegion *region, Ecore_X_Rectangle *rect)
158 {
159    pixman_box16_t box;
160
161    if (!region || !rect)
162      return 0;
163
164    box.x1 = rect->x;
165    box.y1 = rect->y;
166    box.x2 = rect->x + rect->width - 1;
167    box.y2 = rect->y + rect->height - 1;
168
169    return pixman_region_contains_rectangle((pixman_region16_t *)region, &box);
170 }