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 Free
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include <X11/Xutil.h>
22 #include "gdkprivate.h"
30 GdkRegionPrivate *private;
34 xregion = XCreateRegion();
35 private = g_new (GdkRegionPrivate, 1);
36 private->xregion = xregion;
37 region = (GdkRegion*) private;
38 region->user_data = NULL;
44 gdk_region_destroy (GdkRegion *region)
46 GdkRegionPrivate *private;
48 g_return_if_fail (region != NULL);
50 private = (GdkRegionPrivate *) region;
51 XDestroyRegion (private->xregion);
57 gdk_region_empty (GdkRegion *region)
59 GdkRegionPrivate *private;
61 g_return_val_if_fail (region != NULL, 0);
63 private = (GdkRegionPrivate *) region;
65 return XEmptyRegion (private->xregion);
69 gdk_region_equal (GdkRegion *region1,
72 GdkRegionPrivate *private1;
73 GdkRegionPrivate *private2;
75 g_return_val_if_fail (region1 != NULL, 0);
76 g_return_val_if_fail (region2 != NULL, 0);
78 private1 = (GdkRegionPrivate *) region1;
79 private2 = (GdkRegionPrivate *) region2;
81 return XEqualRegion (private1->xregion, private2->xregion);
85 gdk_region_point_in (GdkRegion *region,
89 GdkRegionPrivate *private;
91 g_return_val_if_fail (region != NULL, 0);
93 private = (GdkRegionPrivate *) region;
95 return XPointInRegion (private->xregion, x, y);
99 gdk_region_rect_in (GdkRegion *region,
102 GdkRegionPrivate *private;
105 g_return_val_if_fail (region != NULL, 0);
107 private = (GdkRegionPrivate *) region;
109 res = XRectInRegion (private->xregion, rect->x, rect->y, rect->width, rect->height);
113 case RectangleIn: return GDK_OVERLAP_RECTANGLE_IN;
114 case RectangleOut: return GDK_OVERLAP_RECTANGLE_OUT;
115 case RectanglePart: return GDK_OVERLAP_RECTANGLE_PART;
118 return GDK_OVERLAP_RECTANGLE_OUT; /*what else ? */
122 gdk_region_offset (GdkRegion *region,
126 GdkRegionPrivate *private;
128 g_return_if_fail (region != NULL);
130 private = (GdkRegionPrivate *) region;
132 XOffsetRegion (private->xregion, dx, dy);
136 gdk_region_shrink (GdkRegion *region,
140 GdkRegionPrivate *private;
142 g_return_if_fail (region != NULL);
144 private = (GdkRegionPrivate *) region;
146 XShrinkRegion (private->xregion, dx, dy);
150 gdk_region_union_with_rect (GdkRegion *region,
153 GdkRegionPrivate *private;
155 GdkRegionPrivate *res_private;
158 g_return_val_if_fail (region != NULL, NULL);
160 private = (GdkRegionPrivate *) region;
164 xrect.width = rect->width;
165 xrect.height = rect->height;
167 res = gdk_region_new ();
168 res_private = (GdkRegionPrivate *) res;
170 XUnionRectWithRegion (&xrect, private->xregion, res_private->xregion);
176 gdk_regions_intersect (GdkRegion *source1,
179 GdkRegionPrivate *private1;
180 GdkRegionPrivate *private2;
182 GdkRegionPrivate *res_private;
184 g_return_val_if_fail (source1 != NULL, NULL);
185 g_return_val_if_fail (source2 != NULL, NULL);
187 private1 = (GdkRegionPrivate *) source1;
188 private2 = (GdkRegionPrivate *) source2;
190 res = gdk_region_new ();
191 res_private = (GdkRegionPrivate *) res;
193 XIntersectRegion (private1->xregion, private2->xregion, res_private->xregion);
199 gdk_regions_union (GdkRegion *source1,
202 GdkRegionPrivate *private1;
203 GdkRegionPrivate *private2;
205 GdkRegionPrivate *res_private;
207 g_return_val_if_fail (source1 != NULL, NULL);
208 g_return_val_if_fail (source2 != NULL, NULL);
210 private1 = (GdkRegionPrivate *) source1;
211 private2 = (GdkRegionPrivate *) source2;
213 res = gdk_region_new ();
214 res_private = (GdkRegionPrivate *) res;
216 XUnionRegion (private1->xregion, private2->xregion, res_private->xregion);
222 gdk_regions_subtract (GdkRegion *source1,
225 GdkRegionPrivate *private1;
226 GdkRegionPrivate *private2;
228 GdkRegionPrivate *res_private;
230 g_return_val_if_fail (source1 != NULL, NULL);
231 g_return_val_if_fail (source2 != NULL, NULL);
233 private1 = (GdkRegionPrivate *) source1;
234 private2 = (GdkRegionPrivate *) source2;
236 res = gdk_region_new ();
237 res_private = (GdkRegionPrivate *) res;
239 XSubtractRegion (private1->xregion, private2->xregion, res_private->xregion);
245 gdk_regions_xor (GdkRegion *source1,
248 GdkRegionPrivate *private1;
249 GdkRegionPrivate *private2;
251 GdkRegionPrivate *res_private;
253 g_return_val_if_fail (source1 != NULL, NULL);
254 g_return_val_if_fail (source2 != NULL, NULL);
256 private1 = (GdkRegionPrivate *) source1;
257 private2 = (GdkRegionPrivate *) source2;
259 res = gdk_region_new ();
260 res_private = (GdkRegionPrivate *) res;
262 XXorRegion (private1->xregion, private2->xregion, res_private->xregion);