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>
30 #include "gdkprivate.h"
38 GdkRegionPrivate *private;
42 xregion = XCreateRegion();
43 private = g_new (GdkRegionPrivate, 1);
44 private->xregion = xregion;
45 region = (GdkRegion*) private;
46 region->user_data = NULL;
52 gdk_region_destroy (GdkRegion *region)
54 GdkRegionPrivate *private;
56 g_return_if_fail (region != NULL);
58 private = (GdkRegionPrivate *) region;
59 XDestroyRegion (private->xregion);
65 gdk_region_empty (GdkRegion *region)
67 GdkRegionPrivate *private;
69 g_return_val_if_fail (region != NULL, 0);
71 private = (GdkRegionPrivate *) region;
73 return XEmptyRegion (private->xregion);
77 gdk_region_equal (GdkRegion *region1,
80 GdkRegionPrivate *private1;
81 GdkRegionPrivate *private2;
83 g_return_val_if_fail (region1 != NULL, 0);
84 g_return_val_if_fail (region2 != NULL, 0);
86 private1 = (GdkRegionPrivate *) region1;
87 private2 = (GdkRegionPrivate *) region2;
89 return XEqualRegion (private1->xregion, private2->xregion);
93 gdk_region_get_clipbox(GdkRegion *region,
94 GdkRectangle *rectangle)
99 g_return_if_fail(region != NULL);
100 g_return_if_fail(rectangle != NULL);
102 rp = (GdkRegionPrivate *)region;
103 XClipBox(rp->xregion, &r);
107 rectangle->width = r.width;
108 rectangle->height = r.height;
112 gdk_region_point_in (GdkRegion *region,
116 GdkRegionPrivate *private;
118 g_return_val_if_fail (region != NULL, 0);
120 private = (GdkRegionPrivate *) region;
122 return XPointInRegion (private->xregion, x, y);
126 gdk_region_rect_in (GdkRegion *region,
129 GdkRegionPrivate *private;
132 g_return_val_if_fail (region != NULL, 0);
134 private = (GdkRegionPrivate *) region;
136 res = XRectInRegion (private->xregion, rect->x, rect->y, rect->width, rect->height);
140 case RectangleIn: return GDK_OVERLAP_RECTANGLE_IN;
141 case RectangleOut: return GDK_OVERLAP_RECTANGLE_OUT;
142 case RectanglePart: return GDK_OVERLAP_RECTANGLE_PART;
145 return GDK_OVERLAP_RECTANGLE_OUT; /*what else ? */
149 gdk_region_polygon (GdkPoint *points,
151 GdkFillRule fill_rule)
153 GdkRegionPrivate *private;
156 gint xfill_rule = EvenOddRule;
158 g_return_val_if_fail (points != NULL, NULL);
159 g_return_val_if_fail (npoints != 0, NULL); /* maybe we should check for at least three points */
163 case GDK_EVEN_ODD_RULE:
164 xfill_rule = EvenOddRule;
167 case GDK_WINDING_RULE:
168 xfill_rule = WindingRule;
172 xregion = XPolygonRegion ((XPoint *) points, npoints, xfill_rule);
173 private = g_new (GdkRegionPrivate, 1);
174 private->xregion = xregion;
175 region = (GdkRegion *) private;
176 region->user_data = NULL;
182 gdk_region_offset (GdkRegion *region,
186 GdkRegionPrivate *private;
188 g_return_if_fail (region != NULL);
190 private = (GdkRegionPrivate *) region;
192 XOffsetRegion (private->xregion, dx, dy);
196 gdk_region_shrink (GdkRegion *region,
200 GdkRegionPrivate *private;
202 g_return_if_fail (region != NULL);
204 private = (GdkRegionPrivate *) region;
206 XShrinkRegion (private->xregion, dx, dy);
210 gdk_region_union_with_rect (GdkRegion *region,
213 GdkRegionPrivate *private;
215 GdkRegionPrivate *res_private;
218 g_return_val_if_fail (region != NULL, NULL);
220 private = (GdkRegionPrivate *) region;
224 xrect.width = rect->width;
225 xrect.height = rect->height;
227 res = gdk_region_new ();
228 res_private = (GdkRegionPrivate *) res;
230 XUnionRectWithRegion (&xrect, private->xregion, res_private->xregion);
236 gdk_regions_intersect (GdkRegion *source1,
239 GdkRegionPrivate *private1;
240 GdkRegionPrivate *private2;
242 GdkRegionPrivate *res_private;
244 g_return_val_if_fail (source1 != NULL, NULL);
245 g_return_val_if_fail (source2 != NULL, NULL);
247 private1 = (GdkRegionPrivate *) source1;
248 private2 = (GdkRegionPrivate *) source2;
250 res = gdk_region_new ();
251 res_private = (GdkRegionPrivate *) res;
253 XIntersectRegion (private1->xregion, private2->xregion, res_private->xregion);
259 gdk_regions_union (GdkRegion *source1,
262 GdkRegionPrivate *private1;
263 GdkRegionPrivate *private2;
265 GdkRegionPrivate *res_private;
267 g_return_val_if_fail (source1 != NULL, NULL);
268 g_return_val_if_fail (source2 != NULL, NULL);
270 private1 = (GdkRegionPrivate *) source1;
271 private2 = (GdkRegionPrivate *) source2;
273 res = gdk_region_new ();
274 res_private = (GdkRegionPrivate *) res;
276 XUnionRegion (private1->xregion, private2->xregion, res_private->xregion);
282 gdk_regions_subtract (GdkRegion *source1,
285 GdkRegionPrivate *private1;
286 GdkRegionPrivate *private2;
288 GdkRegionPrivate *res_private;
290 g_return_val_if_fail (source1 != NULL, NULL);
291 g_return_val_if_fail (source2 != NULL, NULL);
293 private1 = (GdkRegionPrivate *) source1;
294 private2 = (GdkRegionPrivate *) source2;
296 res = gdk_region_new ();
297 res_private = (GdkRegionPrivate *) res;
299 XSubtractRegion (private1->xregion, private2->xregion, res_private->xregion);
305 gdk_regions_xor (GdkRegion *source1,
308 GdkRegionPrivate *private1;
309 GdkRegionPrivate *private2;
311 GdkRegionPrivate *res_private;
313 g_return_val_if_fail (source1 != NULL, NULL);
314 g_return_val_if_fail (source2 != NULL, NULL);
316 private1 = (GdkRegionPrivate *) source1;
317 private2 = (GdkRegionPrivate *) source2;
319 res = gdk_region_new ();
320 res_private = (GdkRegionPrivate *) res;
322 XXorRegion (private1->xregion, private2->xregion, res_private->xregion);