2 * Rectangle-related functions
4 * Copyright 1993 Alexandre Julliard
11 /***********************************************************************
14 void SetRect( LPRECT rect
, short left
, short top
, short right
, short bottom
)
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 /***********************************************************************
35 BOOL
CopyRect( LPRECT dest
, LPRECT src
)
42 /***********************************************************************
43 * IsRectEmpty (USER.75)
45 BOOL
IsRectEmpty( LPRECT rect
)
47 return ((rect
->left
== rect
->right
) || (rect
->top
== rect
->bottom
));
51 /***********************************************************************
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
)
73 /***********************************************************************
74 * InflateRect (USER.78)
76 void InflateRect( LPRECT rect
, short x
, short 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
))
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
);
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
);
121 if (IsRectEmpty(src2
)) *dest
= *src1
;
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
);
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
)
151 if (IsRectEmpty( src1
))
153 SetRectEmpty( dest
);
157 if (IntersectRect( &tmp
, src1
, src2
))
159 if (EqualRect( &tmp
, dest
))
161 SetRectEmpty( dest
);
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
;