1 # include "appUtilConfig.h"
2
3 # include <limits.h>
4 # include "geo2DInteger.h"
5
geoInitRectangle(DocumentRectangle * dr)6 void geoInitRectangle( DocumentRectangle * dr )
7 { dr->drX0= dr->drY0= dr->drX1= dr->drY1= 0; return; }
8
geoInvalidateRectangle(DocumentRectangle * dr)9 void geoInvalidateRectangle( DocumentRectangle * dr )
10 {
11 dr->drX0= dr->drY0= INT_MAX;
12 dr->drX1= dr->drY1= INT_MIN;
13
14 return;
15 }
16
17 /************************************************************************/
18 /* */
19 /* Remove the possible orientation of a rectangle: Make sure x0 <= x1 */
20 /* and y0 <= y1. */
21 /* */
22 /************************************************************************/
23
geoNormalizeRectangle(DocumentRectangle * drTo,const DocumentRectangle * drFrom)24 void geoNormalizeRectangle( DocumentRectangle * drTo,
25 const DocumentRectangle * drFrom )
26 {
27 DocumentRectangle dr;
28 int swap;
29
30 dr= *drFrom;
31
32 if ( dr.drX1 < dr.drX0 )
33 { swap= dr.drX1; dr.drX1= dr.drX0; dr.drX0= swap; }
34
35 if ( dr.drY1 < dr.drY0 )
36 { swap= dr.drY1; dr.drY1= dr.drY0; dr.drY0= swap; }
37
38 *drTo= dr;
39
40 return;
41 }
42
geoUnionRectangle(DocumentRectangle * dr,const DocumentRectangle * dr1,const DocumentRectangle * dr2)43 void geoUnionRectangle( DocumentRectangle * dr,
44 const DocumentRectangle * dr1,
45 const DocumentRectangle * dr2 )
46 {
47 if ( dr1->drX0 < dr2->drX0 )
48 { dr->drX0= dr1->drX0; }
49 else{ dr->drX0= dr2->drX0; }
50
51 if ( dr1->drY0 < dr2->drY0 )
52 { dr->drY0= dr1->drY0; }
53 else{ dr->drY0= dr2->drY0; }
54
55 if ( dr1->drX1 < dr2->drX1 )
56 { dr->drX1= dr2->drX1; }
57 else{ dr->drX1= dr1->drX1; }
58
59 if ( dr1->drY1 < dr2->drY1 )
60 { dr->drY1= dr2->drY1; }
61 else{ dr->drY1= dr1->drY1; }
62 }
63
geoIntersectRectangle(DocumentRectangle * dr,const DocumentRectangle * dr1,const DocumentRectangle * dr2)64 int geoIntersectRectangle( DocumentRectangle * dr,
65 const DocumentRectangle * dr1,
66 const DocumentRectangle * dr2 )
67 {
68 DocumentRectangle res= *dr1;
69
70 if ( dr1->drX1 < dr2->drX0 )
71 { return 0; }
72
73 if ( dr2->drX1 < dr1->drX0 )
74 { return 0; }
75
76 if ( dr1->drY1 < dr2->drY0 )
77 { return 0; }
78
79 if ( dr2->drY1 < dr1->drY0 )
80 { return 0; }
81
82 if ( ! dr )
83 { return 1; }
84
85 if ( dr1->drX0 < dr2->drX0 )
86 { res.drX0= dr2->drX0; }
87 else{ res.drX0= dr1->drX0; }
88
89 if ( dr1->drY0 < dr2->drY0 )
90 { res.drY0= dr2->drY0; }
91 else{ res.drY0= dr1->drY0; }
92
93 if ( dr1->drX1 < dr2->drX1 )
94 { res.drX1= dr1->drX1; }
95 else{ res.drX1= dr2->drX1; }
96
97 if ( dr1->drY1 < dr2->drY1 )
98 { res.drY1= dr1->drY1; }
99 else{ res.drY1= dr2->drY1; }
100
101 *dr= res; return 1;
102 }
103
104