2 * Rectangle-related functions
4 * Copyright 1993, 1996 Alexandre Julliard
10 #include "wine/winuser16.h"
13 /***********************************************************************
16 void WINAPI
SetRect16( LPRECT16 rect
, INT16 left
, INT16 top
,
17 INT16 right
, INT16 bottom
)
22 rect
->bottom
= bottom
;
26 /***********************************************************************
29 BOOL WINAPI
SetRect( LPRECT rect
, INT left
, INT top
,
30 INT right
, INT bottom
)
32 if (!rect
) return FALSE
;
36 rect
->bottom
= bottom
;
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;
61 /***********************************************************************
64 BOOL16 WINAPI
CopyRect16( RECT16
*dest
, const RECT16
*src
)
71 /***********************************************************************
74 BOOL WINAPI
CopyRect( RECT
*dest
, const RECT
*src
)
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 /***********************************************************************
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
)
139 /***********************************************************************
140 * OffsetRect (USER32.@)
142 BOOL WINAPI
OffsetRect( LPRECT rect
, INT x
, INT y
)
144 if (!rect
) return FALSE
;
153 /***********************************************************************
154 * InflateRect (USER.78)
156 void WINAPI
InflateRect16( LPRECT16 rect
, INT16 x
, INT16 y
)
165 /***********************************************************************
166 * InflateRect (USER32.@)
168 BOOL WINAPI
InflateRect( LPRECT rect
, INT x
, INT y
)
170 if (!rect
) return FALSE
;
179 /***********************************************************************
180 * IntersectRect (USER.79)
182 BOOL16 WINAPI
IntersectRect16( LPRECT16 dest
, const RECT16
*src1
,
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
);
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
);
200 /***********************************************************************
201 * IntersectRect (USER32.@)
203 BOOL WINAPI
IntersectRect( LPRECT dest
, const RECT
*src1
,
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
);
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
);
222 /***********************************************************************
223 * UnionRect (USER.80)
225 BOOL16 WINAPI
UnionRect16( LPRECT16 dest
, const RECT16
*src1
,
228 if (IsRectEmpty16(src1
))
230 if (IsRectEmpty16(src2
))
232 SetRectEmpty16( dest
);
239 if (IsRectEmpty16(src2
)) *dest
= *src1
;
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
);
252 /***********************************************************************
253 * UnionRect (USER32.@)
255 BOOL WINAPI
UnionRect( LPRECT dest
, const RECT
*src1
,
258 if (!dest
) return FALSE
;
259 if (IsRectEmpty(src1
))
261 if (IsRectEmpty(src2
))
263 SetRectEmpty( dest
);
270 if (IsRectEmpty(src2
)) *dest
= *src1
;
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
);
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
,
312 if (IsRectEmpty16( src1
))
314 SetRectEmpty16( dest
);
318 if (IntersectRect16( &tmp
, src1
, src2
))
320 if (EqualRect16( &tmp
, dest
))
322 SetRectEmpty16( dest
);
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
;
340 /***********************************************************************
341 * SubtractRect (USER32.@)
343 BOOL WINAPI
SubtractRect( LPRECT dest
, const RECT
*src1
,
348 if (!dest
) return FALSE
;
349 if (IsRectEmpty( src1
))
351 SetRectEmpty( dest
);
355 if (IntersectRect( &tmp
, src1
, src2
))
357 if (EqualRect( &tmp
, dest
))
359 SetRectEmpty( dest
);
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
;