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 #define AbsoluteValue(x) ((x) < 0 ? -(x) : (x))
25 int Magick::operator == ( const Magick::Geometry& left_,
26 const Magick::Geometry& right_ )
29 ( left_.isValid() == right_.isValid() ) &&
30 ( left_.width() == right_.width() ) &&
31 ( left_.height() == right_.height() ) &&
32 ( left_.xOff() == right_.xOff() ) &&
33 ( left_.yOff() == right_.yOff() ) &&
34 ( left_.xNegative() == right_.xNegative() ) &&
35 ( left_.yNegative() == right_.yNegative() ) &&
36 ( left_.percent() == right_.percent() ) &&
37 ( left_.aspect() == right_.aspect() ) &&
38 ( left_.greater() == right_.greater() ) &&
39 ( left_.less() == right_.less() )
42 int Magick::operator != ( const Magick::Geometry& left_,
43 const Magick::Geometry& right_ )
45 return ( ! (left_ == right_) );
47 int Magick::operator > ( const Magick::Geometry& left_,
48 const Magick::Geometry& right_ )
50 return ( !( left_ < right_ ) && ( left_ != right_ ) );
52 int Magick::operator < ( const Magick::Geometry& left_,
53 const Magick::Geometry& right_ )
56 ( left_.width() * left_.height() )
58 ( right_.width() * right_.height() )
61 int Magick::operator >= ( const Magick::Geometry& left_,
62 const Magick::Geometry& right_ )
64 return ( ( left_ > right_ ) || ( left_ == right_ ) );
66 int Magick::operator <= ( const Magick::Geometry& left_,
67 const Magick::Geometry& right_ )
69 return ( ( left_ < right_ ) || ( left_ == right_ ) );
72 // Construct using parameterized arguments
73 Magick::Geometry::Geometry ( size_t width_,
83 _xNegative( xNegative_ ),
84 _yNegative( yNegative_ ),
93 // Assignment from C++ string
94 Magick::Geometry::Geometry ( const std::string &geometry_ )
107 *this = geometry_; // Use assignment operator
111 // Assignment from C character string
112 Magick::Geometry::Geometry ( const char *geometry_ )
125 *this = geometry_; // Use assignment operator
129 Magick::Geometry::Geometry ( const Geometry &geometry_ )
130 : _width( geometry_._width ),
131 _height( geometry_._height ),
132 _xOff( geometry_._xOff ),
133 _yOff( geometry_._yOff ),
134 _xNegative( geometry_._xNegative ),
135 _yNegative( geometry_._yNegative ),
136 _isValid ( geometry_._isValid ),
137 _percent( geometry_._percent ),
138 _aspect( geometry_._aspect ),
139 _greater( geometry_._greater ),
140 _less( geometry_._less )
144 // Default constructor
145 Magick::Geometry::Geometry ( void )
160 /* virtual */ Magick::Geometry::~Geometry ( void )
165 Magick::Geometry& Magick::Geometry::operator = ( const Geometry& geometry_ )
167 // If not being set to ourself
168 if ( this != &geometry_ )
170 _width = geometry_._width;
171 _height = geometry_._height;
172 _xOff = geometry_._xOff;
173 _yOff = geometry_._yOff;
174 _xNegative = geometry_._xNegative;
175 _yNegative = geometry_._yNegative;
176 _isValid = geometry_._isValid;
177 _percent = geometry_._percent;
178 _aspect = geometry_._aspect;
179 _greater = geometry_._greater;
180 _less = geometry_._less;
185 // Set value via geometry string
186 /* virtual */ const Magick::Geometry&
187 Magick::Geometry::operator = ( const std::string &geometry_ )
192 // If argument does not start with digit, presume that it is a
193 // page-size specification that needs to be converted to an
194 // equivalent geometry specification using PostscriptGeometry()
195 (void) CopyMagickString(geom,geometry_.c_str(),MaxTextExtent);
196 if ( geom[0] != '-' &&
199 !isdigit(static_cast<int>(geom[0])))
201 char *pageptr = GetPageGeometry( geom );
204 (void) CopyMagickString(geom,pageptr,MaxTextExtent);
205 pageptr=(char *) RelinquishMagickMemory( pageptr );
211 size_t width_val = 0;
212 size_t height_val = 0;
213 ssize_t flags = GetGeometry (geom, &x, &y, &width_val, &height_val );
215 if (flags == NoValue)
223 if ( ( flags & WidthValue ) != 0 )
229 if ( ( flags & HeightValue ) != 0 )
231 _height = height_val;
235 if ( ( flags & XValue ) != 0 )
237 _xOff = static_cast<ssize_t>(x);
241 if ( ( flags & YValue ) != 0 )
243 _yOff = static_cast<ssize_t>(y);
247 if ( ( flags & XNegative ) != 0 )
250 if ( ( flags & YNegative ) != 0 )
253 if ( ( flags & PercentValue ) != 0 )
256 if ( ( flags & AspectValue ) != 0 )
259 if ( ( flags & LessValue ) != 0 )
262 if ( ( flags & GreaterValue ) != 0 )
269 // Set value via geometry C string
270 /* virtual */ const Magick::Geometry& Magick::Geometry::operator = ( const char * geometry_ )
272 *this = std::string(geometry_);
276 // Return geometry string
277 Magick::Geometry::operator std::string() const
281 throwExceptionExplicit( OptionError, "Invalid geometry argument" );
289 FormatMagickString( buffer, MaxTextExtent, "%.20g", (double) _width );
295 FormatMagickString( buffer, MaxTextExtent, "%.20g", (double) _height);
300 if ( _xOff || _yOff )
307 FormatMagickString( buffer, MaxTextExtent, "%+.20g", (double) _xOff);
315 FormatMagickString( buffer, MaxTextExtent, "%+.20g", (double) _yOff);
334 // Construct from RectangleInfo
335 Magick::Geometry::Geometry ( const MagickCore::RectangleInfo &rectangle_ )
336 : _width(static_cast<size_t>(rectangle_.width)),
337 _height(static_cast<size_t>(rectangle_.height)),
338 _xOff(static_cast<ssize_t>(rectangle_.x)),
339 _yOff(static_cast<ssize_t>(rectangle_.y)),
340 _xNegative(rectangle_.x < 0 ? true : false),
341 _yNegative(rectangle_.y < 0 ? true : false),
350 // Return an ImageMagick RectangleInfo struct
351 Magick::Geometry::operator MagickCore::RectangleInfo() const
353 RectangleInfo rectangle;
354 rectangle.width = _width;
355 rectangle.height = _height;
356 _xNegative ? rectangle.x = static_cast<ssize_t>(0-_xOff) : rectangle.x = static_cast<ssize_t>(_xOff);
357 _yNegative ? rectangle.y = static_cast<ssize_t>(0-_yOff) : rectangle.y = static_cast<ssize_t>(_yOff);