fix
[enigma2.git] / lib / gdi / erect.h
1 #ifndef ERECT_H
2 #define ERECT_H
3
4 #include <lib/gdi/esize.h>
5 #include <lib/gdi/epoint.h>
6
7
8 // x2 = x1 + width  (AND NOT, NEVER, NEVER EVER +1 or -1 !!!!)
9
10 class eRect // rectangle class
11 {
12         friend class gRegion;
13 public:
14                         /* eRect() constructs an INVALID rectangle. */
15         eRect() { x1 = y1 = 0; x2 = y2 = -1; }
16         eRect( const ePoint &topleft, const ePoint &bottomright );
17
18         // we use this contructor very often... do it inline...
19         eRect( const ePoint &topleft, const eSize &size )
20         {
21                 x1 = topleft.x();
22                 y1 = topleft.y();
23                 x2 = (x1+size.width());
24                 y2 = (y1+size.height());
25         }
26
27         eRect( int left, int top, int width, int height );
28
29         bool empty()    const;
30         bool valid()    const;
31         eRect normalize()       const;
32
33         int left()      const;
34         int top()       const;
35         int right()     const;
36         int  bottom()   const;
37         int &rLeft();
38         int &rTop();
39         int &rRight();
40         int &rBottom();
41
42         int x() const;
43         int y() const;
44         void setLeft( int pos );
45         void setTop( int pos );
46         void setRight( int pos );
47         void setBottom( int pos );
48         void setX( int x );
49         void setY( int y );
50
51         ePoint topLeft()         const;
52         ePoint bottomRight() const;
53         ePoint topRight()        const;
54         ePoint bottomLeft()      const;
55
56                 /* the sole intention of these functions
57                    is to allow painting frames without 
58                    messing around with the coordinates.
59                    they point to the last pixel included
60                    in the rectangle (which means that 1 is
61                    subtracted from the right and bottom 
62                    coordinates  */
63         ePoint topLeft1()        const;
64         ePoint bottomRight1() const;
65         ePoint topRight1()       const;
66         ePoint bottomLeft1()     const;
67         ePoint center()  const;
68
69         void rect( int *x, int *y, int *w, int *h ) const;
70         void coords( int *x1, int *y1, int *x2, int *y2 ) const;
71
72         void moveTopLeft( const ePoint &p );
73         void moveBottomRight( const ePoint &p );
74         void moveTopRight( const ePoint &p );
75         void moveBottomLeft( const ePoint &p );
76         void moveCenter( const ePoint &p );
77
78         void moveBy( int dx, int dy )
79         {
80                 x1 += dx;
81                 y1 += dy;
82                 x2 += dx;
83                 y2 += dy;
84         }
85
86         void moveBy(ePoint r)
87         {
88                 x1 += r.x();
89                 y1 += r.y();
90                 x2 += r.x();
91                 y2 += r.y();
92         }
93
94         void setRect( int x, int y, int w, int h );
95         void setCoords( int x1, int y1, int x2, int y2 );
96
97         eSize size()    const;
98         int width()     const;
99         int height()    const;
100         void setWidth( int w );
101         void setHeight( int h );
102         void setSize( const eSize &s );
103
104         eRect operator|(const eRect &r) const;
105         eRect operator&(const eRect &r) const;
106         eRect& operator|=(const eRect &r);
107         eRect& operator&=(const eRect &r);
108
109         bool contains( const ePoint &p) const;
110         bool contains( int x, int y) const;
111         bool contains( const eRect &r) const;
112         eRect unite( const eRect &r ) const;
113         eRect intersect( const eRect &r ) const;
114         bool intersects( const eRect &r ) const;
115
116         friend bool operator==( const eRect &, const eRect & );
117         friend bool operator!=( const eRect &, const eRect & );
118         
119         static eRect emptyRect() { return eRect(0, 0, 0, 0); }
120         static eRect invalidRect() { return eRect(); }
121         
122 private:
123         int x1;
124         int y1;
125         int x2;
126         int y2;
127 };
128
129 bool operator==( const eRect &, const eRect & );
130 bool operator!=( const eRect &, const eRect & );
131
132
133 /*****************************************************************************
134   eRect inline member functions
135  *****************************************************************************/
136
137 inline eRect::eRect( int left, int top, int width, int height )
138 {
139         x1 = left;
140         y1 = top;
141         x2 = left+width;
142         y2 = top+height;
143 }
144
145 inline bool eRect::empty() const
146 { return x1 == x2 || y1 == y2; }
147
148 inline bool eRect::valid() const
149 { return x1 <= x2 && y1 <= y2; }
150
151 inline int eRect::left() const
152 { return x1; }
153
154 inline int eRect::top() const
155 { return y1; }
156
157 inline int eRect::right() const
158 { return x2; }
159
160 inline int eRect::bottom() const
161 { return y2; }
162
163 inline int &eRect::rLeft()
164 { return x1; }
165
166 inline int & eRect::rTop()
167 { return y1; }
168
169 inline int & eRect::rRight()
170 { return x2; }
171
172 inline int & eRect::rBottom()
173 { return y2; }
174
175 inline int eRect::x() const
176 { return x1; }
177
178 inline int eRect::y() const
179 { return y1; }
180
181 inline void eRect::setLeft( int pos )
182 { x1 = pos; }
183
184 inline void eRect::setTop( int pos )
185 { y1 = pos; }
186
187 inline void eRect::setRight( int pos )
188 { x2 = pos; }
189
190 inline void eRect::setBottom( int pos )
191 { y2 = pos; }
192
193 inline void eRect::setX( int x )
194 { x1 = x; }
195
196 inline void eRect::setY( int y )
197 { y1 = y; }
198
199 inline ePoint eRect::topLeft() const
200 { return ePoint(x1, y1); }
201
202 inline ePoint eRect::bottomRight() const
203 { return ePoint(x2, y2); }
204
205 inline ePoint eRect::topRight() const
206 { return ePoint(x2, y1); }
207
208 inline ePoint eRect::bottomLeft() const
209 { return ePoint(x1, y2); }
210
211 inline ePoint eRect::topLeft1() const
212 { return ePoint(x1, y1); }
213
214 inline ePoint eRect::bottomRight1() const
215 { return ePoint(x2-1, y2-1); }
216
217 inline ePoint eRect::topRight1() const
218 { return ePoint(x2-1, y1); }
219
220 inline ePoint eRect::bottomLeft1() const
221 { return ePoint(x1, y2-1); }
222
223 inline ePoint eRect::center() const
224 { return ePoint((x1+x2)/2, (y1+y2)/2); }
225
226 inline int eRect::width() const
227 { return  x2 - x1; }
228
229 inline int eRect::height() const
230 { return  y2 - y1; }
231
232 inline eSize eRect::size() const
233 { return eSize(x2-x1, y2-y1); }
234
235 inline bool eRect::contains( int x, int y) const
236 {
237         return (x >= x1) && (x < x2) && (y >= y1) && (y < y2);
238 }
239
240 #endif // eRect_H