summaryrefslogtreecommitdiff
path: root/tk/win/tkWinRegion.c
diff options
context:
space:
mode:
Diffstat (limited to 'tk/win/tkWinRegion.c')
-rw-r--r--tk/win/tkWinRegion.c179
1 files changed, 179 insertions, 0 deletions
diff --git a/tk/win/tkWinRegion.c b/tk/win/tkWinRegion.c
new file mode 100644
index 00000000000..1866971864b
--- /dev/null
+++ b/tk/win/tkWinRegion.c
@@ -0,0 +1,179 @@
+/*
+ * tkWinRegion.c --
+ *
+ * Tk Region emulation code.
+ *
+ * Copyright (c) 1995 Sun Microsystems, Inc.
+ *
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ *
+ * RCS: @(#) $Id$
+ */
+
+#include "tkWinInt.h"
+
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkCreateRegion --
+ *
+ * Construct an empty region.
+ *
+ * Results:
+ * Returns a new region handle.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+TkRegion
+TkCreateRegion()
+{
+ RECT rect;
+ memset(&rect, 0, sizeof(RECT));
+ return (TkRegion) CreateRectRgnIndirect(&rect);
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkDestroyRegion --
+ *
+ * Destroy the specified region.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Frees the storage associated with the specified region.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkDestroyRegion(r)
+ TkRegion r;
+{
+ DeleteObject((HRGN) r);
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkClipBox --
+ *
+ * Computes the bounding box of a region.
+ *
+ * Results:
+ * Sets rect_return to the bounding box of the region.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkClipBox(r, rect_return)
+ TkRegion r;
+ XRectangle* rect_return;
+{
+ RECT rect;
+ GetRgnBox((HRGN)r, &rect);
+ rect_return->x = (short) rect.left;
+ rect_return->y = (short) rect.top;
+ rect_return->width = (short) (rect.right - rect.left);
+ rect_return->height = (short) (rect.bottom - rect.top);
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkIntersectRegion --
+ *
+ * Compute the intersection of two regions.
+ *
+ * Results:
+ * Returns the result in the dr_return region.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkIntersectRegion(sra, srb, dr_return)
+ TkRegion sra;
+ TkRegion srb;
+ TkRegion dr_return;
+{
+ CombineRgn((HRGN) dr_return, (HRGN) sra, (HRGN) srb, RGN_AND);
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkUnionRectWithRegion --
+ *
+ * Create the union of a source region and a rectangle.
+ *
+ * Results:
+ * Returns the result in the dr_return region.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkUnionRectWithRegion(rectangle, src_region, dest_region_return)
+ XRectangle* rectangle;
+ TkRegion src_region;
+ TkRegion dest_region_return;
+{
+ HRGN rectRgn = CreateRectRgn(rectangle->x, rectangle->y,
+ rectangle->x + rectangle->width, rectangle->y + rectangle->height);
+ CombineRgn((HRGN) dest_region_return, (HRGN) src_region,
+ (HRGN) rectRgn, RGN_OR);
+ DeleteObject(rectRgn);
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkRectInRegion --
+ *
+ * Test whether a given rectangle overlaps with a region.
+ *
+ * Results:
+ * Returns RectanglePart or RectangleOut. Note that this is
+ * not a complete implementation since it doesn't test for
+ * RectangleIn.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+int
+TkRectInRegion(r, x, y, width, height)
+ TkRegion r;
+ int x;
+ int y;
+ unsigned int width;
+ unsigned int height;
+{
+ RECT rect;
+ rect.top = y;
+ rect.left = x;
+ rect.bottom = y+height;
+ rect.right = x+width;
+ return RectInRegion((HRGN)r, &rect) ? RectanglePart : RectangleOut;
+}