Fix return type of GetAsyncKeyState.
[wine/testsucceed.git] / windows / rect.c
blobd5bcef14d6ddbc4f649e95dcddf557c5ee63ecbd
1 /*
2 * Rectangle-related functions
4 * Copyright 1993, 1996 Alexandre Julliard
6 */
8 #include "windef.h"
9 #include "wingdi.h"
10 #include "wine/winuser16.h"
11 #include "winuser.h"
13 /***********************************************************************
14 * SetRect (USER.72)
16 void WINAPI SetRect16( LPRECT16 rect, INT16 left, INT16 top,
17 INT16 right, INT16 bottom )
19 rect->left = left;
20 rect->right = right;
21 rect->top = top;
22 rect->bottom = bottom;
26 /***********************************************************************
27 * SetRect (USER32.@)
29 BOOL WINAPI SetRect( LPRECT rect, INT left, INT top,
30 INT right, INT bottom )
32 if (!rect) return FALSE;
33 rect->left = left;
34 rect->right = right;
35 rect->top = top;
36 rect->bottom = bottom;
37 return TRUE;
41 /***********************************************************************
42 * SetRectEmpty (USER.73)
44 void WINAPI SetRectEmpty16( LPRECT16 rect )
46 rect->left = rect->right = rect->top = rect->bottom = 0;
50 /***********************************************************************
51 * SetRectEmpty (USER32.@)
53 BOOL WINAPI SetRectEmpty( LPRECT rect )
55 if (!rect) return FALSE;
56 rect->left = rect->right = rect->top = rect->bottom = 0;
57 return TRUE;
61 /***********************************************************************
62 * CopyRect (USER.74)
64 BOOL16 WINAPI CopyRect16( RECT16 *dest, const RECT16 *src )
66 *dest = *src;
67 return TRUE;
71 /***********************************************************************
72 * CopyRect (USER32.@)
74 BOOL WINAPI CopyRect( RECT *dest, const RECT *src )
76 if (!dest || !src)
77 return FALSE;
78 *dest = *src;
79 return TRUE;
83 /***********************************************************************
84 * IsRectEmpty (USER.75)
86 * Bug compat: Windows checks for 0 or negative width/height.
88 BOOL16 WINAPI IsRectEmpty16( const RECT16 *rect )
90 return ((rect->left >= rect->right) || (rect->top >= rect->bottom));
94 /***********************************************************************
95 * IsRectEmpty (USER32.@)
97 * Bug compat: Windows checks for 0 or negative width/height.
99 BOOL WINAPI IsRectEmpty( const RECT *rect )
101 if (!rect) return TRUE;
102 return ((rect->left >= rect->right) || (rect->top >= rect->bottom));
106 /***********************************************************************
107 * PtInRect (USER.76)
109 BOOL16 WINAPI PtInRect16( const RECT16 *rect, POINT16 pt )
111 return ((pt.x >= rect->left) && (pt.x < rect->right) &&
112 (pt.y >= rect->top) && (pt.y < rect->bottom));
116 /***********************************************************************
117 * PtInRect (USER32.@)
119 BOOL WINAPI PtInRect( const RECT *rect, POINT pt )
121 if (!rect) return FALSE;
122 return ((pt.x >= rect->left) && (pt.x < rect->right) &&
123 (pt.y >= rect->top) && (pt.y < rect->bottom));
127 /***********************************************************************
128 * OffsetRect (USER.77)
130 void WINAPI OffsetRect16( LPRECT16 rect, INT16 x, INT16 y )
132 rect->left += x;
133 rect->right += x;
134 rect->top += y;
135 rect->bottom += y;
139 /***********************************************************************
140 * OffsetRect (USER32.@)
142 BOOL WINAPI OffsetRect( LPRECT rect, INT x, INT y )
144 if (!rect) return FALSE;
145 rect->left += x;
146 rect->right += x;
147 rect->top += y;
148 rect->bottom += y;
149 return TRUE;
153 /***********************************************************************
154 * InflateRect (USER.78)
156 void WINAPI InflateRect16( LPRECT16 rect, INT16 x, INT16 y )
158 rect->left -= x;
159 rect->top -= y;
160 rect->right += x;
161 rect->bottom += y;
165 /***********************************************************************
166 * InflateRect (USER32.@)
168 BOOL WINAPI InflateRect( LPRECT rect, INT x, INT y )
170 if (!rect) return FALSE;
171 rect->left -= x;
172 rect->top -= y;
173 rect->right += x;
174 rect->bottom += y;
175 return TRUE;
179 /***********************************************************************
180 * IntersectRect (USER.79)
182 BOOL16 WINAPI IntersectRect16( LPRECT16 dest, const RECT16 *src1,
183 const RECT16 *src2 )
185 if (IsRectEmpty16(src1) || IsRectEmpty16(src2) ||
186 (src1->left >= src2->right) || (src2->left >= src1->right) ||
187 (src1->top >= src2->bottom) || (src2->top >= src1->bottom))
189 SetRectEmpty16( dest );
190 return FALSE;
192 dest->left = max( src1->left, src2->left );
193 dest->right = min( src1->right, src2->right );
194 dest->top = max( src1->top, src2->top );
195 dest->bottom = min( src1->bottom, src2->bottom );
196 return TRUE;
200 /***********************************************************************
201 * IntersectRect (USER32.@)
203 BOOL WINAPI IntersectRect( LPRECT dest, const RECT *src1,
204 const RECT *src2 )
206 if (!dest || !src1 || !src2) return FALSE;
207 if (IsRectEmpty(src1) || IsRectEmpty(src2) ||
208 (src1->left >= src2->right) || (src2->left >= src1->right) ||
209 (src1->top >= src2->bottom) || (src2->top >= src1->bottom))
211 SetRectEmpty( dest );
212 return FALSE;
214 dest->left = max( src1->left, src2->left );
215 dest->right = min( src1->right, src2->right );
216 dest->top = max( src1->top, src2->top );
217 dest->bottom = min( src1->bottom, src2->bottom );
218 return TRUE;
222 /***********************************************************************
223 * UnionRect (USER.80)
225 BOOL16 WINAPI UnionRect16( LPRECT16 dest, const RECT16 *src1,
226 const RECT16 *src2 )
228 if (IsRectEmpty16(src1))
230 if (IsRectEmpty16(src2))
232 SetRectEmpty16( dest );
233 return FALSE;
235 else *dest = *src2;
237 else
239 if (IsRectEmpty16(src2)) *dest = *src1;
240 else
242 dest->left = min( src1->left, src2->left );
243 dest->right = max( src1->right, src2->right );
244 dest->top = min( src1->top, src2->top );
245 dest->bottom = max( src1->bottom, src2->bottom );
248 return TRUE;
252 /***********************************************************************
253 * UnionRect (USER32.@)
255 BOOL WINAPI UnionRect( LPRECT dest, const RECT *src1,
256 const RECT *src2 )
258 if (!dest) return FALSE;
259 if (IsRectEmpty(src1))
261 if (IsRectEmpty(src2))
263 SetRectEmpty( dest );
264 return FALSE;
266 else *dest = *src2;
268 else
270 if (IsRectEmpty(src2)) *dest = *src1;
271 else
273 dest->left = min( src1->left, src2->left );
274 dest->right = max( src1->right, src2->right );
275 dest->top = min( src1->top, src2->top );
276 dest->bottom = max( src1->bottom, src2->bottom );
279 return TRUE;
283 /***********************************************************************
284 * EqualRect (USER.244)
286 BOOL16 WINAPI EqualRect16( const RECT16* rect1, const RECT16* rect2 )
288 return ((rect1->left == rect2->left) && (rect1->right == rect2->right) &&
289 (rect1->top == rect2->top) && (rect1->bottom == rect2->bottom));
293 /***********************************************************************
294 * EqualRect (USER32.@)
296 BOOL WINAPI EqualRect( const RECT* rect1, const RECT* rect2 )
298 if (!rect1 || !rect2) return FALSE;
299 return ((rect1->left == rect2->left) && (rect1->right == rect2->right) &&
300 (rect1->top == rect2->top) && (rect1->bottom == rect2->bottom));
304 /***********************************************************************
305 * SubtractRect (USER.373)
307 BOOL16 WINAPI SubtractRect16( LPRECT16 dest, const RECT16 *src1,
308 const RECT16 *src2 )
310 RECT16 tmp;
312 if (IsRectEmpty16( src1 ))
314 SetRectEmpty16( dest );
315 return FALSE;
317 *dest = *src1;
318 if (IntersectRect16( &tmp, src1, src2 ))
320 if (EqualRect16( &tmp, dest ))
322 SetRectEmpty16( dest );
323 return FALSE;
325 if ((tmp.top == dest->top) && (tmp.bottom == dest->bottom))
327 if (tmp.left == dest->left) dest->left = tmp.right;
328 else if (tmp.right == dest->right) dest->right = tmp.left;
330 else if ((tmp.left == dest->left) && (tmp.right == dest->right))
332 if (tmp.top == dest->top) dest->top = tmp.bottom;
333 else if (tmp.bottom == dest->bottom) dest->bottom = tmp.top;
336 return TRUE;
340 /***********************************************************************
341 * SubtractRect (USER32.@)
343 BOOL WINAPI SubtractRect( LPRECT dest, const RECT *src1,
344 const RECT *src2 )
346 RECT tmp;
348 if (!dest) return FALSE;
349 if (IsRectEmpty( src1 ))
351 SetRectEmpty( dest );
352 return FALSE;
354 *dest = *src1;
355 if (IntersectRect( &tmp, src1, src2 ))
357 if (EqualRect( &tmp, dest ))
359 SetRectEmpty( dest );
360 return FALSE;
362 if ((tmp.top == dest->top) && (tmp.bottom == dest->bottom))
364 if (tmp.left == dest->left) dest->left = tmp.right;
365 else if (tmp.right == dest->right) dest->right = tmp.left;
367 else if ((tmp.left == dest->left) && (tmp.right == dest->right))
369 if (tmp.top == dest->top) dest->top = tmp.bottom;
370 else if (tmp.bottom == dest->bottom) dest->bottom = tmp.top;
373 return TRUE;