1 // This may look like C code, but it is really -*- C++ -*-
3 // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
5 // Geometry implementation
8 #define MAGICKCORE_IMPLEMENTATION 1
9 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1
11 #include "Magick++/Include.h"
13 #include <ctype.h> // for isdigit
14 #if !defined(MAGICKCORE_WINDOWS_SUPPORT)
20 #include "Magick++/Geometry.h"
21 #include "Magick++/Exception.h"
23 MagickPPExport int Magick::operator == (const Magick::Geometry& left_,
24 const Magick::Geometry& right_)
26 return((left_.aspect() == right_.aspect()) &&
27 (left_.fillArea() == right_.fillArea()) &&
28 (left_.greater() == right_.greater()) &&
29 (left_.height() == right_.height()) &&
30 (left_.isValid() == right_.isValid()) &&
31 (left_.less() == right_.less()) &&
32 (left_.limitPixels() == right_.limitPixels()) &&
33 (left_.percent() == right_.percent()) &&
34 (left_.width() == right_.width()) &&
35 (left_.xNegative() == right_.xNegative()) &&
36 (left_.xOff() == right_.xOff()) &&
37 (left_.yNegative() == right_.yNegative()) &&
38 (left_.yOff() == right_.yOff()));
41 MagickPPExport int Magick::operator != (const Magick::Geometry& left_,
42 const Magick::Geometry& right_)
44 return(!(left_ == right_));
47 MagickPPExport int Magick::operator > (const Magick::Geometry& left_,
48 const Magick::Geometry& right_)
50 return(!(left_ < right_) && (left_ != right_));
53 MagickPPExport int Magick::operator < (const Magick::Geometry& left_,
54 const Magick::Geometry& right_)
56 return((left_.width()*left_.height()) < (right_.width()*right_.height()));
59 MagickPPExport int Magick::operator >= (const Magick::Geometry& left_,
60 const Magick::Geometry& right_)
62 return((left_ > right_) || (left_ == right_));
65 MagickPPExport int Magick::operator <= (const Magick::Geometry& left_,
66 const Magick::Geometry& right_ )
68 return((left_ < right_) || (left_ == right_));
71 Magick::Geometry::Geometry(void)
88 Magick::Geometry::Geometry(const char *geometry_)
103 *this=geometry_; // Use assignment operator
106 Magick::Geometry::Geometry(const Geometry &geometry_)
107 : _width(geometry_._width),
108 _height(geometry_._height),
109 _xOff(geometry_._xOff),
110 _yOff(geometry_._yOff),
111 _xNegative(geometry_._xNegative),
112 _yNegative(geometry_._yNegative),
113 _isValid(geometry_._isValid),
114 _percent(geometry_._percent),
115 _aspect(geometry_._aspect),
116 _greater(geometry_._greater),
117 _less(geometry_._less),
118 _fillArea(geometry_._fillArea),
119 _limitPixels(geometry_._limitPixels)
123 Magick::Geometry::Geometry(const std::string &geometry_)
138 *this=geometry_; // Use assignment operator
141 Magick::Geometry::Geometry(size_t width_,size_t height_,ssize_t xOff_,
142 ssize_t yOff_,bool xNegative_,bool yNegative_)
147 _xNegative(xNegative_),
148 _yNegative(yNegative_),
159 Magick::Geometry::~Geometry(void)
163 const Magick::Geometry& Magick::Geometry::operator=(const char * geometry_)
165 *this=std::string(geometry_);
169 Magick::Geometry& Magick::Geometry::operator=(const Geometry& geometry_)
171 // If not being set to ourself
172 if (this != &geometry_)
174 _width=geometry_._width;
175 _height=geometry_._height;
176 _xOff=geometry_._xOff;
177 _yOff=geometry_._yOff;
178 _xNegative=geometry_._xNegative;
179 _yNegative=geometry_._yNegative;
180 _isValid=geometry_._isValid;
181 _percent=geometry_._percent;
182 _aspect=geometry_._aspect;
183 _greater=geometry_._greater;
184 _less=geometry_._less;
185 _fillArea=geometry_._fillArea;
186 _limitPixels=geometry_._limitPixels;
191 const Magick::Geometry& Magick::Geometry::operator=(
192 const std::string &geometry_)
209 // If argument does not start with digit, presume that it is a
210 // page-size specification that needs to be converted to an
211 // equivalent geometry specification using PostscriptGeometry()
212 (void) CopyMagickString(geom,geometry_.c_str(),MaxTextExtent);
213 if (geom[0] != '-' && geom[0] != '+' && geom[0] != 'x' &&
214 !isdigit(static_cast<int>(geom[0])))
216 pageptr=GetPageGeometry(geom);
219 (void) CopyMagickString(geom,pageptr,MaxTextExtent);
220 pageptr=(char *) RelinquishMagickMemory(pageptr);
224 flags=GetGeometry(geom,&x,&y,&width_val,&height_val);
226 if (flags == NoValue)
234 if ((flags & WidthValue) != 0)
240 if ((flags & HeightValue) != 0)
246 if ((flags & XValue) != 0)
248 _xOff=static_cast<ssize_t>(x);
252 if ((flags & YValue) != 0)
254 _yOff=static_cast<ssize_t>(y);
258 if ((flags & XNegative) != 0)
261 if ((flags & YNegative) != 0)
264 if ((flags & PercentValue) != 0)
267 if ((flags & AspectValue) != 0)
270 if ((flags & LessValue) != 0)
273 if ((flags & GreaterValue) != 0)
276 if ((flags & MinimumValue) != 0)
279 if ((flags & AreaValue) != 0)
285 Magick::Geometry::operator std::string() const
288 buffer[MaxTextExtent];
294 throwExceptionExplicit(OptionError,"Invalid geometry argument");
298 FormatLocaleString(buffer,MaxTextExtent,"%.20g",(double) _width);
304 FormatLocaleString(buffer,MaxTextExtent,"%.20g",(double) _height);
316 FormatLocaleString(buffer,MaxTextExtent,"%.20g",(double) _xOff);
324 FormatLocaleString(buffer,MaxTextExtent,"%.20g",(double) _yOff);
349 Magick::Geometry::Geometry(const MagickCore::RectangleInfo &rectangle_)
350 : _width(static_cast<size_t>(rectangle_.width)),
351 _height(static_cast<size_t>(rectangle_.height)),
352 _xOff(static_cast<ssize_t>(rectangle_.x)),
353 _yOff(static_cast<ssize_t>(rectangle_.y)),
354 _xNegative(rectangle_.x < 0 ? true : false),
355 _yNegative(rectangle_.y < 0 ? true : false),
366 const Magick::Geometry& Magick::Geometry::operator=(
367 const MagickCore::RectangleInfo &rectangle_)
369 _width=static_cast<size_t>(rectangle_.width),
370 _height=static_cast<size_t>(rectangle_.height),
371 _xOff=static_cast<ssize_t>(rectangle_.x),
372 _yOff=static_cast<ssize_t>(rectangle_.y),
373 _xNegative=rectangle_.x < 0 ? true : false,
374 _yNegative=rectangle_.y < 0 ? true : false,
379 Magick::Geometry::operator MagickCore::RectangleInfo() const
381 RectangleInfo rectangle;
382 rectangle.width=_width;
383 rectangle.height=_height;
384 _xNegative ? rectangle.x=static_cast<ssize_t>(0-_xOff) :
385 rectangle.x=static_cast<ssize_t>(_xOff);
386 _yNegative ? rectangle.y=static_cast<ssize_t>(0-_yOff) :
387 rectangle.y=static_cast<ssize_t>(_yOff);