1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include <X11/Xutil.h>
23 #include "gdkprivate.h"
31 GdkRegionPrivate *private;
35 xregion = XCreateRegion();
36 private = g_new (GdkRegionPrivate, 1);
37 private->xregion = xregion;
38 region = (GdkRegion*) private;
39 region->user_data = NULL;
45 gdk_region_destroy (GdkRegion *region)
47 GdkRegionPrivate *private;
49 g_return_if_fail (region != NULL);
51 private = (GdkRegionPrivate *) region;
52 XDestroyRegion (private->xregion);
58 gdk_region_empty (GdkRegion *region)
60 GdkRegionPrivate *private;
62 g_return_val_if_fail (region != NULL, 0);
64 private = (GdkRegionPrivate *) region;
66 return XEmptyRegion (private->xregion);
70 gdk_region_equal (GdkRegion *region1,
73 GdkRegionPrivate *private1;
74 GdkRegionPrivate *private2;
76 g_return_val_if_fail (region1 != NULL, 0);
77 g_return_val_if_fail (region2 != NULL, 0);
79 private1 = (GdkRegionPrivate *) region1;
80 private2 = (GdkRegionPrivate *) region2;
82 return XEqualRegion (private1->xregion, private2->xregion);
86 gdk_region_get_clipbox(GdkRegion *region,
87 GdkRectangle *rectangle)
92 g_return_if_fail(region != NULL);
93 g_return_if_fail(rectangle != NULL);
95 rp = (GdkRegionPrivate *)region;
96 XClipBox(rp->xregion, &r);
100 rectangle->width = r.width;
101 rectangle->height = r.height;
105 gdk_region_point_in (GdkRegion *region,
109 GdkRegionPrivate *private;
111 g_return_val_if_fail (region != NULL, 0);
113 private = (GdkRegionPrivate *) region;
115 return XPointInRegion (private->xregion, x, y);
119 gdk_region_rect_in (GdkRegion *region,
122 GdkRegionPrivate *private;
125 g_return_val_if_fail (region != NULL, 0);
127 private = (GdkRegionPrivate *) region;
129 res = XRectInRegion (private->xregion, rect->x, rect->y, rect->width, rect->height);
133 case RectangleIn: return GDK_OVERLAP_RECTANGLE_IN;
134 case RectangleOut: return GDK_OVERLAP_RECTANGLE_OUT;
135 case RectanglePart: return GDK_OVERLAP_RECTANGLE_PART;
138 return GDK_OVERLAP_RECTANGLE_OUT; /*what else ? */
142 gdk_region_polygon (GdkPoint *points,
144 GdkFillRule fill_rule)
146 GdkRegionPrivate *private;
149 gint xfill_rule = EvenOddRule;
151 g_return_val_if_fail (points != NULL, NULL);
152 g_return_val_if_fail (npoints != 0, NULL); /* maybe we should check for at least three points */
156 case GDK_EVEN_ODD_RULE:
157 xfill_rule = EvenOddRule;
160 case GDK_WINDING_RULE:
161 xfill_rule = WindingRule;
165 xregion = XPolygonRegion ((XPoint *) points, npoints, xfill_rule);
166 private = g_new (GdkRegionPrivate, 1);
167 private->xregion = xregion;
168 region = (GdkRegion *) private;
169 region->user_data = NULL;
175 gdk_region_offset (GdkRegion *region,
179 GdkRegionPrivate *private;
181 g_return_if_fail (region != NULL);
183 private = (GdkRegionPrivate *) region;
185 XOffsetRegion (private->xregion, dx, dy);
189 gdk_region_shrink (GdkRegion *region,
193 GdkRegionPrivate *private;
195 g_return_if_fail (region != NULL);
197 private = (GdkRegionPrivate *) region;
199 XShrinkRegion (private->xregion, dx, dy);
203 gdk_region_union_with_rect (GdkRegion *region,
206 GdkRegionPrivate *private;
208 GdkRegionPrivate *res_private;
211 g_return_val_if_fail (region != NULL, NULL);
213 private = (GdkRegionPrivate *) region;
217 xrect.width = rect->width;
218 xrect.height = rect->height;
220 res = gdk_region_new ();
221 res_private = (GdkRegionPrivate *) res;
223 XUnionRectWithRegion (&xrect, private->xregion, res_private->xregion);
229 gdk_regions_intersect (GdkRegion *source1,
232 GdkRegionPrivate *private1;
233 GdkRegionPrivate *private2;
235 GdkRegionPrivate *res_private;
237 g_return_val_if_fail (source1 != NULL, NULL);
238 g_return_val_if_fail (source2 != NULL, NULL);
240 private1 = (GdkRegionPrivate *) source1;
241 private2 = (GdkRegionPrivate *) source2;
243 res = gdk_region_new ();
244 res_private = (GdkRegionPrivate *) res;
246 XIntersectRegion (private1->xregion, private2->xregion, res_private->xregion);
252 gdk_regions_union (GdkRegion *source1,
255 GdkRegionPrivate *private1;
256 GdkRegionPrivate *private2;
258 GdkRegionPrivate *res_private;
260 g_return_val_if_fail (source1 != NULL, NULL);
261 g_return_val_if_fail (source2 != NULL, NULL);
263 private1 = (GdkRegionPrivate *) source1;
264 private2 = (GdkRegionPrivate *) source2;
266 res = gdk_region_new ();
267 res_private = (GdkRegionPrivate *) res;
269 XUnionRegion (private1->xregion, private2->xregion, res_private->xregion);
275 gdk_regions_subtract (GdkRegion *source1,
278 GdkRegionPrivate *private1;
279 GdkRegionPrivate *private2;
281 GdkRegionPrivate *res_private;
283 g_return_val_if_fail (source1 != NULL, NULL);
284 g_return_val_if_fail (source2 != NULL, NULL);
286 private1 = (GdkRegionPrivate *) source1;
287 private2 = (GdkRegionPrivate *) source2;
289 res = gdk_region_new ();
290 res_private = (GdkRegionPrivate *) res;
292 XSubtractRegion (private1->xregion, private2->xregion, res_private->xregion);
298 gdk_regions_xor (GdkRegion *source1,
301 GdkRegionPrivate *private1;
302 GdkRegionPrivate *private2;
304 GdkRegionPrivate *res_private;
306 g_return_val_if_fail (source1 != NULL, NULL);
307 g_return_val_if_fail (source2 != NULL, NULL);
309 private1 = (GdkRegionPrivate *) source1;
310 private2 = (GdkRegionPrivate *) source2;
312 res = gdk_region_new ();
313 res_private = (GdkRegionPrivate *) res;
315 XXorRegion (private1->xregion, private2->xregion, res_private->xregion);