Release 960414
[wine.git] / misc / rect.c
blob68eb4625ad48c94429638531e2ae40bbeed34321
1 /*
2 * Rectangle-related functions
4 * Copyright 1993 Alexandre Julliard
6 */
8 #include "windows.h"
11 /***********************************************************************
12 * SetRect (USER.72)
14 void SetRect( LPRECT rect, short left, short top, short right, short bottom )
16 rect->left = left;
17 rect->right = right;
18 rect->top = top;
19 rect->bottom = bottom;
23 /***********************************************************************
24 * SetRectEmpty (USER.73)
26 void SetRectEmpty( LPRECT rect )
28 rect->left = rect->right = rect->top = rect->bottom = 0;
32 /***********************************************************************
33 * CopyRect (USER.74)
35 BOOL CopyRect( LPRECT dest, LPRECT src )
37 *dest = *src;
38 return TRUE;
42 /***********************************************************************
43 * IsRectEmpty (USER.75)
45 BOOL IsRectEmpty( LPRECT rect )
47 return ((rect->left == rect->right) || (rect->top == rect->bottom));
51 /***********************************************************************
52 * PtInRect (USER.76)
54 BOOL PtInRect( LPRECT rect, POINT pt )
56 return ((pt.x >= rect->left) && (pt.x < rect->right) &&
57 (pt.y >= rect->top) && (pt.y < rect->bottom));
61 /***********************************************************************
62 * OffsetRect (USER.77)
64 void OffsetRect( LPRECT rect, short x, short y )
66 rect->left += x;
67 rect->right += x;
68 rect->top += y;
69 rect->bottom += y;
73 /***********************************************************************
74 * InflateRect (USER.78)
76 void InflateRect( LPRECT rect, short x, short y )
78 rect->left -= x;
79 rect->top -= y;
80 rect->right += x;
81 rect->bottom += y;
85 /***********************************************************************
86 * IntersectRect (USER.79)
88 BOOL IntersectRect( LPRECT dest, LPRECT src1, LPRECT src2 )
90 if (IsRectEmpty(src1) || IsRectEmpty(src2) ||
91 (src1->left >= src2->right) || (src2->left >= src1->right) ||
92 (src1->top >= src2->bottom) || (src2->top >= src1->bottom))
94 SetRectEmpty( dest );
95 return FALSE;
97 dest->left = MAX( src1->left, src2->left );
98 dest->right = MIN( src1->right, src2->right );
99 dest->top = MAX( src1->top, src2->top );
100 dest->bottom = MIN( src1->bottom, src2->bottom );
101 return TRUE;
105 /***********************************************************************
106 * UnionRect (USER.80)
108 BOOL UnionRect( LPRECT dest, LPRECT src1, LPRECT src2 )
110 if (IsRectEmpty(src1))
112 if (IsRectEmpty(src2))
114 SetRectEmpty( dest );
115 return FALSE;
117 else *dest = *src2;
119 else
121 if (IsRectEmpty(src2)) *dest = *src1;
122 else
124 dest->left = MIN( src1->left, src2->left );
125 dest->right = MAX( src1->right, src2->right );
126 dest->top = MIN( src1->top, src2->top );
127 dest->bottom = MAX( src1->bottom, src2->bottom );
130 return TRUE;
134 /***********************************************************************
135 * EqualRect (USER.244)
137 BOOL EqualRect( const RECT* rect1, const RECT* rect2 )
139 return ((rect1->left == rect2->left) && (rect1->right == rect2->right) &&
140 (rect1->top == rect2->top) && (rect1->bottom == rect2->bottom));
144 /***********************************************************************
145 * SubtractRect (USER.373)
147 BOOL SubtractRect( LPRECT dest, LPRECT src1, LPRECT src2 )
149 RECT tmp;
151 if (IsRectEmpty( src1 ))
153 SetRectEmpty( dest );
154 return FALSE;
156 *dest = *src1;
157 if (IntersectRect( &tmp, src1, src2 ))
159 if (EqualRect( &tmp, dest ))
161 SetRectEmpty( dest );
162 return FALSE;
164 if ((tmp.top == dest->top) && (tmp.bottom == dest->bottom))
166 if (tmp.left == dest->left) dest->left = tmp.right;
167 else if (tmp.right == dest->right) dest->right = tmp.left;
169 else if ((tmp.left == dest->left) && (tmp.right == dest->right))
171 if (tmp.top == dest->top) dest->top = tmp.bottom;
172 else if (tmp.bottom == dest->bottom) dest->bottom = tmp.top;
175 return TRUE;