Extrenal srt problem gst-1 solved.
[openblackhole/openblackhole-enigma2.git] / lib / gdi / erect.cpp
1 #include <lib/gdi/erect.h>
2 #include <lib/base/eerror.h>
3
4 /*****************************************************************************
5   eRect member functions
6  *****************************************************************************/
7
8 eRect eRect::normalize() const
9 {
10         eRect r;
11         if ( x2 < x1 ) {                                // swap bad x values
12         r.x1 = x2;
13         r.x2 = x1;
14         } else {
15         r.x1 = x1;
16         r.x2 = x2;
17         }
18         if ( y2 < y1 ) {                                // swap bad y values
19         r.y1 = y2;
20         r.y2 = y1;
21         } else {
22         r.y1 = y1;
23         r.y2 = y2;
24         }
25         return r;
26 }
27
28 void eRect::rect( int *x, int *y, int *w, int *h ) const
29 {
30         *x = x1;
31         *y = y1;
32         *w = x2-x1;
33         *h = y2-y1;
34 }
35
36 void eRect::coords( int *xp1, int *yp1, int *xp2, int *yp2 ) const
37 {
38         *xp1 = x1;
39         *yp1 = y1;
40         *xp2 = x2;
41         *yp2 = y2;
42 }
43
44 void eRect::moveTopLeft( const ePoint &p )
45 {
46         x2 += (p.x() - x1);
47         y2 += (p.y() - y1);
48         x1 = p.x();
49         y1 = p.y();
50 }
51
52 void eRect::moveBottomRight( const ePoint &p )
53 {
54         x1 += (p.x() - x2);
55         y1 += (p.y() - y2);
56         x2 = p.x();
57         y2 = p.y();
58 }
59
60 void eRect::moveTopRight( const ePoint &p )
61 {
62         x1 += (p.x() - x2);
63         y2 += (p.y() - y1);
64         x2 = p.x();
65         y1 = p.y();
66 }
67
68 void eRect::moveBottomLeft( const ePoint &p )
69 {
70         x2 += (p.x() - x1);
71         y1 += (p.y() - y2);
72         x1 = p.x();
73         y2 = p.y();
74 }
75
76 void eRect::moveCenter( const ePoint &p )
77 {
78         int w = x2 - x1;
79         int h = y2 - y1;
80         x1 = (p.x() - w/2);
81         y1 = (p.y() - h/2);
82         x2 = x1 + w;
83         y2 = y1 + h;
84 }
85
86 void eRect::setRect( int x, int y, int w, int h )
87 {
88         x1 = x;
89         y1 = y;
90         x2 = (x+w);
91         y2 = (y+h);
92 }
93
94 void eRect::setCoords( int xp1, int yp1, int xp2, int yp2 )
95 {
96         x1 = xp1;
97         y1 = yp1;
98         x2 = xp2;
99         y2 = yp2;
100 }
101
102 void eRect::setWidth( int w )
103 {
104         x2 = x1 + w;
105 }
106
107 void eRect::setHeight( int h )
108 {
109         y2 = y1 + h;
110 }
111
112 void eRect::setSize( const eSize &s )
113 {
114         x2 = s.width() +x1;
115         y2 = s.height()+y1;
116 }
117
118 bool eRect::contains( const ePoint &p) const
119 {
120         return p.x() >= x1 && p.x() < x2 &&
121                    p.y() >= y1 && p.y() < y2;
122 }
123
124 bool eRect::contains( const eRect &r) const
125 {
126         return r.x1 >= x1 &&
127                                  r.x2 <= x2 &&
128                                  r.y1 >= y1 &&
129                                  r.y2 <= y2;
130 }
131
132 eRect& eRect::operator|=(const eRect &r)
133 {
134         *this = *this | r;
135         return *this;
136 }
137
138 eRect& eRect::operator&=(const eRect &r)
139 {
140         *this = *this & r;
141         return *this;
142 }
143
144 eRect eRect::operator|(const eRect &r) const
145 {
146         if ( valid() ) {
147         if ( r.valid() ) {
148                 eRect tmp;
149                 tmp.setLeft(   MIN( x1, r.x1 ) );
150                 tmp.setRight(  MAX( x2, r.x2 ) );
151                 tmp.setTop(        MIN( y1, r.y1 ) );
152                 tmp.setBottom( MAX( y2, r.y2 ) );
153                 return tmp;
154         } else {
155                 return *this;
156         }
157         } else {
158         return r;
159         }
160 }
161
162 eRect eRect::unite( const eRect &r ) const
163 {
164         return *this | r;
165 }
166
167 eRect eRect::operator&( const eRect &r ) const
168 {
169         eRect tmp;
170         tmp.x1 = MAX( x1, r.x1 );
171         tmp.x2 = MIN( x2, r.x2 );
172         tmp.y1 = MAX( y1, r.y1 );
173         tmp.y2 = MIN( y2, r.y2 );
174         return tmp;
175 }
176
177 eRect eRect::intersect( const eRect &r ) const
178 {
179         return *this & r;
180 }
181
182 bool eRect::intersects( const eRect &r ) const
183 {
184         return ( MAX( x1, r.x1 ) < MIN( x2, r.x2 ) &&
185                  MAX( y1, r.y1 ) < MIN( y2, r.y2 ) );
186 }
187
188 bool operator==( const eRect &r1, const eRect &r2 )
189 {
190         return r1.x1==r2.x1 && r1.x2==r2.x2 && r1.y1==r2.y1 && r1.y2==r2.y2;
191 }
192
193 bool operator!=( const eRect &r1, const eRect &r2 )
194 {
195         return r1.x1!=r2.x1 || r1.x2!=r2.x2 || r1.y1!=r2.y1 || r1.y2!=r2.y2;
196 }
197
198 void eRect::scale(int x_n, int x_d, int y_n, int y_d)
199 {
200         ASSERT(x_d); ASSERT(y_d);
201         x1 *= x_n; x1 /= x_d;
202         x2 *= x_n; x2 /= x_d;
203         y1 *= y_n; y1 /= y_d;
204         y2 *= y_n; y2 /= y_d;
205 }
206