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 * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
28 #include <X11/Xutil.h>
29 #include "gdkprivate-x11.h"
34 GdkRegionPrivate *private;
38 xregion = XCreateRegion();
39 private = g_new (GdkRegionPrivate, 1);
40 private->xregion = xregion;
41 region = (GdkRegion*) private;
42 region->user_data = NULL;
48 gdk_region_destroy (GdkRegion *region)
50 GdkRegionPrivate *private;
52 g_return_if_fail (region != NULL);
54 private = (GdkRegionPrivate *) region;
55 XDestroyRegion (private->xregion);
61 gdk_region_empty (GdkRegion *region)
63 GdkRegionPrivate *private;
65 g_return_val_if_fail (region != NULL, 0);
67 private = (GdkRegionPrivate *) region;
69 return XEmptyRegion (private->xregion);
73 gdk_region_equal (GdkRegion *region1,
76 GdkRegionPrivate *private1;
77 GdkRegionPrivate *private2;
79 g_return_val_if_fail (region1 != NULL, 0);
80 g_return_val_if_fail (region2 != NULL, 0);
82 private1 = (GdkRegionPrivate *) region1;
83 private2 = (GdkRegionPrivate *) region2;
85 return XEqualRegion (private1->xregion, private2->xregion);
89 gdk_region_get_clipbox(GdkRegion *region,
90 GdkRectangle *rectangle)
95 g_return_if_fail(region != NULL);
96 g_return_if_fail(rectangle != NULL);
98 rp = (GdkRegionPrivate *)region;
99 XClipBox(rp->xregion, &r);
103 rectangle->width = r.width;
104 rectangle->height = r.height;
108 gdk_region_point_in (GdkRegion *region,
112 GdkRegionPrivate *private;
114 g_return_val_if_fail (region != NULL, 0);
116 private = (GdkRegionPrivate *) region;
118 return XPointInRegion (private->xregion, x, y);
122 gdk_region_rect_in (GdkRegion *region,
125 GdkRegionPrivate *private;
128 g_return_val_if_fail (region != NULL, 0);
130 private = (GdkRegionPrivate *) region;
132 res = XRectInRegion (private->xregion, rect->x, rect->y, rect->width, rect->height);
136 case RectangleIn: return GDK_OVERLAP_RECTANGLE_IN;
137 case RectangleOut: return GDK_OVERLAP_RECTANGLE_OUT;
138 case RectanglePart: return GDK_OVERLAP_RECTANGLE_PART;
141 return GDK_OVERLAP_RECTANGLE_OUT; /*what else ? */
145 gdk_region_polygon (GdkPoint *points,
147 GdkFillRule fill_rule)
149 GdkRegionPrivate *private;
152 gint xfill_rule = EvenOddRule;
154 g_return_val_if_fail (points != NULL, NULL);
155 g_return_val_if_fail (npoints != 0, NULL); /* maybe we should check for at least three points */
159 case GDK_EVEN_ODD_RULE:
160 xfill_rule = EvenOddRule;
163 case GDK_WINDING_RULE:
164 xfill_rule = WindingRule;
168 xregion = XPolygonRegion ((XPoint *) points, npoints, xfill_rule);
169 private = g_new (GdkRegionPrivate, 1);
170 private->xregion = xregion;
171 region = (GdkRegion *) private;
172 region->user_data = NULL;
178 gdk_region_offset (GdkRegion *region,
182 GdkRegionPrivate *private;
184 g_return_if_fail (region != NULL);
186 private = (GdkRegionPrivate *) region;
188 XOffsetRegion (private->xregion, dx, dy);
192 gdk_region_shrink (GdkRegion *region,
196 GdkRegionPrivate *private;
198 g_return_if_fail (region != NULL);
200 private = (GdkRegionPrivate *) region;
202 XShrinkRegion (private->xregion, dx, dy);
206 gdk_region_union_with_rect (GdkRegion *region,
209 GdkRegionPrivate *private;
211 GdkRegionPrivate *res_private;
214 g_return_val_if_fail (region != NULL, NULL);
216 private = (GdkRegionPrivate *) region;
220 xrect.width = rect->width;
221 xrect.height = rect->height;
223 res = gdk_region_new ();
224 res_private = (GdkRegionPrivate *) res;
226 XUnionRectWithRegion (&xrect, private->xregion, res_private->xregion);
232 gdk_regions_intersect (GdkRegion *source1,
235 GdkRegionPrivate *private1;
236 GdkRegionPrivate *private2;
238 GdkRegionPrivate *res_private;
240 g_return_val_if_fail (source1 != NULL, NULL);
241 g_return_val_if_fail (source2 != NULL, NULL);
243 private1 = (GdkRegionPrivate *) source1;
244 private2 = (GdkRegionPrivate *) source2;
246 res = gdk_region_new ();
247 res_private = (GdkRegionPrivate *) res;
249 XIntersectRegion (private1->xregion, private2->xregion, res_private->xregion);
255 gdk_regions_union (GdkRegion *source1,
258 GdkRegionPrivate *private1;
259 GdkRegionPrivate *private2;
261 GdkRegionPrivate *res_private;
263 g_return_val_if_fail (source1 != NULL, NULL);
264 g_return_val_if_fail (source2 != NULL, NULL);
266 private1 = (GdkRegionPrivate *) source1;
267 private2 = (GdkRegionPrivate *) source2;
269 res = gdk_region_new ();
270 res_private = (GdkRegionPrivate *) res;
272 XUnionRegion (private1->xregion, private2->xregion, res_private->xregion);
278 gdk_regions_subtract (GdkRegion *source1,
281 GdkRegionPrivate *private1;
282 GdkRegionPrivate *private2;
284 GdkRegionPrivate *res_private;
286 g_return_val_if_fail (source1 != NULL, NULL);
287 g_return_val_if_fail (source2 != NULL, NULL);
289 private1 = (GdkRegionPrivate *) source1;
290 private2 = (GdkRegionPrivate *) source2;
292 res = gdk_region_new ();
293 res_private = (GdkRegionPrivate *) res;
295 XSubtractRegion (private1->xregion, private2->xregion, res_private->xregion);
301 gdk_regions_xor (GdkRegion *source1,
304 GdkRegionPrivate *private1;
305 GdkRegionPrivate *private2;
307 GdkRegionPrivate *res_private;
309 g_return_val_if_fail (source1 != NULL, NULL);
310 g_return_val_if_fail (source2 != NULL, NULL);
312 private1 = (GdkRegionPrivate *) source1;
313 private2 = (GdkRegionPrivate *) source2;
315 res = gdk_region_new ();
316 res_private = (GdkRegionPrivate *) res;
318 XXorRegion (private1->xregion, private2->xregion, res_private->xregion);