1 /* === S Y N F I G ========================================================= */
3 ** \brief Rectangle Class
8 ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 ** Copyright (c) 2007 Chris Moore
11 ** This package is free software; you can redistribute it and/or
12 ** modify it under the terms of the GNU General Public License as
13 ** published by the Free Software Foundation; either version 2 of
14 ** the License, or (at your option) any later version.
16 ** This package is distributed in the hope that it will be useful,
17 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ** General Public License for more details.
22 /* ========================================================================= */
24 /* === S T A R T =========================================================== */
26 #ifndef __SYNFIG_RECT_H
27 #define __SYNFIG_RECT_H
29 /* === H E A D E R S ======================================================= */
37 /* === M A C R O S ========================================================= */
39 /* === T Y P E D E F S ===================================================== */
41 /* === C L A S S E S & S T R U C T S ======================================= */
45 class Rect : public etl::rect<Real>
49 using etl::rect<Real>::set_point;
50 using etl::rect<Real>::expand;
51 using etl::rect<Real>::set;
53 static Rect full_plane();
55 static Rect horizontal_strip(const value_type &y1, const value_type &y2);
56 static Rect vertical_strip(const value_type &x1, const value_type &x2);
70 Rect(const Point& x) { set_point(x); }
72 Rect(const Point& min, const Point& max) { set_point(min); expand(max); }
74 Rect(const value_type &x1,const value_type &y1) { set_point(x1,y1); }
76 Rect(const value_type &x1,const value_type &y1,
77 const value_type &x2,const value_type &y2)
83 void set_point(const Point& max) { set_point(max[0],max[1]); }
85 Rect& expand(const Point& max) { expand(max[0],max[1]); return *this; }
87 Rect& expand(const Real& r) { minx-=r; miny-=r; maxx+=r; maxy+=r; return *this; }
89 Rect& expand_x(const Real& r) { minx-=r; maxx+=r; return *this; }
91 Rect& expand_y(const Real& r) { miny-=r; maxy+=r; return *this; }
93 Rect& set(const Point& min,const Point& max) { set(min[0],min[1],max[0],max[1]); return *this; }
95 Point get_min()const { return Point(minx,miny); }
96 Point get_max()const { return Point(maxx,maxy); }
98 bool is_inside(const Point& x) { return x[0]>minx && x[0]<maxx && x[1]>miny && x[1]<maxy; }
102 return (maxx-minx)*(maxy-miny);
107 Rect& operator+=(const Vector& rhs)
109 minx+=rhs[0]; miny+=rhs[1];
110 maxx+=rhs[0]; maxy+=rhs[1];
114 Rect& operator-=(const Vector& rhs)
116 minx-=rhs[0]; miny-=rhs[1];
117 maxx-=rhs[0]; maxy-=rhs[1];
121 Rect& operator*=(const Real& rhs)
123 minx*=rhs; miny*=rhs;
124 maxx*=rhs; maxy*=rhs;
128 Rect& operator/=(Real rhs)
130 rhs=1.0/rhs; // Avoid doing several divisions
131 minx*=rhs; miny*=rhs;
132 maxx*=rhs; maxy*=rhs;
136 Rect& operator&=(const Rect& rhs)
138 if(rhs.area()>0.00000001 && area()>0.00000001)
139 etl::set_intersect(*this,*this,rhs);
145 Rect& operator|=(const Rect& rhs)
147 if(rhs.area()>0.00000001 && area()>0.00000001)
148 etl::set_union(*this,*this,rhs);
151 if(area()<rhs.area())
157 Rect operator+(const Vector& rhs)const { return Rect(*this)+=rhs; }
159 Rect operator-(const Vector& rhs)const { return Rect(*this)-=rhs; }
161 Rect operator*(const Real& rhs)const { return Rect(*this)*=rhs; }
163 Rect operator/(const Real& rhs)const { return Rect(*this)/=rhs; }
165 Rect operator&(const Rect& rhs)const { return Rect(*this)&=rhs; }
167 Rect operator|(const Rect& rhs)const { return Rect(*this)|=rhs; }
169 bool operator&&(const Rect& rhs)const { return etl::intersect(*this, rhs); }
171 bool is_valid()const { return valid(); }
172 }; // END of class Rect
174 }; // END of namespace synfig
176 /* === E N D =============================================================== */