1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Server DLL
4 * FILE: win32ss/user/winsrv/consrv/include/rect.h
5 * PURPOSE: Rectangle helper functions
6 * PROGRAMMERS: G� van Geldorp
7 * Jeffrey Morlan
8 */
9
10 #pragma once
11
12 #define ConioInitLongRect(Rect, Top, Left, Bottom, Right) \
13 do { \
14 ((Rect)->top) = Top; \
15 ((Rect)->left) = Left; \
16 ((Rect)->bottom) = Bottom; \
17 ((Rect)->right) = Right; \
18 } while (0)
19
20 #define ConioInitRect(Rect, top, left, bottom, right) \
21 do { \
22 ((Rect)->Top) = top; \
23 ((Rect)->Left) = left; \
24 ((Rect)->Bottom) = bottom; \
25 ((Rect)->Right) = right; \
26 } while (0)
27
28 #define ConioIsRectEmpty(Rect) \
29 (((Rect)->Left > (Rect)->Right) || ((Rect)->Top > (Rect)->Bottom))
30
31 #define ConioRectHeight(Rect) \
32 (((Rect)->Top > (Rect)->Bottom) ? 0 : ((Rect)->Bottom - (Rect)->Top + 1))
33 #define ConioRectWidth(Rect) \
34 (((Rect)->Left > (Rect)->Right) ? 0 : ((Rect)->Right - (Rect)->Left + 1))
35
36
37 static __inline BOOLEAN
ConioGetIntersection(OUT PSMALL_RECT Intersection,IN PSMALL_RECT Rect1,IN PSMALL_RECT Rect2)38 ConioGetIntersection(OUT PSMALL_RECT Intersection,
39 IN PSMALL_RECT Rect1,
40 IN PSMALL_RECT Rect2)
41 {
42 if ( ConioIsRectEmpty(Rect1) ||
43 ConioIsRectEmpty(Rect2) ||
44 (Rect1->Top > Rect2->Bottom) ||
45 (Rect1->Left > Rect2->Right) ||
46 (Rect1->Bottom < Rect2->Top) ||
47 (Rect1->Right < Rect2->Left) )
48 {
49 /* The rectangles do not intersect */
50 ConioInitRect(Intersection, 0, -1, 0, -1);
51 return FALSE;
52 }
53
54 ConioInitRect(Intersection,
55 max(Rect1->Top , Rect2->Top ),
56 max(Rect1->Left , Rect2->Left ),
57 min(Rect1->Bottom, Rect2->Bottom),
58 min(Rect1->Right , Rect2->Right ));
59
60 return TRUE;
61 }
62
63 static __inline BOOLEAN
ConioGetUnion(OUT PSMALL_RECT Union,IN PSMALL_RECT Rect1,IN PSMALL_RECT Rect2)64 ConioGetUnion(OUT PSMALL_RECT Union,
65 IN PSMALL_RECT Rect1,
66 IN PSMALL_RECT Rect2)
67 {
68 if (ConioIsRectEmpty(Rect1))
69 {
70 if (ConioIsRectEmpty(Rect2))
71 {
72 ConioInitRect(Union, 0, -1, 0, -1);
73 return FALSE;
74 }
75 else
76 {
77 *Union = *Rect2;
78 }
79 }
80 else if (ConioIsRectEmpty(Rect2))
81 {
82 *Union = *Rect1;
83 }
84 else
85 {
86 ConioInitRect(Union,
87 min(Rect1->Top , Rect2->Top ),
88 min(Rect1->Left , Rect2->Left ),
89 max(Rect1->Bottom, Rect2->Bottom),
90 max(Rect1->Right , Rect2->Right ));
91 }
92
93 return TRUE;
94 }
95