1 /*
2 * tkWinRegion.c --
3 *
4 * Tk Region emulation code.
5 *
6 * Copyright (c) 1995 Sun Microsystems, Inc.
7 *
8 * See the file "license.terms" for information on usage and redistribution
9 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
10 *
11 * RCS: @(#) $Id: tkWinRegion.c,v 1.3 2002/06/14 13:35:49 dkf Exp $
12 */
13
14 #include "tkWinInt.h"
15
16
17 /*
18 *----------------------------------------------------------------------
19 *
20 * TkCreateRegion --
21 *
22 * Construct an empty region.
23 *
24 * Results:
25 * Returns a new region handle.
26 *
27 * Side effects:
28 * None.
29 *
30 *----------------------------------------------------------------------
31 */
32
33 TkRegion
TkCreateRegion()34 TkCreateRegion()
35 {
36 RECT rect;
37 memset(&rect, 0, sizeof(RECT));
38 return (TkRegion) CreateRectRgnIndirect(&rect);
39 }
40
41 /*
42 *----------------------------------------------------------------------
43 *
44 * TkDestroyRegion --
45 *
46 * Destroy the specified region.
47 *
48 * Results:
49 * None.
50 *
51 * Side effects:
52 * Frees the storage associated with the specified region.
53 *
54 *----------------------------------------------------------------------
55 */
56
57 void
TkDestroyRegion(r)58 TkDestroyRegion(r)
59 TkRegion r;
60 {
61 DeleteObject((HRGN) r);
62 }
63
64 /*
65 *----------------------------------------------------------------------
66 *
67 * TkClipBox --
68 *
69 * Computes the bounding box of a region.
70 *
71 * Results:
72 * Sets rect_return to the bounding box of the region.
73 *
74 * Side effects:
75 * None.
76 *
77 *----------------------------------------------------------------------
78 */
79
80 void
TkClipBox(r,rect_return)81 TkClipBox(r, rect_return)
82 TkRegion r;
83 XRectangle* rect_return;
84 {
85 RECT rect;
86 GetRgnBox((HRGN)r, &rect);
87 rect_return->x = (short) rect.left;
88 rect_return->y = (short) rect.top;
89 rect_return->width = (short) (rect.right - rect.left);
90 rect_return->height = (short) (rect.bottom - rect.top);
91 }
92
93 /*
94 *----------------------------------------------------------------------
95 *
96 * TkIntersectRegion --
97 *
98 * Compute the intersection of two regions.
99 *
100 * Results:
101 * Returns the result in the dr_return region.
102 *
103 * Side effects:
104 * None.
105 *
106 *----------------------------------------------------------------------
107 */
108
109 void
TkIntersectRegion(sra,srb,dr_return)110 TkIntersectRegion(sra, srb, dr_return)
111 TkRegion sra;
112 TkRegion srb;
113 TkRegion dr_return;
114 {
115 CombineRgn((HRGN) dr_return, (HRGN) sra, (HRGN) srb, RGN_AND);
116 }
117
118 /*
119 *----------------------------------------------------------------------
120 *
121 * TkUnionRectWithRegion --
122 *
123 * Create the union of a source region and a rectangle.
124 *
125 * Results:
126 * Returns the result in the dr_return region.
127 *
128 * Side effects:
129 * None.
130 *
131 *----------------------------------------------------------------------
132 */
133
134 void
TkUnionRectWithRegion(rectangle,src_region,dest_region_return)135 TkUnionRectWithRegion(rectangle, src_region, dest_region_return)
136 XRectangle* rectangle;
137 TkRegion src_region;
138 TkRegion dest_region_return;
139 {
140 HRGN rectRgn = CreateRectRgn(rectangle->x, rectangle->y,
141 rectangle->x + rectangle->width, rectangle->y + rectangle->height);
142 CombineRgn((HRGN) dest_region_return, (HRGN) src_region,
143 (HRGN) rectRgn, RGN_OR);
144 DeleteObject(rectRgn);
145 }
146
147 /*
148 *----------------------------------------------------------------------
149 *
150 * TkRectInRegion --
151 *
152 * Test whether a given rectangle overlaps with a region.
153 *
154 * Results:
155 * Returns RectanglePart or RectangleOut. Note that this is
156 * not a complete implementation since it doesn't test for
157 * RectangleIn.
158 *
159 * Side effects:
160 * None.
161 *
162 *----------------------------------------------------------------------
163 */
164
165 int
TkRectInRegion(r,x,y,width,height)166 TkRectInRegion(r, x, y, width, height)
167 TkRegion r;
168 int x;
169 int y;
170 unsigned int width;
171 unsigned int height;
172 {
173 RECT rect;
174 rect.top = y;
175 rect.left = x;
176 rect.bottom = y+height;
177 rect.right = x+width;
178 return RectInRegion((HRGN)r, &rect) ? RectanglePart : RectangleOut;
179 }
180
181 /*
182 *----------------------------------------------------------------------
183 *
184 * TkSubtractRegion --
185 *
186 * Compute the set-difference of two regions.
187 *
188 * Results:
189 * Returns the result in the dr_return region.
190 *
191 * Side effects:
192 * None.
193 *
194 *----------------------------------------------------------------------
195 */
196
197 void
TkSubtractRegion(sra,srb,dr_return)198 TkSubtractRegion(sra, srb, dr_return)
199 TkRegion sra;
200 TkRegion srb;
201 TkRegion dr_return;
202 {
203 CombineRgn((HRGN) dr_return, (HRGN) sra, (HRGN) srb, RGN_DIFF);
204 }
205