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
17namespace 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