From fa26673f493b01ac1d137d2efd0eae5a7329a245 Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Sat, 28 Feb 1998 17:12:41 +0000 Subject: [PATCH] oops, forgot that, be nice ;) -timj --- gdk/gdkregion.c | 268 ++++++++++++++++++++++++++++++++++++++++ gdk/x11/gdkregion-x11.c | 268 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 536 insertions(+) create mode 100644 gdk/gdkregion.c create mode 100644 gdk/x11/gdkregion-x11.c diff --git a/gdk/gdkregion.c b/gdk/gdkregion.c new file mode 100644 index 0000000000..50b4b55391 --- /dev/null +++ b/gdk/gdkregion.c @@ -0,0 +1,268 @@ +/* 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include "gdk.h" +#include "gdkprivate.h" + + + + +GdkRegion* +gdk_region_new (void) +{ + GdkRegionPrivate *private; + GdkRegion *region; + Region xregion; + + xregion = XCreateRegion(); + 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; + XDestroyRegion (private->xregion); + + g_free (private); +} + +gboolean +gdk_region_empty (GdkRegion *region) +{ + GdkRegionPrivate *private; + + g_return_val_if_fail (region != NULL, 0); + + private = (GdkRegionPrivate *) region; + + return XEmptyRegion (private->xregion); +} + +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 XEqualRegion (private1->xregion, private2->xregion); +} + +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 XPointInRegion (private->xregion, x, y); +} + +GdkOverlapType +gdk_region_rect_in (GdkRegion *region, + GdkRectangle *rect) +{ + GdkRegionPrivate *private; + int res; + + g_return_val_if_fail (region != NULL, 0); + + private = (GdkRegionPrivate *) region; + + res = XRectInRegion (private->xregion, rect->x, rect->y, rect->width, rect->height); + + switch (res) + { + case RectangleIn: return GDK_OVERLAP_RECTANGLE_IN; + case RectangleOut: return GDK_OVERLAP_RECTANGLE_OUT; + case RectanglePart: return GDK_OVERLAP_RECTANGLE_PART; + } + + return GDK_OVERLAP_RECTANGLE_OUT; // what else ? +} + +void +gdk_region_offset (GdkRegion *region, + gint dx, + gint dy) +{ + GdkRegionPrivate *private; + + g_return_if_fail (region != NULL); + + private = (GdkRegionPrivate *) region; + + XOffsetRegion (private->xregion, dx, dy); +} + +void +gdk_region_shrink (GdkRegion *region, + gint dx, + gint dy) +{ + GdkRegionPrivate *private; + + g_return_if_fail (region != NULL); + + private = (GdkRegionPrivate *) region; + + XShrinkRegion (private->xregion, dx, dy); +} + +GdkRegion* +gdk_region_union_with_rect (GdkRegion *region, + GdkRectangle *rect) +{ + GdkRegionPrivate *private; + GdkRegion *res; + GdkRegionPrivate *res_private; + XRectangle xrect; + + g_return_val_if_fail (region != NULL, NULL); + + private = (GdkRegionPrivate *) region; + + xrect.x = rect->x; + xrect.y = rect->y; + xrect.width = rect->width; + xrect.height = rect->height; + + res = gdk_region_new (); + res_private = (GdkRegionPrivate *) res; + + XUnionRectWithRegion (&xrect, private->xregion, res_private->xregion); + + 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; + + XIntersectRegion (private1->xregion, private2->xregion, res_private->xregion); + + 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; + + XUnionRegion (private1->xregion, private2->xregion, res_private->xregion); + + 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; + + XSubtractRegion (private1->xregion, private2->xregion, res_private->xregion); + + 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; + + XXorRegion (private1->xregion, private2->xregion, res_private->xregion); + + return res; +} + + + diff --git a/gdk/x11/gdkregion-x11.c b/gdk/x11/gdkregion-x11.c new file mode 100644 index 0000000000..50b4b55391 --- /dev/null +++ b/gdk/x11/gdkregion-x11.c @@ -0,0 +1,268 @@ +/* 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include "gdk.h" +#include "gdkprivate.h" + + + + +GdkRegion* +gdk_region_new (void) +{ + GdkRegionPrivate *private; + GdkRegion *region; + Region xregion; + + xregion = XCreateRegion(); + 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; + XDestroyRegion (private->xregion); + + g_free (private); +} + +gboolean +gdk_region_empty (GdkRegion *region) +{ + GdkRegionPrivate *private; + + g_return_val_if_fail (region != NULL, 0); + + private = (GdkRegionPrivate *) region; + + return XEmptyRegion (private->xregion); +} + +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 XEqualRegion (private1->xregion, private2->xregion); +} + +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 XPointInRegion (private->xregion, x, y); +} + +GdkOverlapType +gdk_region_rect_in (GdkRegion *region, + GdkRectangle *rect) +{ + GdkRegionPrivate *private; + int res; + + g_return_val_if_fail (region != NULL, 0); + + private = (GdkRegionPrivate *) region; + + res = XRectInRegion (private->xregion, rect->x, rect->y, rect->width, rect->height); + + switch (res) + { + case RectangleIn: return GDK_OVERLAP_RECTANGLE_IN; + case RectangleOut: return GDK_OVERLAP_RECTANGLE_OUT; + case RectanglePart: return GDK_OVERLAP_RECTANGLE_PART; + } + + return GDK_OVERLAP_RECTANGLE_OUT; // what else ? +} + +void +gdk_region_offset (GdkRegion *region, + gint dx, + gint dy) +{ + GdkRegionPrivate *private; + + g_return_if_fail (region != NULL); + + private = (GdkRegionPrivate *) region; + + XOffsetRegion (private->xregion, dx, dy); +} + +void +gdk_region_shrink (GdkRegion *region, + gint dx, + gint dy) +{ + GdkRegionPrivate *private; + + g_return_if_fail (region != NULL); + + private = (GdkRegionPrivate *) region; + + XShrinkRegion (private->xregion, dx, dy); +} + +GdkRegion* +gdk_region_union_with_rect (GdkRegion *region, + GdkRectangle *rect) +{ + GdkRegionPrivate *private; + GdkRegion *res; + GdkRegionPrivate *res_private; + XRectangle xrect; + + g_return_val_if_fail (region != NULL, NULL); + + private = (GdkRegionPrivate *) region; + + xrect.x = rect->x; + xrect.y = rect->y; + xrect.width = rect->width; + xrect.height = rect->height; + + res = gdk_region_new (); + res_private = (GdkRegionPrivate *) res; + + XUnionRectWithRegion (&xrect, private->xregion, res_private->xregion); + + 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; + + XIntersectRegion (private1->xregion, private2->xregion, res_private->xregion); + + 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; + + XUnionRegion (private1->xregion, private2->xregion, res_private->xregion); + + 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; + + XSubtractRegion (private1->xregion, private2->xregion, res_private->xregion); + + 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; + + XXorRegion (private1->xregion, private2->xregion, res_private->xregion); + + return res; +} + + +