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
17 #include "Magick++/Geometry.h"
18 #include "Magick++/Exception.h"
20 #define AbsoluteValue(x) ((x) < 0 ? -(x) : (x))
22 int Magick::operator == ( const Magick::Geometry& left_,
23 const Magick::Geometry& right_ )
26 ( left_.isValid() == right_.isValid() ) &&
27 ( left_.width() == right_.width() ) &&
28 ( left_.height() == right_.height() ) &&
29 ( left_.xOff() == right_.xOff() ) &&
30 ( left_.yOff() == right_.yOff() ) &&
31 ( left_.xNegative() == right_.xNegative() ) &&
32 ( left_.yNegative() == right_.yNegative() ) &&
33 ( left_.percent() == right_.percent() ) &&
34 ( left_.aspect() == right_.aspect() ) &&
35 ( left_.greater() == right_.greater() ) &&
36 ( left_.less() == right_.less() ) &&
37 ( left_.fillArea() == right_.fillArea() ) &&
38 ( left_.limitPixels() == right_.limitPixels() )
41 int Magick::operator != ( const Magick::Geometry& left_,
42 const Magick::Geometry& right_ )
44 return ( ! (left_ == right_) );
46 int Magick::operator > ( const Magick::Geometry& left_,
47 const Magick::Geometry& right_ )
49 return ( !( left_ < right_ ) && ( left_ != right_ ) );
51 int Magick::operator < ( const Magick::Geometry& left_,
52 const Magick::Geometry& right_ )
55 ( left_.width() * left_.height() )
57 ( right_.width() * right_.height() )
60 int Magick::operator >= ( const Magick::Geometry& left_,
61 const Magick::Geometry& right_ )
63 return ( ( left_ > right_ ) || ( left_ == right_ ) );
65 int Magick::operator <= ( const Magick::Geometry& left_,
66 const Magick::Geometry& right_ )
68 return ( ( left_ < right_ ) || ( left_ == right_ ) );
71 // Construct using parameterized arguments
72 Magick::Geometry::Geometry ( size_t width_,
82 _xNegative( xNegative_ ),
83 _yNegative( yNegative_ ),
94 // Assignment from C++ string
95 Magick::Geometry::Geometry ( const std::string &geometry_ )
108 _limitPixels( false )
110 *this = geometry_; // Use assignment operator
114 // Assignment from C character string
115 Magick::Geometry::Geometry ( const char *geometry_ )
128 _limitPixels( false )
130 *this = geometry_; // Use assignment operator
134 Magick::Geometry::Geometry ( const Geometry &geometry_ )
135 : _width( geometry_._width ),
136 _height( geometry_._height ),
137 _xOff( geometry_._xOff ),
138 _yOff( geometry_._yOff ),
139 _xNegative( geometry_._xNegative ),
140 _yNegative( geometry_._yNegative ),
141 _isValid ( geometry_._isValid ),
142 _percent( geometry_._percent ),
143 _aspect( geometry_._aspect ),
144 _greater( geometry_._greater ),
145 _less( geometry_._less ),
146 _fillArea( geometry_._fillArea ),
147 _limitPixels( geometry_._limitPixels )
151 // Default constructor
152 Magick::Geometry::Geometry ( void )
165 _limitPixels( false )
169 /* virtual */ Magick::Geometry::~Geometry ( void )
174 Magick::Geometry& Magick::Geometry::operator = ( const Geometry& geometry_ )
176 // If not being set to ourself
177 if ( this != &geometry_ )
179 _width = geometry_._width;
180 _height = geometry_._height;
181 _xOff = geometry_._xOff;
182 _yOff = geometry_._yOff;
183 _xNegative = geometry_._xNegative;
184 _yNegative = geometry_._yNegative;
185 _isValid = geometry_._isValid;
186 _percent = geometry_._percent;
187 _aspect = geometry_._aspect;
188 _greater = geometry_._greater;
189 _less = geometry_._less;
190 _fillArea = geometry_._fillArea;
191 _limitPixels = geometry_._limitPixels;
196 // Set value via geometry string
197 /* virtual */ const Magick::Geometry&
198 Magick::Geometry::operator = ( const std::string &geometry_ )
203 // If argument does not start with digit, presume that it is a
204 // page-size specification that needs to be converted to an
205 // equivalent geometry specification using PostscriptGeometry()
206 (void) CopyMagickString(geom,geometry_.c_str(),MaxTextExtent);
207 if ( geom[0] != '-' &&
210 !isdigit(static_cast<int>(geom[0])))
212 char *pageptr = GetPageGeometry( geom );
215 (void) CopyMagickString(geom,pageptr,MaxTextExtent);
216 pageptr=(char *) RelinquishMagickMemory( pageptr );
222 size_t width_val = 0;
223 size_t height_val = 0;
224 ssize_t flags = GetGeometry (geom, &x, &y, &width_val, &height_val );
226 if (flags == NoValue)
234 if ( ( flags & WidthValue ) != 0 )
240 if ( ( flags & HeightValue ) != 0 )
242 _height = height_val;
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 )
286 // Set value via geometry C string
287 /* virtual */ const Magick::Geometry& Magick::Geometry::operator = ( const char * geometry_ )
289 *this = std::string(geometry_);
293 // Return geometry string
294 Magick::Geometry::operator std::string() const
298 throwExceptionExplicit( OptionError, "Invalid geometry argument" );
302 char buffer[MaxTextExtent];
306 FormatLocaleString( buffer, MaxTextExtent, "%.20g", (double) _width );
312 FormatLocaleString( buffer, MaxTextExtent, "%.20g", (double) _height);
317 if ( _xOff || _yOff )
324 FormatLocaleString( buffer, MaxTextExtent, "%.20g", (double) _xOff);
332 FormatLocaleString( buffer, MaxTextExtent, "%.20g", (double) _yOff);
357 // Construct from RectangleInfo
358 Magick::Geometry::Geometry ( const MagickCore::RectangleInfo &rectangle_ )
359 : _width(static_cast<size_t>( rectangle_.width )),
360 _height(static_cast<size_t>( rectangle_.height )),
361 _xOff(static_cast<ssize_t>( rectangle_.x )),
362 _yOff(static_cast<ssize_t>( rectangle_.y )),
363 _xNegative( rectangle_.x < 0 ? true : false ),
364 _yNegative( rectangle_.y < 0 ? true : false ),
371 _limitPixels( false )
375 // Return an ImageMagick RectangleInfo struct
376 Magick::Geometry::operator MagickCore::RectangleInfo() const
378 RectangleInfo rectangle;
379 rectangle.width = _width;
380 rectangle.height = _height;
381 _xNegative ? rectangle.x = static_cast<ssize_t>(0-_xOff) : rectangle.x = static_cast<ssize_t>(_xOff);
382 _yNegative ? rectangle.y = static_cast<ssize_t>(0-_yOff) : rectangle.y = static_cast<ssize_t>(_yOff);