diff options
author | Tor Lillqvist <tml@src.gnome.org> | 1999-03-05 19:53:56 +0000 |
---|---|---|
committer | Tor Lillqvist <tml@src.gnome.org> | 1999-03-05 19:53:56 +0000 |
commit | 9f3b82e178d58786d754d814512db515b6c2f155 (patch) | |
tree | 1e92fa1cf0c05f5dad6744c0d802c20c16fb4962 /gdk/win32/gdkregion-win32.c | |
parent | ced58eb136565ad03326277a5248467dd9fe8eb3 (diff) | |
download | gtk+-9f3b82e178d58786d754d814512db515b6c2f155.tar.gz |
Win32 version of GDK source files and resource files (cursors and icons).
Diffstat (limited to 'gdk/win32/gdkregion-win32.c')
-rw-r--r-- | gdk/win32/gdkregion-win32.c | 350 |
1 files changed, 350 insertions, 0 deletions
diff --git a/gdk/win32/gdkregion-win32.c b/gdk/win32/gdkregion-win32.c new file mode 100644 index 0000000000..4a37c3b107 --- /dev/null +++ b/gdk/win32/gdkregion-win32.c @@ -0,0 +1,350 @@ +/* GDK - The GIMP Drawing Kit + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS + * file for a list of people on the GTK+ Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include "config.h" + +#include "gdk.h" +#include "gdkprivate.h" + + +GdkRegion* +gdk_region_new (void) +{ + GdkRegionPrivate *private; + GdkRegion *region; + HRGN xregion; + + /* Create an empty region */ + xregion = CreateRectRgn (1, 1, 0, 0); + private = g_new (GdkRegionPrivate, 1); + private->xregion = xregion; + region = (GdkRegion*) private; + region->user_data = NULL; + + return region; +} + +void +gdk_region_destroy (GdkRegion *region) +{ + GdkRegionPrivate *private; + + g_return_if_fail (region != NULL); + + private = (GdkRegionPrivate *) region; + DeleteObject (private->xregion); + g_free (private); +} + +gboolean +gdk_region_empty (GdkRegion *region) +{ + GdkRegionPrivate *private; + RECT rect; + + g_return_val_if_fail (region != NULL, 0); + + private = (GdkRegionPrivate *) region; + + return (GetRgnBox (private->xregion, &rect) == NULLREGION); +} + +gboolean +gdk_region_equal (GdkRegion *region1, + GdkRegion *region2) +{ + GdkRegionPrivate *private1; + GdkRegionPrivate *private2; + + g_return_val_if_fail (region1 != NULL, 0); + g_return_val_if_fail (region2 != NULL, 0); + + private1 = (GdkRegionPrivate *) region1; + private2 = (GdkRegionPrivate *) region2; + + return EqualRgn (private1->xregion, private2->xregion); +} + +void +gdk_region_get_clipbox(GdkRegion *region, + GdkRectangle *rectangle) +{ + GdkRegionPrivate *rp; + RECT r; + + g_return_if_fail(region != NULL); + g_return_if_fail(rectangle != NULL); + + rp = (GdkRegionPrivate *)region; + + GetRgnBox (rp->xregion, &r); + rectangle->x = r.left; + rectangle->y = r.top; + rectangle->width = r.right - r.left; + rectangle->height = r.bottom - r.top; +} + +gboolean +gdk_region_point_in (GdkRegion *region, + gint x, + gint y) +{ + GdkRegionPrivate *private; + + g_return_val_if_fail (region != NULL, 0); + + private = (GdkRegionPrivate *) region; + + return PtInRegion (private->xregion, x, y); +} + +GdkOverlapType +gdk_region_rect_in (GdkRegion *region, + GdkRectangle *rect) +{ + GdkRegionPrivate *private; + RECT r; + int res; + + g_return_val_if_fail (region != NULL, 0); + + private = (GdkRegionPrivate *) region; + + r.left = rect->x; + r.top = rect->y; + r.right = rect->x + rect->width; + r.bottom = rect->y + rect->height; + + if (RectInRegion (private->xregion, &r)) + return GDK_OVERLAP_RECTANGLE_PART; + + return GDK_OVERLAP_RECTANGLE_OUT; /*what else ? */ +} + +GdkRegion * +gdk_region_polygon (GdkPoint *points, + gint npoints, + GdkFillRule fill_rule) +{ + GdkRegionPrivate *private; + GdkRegion *region; + HRGN xregion; + POINT *pts; + gint xfill_rule = ALTERNATE; + gint i; + + g_return_val_if_fail (points != NULL, NULL); + g_return_val_if_fail (npoints != 0, NULL); /* maybe we should check for at least three points */ + + switch (fill_rule) + { + case GDK_EVEN_ODD_RULE: + xfill_rule = ALTERNATE; + break; + + case GDK_WINDING_RULE: + xfill_rule = WINDING; + break; + } + + pts = g_malloc (npoints * sizeof (*pts)); + for (i = 0; i < npoints; i++) + { + pts[i].x = points[i].x; + pts[i].y = points[i].y; + } + xregion = CreatePolygonRgn (pts, npoints, xfill_rule); + g_free (pts); + + private = g_new (GdkRegionPrivate, 1); + private->xregion = xregion; + region = (GdkRegion *) private; + region->user_data = NULL; + + return region; +} + +void +gdk_region_offset (GdkRegion *region, + gint dx, + gint dy) +{ + GdkRegionPrivate *private; + + g_return_if_fail (region != NULL); + + private = (GdkRegionPrivate *) region; + + OffsetRgn (private->xregion, dx, dy); +} + +void +gdk_region_shrink (GdkRegion *region, + gint dx, + gint dy) +{ + GdkRegionPrivate *private; + RECT r; + + g_return_if_fail (region != NULL); + + private = (GdkRegionPrivate *) region; + + /* Is it correct just to intersect it with a smaller bounding box? */ + GetRgnBox (private->xregion, &r); + + if (-dx > r.right - r.left) + { + r.left += dx/2; + r.right -= dx/2; + } + if (-dy > r.bottom - r.top) + { + r.top += dy/2; + r.bottom -= dy/2; + } + + CombineRgn (private->xregion, private->xregion, + CreateRectRgnIndirect (&r), RGN_AND); +} + +GdkRegion* +gdk_region_union_with_rect (GdkRegion *region, + GdkRectangle *rect) +{ + GdkRegionPrivate *private; + GdkRegion *res; + GdkRegionPrivate *res_private; + RECT xrect; + + g_return_val_if_fail (region != NULL, NULL); + + private = (GdkRegionPrivate *) region; + + xrect.left = rect->x; + xrect.top = rect->y; + xrect.right = rect->x + rect->width; + xrect.bottom = rect->y + rect->height; + + res = gdk_region_new (); + res_private = (GdkRegionPrivate *) res; + + CombineRgn (res_private->xregion, private->xregion, + CreateRectRgnIndirect (&xrect), RGN_OR); + return res; +} + +GdkRegion* +gdk_regions_intersect (GdkRegion *source1, + GdkRegion *source2) +{ + GdkRegionPrivate *private1; + GdkRegionPrivate *private2; + GdkRegion *res; + GdkRegionPrivate *res_private; + + g_return_val_if_fail (source1 != NULL, NULL); + g_return_val_if_fail (source2 != NULL, NULL); + + private1 = (GdkRegionPrivate *) source1; + private2 = (GdkRegionPrivate *) source2; + + res = gdk_region_new (); + res_private = (GdkRegionPrivate *) res; + + CombineRgn (res_private->xregion, private1->xregion, private2->xregion, + RGN_AND); + return res; +} + +GdkRegion* +gdk_regions_union (GdkRegion *source1, + GdkRegion *source2) +{ + GdkRegionPrivate *private1; + GdkRegionPrivate *private2; + GdkRegion *res; + GdkRegionPrivate *res_private; + + g_return_val_if_fail (source1 != NULL, NULL); + g_return_val_if_fail (source2 != NULL, NULL); + + private1 = (GdkRegionPrivate *) source1; + private2 = (GdkRegionPrivate *) source2; + + res = gdk_region_new (); + res_private = (GdkRegionPrivate *) res; + + CombineRgn (res_private->xregion, private1->xregion, private2->xregion, + RGN_OR); + return res; +} + +GdkRegion* +gdk_regions_subtract (GdkRegion *source1, + GdkRegion *source2) +{ + GdkRegionPrivate *private1; + GdkRegionPrivate *private2; + GdkRegion *res; + GdkRegionPrivate *res_private; + + g_return_val_if_fail (source1 != NULL, NULL); + g_return_val_if_fail (source2 != NULL, NULL); + + private1 = (GdkRegionPrivate *) source1; + private2 = (GdkRegionPrivate *) source2; + + res = gdk_region_new (); + res_private = (GdkRegionPrivate *) res; + + CombineRgn (res_private->xregion, private1->xregion, private2->xregion, + RGN_DIFF); + return res; +} + +GdkRegion* +gdk_regions_xor (GdkRegion *source1, + GdkRegion *source2) +{ + GdkRegionPrivate *private1; + GdkRegionPrivate *private2; + GdkRegion *res; + GdkRegionPrivate *res_private; + + g_return_val_if_fail (source1 != NULL, NULL); + g_return_val_if_fail (source2 != NULL, NULL); + + private1 = (GdkRegionPrivate *) source1; + private2 = (GdkRegionPrivate *) source2; + + res = gdk_region_new (); + res_private = (GdkRegionPrivate *) res; + + CombineRgn (res_private->xregion, private1->xregion, private2->xregion, + RGN_XOR); + return res; +} |