4 #include <lib/gdi/esize.h>
5 #include <lib/gdi/epoint.h>
8 // x2 = x1 + width (AND NOT, NEVER, NEVER EVER +1 or -1 !!!!)
10 class eRect // rectangle class
14 /* eRect() constructs an INVALID rectangle. */
15 eRect() { x1 = y1 = 0; x2 = y2 = -1; }
16 eRect( const ePoint &topleft, const ePoint &bottomright );
18 // we use this contructor very often... do it inline...
19 eRect( const ePoint &topleft, const eSize &size )
23 x2 = (x1+size.width());
24 y2 = (y1+size.height());
27 eRect( int left, int top, int width, int height );
31 eRect normalize() const;
44 void setLeft( int pos );
45 void setTop( int pos );
46 void setRight( int pos );
47 void setBottom( int pos );
51 ePoint topLeft() const;
52 ePoint bottomRight() const;
53 ePoint topRight() const;
54 ePoint bottomLeft() const;
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
63 ePoint topLeft1() const;
64 ePoint bottomRight1() const;
65 ePoint topRight1() const;
66 ePoint bottomLeft1() const;
67 ePoint center() const;
69 void rect( int *x, int *y, int *w, int *h ) const;
70 void coords( int *x1, int *y1, int *x2, int *y2 ) const;
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 );
78 void moveBy( int dx, int dy )
94 void setRect( int x, int y, int w, int h );
95 void setCoords( int x1, int y1, int x2, int y2 );
100 void setWidth( int w );
101 void setHeight( int h );
102 void setSize( const eSize &s );
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);
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;
116 friend bool operator==( const eRect &, const eRect & );
117 friend bool operator!=( const eRect &, const eRect & );
119 static eRect emptyRect() { return eRect(0, 0, 0, 0); }
120 static eRect invalidRect() { return eRect(); }
122 void scale(int x_n, int x_d, int y_n, int y_d);
131 bool operator==( const eRect &, const eRect & );
132 bool operator!=( const eRect &, const eRect & );
135 /*****************************************************************************
136 eRect inline member functions
137 *****************************************************************************/
139 inline eRect::eRect( int left, int top, int width, int height )
147 inline bool eRect::empty() const
148 { return x1 >= x2 || y1 >= y2; }
150 inline bool eRect::valid() const
151 { return x1 <= x2 && y1 <= y2; }
153 inline int eRect::left() const
156 inline int eRect::top() const
159 inline int eRect::right() const
162 inline int eRect::bottom() const
165 inline int &eRect::rLeft()
168 inline int & eRect::rTop()
171 inline int & eRect::rRight()
174 inline int & eRect::rBottom()
177 inline int eRect::x() const
180 inline int eRect::y() const
183 inline void eRect::setLeft( int pos )
186 inline void eRect::setTop( int pos )
189 inline void eRect::setRight( int pos )
192 inline void eRect::setBottom( int pos )
195 inline void eRect::setX( int x )
198 inline void eRect::setY( int y )
201 inline ePoint eRect::topLeft() const
202 { return ePoint(x1, y1); }
204 inline ePoint eRect::bottomRight() const
205 { return ePoint(x2, y2); }
207 inline ePoint eRect::topRight() const
208 { return ePoint(x2, y1); }
210 inline ePoint eRect::bottomLeft() const
211 { return ePoint(x1, y2); }
213 inline ePoint eRect::topLeft1() const
214 { return ePoint(x1, y1); }
216 inline ePoint eRect::bottomRight1() const
217 { return ePoint(x2-1, y2-1); }
219 inline ePoint eRect::topRight1() const
220 { return ePoint(x2-1, y1); }
222 inline ePoint eRect::bottomLeft1() const
223 { return ePoint(x1, y2-1); }
225 inline ePoint eRect::center() const
226 { return ePoint((x1+x2)/2, (y1+y2)/2); }
228 inline int eRect::width() const
231 inline int eRect::height() const
234 inline eSize eRect::size() const
235 { return eSize(x2-x1, y2-y1); }
237 inline bool eRect::contains( int x, int y) const
239 return (x >= x1) && (x < x2) && (y >= y1) && (y < y2);