blob: e783e854e32cbd6cc19d02000c5d4fae5a461ad9 [file] [log] [blame]
Alexandre Julliard401710d1993-09-04 10:09:32 +00001/*
2 * Rectangle-related functions
3 *
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +00004 * Copyright 1993, 1996 Alexandre Julliard
Alexandre Julliard234bc241994-12-10 13:02:28 +00005 *
Alexandre Julliard59730ae1996-03-24 16:20:51 +00006 */
Alexandre Julliard401710d1993-09-04 10:09:32 +00007
8#include "windows.h"
9
Alexandre Julliard401710d1993-09-04 10:09:32 +000010
11/***********************************************************************
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000012 * SetRect16 (USER.72)
Alexandre Julliard401710d1993-09-04 10:09:32 +000013 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000014void WINAPI SetRect16( LPRECT16 rect, INT16 left, INT16 top,
15 INT16 right, INT16 bottom )
Alexandre Julliard401710d1993-09-04 10:09:32 +000016{
17 rect->left = left;
18 rect->right = right;
19 rect->top = top;
20 rect->bottom = bottom;
21}
22
23
24/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000025 * SetRect32 (USER32.499)
Alexandre Julliard401710d1993-09-04 10:09:32 +000026 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000027void WINAPI SetRect32( LPRECT32 rect, INT32 left, INT32 top,
28 INT32 right, INT32 bottom )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000029{
30 rect->left = left;
31 rect->right = right;
32 rect->top = top;
33 rect->bottom = bottom;
34}
35
36
37/***********************************************************************
38 * SetRectEmpty16 (USER.73)
39 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000040void WINAPI SetRectEmpty16( LPRECT16 rect )
Alexandre Julliard401710d1993-09-04 10:09:32 +000041{
42 rect->left = rect->right = rect->top = rect->bottom = 0;
43}
44
45
46/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000047 * SetRectEmpty32 (USER32.500)
Alexandre Julliard401710d1993-09-04 10:09:32 +000048 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000049void WINAPI SetRectEmpty32( LPRECT32 rect )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000050{
51 rect->left = rect->right = rect->top = rect->bottom = 0;
52}
53
54
55/***********************************************************************
56 * CopyRect16 (USER.74)
57 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000058BOOL16 WINAPI CopyRect16( RECT16 *dest, const RECT16 *src )
Alexandre Julliard401710d1993-09-04 10:09:32 +000059{
60 *dest = *src;
Alexandre Julliard7e56f681996-01-31 19:02:28 +000061 return TRUE;
Alexandre Julliard401710d1993-09-04 10:09:32 +000062}
63
64
65/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000066 * CopyRect32 (USER32.62)
Alexandre Julliard401710d1993-09-04 10:09:32 +000067 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000068BOOL32 WINAPI CopyRect32( RECT32 *dest, const RECT32 *src )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000069{
70 *dest = *src;
71 return TRUE;
72}
73
74
75/***********************************************************************
76 * IsRectEmpty16 (USER.75)
77 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000078BOOL16 WINAPI IsRectEmpty16( const RECT16 *rect )
Alexandre Julliard401710d1993-09-04 10:09:32 +000079{
80 return ((rect->left == rect->right) || (rect->top == rect->bottom));
81}
82
83
84/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +000085 * IsRectEmpty32 (USER32.347)
Alexandre Julliard401710d1993-09-04 10:09:32 +000086 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000087BOOL32 WINAPI IsRectEmpty32( const RECT32 *rect )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +000088{
89 return ((rect->left == rect->right) || (rect->top == rect->bottom));
90}
91
92
93/***********************************************************************
94 * PtInRect16 (USER.76)
95 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000096BOOL16 WINAPI PtInRect16( const RECT16 *rect, POINT16 pt )
Alexandre Julliard401710d1993-09-04 10:09:32 +000097{
98 return ((pt.x >= rect->left) && (pt.x < rect->right) &&
99 (pt.y >= rect->top) && (pt.y < rect->bottom));
100}
101
102
103/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000104 * PtInRect32 (USER32.424)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000105 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000106BOOL32 WINAPI PtInRect32( const RECT32 *rect, POINT32 pt )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000107{
108 return ((pt.x >= rect->left) && (pt.x < rect->right) &&
109 (pt.y >= rect->top) && (pt.y < rect->bottom));
110}
111
112
113/***********************************************************************
114 * OffsetRect16 (USER.77)
115 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000116void WINAPI OffsetRect16( LPRECT16 rect, INT16 x, INT16 y )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000117{
118 rect->left += x;
119 rect->right += x;
120 rect->top += y;
121 rect->bottom += y;
122}
123
124
125/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000126 * OffsetRect32 (USER32.406)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000127 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000128void WINAPI OffsetRect32( LPRECT32 rect, INT32 x, INT32 y )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000129{
130 rect->left += x;
131 rect->right += x;
132 rect->top += y;
133 rect->bottom += y;
134}
135
136
137/***********************************************************************
138 * InflateRect16 (USER.78)
139 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000140void WINAPI InflateRect16( LPRECT16 rect, INT16 x, INT16 y )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000141{
Alexandre Julliardf0b23541993-09-29 12:21:49 +0000142 rect->left -= x;
143 rect->top -= y;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000144 rect->right += x;
145 rect->bottom += y;
146}
147
148
149/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000150 * InflateRect32 (USER32.321)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000151 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000152void WINAPI InflateRect32( LPRECT32 rect, INT32 x, INT32 y )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000153{
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000154 rect->left -= x;
155 rect->top -= y;
156 rect->right += x;
157 rect->bottom += y;
158}
159
160
161/***********************************************************************
162 * IntersectRect16 (USER.79)
163 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000164BOOL16 WINAPI IntersectRect16( LPRECT16 dest, const RECT16 *src1,
165 const RECT16 *src2 )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000166{
167 if (IsRectEmpty16(src1) || IsRectEmpty16(src2) ||
Alexandre Julliardfb9a9191994-03-01 19:48:04 +0000168 (src1->left >= src2->right) || (src2->left >= src1->right) ||
Alexandre Julliard401710d1993-09-04 10:09:32 +0000169 (src1->top >= src2->bottom) || (src2->top >= src1->bottom))
170 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000171 SetRectEmpty16( dest );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000172 return FALSE;
173 }
174 dest->left = MAX( src1->left, src2->left );
175 dest->right = MIN( src1->right, src2->right );
176 dest->top = MAX( src1->top, src2->top );
177 dest->bottom = MIN( src1->bottom, src2->bottom );
178 return TRUE;
179}
180
181
182/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000183 * IntersectRect32 (USER32.327)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000184 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000185BOOL32 WINAPI IntersectRect32( LPRECT32 dest, const RECT32 *src1,
186 const RECT32 *src2 )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000187{
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000188 if (IsRectEmpty32(src1) || IsRectEmpty32(src2) ||
189 (src1->left >= src2->right) || (src2->left >= src1->right) ||
190 (src1->top >= src2->bottom) || (src2->top >= src1->bottom))
Alexandre Julliard401710d1993-09-04 10:09:32 +0000191 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000192 SetRectEmpty32( dest );
193 return FALSE;
194 }
195 dest->left = MAX( src1->left, src2->left );
196 dest->right = MIN( src1->right, src2->right );
197 dest->top = MAX( src1->top, src2->top );
198 dest->bottom = MIN( src1->bottom, src2->bottom );
199 return TRUE;
200}
201
202
203/***********************************************************************
204 * UnionRect16 (USER.80)
205 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000206BOOL16 WINAPI UnionRect16( LPRECT16 dest, const RECT16 *src1,
207 const RECT16 *src2 )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000208{
209 if (IsRectEmpty16(src1))
210 {
211 if (IsRectEmpty16(src2))
Alexandre Julliard401710d1993-09-04 10:09:32 +0000212 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000213 SetRectEmpty16( dest );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000214 return FALSE;
215 }
216 else *dest = *src2;
217 }
218 else
219 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000220 if (IsRectEmpty16(src2)) *dest = *src1;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000221 else
222 {
223 dest->left = MIN( src1->left, src2->left );
224 dest->right = MAX( src1->right, src2->right );
225 dest->top = MIN( src1->top, src2->top );
226 dest->bottom = MAX( src1->bottom, src2->bottom );
227 }
228 }
229 return TRUE;
230}
231
232
233/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000234 * UnionRect32 (USER32.559)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000235 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000236BOOL32 WINAPI UnionRect32( LPRECT32 dest, const RECT32 *src1,
237 const RECT32 *src2 )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000238{
239 if (IsRectEmpty32(src1))
240 {
241 if (IsRectEmpty32(src2))
242 {
243 SetRectEmpty32( dest );
244 return FALSE;
245 }
246 else *dest = *src2;
247 }
248 else
249 {
250 if (IsRectEmpty32(src2)) *dest = *src1;
251 else
252 {
253 dest->left = MIN( src1->left, src2->left );
254 dest->right = MAX( src1->right, src2->right );
255 dest->top = MIN( src1->top, src2->top );
256 dest->bottom = MAX( src1->bottom, src2->bottom );
257 }
258 }
259 return TRUE;
260}
261
262
263/***********************************************************************
264 * EqualRect16 (USER.244)
265 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000266BOOL16 WINAPI EqualRect16( const RECT16* rect1, const RECT16* rect2 )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000267{
268 return ((rect1->left == rect2->left) && (rect1->right == rect2->right) &&
269 (rect1->top == rect2->top) && (rect1->bottom == rect2->bottom));
270}
271
272
273/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000274 * EqualRect32 (USER32.194)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000275 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000276BOOL32 WINAPI EqualRect32( const RECT32* rect1, const RECT32* rect2 )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000277{
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000278 return ((rect1->left == rect2->left) && (rect1->right == rect2->right) &&
279 (rect1->top == rect2->top) && (rect1->bottom == rect2->bottom));
280}
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000281
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000282
283/***********************************************************************
284 * SubtractRect16 (USER.373)
285 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000286BOOL16 WINAPI SubtractRect16( LPRECT16 dest, const RECT16 *src1,
287 const RECT16 *src2 )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000288{
289 RECT16 tmp;
290
291 if (IsRectEmpty16( src1 ))
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000292 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000293 SetRectEmpty16( dest );
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000294 return FALSE;
295 }
Alexandre Julliard401710d1993-09-04 10:09:32 +0000296 *dest = *src1;
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000297 if (IntersectRect16( &tmp, src1, src2 ))
Alexandre Julliard401710d1993-09-04 10:09:32 +0000298 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000299 if (EqualRect16( &tmp, dest ))
Alexandre Julliardcdd09231994-01-12 11:12:51 +0000300 {
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000301 SetRectEmpty16( dest );
Alexandre Julliardcdd09231994-01-12 11:12:51 +0000302 return FALSE;
303 }
304 if ((tmp.top == dest->top) && (tmp.bottom == dest->bottom))
Alexandre Julliard401710d1993-09-04 10:09:32 +0000305 {
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000306 if (tmp.left == dest->left) dest->left = tmp.right;
307 else if (tmp.right == dest->right) dest->right = tmp.left;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000308 }
309 else if ((tmp.left == dest->left) && (tmp.right == dest->right))
310 {
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000311 if (tmp.top == dest->top) dest->top = tmp.bottom;
312 else if (tmp.bottom == dest->bottom) dest->bottom = tmp.top;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000313 }
314 }
315 return TRUE;
316}
317
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000318
319/***********************************************************************
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000320 * SubtractRect32 (USER32.536)
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000321 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +0000322BOOL32 WINAPI SubtractRect32( LPRECT32 dest, const RECT32 *src1,
323 const RECT32 *src2 )
Alexandre Julliarde2bfa4c1996-05-16 18:21:06 +0000324{
325 RECT32 tmp;
326
327 if (IsRectEmpty32( src1 ))
328 {
329 SetRectEmpty32( dest );
330 return FALSE;
331 }
332 *dest = *src1;
333 if (IntersectRect32( &tmp, src1, src2 ))
334 {
335 if (EqualRect32( &tmp, dest ))
336 {
337 SetRectEmpty32( dest );
338 return FALSE;
339 }
340 if ((tmp.top == dest->top) && (tmp.bottom == dest->bottom))
341 {
342 if (tmp.left == dest->left) dest->left = tmp.right;
343 else if (tmp.right == dest->right) dest->right = tmp.left;
344 }
345 else if ((tmp.left == dest->left) && (tmp.right == dest->right))
346 {
347 if (tmp.top == dest->top) dest->top = tmp.bottom;
348 else if (tmp.bottom == dest->bottom) dest->bottom = tmp.top;
349 }
350 }
351 return TRUE;
352}