1 // This may look like C code, but it is really -*- C++ -*-
2 //
3 // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002
4 // Copyright Dirk Lemstra 2014
5 //
6 // Geometry Definition
7 //
8 // Representation of an ImageMagick geometry specification
9 // X11 geometry specification plus hints
10 
11 #if !defined (Magick_Geometry_header)
12 #define Magick_Geometry_header
13 
14 #include "Magick++/Include.h"
15 #include <string>
16 
17 namespace Magick
18 {
19   class MagickPPExport Geometry;
20 
21   // Compare two Geometry objects regardless of LHS/RHS
22   MagickPPExport int operator ==
23     (const Magick::Geometry& left_,const Magick::Geometry& right_);
24   MagickPPExport int operator !=
25     (const Magick::Geometry& left_,const Magick::Geometry& right_);
26   MagickPPExport int operator >
27     (const Magick::Geometry& left_,const Magick::Geometry& right_);
28   MagickPPExport int operator <
29     (const Magick::Geometry& left_,const Magick::Geometry& right_);
30   MagickPPExport int operator >=
31     (const Magick::Geometry& left_,const Magick::Geometry& right_);
32   MagickPPExport int operator <=
33     (const Magick::Geometry& left_,const Magick::Geometry& right_);
34 
35   class MagickPPExport Geometry
36   {
37   public:
38 
39     // Default constructor
40     Geometry();
41 
42     // Construct Geometry from specified string
43     Geometry(const char *geometry_);
44 
45     // Copy constructor
46     Geometry(const Geometry &geometry_);
47 
48     // Construct Geometry from specified string
49     Geometry(const std::string &geometry_);
50 
51     // Construct Geometry from specified dimensions
52     Geometry(size_t width_,size_t height_,::ssize_t xOff_=0,
53       ::ssize_t yOff_=0);
54 
55     // Destructor
56     ~Geometry(void);
57 
58     // Set via geometry string
59     const Geometry& operator=(const char *geometry_);
60 
61     // Assignment operator
62     Geometry& operator=(const Geometry& Geometry_);
63 
64     // Set via geometry string
65     const Geometry& operator=(const std::string &geometry_);
66 
67     // Return geometry string
68     operator std::string() const;
69 
70     // Resize without preserving aspect ratio (!)
71     void aspect(bool aspect_);
72     bool aspect(void) const;
73 
74     // Resize the image based on the smallest fitting dimension (^)
75     void fillArea(bool fillArea_);
76     bool fillArea(void) const;
77 
78     // Resize if image is greater than size (>)
79     void greater(bool greater_);
80     bool greater(void) const;
81 
82     // Height
83     void height(size_t height_);
84     size_t height(void) const;
85 
86     // Does object contain valid geometry?
87     void isValid(bool isValid_);
88     bool isValid(void) const;
89 
90     // Resize if image is less than size (<)
91     void less(bool less_);
92     bool less(void) const;
93 
94     // Resize using a pixel area count limit (@)
95     void limitPixels(bool limitPixels_);
96     bool limitPixels(void) const;
97 
98     // Width and height are expressed as percentages
99     void percent(bool percent_);
100     bool percent(void) const;
101 
102     // Width
103     void width(size_t width_);
104     size_t width(void) const;
105 
106     // X offset from origin
107     void xOff(::ssize_t xOff_);
108     ::ssize_t xOff(void) const;
109 
110     // Y offset from origin
111     void yOff(::ssize_t yOff_);
112     ::ssize_t yOff(void) const;
113 
114     //
115     // Public methods below this point are for Magick++ use only.
116     //
117 
118     // Construct from RectangleInfo
119     Geometry(const MagickCore::RectangleInfo &rectangle_);
120 
121     // Set via RectangleInfo
122     const Geometry& operator=(const MagickCore::RectangleInfo &rectangle_);
123 
124     // Return an ImageMagick RectangleInfo struct
125     operator MagickCore::RectangleInfo() const;
126 
127   private:
128     size_t _width;
129     size_t _height;
130     ::ssize_t _xOff;
131     ::ssize_t _yOff;
132     bool _isValid;
133     bool _percent;     // Interpret width & height as percentages (%)
134     bool _aspect;      // Force exact size (!)
135     bool _greater;     // Resize only if larger than geometry (>)
136     bool _less;        // Resize only if smaller than geometry (<)
137     bool _fillArea;    // Resize the image based on the smallest fitting dimension (^)
138     bool _limitPixels; // Resize using a pixel area count limit (@)
139   };
140 
141   class MagickPPExport Offset;
142 
143   // Compare two Offset objects
144   MagickPPExport int operator ==
145     (const Magick::Offset& left_,const Magick::Offset& right_);
146   MagickPPExport int operator !=
147     (const Magick::Offset& left_,const Magick::Offset& right_);
148 
149   class MagickPPExport Offset
150   {
151   public:
152 
153     // Default constructor
154     Offset();
155 
156     // Construct Offset from specified string
157     Offset(const char *offset_);
158 
159     // Copy constructor
160     Offset(const Offset &offset_);
161 
162     // Construct Offset from specified string
163     Offset(const std::string &offset_);
164 
165     // Construct Offset from specified x and y
166     Offset(ssize_t x_,ssize_t y_);
167 
168     // Destructor
169     ~Offset(void);
170 
171     // Set via offset string
172     const Offset& operator=(const char *offset_);
173 
174     // Assignment operator
175     Offset& operator=(const Offset& offset_);
176 
177     // Set via offset string
178     const Offset& operator=(const std::string &offset_);
179 
180     // X offset from origin
181     ssize_t x(void) const;
182 
183     // Y offset from origin
184     ssize_t y(void) const;
185 
186     //
187     // Public methods below this point are for Magick++ use only.
188     //
189 
190     // Return an ImageMagick OffsetInfo struct
191     operator MagickCore::OffsetInfo() const;
192 
193   private:
194     ssize_t _x;
195     ssize_t _y;
196   };
197 
198   class MagickPPExport Point;
199 
200   // Compare two Point objects
201   MagickPPExport int operator ==
202     (const Magick::Point& left_,const Magick::Point& right_);
203   MagickPPExport int operator !=
204     (const Magick::Point& left_,const Magick::Point& right_);
205 
206   class MagickPPExport Point
207   {
208   public:
209 
210     // Default constructor
211     Point();
212 
213     // Construct Point from specified string
214     Point(const char *point_);
215 
216     // Copy constructor
217     Point(const Point &point_);
218 
219     // Construct Point from specified string
220     Point(const std::string &point_);
221 
222     // Construct Point from specified x and y
223     Point(double x_,double y_);
224 
225     // Construct Point from specified x y
226     Point(double xy_);
227 
228     // Destructor
229     ~Point(void);
230 
231     // Set via point string
232     const Point& operator=(const char *point_);
233 
234     // Set via double value
235     const Point& operator=(double xy_);
236 
237     // Assignment operator
238     Point& operator=(const Point& point_);
239 
240     // Set via point string
241     const Point& operator=(const std::string &point_);
242 
243     // Return point string
244     operator std::string() const;
245 
246     // Does object contain valid point?
247     bool isValid() const;
248 
249     // X offset from origin
250     double x(void) const;
251 
252     // Y offset from origin
253     double y(void) const;
254 
255   private:
256     double _x;
257     double _y;
258   };
259 } // namespace Magick
260 
261 #endif // Magick_Geometry_header
262