1 #error this file should not be used, I think
3 /* GDK - The GIMP Drawing Kit
4 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
23 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
24 * file for a list of people on the GTK+ Team. See the ChangeLog
25 * files for a list of changes. These files are distributed with
26 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
32 #include "gdkprivate-win32.h"
38 GdkRegionPrivate *private;
43 /* Create an empty region */
44 SetRectEmpty (&emptyRect);
45 xregion = CreateRectRgnIndirect (&emptyRect);
46 private = g_new (GdkRegionPrivate, 1);
47 private->xregion = xregion;
48 region = (GdkRegion*) private;
49 region->user_data = NULL;
55 gdk_region_destroy (GdkRegion *region)
57 GdkRegionPrivate *private;
59 g_return_if_fail (region != NULL);
61 private = (GdkRegionPrivate *) region;
62 DeleteObject (private->xregion);
67 gdk_region_empty (GdkRegion *region)
69 GdkRegionPrivate *private;
72 g_return_val_if_fail (region != NULL, 0);
74 private = (GdkRegionPrivate *) region;
76 return (GetRgnBox (private->xregion, &rect) == NULLREGION);
80 gdk_region_equal (GdkRegion *region1,
83 GdkRegionPrivate *private1;
84 GdkRegionPrivate *private2;
86 g_return_val_if_fail (region1 != NULL, 0);
87 g_return_val_if_fail (region2 != NULL, 0);
89 private1 = (GdkRegionPrivate *) region1;
90 private2 = (GdkRegionPrivate *) region2;
92 return EqualRgn (private1->xregion, private2->xregion);
96 gdk_region_get_clipbox(GdkRegion *region,
97 GdkRectangle *rectangle)
102 g_return_if_fail(region != NULL);
103 g_return_if_fail(rectangle != NULL);
105 rp = (GdkRegionPrivate *)region;
107 GetRgnBox (rp->xregion, &r);
108 rectangle->x = r.left;
109 rectangle->y = r.top;
110 rectangle->width = r.right - r.left;
111 rectangle->height = r.bottom - r.top;
115 gdk_region_point_in (GdkRegion *region,
119 GdkRegionPrivate *private;
121 g_return_val_if_fail (region != NULL, 0);
123 private = (GdkRegionPrivate *) region;
125 return PtInRegion (private->xregion, x, y);
129 gdk_region_rect_in (GdkRegion *region,
132 GdkRegionPrivate *private;
136 g_return_val_if_fail (region != NULL, 0);
138 private = (GdkRegionPrivate *) region;
142 r.right = rect->x + rect->width;
143 r.bottom = rect->y + rect->height;
145 if (RectInRegion (private->xregion, &r))
146 return GDK_OVERLAP_RECTANGLE_PART;
148 return GDK_OVERLAP_RECTANGLE_OUT; /*what else ? */
152 gdk_region_polygon (GdkPoint *points,
154 GdkFillRule fill_rule)
156 GdkRegionPrivate *private;
160 gint xfill_rule = ALTERNATE;
163 g_return_val_if_fail (points != NULL, NULL);
164 g_return_val_if_fail (npoints != 0, NULL); /* maybe we should check for at least three points */
168 case GDK_EVEN_ODD_RULE:
169 xfill_rule = ALTERNATE;
172 case GDK_WINDING_RULE:
173 xfill_rule = WINDING;
177 pts = g_malloc (npoints * sizeof (*pts));
178 for (i = 0; i < npoints; i++)
180 pts[i].x = points[i].x;
181 pts[i].y = points[i].y;
183 xregion = CreatePolygonRgn (pts, npoints, xfill_rule);
186 private = g_new (GdkRegionPrivate, 1);
187 private->xregion = xregion;
188 region = (GdkRegion *) private;
189 region->user_data = NULL;
195 gdk_region_offset (GdkRegion *region,
199 GdkRegionPrivate *private;
201 g_return_if_fail (region != NULL);
203 private = (GdkRegionPrivate *) region;
205 OffsetRgn (private->xregion, dx, dy);
209 gdk_region_shrink (GdkRegion *region,
213 GdkRegionPrivate *private;
217 g_return_if_fail (region != NULL);
219 private = (GdkRegionPrivate *) region;
221 if (dx > 0 || dy > 0)
223 /* We want to shrink it in one or both dimensions.
224 * Is it correct just to intersect it with a smaller bounding box?
227 GetRgnBox (private->xregion, &r);
239 shrunken_bbox = CreateRectRgnIndirect (&r);
240 CombineRgn (private->xregion, private->xregion,
241 shrunken_bbox, RGN_AND);
242 DeleteObject (shrunken_bbox);
246 /* Do nothing if the regions is expanded? XXX */
251 gdk_region_union_with_rect (GdkRegion *region,
254 GdkRegionPrivate *private;
256 GdkRegionPrivate *res_private;
260 g_return_val_if_fail (region != NULL, NULL);
262 private = (GdkRegionPrivate *) region;
264 xrect.left = rect->x;
266 xrect.right = rect->x + rect->width;
267 xrect.bottom = rect->y + rect->height;
269 res = gdk_region_new ();
270 res_private = (GdkRegionPrivate *) res;
272 rectangle = CreateRectRgnIndirect (&xrect);
273 CombineRgn (res_private->xregion, private->xregion,
275 DeleteObject (rectangle);
280 gdk_regions_op (GdkRegion *source1,
284 GdkRegionPrivate *private1;
285 GdkRegionPrivate *private2;
287 GdkRegionPrivate *res_private;
289 g_return_val_if_fail (source1 != NULL, NULL);
290 g_return_val_if_fail (source2 != NULL, NULL);
292 private1 = (GdkRegionPrivate *) source1;
293 private2 = (GdkRegionPrivate *) source2;
295 res = gdk_region_new ();
296 res_private = (GdkRegionPrivate *) res;
298 CombineRgn (res_private->xregion, private1->xregion, private2->xregion, op);
303 gdk_regions_intersect (GdkRegion *source1,
306 return gdk_regions_op (source1, source2, RGN_AND);
310 gdk_regions_union (GdkRegion *source1,
313 return gdk_regions_op (source1, source2, RGN_OR);
317 gdk_regions_subtract (GdkRegion *source1,
320 return gdk_regions_op (source1, source2, RGN_DIFF);
324 gdk_regions_xor (GdkRegion *source1,
327 return gdk_regions_op (source1, source2, RGN_XOR);