Home | History | Annotate | Download | only in Magick++
      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-2015
      5 //
      6 // Definition of Drawable (Graphic objects)
      7 //
      8 // The technique used for instantiating classes which derive from STL
      9 // templates is described in Microsoft MSDN Article ID: Q168958
     10 // "HOWTO: Exporting STL Components Inside & Outside of a Class".
     11 // "http://support.microsoft.com/kb/168958"
     12 //
     13 // Note that version 3.0 of this article says that that only STL
     14 // container template which supports DLL export is <vector> and we are
     15 // not using <vector> as part of the Drawable implementation.
     16 //
     17 
     18 #if !defined(Magick_Drawable_header)
     19 #define Magick_Drawable_header
     20 
     21 #include "Magick++/Include.h"
     22 
     23 #include <functional>
     24 #include <string>
     25 #include <vector>
     26 #include <utility>
     27 #include "Magick++/Color.h"
     28 #include "Magick++/Geometry.h"
     29 
     30 #if defined(MagickDLLExplicitTemplate)
     31 #  if defined(MAGICK_PLUSPLUS_IMPLEMENTATION)
     32 #    define MagickDrawableExtern
     33 #  else
     34 #   pragma warning( disable: 4231 ) // Disable warning regarding using extern
     35 #    define MagickDrawableExtern extern
     36 #  endif // MAGICK_PLUSPLUS_IMPLEMENTATION
     37 #else
     38 #  define MagickDrawableExtern
     39 #endif // MagickDLLExplicitTemplate
     40 
     41 namespace Magick
     42 {
     43   //
     44   // Representation of an x,y coordinate
     45   //
     46   class MagickPPExport Coordinate
     47   {
     48   public:
     49 
     50     Coordinate(void)
     51       : _x(0),
     52         _y(0) {}
     53 
     54     Coordinate(double x_,double y_)
     55       : _x(x_),
     56         _y(y_) {}
     57 
     58     virtual ~Coordinate() {}
     59 
     60     void x(double x_) { _x=x_; }
     61     double x(void) const { return _x; }
     62 
     63     void y(double y_) { _y=y_; }
     64     double y(void) const { return _y; }
     65 
     66   private:
     67     double _x;
     68     double _y;
     69   };
     70 
     71   typedef std::vector<Magick::Coordinate> CoordinateList;
     72 
     73 #if defined(MagickDLLExplicitTemplate)
     74 
     75   MagickDrawableExtern template class MagickPPExport
     76   std::allocator<Magick::Coordinate>;
     77 
     78 #endif // MagickDLLExplicitTemplate
     79 
     80   // Compare two Coordinate objects regardless of LHS/RHS
     81   extern MagickPPExport int operator ==
     82     (const Coordinate& left_,const Coordinate& right_);
     83   extern MagickPPExport int operator !=
     84     (const Coordinate& left_, const Coordinate& right_);
     85   extern MagickPPExport int operator >
     86     (const Coordinate& left_, const Coordinate& right_);
     87   extern MagickPPExport int operator <
     88     (const Coordinate& left_, const Coordinate& right_);
     89   extern MagickPPExport int operator >=
     90     (const Coordinate& left_, const Coordinate& right_);
     91   extern MagickPPExport int operator <=
     92     (const Coordinate& left_, const Coordinate& right_);
     93 
     94   //
     95   // Base class for all drawable objects
     96   //
     97   class MagickPPExport DrawableBase:
     98     public std::unary_function<MagickCore::DrawingWand,void>
     99   {
    100   public:
    101 
    102     // Default constructor
    103     DrawableBase(void);
    104 
    105     // Destructor
    106     virtual ~DrawableBase(void);
    107 
    108     // Operator to invoke equivalent draw API call
    109     virtual void operator()(MagickCore::DrawingWand *) const;
    110 
    111     // Return polymorphic copy of object
    112     virtual DrawableBase* copy() const;
    113   };
    114 
    115   //
    116   // Representation of a drawable surrogate object to manage drawable objects
    117   //
    118   #undef Drawable // Conflict with <X11/Xproto.h>
    119   class MagickPPExport Drawable
    120   {
    121   public:
    122 
    123     // Default constructor
    124     Drawable(void);
    125 
    126     // Construct from DrawableBase
    127     Drawable(const DrawableBase& original_);
    128 
    129     // Destructor
    130     ~Drawable(void);
    131 
    132     // Copy constructor
    133     Drawable(const Drawable& original_);
    134 
    135     // Assignment operator
    136     Drawable& operator=(const Drawable& original_);
    137 
    138     // Operator to invoke contained object
    139     void operator()(MagickCore::DrawingWand *) const;
    140 
    141   private:
    142     DrawableBase* dp;
    143   };
    144 
    145   typedef std::vector<Magick::Drawable> DrawableList;
    146 
    147 #if defined(MagickDLLExplicitTemplate)
    148 
    149   MagickDrawableExtern template class MagickPPExport
    150   std::allocator<Magick::Drawable>;
    151 
    152 #endif // MagickDLLExplicitTemplate
    153 
    154 //
    155 // Base class for all drawable path elements for use with
    156 // DrawablePath
    157 //
    158 class MagickPPExport VPathBase
    159 {
    160 public:
    161   // Constructor
    162   VPathBase ( void )
    163     { }
    164 
    165   // Destructor
    166   virtual ~VPathBase ( void );
    167 
    168   // Assignment operator
    169   //    const VPathBase& operator= (const VPathBase& original_ );
    170 
    171   // Operator to invoke equivalent draw API call
    172   virtual void operator()( MagickCore::DrawingWand *context_ ) const = 0;
    173 
    174   // Return polymorphic copy of object
    175   virtual VPathBase* copy() const = 0;
    176 };
    177 
    178 //
    179 // Representation of a drawable path element surrogate object to
    180 // manage drawable path elements so they may be passed as a list to
    181 // DrawablePath.
    182 //
    183 class MagickPPExport VPath
    184 {
    185 public:
    186   // Constructor
    187   VPath ( void );
    188 
    189   // Construct from VPathBase
    190   VPath ( const VPathBase& original_ );
    191 
    192   // Destructor
    193   virtual ~VPath ( void );
    194 
    195   // Copy constructor
    196   VPath ( const VPath& original_ );
    197 
    198   // Assignment operator
    199   VPath& operator= (const VPath& original_ );
    200 
    201   // Operator to invoke contained object
    202   void operator()( MagickCore::DrawingWand *context_ ) const;
    203 
    204 private:
    205   VPathBase* dp;
    206 };
    207 
    208 // Compare two VPath objects regardless of LHS/RHS
    209 extern MagickPPExport int operator == ( const VPath& left_,
    210                                       const VPath& right_ );
    211 extern MagickPPExport int operator != ( const VPath& left_,
    212                                       const VPath& right_ );
    213 extern MagickPPExport int operator >  ( const VPath& left_,
    214                                       const VPath& right_ );
    215 extern MagickPPExport int operator <  ( const VPath& left_,
    216                                       const VPath& right_ );
    217 extern MagickPPExport int operator >= ( const VPath& left_,
    218                                       const VPath& right_ );
    219 extern MagickPPExport int operator <= ( const VPath& left_,
    220                                       const VPath& right_ );
    221 
    222 typedef std::vector<Magick::VPath> VPathList;
    223 
    224 #if defined(MagickDLLExplicitTemplate)
    225 
    226 MagickDrawableExtern template class MagickPPExport
    227 std::allocator<Magick::VPath>;
    228 
    229 // MagickDrawableExtern template class MagickPPExport
    230 // std::vector<Magick::VPath, std::allocator<Magick::VPath> >;
    231 
    232 #endif // MagickDLLExplicitTemplate
    233 
    234 //
    235 // Drawable Objects
    236 //
    237 
    238 // Affine (scaling, rotation, and translation)
    239 class MagickPPExport DrawableAffine  : public DrawableBase
    240 {
    241 public:
    242   DrawableAffine ( double sx_, double sy_,
    243                    double rx_, double ry_,
    244                    double tx_, double ty_ );
    245 
    246   DrawableAffine ( void );
    247 
    248   /*virtual*/ ~DrawableAffine( void );
    249 
    250   // Operator to invoke equivalent draw API call
    251   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    252 
    253   // Return polymorphic copy of object
    254   /*virtual*/
    255   DrawableBase* copy() const;
    256 
    257   void sx( const double sx_ )
    258     {
    259       _affine.sx = sx_;
    260     }
    261   double sx( void ) const
    262     {
    263       return _affine.sx;
    264     }
    265 
    266   void sy( const double sy_ )
    267     {
    268       _affine.sy = sy_;
    269     }
    270   double sy( void ) const
    271     {
    272       return _affine.sy;
    273     }
    274 
    275   void rx( const double rx_ )
    276     {
    277       _affine.rx = rx_;
    278     }
    279   double rx( void ) const
    280     {
    281       return _affine.rx;
    282     }
    283 
    284   void ry( const double ry_ )
    285     {
    286       _affine.ry = ry_;
    287     }
    288   double ry( void ) const
    289     {
    290       return _affine.ry;
    291     }
    292 
    293   void tx( const double tx_ )
    294     {
    295       _affine.tx = tx_;
    296     }
    297   double tx( void ) const
    298     {
    299       return _affine.tx;
    300     }
    301 
    302   void ty( const double ty_ )
    303     {
    304       _affine.ty = ty_;
    305     }
    306   double ty( void ) const
    307     {
    308       return _affine.ty;
    309     }
    310 
    311 private:
    312   MagickCore::AffineMatrix  _affine;
    313 };
    314 
    315 // Change pixel alpha value to transparent using PaintMethod
    316 class MagickPPExport DrawableAlpha : public DrawableBase
    317 {
    318 public:
    319 
    320     DrawableAlpha(double x_, double y_,PaintMethod paintMethod_)
    321       : _x(x_),
    322         _y(y_),
    323         _paintMethod(paintMethod_)
    324     {
    325     }
    326 
    327     ~DrawableAlpha(void);
    328 
    329     // Operator to invoke equivalent draw API call
    330     void operator()(MagickCore::DrawingWand *context_) const;
    331 
    332     // Return polymorphic copy of object
    333     DrawableBase* copy() const;
    334 
    335     void x(double x_)
    336     {
    337       _x=x_;
    338     }
    339 
    340     double x(void) const
    341     {
    342       return(_x);
    343     }
    344 
    345     void y(double y_)
    346     {
    347       _y=y_;
    348     }
    349 
    350     double y(void) const
    351     {
    352       return(_y);
    353     }
    354 
    355     void paintMethod(PaintMethod paintMethod_)
    356     {
    357       _paintMethod=paintMethod_;
    358     }
    359 
    360     PaintMethod paintMethod(void) const
    361     {
    362       return(_paintMethod);
    363     }
    364 
    365   private:
    366 
    367     double _x;
    368     double _y;
    369     PaintMethod _paintMethod;
    370 };
    371 
    372 // Arc
    373 class MagickPPExport DrawableArc : public DrawableBase
    374 {
    375 public:
    376   DrawableArc ( double startX_, double startY_,
    377                 double endX_, double endY_,
    378                 double startDegrees_, double endDegrees_ )
    379     : _startX(startX_),
    380       _startY(startY_),
    381       _endX(endX_),
    382       _endY(endY_),
    383       _startDegrees(startDegrees_),
    384       _endDegrees(endDegrees_)
    385     { }
    386 
    387   /*virtual*/ ~DrawableArc( void );
    388 
    389   // Operator to invoke equivalent draw API call
    390   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    391 
    392   // Return polymorphic copy of object
    393   /*virtual*/ DrawableBase* copy() const;
    394 
    395   void startX( double startX_ )
    396     {
    397       _startX = startX_;
    398     }
    399   double startX( void ) const
    400     {
    401       return _startX;
    402     }
    403 
    404   void startY( double startY_ )
    405     {
    406       _startY = startY_;
    407     }
    408   double startY( void ) const
    409     {
    410       return _startY;
    411     }
    412 
    413   void endX( double endX_ )
    414     {
    415       _endX = endX_;
    416     }
    417   double endX( void ) const
    418     {
    419       return _endX;
    420     }
    421 
    422   void endY( double endY_ )
    423     {
    424       _endY = endY_;
    425     }
    426   double endY( void ) const
    427     {
    428       return _endY;
    429     }
    430 
    431   void startDegrees( double startDegrees_ )
    432     {
    433       _startDegrees = startDegrees_;
    434     }
    435   double startDegrees( void ) const
    436     {
    437       return _startDegrees;
    438     }
    439 
    440   void endDegrees( double endDegrees_ )
    441     {
    442       _endDegrees = endDegrees_;
    443     }
    444   double endDegrees( void ) const
    445     {
    446       return _endDegrees;
    447     }
    448 
    449 private:
    450   double _startX;
    451   double _startY;
    452   double _endX;
    453   double _endY;
    454   double _startDegrees;
    455   double _endDegrees;
    456 };
    457 
    458 // Bezier curve (Coordinate list must contain at least three members)
    459 class MagickPPExport DrawableBezier : public DrawableBase
    460 {
    461 public:
    462   // Construct from coordinates
    463   DrawableBezier ( const CoordinateList &coordinates_ );
    464 
    465   // Copy constructor
    466   DrawableBezier ( const DrawableBezier& original_ );
    467 
    468   // Destructor
    469   /*virtual*/ ~DrawableBezier ( void );
    470 
    471   // Operator to invoke equivalent draw API call
    472   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    473 
    474   // Return polymorphic copy of object
    475   /*virtual*/ DrawableBase* copy() const;
    476 
    477 private:
    478   CoordinateList _coordinates;
    479 };
    480 
    481   // Sets the border color to be used for drawing bordered objects.
    482   class MagickPPExport DrawableBorderColor : public DrawableBase
    483   {
    484   public:
    485 
    486     DrawableBorderColor(const Color &color_);
    487 
    488     DrawableBorderColor(const DrawableBorderColor &original_);
    489 
    490     ~DrawableBorderColor(void);
    491 
    492     // Operator to invoke equivalent draw API call
    493     void operator()(MagickCore::DrawingWand *context_) const;
    494 
    495     void color(const Color &color_);
    496     Color color(void) const;
    497 
    498     // Return polymorphic copy of object
    499     DrawableBase* copy() const;
    500 
    501   private:
    502     Color _color;
    503   };
    504 
    505   // Sets the polygon fill rule to be used by the clipping path.
    506   class MagickPPExport DrawableClipRule : public DrawableBase
    507   {
    508   public:
    509 
    510     DrawableClipRule(const FillRule fillRule_);
    511 
    512     ~DrawableClipRule(void);
    513 
    514     // Operator to invoke equivalent draw API call
    515     void operator()(MagickCore::DrawingWand *context_) const;
    516 
    517     void fillRule(const FillRule fillRule_);
    518     FillRule fillRule(void) const;
    519 
    520     // Return polymorphic copy of object
    521     DrawableBase* copy() const;
    522 
    523   private:
    524     FillRule _fillRule;
    525   };
    526 
    527   // Sets the interpretation of clip path units.
    528   class MagickPPExport DrawableClipUnits : public DrawableBase
    529   {
    530   public:
    531 
    532     DrawableClipUnits(const ClipPathUnits units_);
    533 
    534     ~DrawableClipUnits(void);
    535 
    536     // Operator to invoke equivalent draw API call
    537     void operator()(MagickCore::DrawingWand *context_) const;
    538 
    539     void units(const ClipPathUnits units_);
    540     ClipPathUnits units(void) const;
    541 
    542     // Return polymorphic copy of object
    543     DrawableBase* copy() const;
    544 
    545   private:
    546     ClipPathUnits _units;
    547   };
    548 
    549 // Pop (terminate) clip path definition
    550 class MagickPPExport DrawablePopClipPath : public DrawableBase
    551 {
    552 public:
    553   DrawablePopClipPath ( void )
    554     : _dummy(0)
    555     {
    556     }
    557 
    558   /*virtual*/ ~DrawablePopClipPath ( void );
    559 
    560   // Operator to invoke equivalent draw API call
    561   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    562 
    563   // Return polymorphic copy of object
    564   /*virtual*/ DrawableBase* copy() const;
    565 
    566 private:
    567   ::ssize_t   _dummy;
    568 };
    569 
    570 // Push (create) Clip path definition
    571 class MagickPPExport DrawablePushClipPath : public DrawableBase
    572 {
    573 public:
    574   DrawablePushClipPath ( const std::string &id_);
    575 
    576   DrawablePushClipPath ( const DrawablePushClipPath& original_ );
    577 
    578   /*virtual*/ ~DrawablePushClipPath ( void );
    579 
    580   // Operator to invoke equivalent draw API call
    581   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    582 
    583   // Return polymorphic copy of object
    584   /*virtual*/ DrawableBase* copy() const;
    585 
    586 private:
    587   std::string _id;
    588 };
    589 
    590 // Named Clip Path
    591 class MagickPPExport DrawableClipPath : public DrawableBase
    592 {
    593 public:
    594   DrawableClipPath ( const std::string &id_ );
    595   DrawableClipPath ( const DrawableClipPath& original_ );
    596 
    597   /*virtual*/ ~DrawableClipPath ( void );
    598 
    599   // Operator to invoke equivalent draw API call
    600   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    601 
    602   // Return polymorphic copy of object
    603   /*virtual*/ DrawableBase* copy() const;
    604 
    605   void clip_path( const std::string &id_ )
    606     {
    607       _id = id_.c_str(); //multithread safe
    608     }
    609   std::string clip_path( void ) const
    610     {
    611       return _id;
    612     }
    613 
    614 private:
    615   std::string   _id;
    616 };
    617 
    618 // Circle
    619 class MagickPPExport DrawableCircle : public DrawableBase
    620 {
    621 public:
    622   DrawableCircle ( double originX_, double originY_,
    623                    double perimX_, double perimY_ )
    624     : _originX(originX_),
    625       _originY(originY_),
    626       _perimX(perimX_),
    627       _perimY(perimY_)
    628     {
    629     }
    630 
    631   /*virtual*/ ~DrawableCircle ( void );
    632 
    633   // Operator to invoke equivalent draw API call
    634   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    635 
    636   // Return polymorphic copy of object
    637   /*virtual*/ DrawableBase* copy() const;
    638 
    639   void originX( double originX_ )
    640     {
    641       _originX = originX_;
    642     }
    643   double originX( void ) const
    644     {
    645       return _originX;
    646     }
    647 
    648   void originY( double originY_ )
    649     {
    650       _originY = originY_;
    651     }
    652   double originY( void ) const
    653     {
    654       return _originY;
    655     }
    656 
    657   void perimX( double perimX_ )
    658     {
    659       _perimX = perimX_;
    660     }
    661   double perimX( void ) const
    662     {
    663       return _perimX;
    664     }
    665 
    666   void perimY( double perimY_ )
    667     {
    668       _perimY = perimY_;
    669     }
    670   double perimY( void ) const
    671     {
    672       return _perimY;
    673     }
    674 
    675 private:
    676   double _originX;
    677   double _originY;
    678   double _perimX;
    679   double _perimY;
    680 };
    681 
    682 // Colorize at point using PaintMethod
    683 class MagickPPExport DrawableColor : public DrawableBase
    684 {
    685 public:
    686   DrawableColor ( double x_, double y_,
    687                   PaintMethod paintMethod_ )
    688     : _x(x_),
    689       _y(y_),
    690       _paintMethod(paintMethod_)
    691     { }
    692 
    693   /*virtual*/ ~DrawableColor ( void );
    694 
    695   // Operator to invoke equivalent draw API call
    696   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    697 
    698   // Return polymorphic copy of object
    699   /*virtual*/ DrawableBase* copy() const;
    700 
    701   void x( double x_ )
    702     {
    703       _x = x_;
    704     }
    705   double x( void ) const
    706     {
    707       return _x;
    708     }
    709 
    710   void y( double y_ )
    711     {
    712       _y = y_;
    713     }
    714   double y( void ) const
    715     {
    716       return _y;
    717     }
    718 
    719   void paintMethod( PaintMethod paintMethod_ )
    720     {
    721       _paintMethod = paintMethod_;
    722     }
    723   PaintMethod paintMethod( void ) const
    724     {
    725       return _paintMethod;
    726     }
    727 
    728 private:
    729   double _x;
    730   double _y;
    731   PaintMethod _paintMethod;
    732 };
    733 
    734 // Draw image at point, scaled to size specified by width and height
    735 class MagickPPExport Image;
    736 class MagickPPExport DrawableCompositeImage : public DrawableBase
    737 {
    738 public:
    739   DrawableCompositeImage ( double x_, double y_,
    740                            const std::string &filename_ );
    741 
    742   DrawableCompositeImage ( double x_, double y_,
    743                            const Image &image_ );
    744 
    745   DrawableCompositeImage ( double x_, double y_,
    746                            double width_, double height_,
    747                            const std::string &filename_ );
    748 
    749   DrawableCompositeImage ( double x_, double y_,
    750                            double width_, double height_,
    751                            const Image &image_ );
    752 
    753   DrawableCompositeImage ( double x_, double y_,
    754                            double width_, double height_,
    755                            const std::string &filename_,
    756                            CompositeOperator composition_ );
    757 
    758   DrawableCompositeImage ( double x_, double y_,
    759                            double width_, double height_,
    760                            const Image &image_,
    761                            CompositeOperator composition_ );
    762 
    763   // Copy constructor
    764   DrawableCompositeImage ( const DrawableCompositeImage& original_ );
    765 
    766   // Destructor
    767   /*virtual*/ ~DrawableCompositeImage( void );
    768 
    769   // Assignment operator
    770   DrawableCompositeImage& operator=
    771   (const DrawableCompositeImage& original_ );
    772 
    773   // Operator to invoke equivalent draw API call
    774   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    775 
    776   // Return polymorphic copy of object
    777   /*virtual*/ DrawableBase* copy() const;
    778 
    779   void composition( CompositeOperator composition_ )
    780     {
    781       _composition = composition_;
    782     }
    783   CompositeOperator composition( void ) const
    784     {
    785       return _composition;
    786     }
    787 
    788   void filename( const std::string &image_ );
    789   std::string filename( void ) const;
    790 
    791   void x( double x_ )
    792     {
    793       _x = x_;
    794     }
    795   double x( void ) const
    796     {
    797       return _x;
    798     }
    799 
    800   void y( double y_ )
    801     {
    802       _y = y_;
    803     }
    804   double y( void ) const
    805     {
    806       return _y;
    807     }
    808 
    809   void width( double width_ )
    810     {
    811       _width = width_;
    812     }
    813   double width( void ) const
    814     {
    815       return _width;
    816     }
    817 
    818   void height( double height_ )
    819     {
    820       _height = height_;
    821     }
    822   double height( void ) const
    823     {
    824       return _height;
    825     }
    826 
    827   void image( const Image &image_ );
    828   Magick::Image image( void ) const;
    829 
    830   // Specify image format used to output Base64 inlined image data.
    831   void magick( std::string magick_ );
    832   std::string magick( void );
    833 
    834 private:
    835   CompositeOperator  _composition;
    836   double             _x;
    837   double             _y;
    838   double             _width;
    839   double             _height;
    840   Image*             _image;
    841 };
    842 
    843 // Density
    844 class MagickPPExport DrawableDensity : public DrawableBase
    845 {
    846 public:
    847 
    848   DrawableDensity(const Point &density_);
    849 
    850   DrawableDensity(const std::string &density_);
    851 
    852   ~DrawableDensity(void);
    853 
    854   void operator()(MagickCore::DrawingWand *context_) const;
    855 
    856   DrawableBase* copy() const;
    857 
    858 private:
    859   std::string _density;
    860 };
    861 
    862 // Ellipse
    863 class MagickPPExport DrawableEllipse : public DrawableBase
    864 {
    865 public:
    866   DrawableEllipse ( double originX_, double originY_,
    867                     double radiusX_, double radiusY_,
    868                     double arcStart_, double arcEnd_ )
    869     : _originX(originX_),
    870       _originY(originY_),
    871       _radiusX(radiusX_),
    872       _radiusY(radiusY_),
    873       _arcStart(arcStart_),
    874       _arcEnd(arcEnd_)
    875     { }
    876 
    877   /*virtual*/ ~DrawableEllipse( void );
    878 
    879   // Operator to invoke equivalent draw API call
    880   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    881 
    882   // Return polymorphic copy of object
    883   /*virtual*/ DrawableBase* copy() const;
    884 
    885   void originX( double originX_ )
    886     {
    887       _originX = originX_;
    888     }
    889   double originX( void ) const
    890     {
    891       return _originX;
    892     }
    893 
    894   void originY( double originY_ )
    895     {
    896       _originY = originY_;
    897     }
    898   double originY( void ) const
    899     {
    900       return _originY;
    901     }
    902 
    903   void radiusX( double radiusX_ )
    904     {
    905       _radiusX = radiusX_;
    906     }
    907   double radiusX( void ) const
    908     {
    909       return _radiusX;
    910     }
    911 
    912   void radiusY( double radiusY_ )
    913     {
    914       _radiusY = radiusY_;
    915     }
    916   double radiusY( void ) const
    917     {
    918       return _radiusY;
    919     }
    920 
    921   void arcStart( double arcStart_ )
    922     {
    923       _arcStart = arcStart_;
    924     }
    925   double arcStart( void ) const
    926     {
    927       return _arcStart;
    928     }
    929 
    930   void arcEnd( double arcEnd_ )
    931     {
    932       _arcEnd = arcEnd_;
    933     }
    934   double arcEnd( void ) const
    935     {
    936       return _arcEnd;
    937     }
    938 
    939 private:
    940   double _originX;
    941   double _originY;
    942   double _radiusX;
    943   double _radiusY;
    944   double _arcStart;
    945   double _arcEnd;
    946 };
    947 
    948 // Specify drawing fill color
    949 class MagickPPExport DrawableFillColor : public DrawableBase
    950 {
    951 public:
    952   DrawableFillColor ( const Color &color_ );
    953 
    954   DrawableFillColor ( const DrawableFillColor& original_ );
    955 
    956   /*virtual*/ ~DrawableFillColor( void );
    957 
    958   // Operator to invoke equivalent draw API call
    959   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
    960 
    961   // Return polymorphic copy of object
    962   /*virtual*/ DrawableBase* copy() const;
    963 
    964   void color( const Color &color_ )
    965     {
    966       _color = color_;
    967     }
    968   Color color( void ) const
    969     {
    970       return _color;
    971     }
    972 
    973 private:
    974   Color _color;
    975 };
    976 
    977   // Sets the URL to use as a fill pattern for filling objects. Only local
    978   // URLs("#identifier") are supported at this time. These local URLs are
    979   // normally created by defining a named fill pattern with
    980   // DrawablePushPattern/DrawablePopPattern.
    981   class MagickPPExport DrawableFillPatternUrl : public DrawableBase
    982   {
    983   public:
    984 
    985     DrawableFillPatternUrl(const std::string &url_);
    986 
    987     ~DrawableFillPatternUrl(void);
    988 
    989     DrawableFillPatternUrl(const DrawableFillPatternUrl& original_);
    990 
    991     // Operator to invoke equivalent draw API call
    992     void operator()(MagickCore::DrawingWand *context_) const;
    993 
    994     void url(const std::string &url_);
    995     std::string url(void) const;
    996 
    997     // Return polymorphic copy of object
    998     DrawableBase* copy() const;
    999 
   1000   private:
   1001     std::string _url;
   1002   };
   1003 
   1004 // Specify fill rule (fill-rule)
   1005 class MagickPPExport DrawableFillRule : public DrawableBase
   1006 {
   1007 public:
   1008   DrawableFillRule ( const FillRule fillRule_ )
   1009     : _fillRule(fillRule_)
   1010     {
   1011     }
   1012 
   1013   /*virtual*/ ~DrawableFillRule ( void );
   1014 
   1015   // Operator to invoke equivalent draw API call
   1016   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1017 
   1018   // Return polymorphic copy of object
   1019   /*virtual*/ DrawableBase* copy() const;
   1020 
   1021   void fillRule( const FillRule fillRule_ )
   1022     {
   1023       _fillRule = fillRule_;
   1024     }
   1025   FillRule fillRule( void ) const
   1026     {
   1027       return _fillRule;
   1028     }
   1029 
   1030 private:
   1031   FillRule _fillRule;
   1032 };
   1033 
   1034 // Specify drawing fill alpha
   1035 class MagickPPExport DrawableFillOpacity : public DrawableBase
   1036 {
   1037 public:
   1038 
   1039   DrawableFillOpacity(double opacity_)
   1040     : _opacity(opacity_)
   1041   {
   1042   }
   1043 
   1044   ~DrawableFillOpacity ( void );
   1045 
   1046   // Operator to invoke equivalent draw API call
   1047   void operator()(MagickCore::DrawingWand *context_) const;
   1048 
   1049   // Return polymorphic copy of object
   1050   DrawableBase* copy() const;
   1051 
   1052   void opacity(double opacity_)
   1053   {
   1054     _opacity=opacity_;
   1055   }
   1056 
   1057   double opacity(void) const
   1058   {
   1059     return(_opacity);
   1060   }
   1061 
   1062 private:
   1063   double _opacity;
   1064 };
   1065 
   1066 // Specify text font
   1067 class MagickPPExport DrawableFont : public DrawableBase
   1068 {
   1069 public:
   1070   DrawableFont ( const std::string &font_ );
   1071 
   1072   DrawableFont ( const std::string &family_,
   1073                  StyleType style_,
   1074                  const unsigned int weight_,
   1075                  StretchType stretch_ );
   1076   DrawableFont ( const DrawableFont& original_ );
   1077 
   1078   /*virtual*/ ~DrawableFont ( void );
   1079 
   1080   // Operator to invoke equivalent draw API call
   1081   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1082 
   1083   // Return polymorphic copy of object
   1084   /*virtual*/ DrawableBase* copy() const;
   1085 
   1086   void font( const std::string &font_ )
   1087     {
   1088       _font = font_;
   1089     }
   1090   std::string font( void ) const
   1091     {
   1092       return _font;
   1093     }
   1094 
   1095 private:
   1096   std::string   _font;
   1097   std::string   _family;
   1098   StyleType     _style;
   1099   unsigned int _weight;
   1100   StretchType   _stretch;
   1101 };
   1102 
   1103 // Specify text positioning gravity
   1104 class MagickPPExport DrawableGravity : public DrawableBase
   1105 {
   1106 public:
   1107   DrawableGravity ( GravityType gravity_ )
   1108     : _gravity(gravity_)
   1109     {
   1110     }
   1111 
   1112   /*virtual*/ ~DrawableGravity ( void );
   1113 
   1114   // Operator to invoke equivalent draw API call
   1115   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1116 
   1117   // Return polymorphic copy of object
   1118   /*virtual*/ DrawableBase* copy() const;
   1119 
   1120   void gravity( GravityType gravity_ )
   1121     {
   1122       _gravity = gravity_;
   1123     }
   1124   GravityType gravity( void ) const
   1125     {
   1126       return _gravity;
   1127     }
   1128 
   1129 private:
   1130   GravityType _gravity;
   1131 };
   1132 
   1133 // Line
   1134 class MagickPPExport DrawableLine : public DrawableBase
   1135 {
   1136 public:
   1137   DrawableLine ( double startX_, double startY_,
   1138                  double endX_, double endY_ )
   1139     : _startX(startX_),
   1140       _startY(startY_),
   1141       _endX(endX_),
   1142       _endY(endY_)
   1143     { }
   1144 
   1145   /*virtual*/ ~DrawableLine ( void );
   1146 
   1147   // Operator to invoke equivalent draw API call
   1148   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1149 
   1150   // Return polymorphic copy of object
   1151   /*virtual*/ DrawableBase* copy() const;
   1152 
   1153   void startX( double startX_ )
   1154     {
   1155       _startX = startX_;
   1156     }
   1157   double startX( void ) const
   1158     {
   1159       return _startX;
   1160     }
   1161 
   1162   void startY( double startY_ )
   1163     {
   1164       _startY = startY_;
   1165     }
   1166   double startY( void ) const
   1167     {
   1168       return _startY;
   1169     }
   1170 
   1171   void endX( double endX_ )
   1172     {
   1173       _endX = endX_;
   1174     }
   1175   double endX( void ) const
   1176     {
   1177       return _endX;
   1178     }
   1179 
   1180   void endY( double endY_ )
   1181     {
   1182       _endY = endY_;
   1183     }
   1184   double endY( void ) const
   1185     {
   1186       return _endY;
   1187     }
   1188 
   1189 private:
   1190   double _startX;
   1191   double _startY;
   1192   double _endX;
   1193   double _endY;
   1194 };
   1195 
   1196 // Drawable Path
   1197 class MagickPPExport DrawablePath : public DrawableBase
   1198 {
   1199 public:
   1200   DrawablePath ( const VPathList &path_ );
   1201 
   1202   DrawablePath ( const DrawablePath& original_ );
   1203 
   1204   /*virtual*/ ~DrawablePath ( void );
   1205 
   1206   // Operator to invoke equivalent draw API call
   1207   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1208 
   1209   // Return polymorphic copy of object
   1210   /*virtual*/ DrawableBase* copy() const;
   1211 
   1212 private:
   1213   VPathList _path;
   1214 };
   1215 
   1216 // Point
   1217 class MagickPPExport DrawablePoint : public DrawableBase
   1218 {
   1219 public:
   1220   DrawablePoint ( double x_, double y_ )
   1221     : _x(x_),
   1222       _y(y_)
   1223     { }
   1224 
   1225   /*virtual*/ ~DrawablePoint ( void );
   1226 
   1227   // Operator to invoke equivalent draw API call
   1228   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1229 
   1230   // Return polymorphic copy of object
   1231   /*virtual*/ DrawableBase* copy() const;
   1232 
   1233   void x( double x_ )
   1234     {
   1235       _x = x_;
   1236     }
   1237   double x( void ) const
   1238     {
   1239       return _x;
   1240     }
   1241 
   1242   void y( double y_ )
   1243     {
   1244       _y = y_;
   1245     }
   1246   double y( void ) const
   1247     {
   1248       return _y;
   1249     }
   1250 
   1251 private:
   1252   double _x;
   1253   double _y;
   1254 };
   1255 
   1256 // Text pointsize
   1257 class MagickPPExport DrawablePointSize : public DrawableBase
   1258 {
   1259 public:
   1260   DrawablePointSize ( double pointSize_ )
   1261     : _pointSize(pointSize_)
   1262     { }
   1263 
   1264   /*virtual*/ ~DrawablePointSize ( void );
   1265 
   1266   // Operator to invoke equivalent draw API call
   1267   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1268 
   1269   // Return polymorphic copy of object
   1270   /*virtual*/ DrawableBase* copy() const;
   1271 
   1272   void pointSize( double pointSize_ )
   1273     {
   1274       _pointSize = pointSize_;
   1275     }
   1276   double pointSize( void ) const
   1277     {
   1278       return _pointSize;
   1279     }
   1280 
   1281 private:
   1282   double _pointSize;
   1283 };
   1284 
   1285 // Polygon (Coordinate list must contain at least three members)
   1286 class MagickPPExport DrawablePolygon : public DrawableBase
   1287 {
   1288 public:
   1289   DrawablePolygon ( const CoordinateList &coordinates_ );
   1290 
   1291   DrawablePolygon ( const DrawablePolygon& original_ );
   1292 
   1293   /*virtual*/ ~DrawablePolygon ( void );
   1294 
   1295   // Operator to invoke equivalent draw API call
   1296   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1297 
   1298   // Return polymorphic copy of object
   1299   /*virtual*/ DrawableBase* copy() const;
   1300 
   1301 private:
   1302   CoordinateList _coordinates;
   1303 };
   1304 
   1305 // Polyline (Coordinate list must contain at least three members)
   1306 class MagickPPExport DrawablePolyline : public DrawableBase
   1307 {
   1308 public:
   1309   DrawablePolyline ( const CoordinateList &coordinates_ );
   1310 
   1311   DrawablePolyline ( const DrawablePolyline& original_ );
   1312 
   1313   /*virtual*/ ~DrawablePolyline ( void );
   1314 
   1315   // Operator to invoke equivalent draw API call
   1316   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1317 
   1318   // Return polymorphic copy of object
   1319   /*virtual*/ DrawableBase* copy() const;
   1320 
   1321 private:
   1322   CoordinateList _coordinates;
   1323 };
   1324 
   1325 // Pop Graphic Context
   1326 class MagickPPExport DrawablePopGraphicContext : public DrawableBase
   1327 {
   1328 public:
   1329   DrawablePopGraphicContext ( void )
   1330     : _dummy(0)
   1331     {
   1332     }
   1333 
   1334   /*virtual*/ ~DrawablePopGraphicContext ( void );
   1335 
   1336   // Operator to invoke equivalent draw API call
   1337   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1338 
   1339   // Return polymorphic copy of object
   1340   /*virtual*/ DrawableBase* copy() const;
   1341 
   1342 private:
   1343   ::ssize_t   _dummy;
   1344 };
   1345 
   1346 // Push Graphic Context
   1347 class MagickPPExport DrawablePushGraphicContext : public DrawableBase
   1348 {
   1349 public:
   1350   DrawablePushGraphicContext ( void )
   1351     : _dummy(0)
   1352     {
   1353     }
   1354 
   1355   /*virtual*/ ~DrawablePushGraphicContext ( void );
   1356 
   1357   // Operator to invoke equivalent draw API call
   1358   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1359 
   1360   // Return polymorphic copy of object
   1361   /*virtual*/ DrawableBase* copy() const;
   1362 
   1363 private:
   1364   ::ssize_t   _dummy;
   1365 };
   1366 
   1367 // Pop (terminate) Pattern definition
   1368 class MagickPPExport DrawablePopPattern : public DrawableBase
   1369 {
   1370 public:
   1371   DrawablePopPattern ( void )
   1372     : _dummy(0)
   1373     {
   1374     }
   1375 
   1376   /*virtual*/ ~DrawablePopPattern ( void );
   1377 
   1378   // Operator to invoke equivalent draw API call
   1379   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1380 
   1381   // Return polymorphic copy of object
   1382   /*virtual*/ DrawableBase* copy() const;
   1383 
   1384 private:
   1385   ::ssize_t   _dummy;
   1386 };
   1387 
   1388 // Push (create) Pattern definition
   1389 class MagickPPExport DrawablePushPattern : public DrawableBase
   1390 {
   1391 public:
   1392   DrawablePushPattern ( const std::string &id_, ::ssize_t x_, ::ssize_t y_,
   1393                         size_t width_, size_t height_ );
   1394 
   1395   DrawablePushPattern ( const DrawablePushPattern& original_ );
   1396 
   1397   /*virtual*/ ~DrawablePushPattern ( void );
   1398 
   1399   // Operator to invoke equivalent draw API call
   1400   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1401 
   1402   // Return polymorphic copy of object
   1403   /*virtual*/ DrawableBase* copy() const;
   1404 
   1405 private:
   1406   std::string         _id;
   1407   ::ssize_t		_x;
   1408   ::ssize_t		_y;
   1409   size_t		_width;
   1410   size_t		_height;
   1411 };
   1412 
   1413 // Rectangle
   1414 class MagickPPExport DrawableRectangle : public DrawableBase
   1415 {
   1416 public:
   1417   DrawableRectangle ( double upperLeftX_, double upperLeftY_,
   1418                       double lowerRightX_, double lowerRightY_ )
   1419     : _upperLeftX(upperLeftX_),
   1420       _upperLeftY(upperLeftY_),
   1421       _lowerRightX(lowerRightX_),
   1422       _lowerRightY(lowerRightY_)
   1423     { }
   1424 
   1425   /*virtual*/ ~DrawableRectangle ( void );
   1426 
   1427   // Operator to invoke equivalent draw API call
   1428   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1429 
   1430   // Return polymorphic copy of object
   1431   /*virtual*/ DrawableBase* copy() const;
   1432 
   1433   void upperLeftX( double upperLeftX_ )
   1434     {
   1435       _upperLeftX = upperLeftX_;
   1436     }
   1437   double upperLeftX( void ) const
   1438     {
   1439       return _upperLeftX;
   1440     }
   1441 
   1442   void upperLeftY( double upperLeftY_ )
   1443     {
   1444       _upperLeftY = upperLeftY_;
   1445     }
   1446   double upperLeftY( void ) const
   1447     {
   1448       return _upperLeftY;
   1449     }
   1450 
   1451   void lowerRightX( double lowerRightX_ )
   1452     {
   1453       _lowerRightX = lowerRightX_;
   1454     }
   1455   double lowerRightX( void ) const
   1456     {
   1457       return _lowerRightX;
   1458     }
   1459 
   1460   void lowerRightY( double lowerRightY_ )
   1461     {
   1462       _lowerRightY = lowerRightY_;
   1463     }
   1464   double lowerRightY( void ) const
   1465     {
   1466       return _lowerRightY;
   1467     }
   1468 
   1469 private:
   1470   double _upperLeftX;
   1471   double _upperLeftY;
   1472   double _lowerRightX;
   1473   double _lowerRightY;
   1474 };
   1475 
   1476 // Apply Rotation
   1477 class MagickPPExport DrawableRotation : public DrawableBase
   1478 {
   1479 public:
   1480   DrawableRotation ( double angle_ )
   1481     : _angle( angle_ )
   1482     { }
   1483 
   1484   /*virtual*/ ~DrawableRotation ( void );
   1485 
   1486   // Operator to invoke equivalent draw API call
   1487   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1488 
   1489   // Return polymorphic copy of object
   1490   /*virtual*/ DrawableBase* copy() const;
   1491 
   1492   void angle( double angle_ )
   1493     {
   1494       _angle = angle_;
   1495     }
   1496   double angle( void ) const
   1497     {
   1498       return _angle;
   1499     }
   1500 
   1501 private:
   1502   double _angle;
   1503 };
   1504 
   1505 // Round Rectangle
   1506 class MagickPPExport DrawableRoundRectangle : public DrawableBase
   1507 {
   1508 public:
   1509   DrawableRoundRectangle ( double centerX_, double centerY_,
   1510                            double width_, double hight_,
   1511                            double cornerWidth_, double cornerHeight_ )
   1512     : _centerX(centerX_),
   1513       _centerY(centerY_),
   1514       _width(width_),
   1515       _hight(hight_),
   1516       _cornerWidth(cornerWidth_),
   1517       _cornerHeight(cornerHeight_)
   1518     { }
   1519 
   1520   /*virtual*/ ~DrawableRoundRectangle ( void );
   1521 
   1522   // Operator to invoke equivalent draw API call
   1523   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1524 
   1525   // Return polymorphic copy of object
   1526   /*virtual*/ DrawableBase* copy() const;
   1527 
   1528   void centerX( double centerX_ )
   1529     {
   1530       _centerX = centerX_;
   1531     }
   1532   double centerX( void ) const
   1533     {
   1534       return _centerX;
   1535     }
   1536 
   1537   void centerY( double centerY_ )
   1538     {
   1539       _centerY = centerY_;
   1540     }
   1541   double centerY( void ) const
   1542     {
   1543       return _centerY;
   1544     }
   1545 
   1546   void width( double width_ )
   1547     {
   1548       _width = width_;
   1549     }
   1550   double width( void ) const
   1551     {
   1552       return _width;
   1553     }
   1554 
   1555   void hight( double hight_ )
   1556     {
   1557       _hight = hight_;
   1558     }
   1559   double hight( void ) const
   1560     {
   1561       return _hight;
   1562     }
   1563 
   1564   void cornerWidth( double cornerWidth_ )
   1565     {
   1566       _cornerWidth = cornerWidth_;
   1567     }
   1568   double cornerWidth( void ) const
   1569     {
   1570       return _cornerWidth;
   1571     }
   1572 
   1573   void cornerHeight( double cornerHeight_ )
   1574     {
   1575       _cornerHeight = cornerHeight_;
   1576     }
   1577   double cornerHeight( void ) const
   1578     {
   1579       return _cornerHeight;
   1580     }
   1581 
   1582 private:
   1583   double _centerX;
   1584   double _centerY;
   1585   double _width;
   1586   double _hight;
   1587   double _cornerWidth;
   1588   double _cornerHeight;
   1589 };
   1590 
   1591 // Apply Scaling
   1592 class MagickPPExport DrawableScaling : public DrawableBase
   1593 {
   1594 public:
   1595   DrawableScaling ( double x_, double y_ )
   1596     : _x(x_),
   1597       _y(y_)
   1598     { }
   1599 
   1600   /*virtual*/ ~DrawableScaling ( void );
   1601 
   1602   // Operator to invoke equivalent draw API call
   1603   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1604 
   1605   // Return polymorphic copy of object
   1606   /*virtual*/ DrawableBase* copy() const;
   1607 
   1608   void x( double x_ )
   1609     {
   1610       _x = x_;
   1611     }
   1612   double x( void ) const
   1613     {
   1614       return _x;
   1615     }
   1616 
   1617   void y( double y_ )
   1618     {
   1619       _y = y_;
   1620     }
   1621   double y( void ) const
   1622     {
   1623       return _y;
   1624     }
   1625 
   1626 private:
   1627   double _x;
   1628   double _y;
   1629 };
   1630 
   1631 // Apply Skew in X direction
   1632 class MagickPPExport DrawableSkewX : public DrawableBase
   1633 {
   1634 public:
   1635   DrawableSkewX ( double angle_ )
   1636     : _angle(angle_)
   1637     { }
   1638 
   1639   /*virtual*/ ~DrawableSkewX ( void );
   1640 
   1641   // Operator to invoke equivalent draw API call
   1642   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1643 
   1644   // Return polymorphic copy of object
   1645   /*virtual*/ DrawableBase* copy() const;
   1646 
   1647   void angle( double angle_ )
   1648     {
   1649       _angle = angle_;
   1650     }
   1651   double angle( void ) const
   1652     {
   1653       return _angle;
   1654     }
   1655 
   1656 private:
   1657   double _angle;
   1658 };
   1659 
   1660 // Apply Skew in Y direction
   1661 class MagickPPExport DrawableSkewY : public DrawableBase
   1662 {
   1663 public:
   1664   DrawableSkewY ( double angle_ )
   1665     : _angle(angle_)
   1666     { }
   1667 
   1668   /*virtual*/ ~DrawableSkewY ( void );
   1669 
   1670   // Operator to invoke equivalent draw API call
   1671   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1672 
   1673   // Return polymorphic copy of object
   1674   /*virtual*/ DrawableBase* copy() const;
   1675 
   1676   void angle( double angle_ )
   1677     {
   1678       _angle = angle_;
   1679     }
   1680   double angle( void ) const
   1681     {
   1682       return _angle;
   1683     }
   1684 
   1685 private:
   1686   double _angle;
   1687 };
   1688 
   1689   // Stroke dasharray
   1690   //
   1691   // dasharray_ is an allocated array terminated by value 0.0 or 0.
   1692   // The array is copied so the original does not need to be preserved.
   1693   // Pass a null pointer to clear an existing dash array setting.
   1694   class MagickPPExport DrawableStrokeDashArray : public DrawableBase
   1695   {
   1696   public:
   1697 
   1698       DrawableStrokeDashArray(const double* dasharray_);
   1699 
   1700       DrawableStrokeDashArray(const Magick::DrawableStrokeDashArray &original_);
   1701 
   1702       ~DrawableStrokeDashArray(void);
   1703 
   1704       // Operator to invoke equivalent draw API call
   1705       void operator()(MagickCore::DrawingWand *context_) const;
   1706 
   1707       // Return polymorphic copy of object
   1708       DrawableBase* copy() const;
   1709 
   1710       void dasharray(const double* dasharray_);
   1711       const double* dasharray(void) const;
   1712 
   1713       DrawableStrokeDashArray& operator=(
   1714         const Magick::DrawableStrokeDashArray &original_);
   1715 
   1716   private:
   1717       size_t _size;
   1718       double *_dasharray;
   1719   };
   1720 
   1721   // Stroke dashoffset
   1722   class MagickPPExport DrawableStrokeDashOffset : public DrawableBase
   1723   {
   1724   public:
   1725     DrawableStrokeDashOffset(const double offset_)
   1726       : _offset(offset_)
   1727       { }
   1728 
   1729      ~DrawableStrokeDashOffset(void);
   1730 
   1731     // Operator to invoke equivalent draw API call
   1732     void operator()(MagickCore::DrawingWand *context_) const;
   1733 
   1734     // Return polymorphic copy of object
   1735     DrawableBase* copy() const;
   1736 
   1737     void offset(const double offset_);
   1738     double offset(void) const;
   1739 
   1740   private:
   1741     double _offset;
   1742   };
   1743 
   1744 // Stroke linecap
   1745 class MagickPPExport DrawableStrokeLineCap : public DrawableBase
   1746 {
   1747 public:
   1748   DrawableStrokeLineCap ( LineCap linecap_ )
   1749     : _linecap(linecap_)
   1750     { }
   1751 
   1752   /*virtual*/ ~DrawableStrokeLineCap ( void );
   1753 
   1754   // Operator to invoke equivalent draw API call
   1755   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1756 
   1757   // Return polymorphic copy of object
   1758   /*virtual*/ DrawableBase* copy() const;
   1759 
   1760   void linecap( LineCap linecap_ )
   1761     {
   1762       _linecap = linecap_;
   1763     }
   1764   LineCap linecap( void ) const
   1765     {
   1766       return _linecap;
   1767     }
   1768 
   1769 private:
   1770   LineCap _linecap;
   1771 };
   1772 
   1773 // Stroke linejoin
   1774 class MagickPPExport DrawableStrokeLineJoin : public DrawableBase
   1775 {
   1776 public:
   1777   DrawableStrokeLineJoin ( LineJoin linejoin_ )
   1778     : _linejoin(linejoin_)
   1779     { }
   1780 
   1781   /*virtual*/ ~DrawableStrokeLineJoin ( void );
   1782 
   1783   // Operator to invoke equivalent draw API call
   1784   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1785 
   1786   // Return polymorphic copy of object
   1787   /*virtual*/ DrawableBase* copy() const;
   1788 
   1789   void linejoin( LineJoin linejoin_ )
   1790     {
   1791       _linejoin = linejoin_;
   1792     }
   1793   LineJoin linejoin( void ) const
   1794     {
   1795       return _linejoin;
   1796     }
   1797 
   1798 private:
   1799   LineJoin _linejoin;
   1800 };
   1801 
   1802 // Stroke miterlimit
   1803 class MagickPPExport DrawableMiterLimit : public DrawableBase
   1804 {
   1805 public:
   1806   DrawableMiterLimit ( size_t miterlimit_ )
   1807     : _miterlimit(miterlimit_)
   1808     { }
   1809 
   1810   /*virtual*/ ~DrawableMiterLimit ( void );
   1811 
   1812   // Operator to invoke equivalent draw API call
   1813   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1814 
   1815   // Return polymorphic copy of object
   1816   /*virtual*/ DrawableBase* copy() const;
   1817 
   1818   void miterlimit( size_t miterlimit_ )
   1819     {
   1820       _miterlimit = miterlimit_;
   1821     }
   1822   size_t miterlimit( void ) const
   1823     {
   1824       return _miterlimit;
   1825     }
   1826 
   1827 private:
   1828   size_t _miterlimit;
   1829 };
   1830 
   1831 // Sets the pattern used for stroking object outlines.
   1832 class MagickPPExport DrawableStrokePatternUrl : public DrawableBase
   1833 {
   1834 public:
   1835 
   1836   DrawableStrokePatternUrl(const std::string &url_);
   1837 
   1838   ~DrawableStrokePatternUrl(void);
   1839 
   1840   DrawableStrokePatternUrl(const DrawableStrokePatternUrl& original_);
   1841 
   1842   // Operator to invoke equivalent draw API call
   1843   void operator()(MagickCore::DrawingWand *context_) const;
   1844 
   1845   void url(const std::string &url_);
   1846   std::string url(void) const;
   1847 
   1848   // Return polymorphic copy of object
   1849   DrawableBase* copy() const;
   1850 
   1851 private:
   1852   std::string _url;
   1853 };
   1854 
   1855 // Stroke antialias
   1856 class MagickPPExport DrawableStrokeAntialias : public DrawableBase
   1857 {
   1858 public:
   1859   DrawableStrokeAntialias ( bool flag_ )
   1860     : _flag(flag_)
   1861     { }
   1862 
   1863   /*virtual*/ ~DrawableStrokeAntialias ( void );
   1864 
   1865   // Operator to invoke equivalent draw API call
   1866   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1867 
   1868   // Return polymorphic copy of object
   1869   /*virtual*/ DrawableBase* copy() const;
   1870 
   1871   void flag( bool flag_ )
   1872     {
   1873       _flag = flag_;
   1874     }
   1875   bool flag( void ) const
   1876     {
   1877       return _flag;
   1878     }
   1879 
   1880 private:
   1881   bool _flag;
   1882 };
   1883 
   1884 // Stroke color
   1885 class MagickPPExport DrawableStrokeColor : public DrawableBase
   1886 {
   1887 public:
   1888   DrawableStrokeColor ( const Color &color_ );
   1889 
   1890   DrawableStrokeColor ( const DrawableStrokeColor& original_ );
   1891 
   1892   /*virtual*/ ~DrawableStrokeColor ( void );
   1893 
   1894   // Operator to invoke equivalent draw API call
   1895   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1896 
   1897   // Return polymorphic copy of object
   1898   /*virtual*/ DrawableBase* copy() const;
   1899 
   1900   void color( const Color& color_ )
   1901     {
   1902       _color = color_;
   1903     }
   1904   Color color( void ) const
   1905     {
   1906       return _color;
   1907     }
   1908 
   1909 private:
   1910   Color _color;
   1911 };
   1912 
   1913 // Stroke opacity
   1914 class MagickPPExport DrawableStrokeOpacity : public DrawableBase
   1915 {
   1916 public:
   1917 
   1918   DrawableStrokeOpacity(double opacity_)
   1919     : _opacity(opacity_)
   1920   {
   1921   }
   1922 
   1923   ~DrawableStrokeOpacity(void);
   1924 
   1925   // Operator to invoke equivalent draw API call
   1926   void operator()(MagickCore::DrawingWand *context_) const;
   1927 
   1928   // Return polymorphic copy of object
   1929   DrawableBase* copy() const;
   1930 
   1931   void opacity(double opacity_)
   1932   {
   1933     _opacity=opacity_;
   1934   }
   1935 
   1936   double opacity(void) const
   1937   {
   1938     return(_opacity);
   1939   }
   1940 
   1941 private:
   1942   double _opacity;
   1943 };
   1944 
   1945 // Stroke width
   1946 class MagickPPExport DrawableStrokeWidth : public DrawableBase
   1947 {
   1948 public:
   1949   DrawableStrokeWidth ( double width_ )
   1950     : _width(width_)
   1951     { }
   1952 
   1953   /*virtual*/ ~DrawableStrokeWidth ( void );
   1954 
   1955   // Operator to invoke equivalent draw API call
   1956   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1957 
   1958   // Return polymorphic copy of object
   1959   /*virtual*/ DrawableBase* copy() const;
   1960 
   1961   void width( double width_ )
   1962     {
   1963       _width = width_;
   1964     }
   1965   double width( void ) const
   1966     {
   1967       return _width;
   1968     }
   1969 
   1970 private:
   1971   double _width;
   1972 };
   1973 
   1974 // Draw text at point
   1975 class MagickPPExport DrawableText : public DrawableBase
   1976 {
   1977 public:
   1978   DrawableText ( const double x_, const double y_,
   1979                  const std::string &text_ );
   1980   DrawableText ( const double x_, const double y_,
   1981                  const std::string &text_, const std::string &encoding_);
   1982 
   1983   DrawableText ( const DrawableText& original_ );
   1984 
   1985   /*virtual*/ ~DrawableText ( void );
   1986 
   1987   // Operator to invoke equivalent draw API call
   1988   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   1989 
   1990   // Return polymorphic copy of object
   1991   /*virtual*/ DrawableBase* copy() const;
   1992 
   1993   void encoding(const std::string &encoding_)
   1994     {
   1995       _encoding = encoding_;
   1996     }
   1997 
   1998   void x( double x_ )
   1999     {
   2000       _x = x_;
   2001     }
   2002   double x( void ) const
   2003     {
   2004       return _x;
   2005     }
   2006 
   2007   void y( double y_ )
   2008     {
   2009       _y = y_;
   2010     }
   2011   double y( void ) const
   2012     {
   2013       return _y;
   2014     }
   2015 
   2016   void text( const std::string &text_ )
   2017     {
   2018       _text = text_;
   2019     }
   2020   std::string text( void ) const
   2021     {
   2022       return _text;
   2023     }
   2024 
   2025 private:
   2026   double      _x;
   2027   double      _y;
   2028   std::string _text;
   2029   std::string _encoding;
   2030 };
   2031 
   2032 // Text alignment
   2033 class MagickPPExport DrawableTextAlignment : public DrawableBase
   2034 {
   2035 public:
   2036 
   2037   DrawableTextAlignment(AlignType alignment_);
   2038 
   2039   DrawableTextAlignment(const DrawableTextAlignment& original_);
   2040 
   2041   ~DrawableTextAlignment(void);
   2042 
   2043   // Operator to invoke equivalent draw API call
   2044   void operator()(MagickCore::DrawingWand *context_) const;
   2045 
   2046   void alignment(AlignType alignment_);
   2047   AlignType alignment(void) const;
   2048 
   2049   // Return polymorphic copy of object
   2050   DrawableBase* copy() const;
   2051 
   2052 private:
   2053   AlignType _alignment;
   2054 };
   2055 
   2056 // Text antialias
   2057 class MagickPPExport DrawableTextAntialias : public DrawableBase
   2058 {
   2059 public:
   2060   DrawableTextAntialias ( bool flag_ );
   2061 
   2062   DrawableTextAntialias( const DrawableTextAntialias &original_ );
   2063 
   2064   /*virtual*/ ~DrawableTextAntialias ( void );
   2065 
   2066   // Operator to invoke equivalent draw API call
   2067   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2068 
   2069   // Return polymorphic copy of object
   2070   /*virtual*/ DrawableBase* copy() const;
   2071 
   2072   void flag( bool flag_ )
   2073     {
   2074       _flag = flag_;
   2075     }
   2076   bool flag( void ) const
   2077     {
   2078       return _flag;
   2079     }
   2080 
   2081 private:
   2082   bool _flag;
   2083 };
   2084 
   2085 // Decoration (text decoration)
   2086 class MagickPPExport DrawableTextDecoration : public DrawableBase
   2087 {
   2088 public:
   2089   DrawableTextDecoration ( DecorationType decoration_ );
   2090 
   2091   DrawableTextDecoration ( const DrawableTextDecoration& original_ );
   2092 
   2093   /*virtual*/ ~DrawableTextDecoration( void );
   2094 
   2095   // Operator to invoke equivalent draw API call
   2096   /*virtual*/  void operator()( MagickCore::DrawingWand *context_ ) const;
   2097 
   2098   // Return polymorphic copy of object
   2099   /*virtual*/ DrawableBase* copy() const;
   2100 
   2101   void decoration( DecorationType decoration_ )
   2102     {
   2103       _decoration = decoration_;
   2104     }
   2105   DecorationType decoration( void ) const
   2106     {
   2107       return _decoration;
   2108     }
   2109 
   2110 private:
   2111   DecorationType _decoration;
   2112 };
   2113 
   2114   // Render text right-to-left or left-to-right.
   2115   class MagickPPExport DrawableTextDirection : public DrawableBase
   2116   {
   2117   public:
   2118 
   2119     DrawableTextDirection(DirectionType direction_);
   2120 
   2121     ~DrawableTextDirection(void);
   2122 
   2123     void operator()(MagickCore::DrawingWand *context_) const;
   2124 
   2125     void direction(DirectionType direction_);
   2126     DirectionType direction(void) const;
   2127 
   2128     DrawableBase* copy() const;
   2129 
   2130   private:
   2131     DirectionType _direction;
   2132   };
   2133 
   2134   // Specify text inter-line spacing
   2135   class MagickPPExport DrawableTextInterlineSpacing : public DrawableBase
   2136   {
   2137   public:
   2138 
   2139     DrawableTextInterlineSpacing(double spacing_);
   2140 
   2141     ~DrawableTextInterlineSpacing(void);
   2142 
   2143     void operator()(MagickCore::DrawingWand *context_) const;
   2144 
   2145     void spacing(double spacing_);
   2146     double spacing(void) const;
   2147 
   2148     DrawableBase* copy() const;
   2149 
   2150   private:
   2151     double _spacing;
   2152   };
   2153 
   2154   // Specify text inter-word spacing
   2155   class MagickPPExport DrawableTextInterwordSpacing : public DrawableBase
   2156   {
   2157   public:
   2158 
   2159     DrawableTextInterwordSpacing(double spacing_);
   2160 
   2161     ~DrawableTextInterwordSpacing(void);
   2162 
   2163     void operator()(MagickCore::DrawingWand *context_) const;
   2164 
   2165     void spacing(double spacing_);
   2166     double spacing(void) const;
   2167 
   2168     DrawableBase *copy() const;
   2169 
   2170   private:
   2171     double _spacing;
   2172   };
   2173 
   2174   // Specify text kerning
   2175   class MagickPPExport DrawableTextKerning : public DrawableBase
   2176   {
   2177   public:
   2178 
   2179     DrawableTextKerning(double kerning_);
   2180 
   2181     ~DrawableTextKerning(void);
   2182 
   2183     void operator()(MagickCore::DrawingWand *context_) const;
   2184 
   2185     void kerning(double kerning_);
   2186     double kerning(void) const;
   2187 
   2188     DrawableBase *copy() const;
   2189 
   2190   private:
   2191     double _kerning;
   2192   };
   2193 
   2194 // Text undercolor box
   2195 class MagickPPExport DrawableTextUnderColor : public DrawableBase
   2196 {
   2197 public:
   2198   DrawableTextUnderColor ( const Color &color_ );
   2199 
   2200   DrawableTextUnderColor ( const DrawableTextUnderColor& original_ );
   2201 
   2202   /*virtual*/ ~DrawableTextUnderColor ( void );
   2203 
   2204   // Operator to invoke equivalent draw API call
   2205   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2206 
   2207   // Return polymorphic copy of object
   2208   /*virtual*/ DrawableBase* copy() const;
   2209 
   2210   void color( const Color& color_ )
   2211     {
   2212       _color = color_;
   2213     }
   2214   Color color( void ) const
   2215     {
   2216       return _color;
   2217     }
   2218 
   2219 private:
   2220   Color _color;
   2221 };
   2222 
   2223 // Apply Translation
   2224 class MagickPPExport DrawableTranslation : public DrawableBase
   2225 {
   2226 public:
   2227   DrawableTranslation ( double x_, double y_ )
   2228     : _x(x_),
   2229       _y(y_)
   2230     { }
   2231 
   2232   /*virtual*/ ~DrawableTranslation ( void );
   2233 
   2234   // Operator to invoke equivalent draw API call
   2235   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2236 
   2237   // Return polymorphic copy of object
   2238   /*virtual*/ DrawableBase* copy() const;
   2239 
   2240   void x( double x_ )
   2241     {
   2242       _x = x_;
   2243     }
   2244   double x( void ) const
   2245     {
   2246       return _x;
   2247     }
   2248 
   2249   void y( double y_ )
   2250     {
   2251       _y = y_;
   2252     }
   2253   double y( void ) const
   2254     {
   2255       return _y;
   2256     }
   2257 
   2258 private:
   2259   double _x;
   2260   double _y;
   2261 };
   2262 
   2263 // Set the size of the viewbox
   2264 class MagickPPExport DrawableViewbox : public DrawableBase
   2265 {
   2266 public:
   2267   DrawableViewbox(::ssize_t x1_, ::ssize_t y1_,
   2268                   ::ssize_t x2_, ::ssize_t y2_)
   2269     : _x1(x1_),
   2270       _y1(y1_),
   2271       _x2(x2_),
   2272       _y2(y2_) { }
   2273 
   2274   /*virtual*/ ~DrawableViewbox ( void );
   2275 
   2276   // Operator to invoke equivalent draw API call
   2277   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2278 
   2279   // Return polymorphic copy of object
   2280   /*virtual*/
   2281   DrawableBase* copy() const;
   2282 
   2283   void x1( ::ssize_t x1_ )
   2284     {
   2285       _x1 = x1_;
   2286     }
   2287   ::ssize_t x1( void ) const
   2288     {
   2289       return _x1;
   2290     }
   2291 
   2292   void y1( ::ssize_t y1_ )
   2293     {
   2294       _y1 = y1_;
   2295     }
   2296   ::ssize_t y1( void ) const
   2297     {
   2298       return _y1;
   2299     }
   2300 
   2301   void x2( ::ssize_t x2_ )
   2302     {
   2303       _x2 = x2_;
   2304     }
   2305   ::ssize_t x2( void ) const
   2306     {
   2307       return _x2;
   2308     }
   2309 
   2310   void y2( ::ssize_t y2_ )
   2311     {
   2312       _y2 = y2_;
   2313     }
   2314   ::ssize_t y2( void ) const
   2315     {
   2316       return _y2;
   2317     }
   2318 
   2319 private:
   2320   ::ssize_t _x1;
   2321   ::ssize_t _y1;
   2322   ::ssize_t _x2;
   2323   ::ssize_t _y2;
   2324 };
   2325 
   2326 //
   2327 // Path Element Classes To Support DrawablePath
   2328 //
   2329 class MagickPPExport PathArcArgs
   2330 {
   2331 public:
   2332   PathArcArgs( void );
   2333 
   2334   PathArcArgs( double radiusX_, double radiusY_,
   2335                double xAxisRotation_, bool largeArcFlag_,
   2336                bool sweepFlag_, double x_, double y_ );
   2337 
   2338   PathArcArgs( const PathArcArgs &original_ );
   2339 
   2340   ~PathArcArgs ( void );
   2341 
   2342   void radiusX( double radiusX_ )
   2343     {
   2344       _radiusX = radiusX_;
   2345     }
   2346   double radiusX( void ) const
   2347     {
   2348       return _radiusX;
   2349     }
   2350 
   2351   void radiusY( double radiusY_ )
   2352     {
   2353       _radiusY = radiusY_;
   2354     }
   2355   double radiusY( void ) const
   2356     {
   2357       return _radiusY;
   2358     }
   2359 
   2360   void xAxisRotation( double xAxisRotation_ )
   2361     {
   2362       _xAxisRotation = xAxisRotation_;
   2363     }
   2364   double xAxisRotation( void ) const
   2365     {
   2366       return _xAxisRotation;
   2367     }
   2368 
   2369   void largeArcFlag( bool largeArcFlag_ )
   2370     {
   2371       _largeArcFlag = largeArcFlag_;
   2372     }
   2373   bool largeArcFlag( void ) const
   2374     {
   2375       return _largeArcFlag;
   2376     }
   2377 
   2378   void sweepFlag( bool sweepFlag_ )
   2379     {
   2380       _sweepFlag = sweepFlag_;
   2381     }
   2382   bool sweepFlag( void ) const
   2383     {
   2384       return _sweepFlag;
   2385     }
   2386 
   2387   void x( double x_ )
   2388     {
   2389       _x = x_;
   2390     }
   2391   double x( void ) const
   2392     {
   2393       return _x;
   2394     }
   2395 
   2396   void y( double y_ )
   2397     {
   2398       _y = y_;
   2399     }
   2400   double y( void ) const
   2401     {
   2402       return _y;
   2403     }
   2404 
   2405 private:
   2406   double	_radiusX;	// X radius
   2407   double	_radiusY;	// Y radius
   2408   double	_xAxisRotation;	// Rotation relative to X axis
   2409   bool        _largeArcFlag;	// Draw longer of the two matching arcs
   2410   bool        _sweepFlag;	// Draw arc matching clock-wise rotation
   2411   double	_x;		// End-point X
   2412   double	_y;		// End-point Y
   2413 };
   2414 
   2415 // Compare two PathArcArgs objects regardless of LHS/RHS
   2416 extern MagickPPExport int operator == ( const PathArcArgs& left_,
   2417                                       const PathArcArgs& right_ );
   2418 extern MagickPPExport int operator != ( const PathArcArgs& left_,
   2419                                       const PathArcArgs& right_ );
   2420 extern MagickPPExport int operator >  ( const PathArcArgs& left_,
   2421                                       const PathArcArgs& right_ );
   2422 extern MagickPPExport int operator <  ( const PathArcArgs& left_,
   2423                                       const PathArcArgs& right_ );
   2424 extern MagickPPExport int operator >= ( const PathArcArgs& left_,
   2425                                       const PathArcArgs& right_ );
   2426 extern MagickPPExport int operator <= ( const PathArcArgs& left_,
   2427                                       const PathArcArgs& right_ );
   2428 
   2429 typedef std::vector<Magick::PathArcArgs> PathArcArgsList;
   2430 
   2431 #if defined(MagickDLLExplicitTemplate)
   2432 
   2433 MagickDrawableExtern template class MagickPPExport
   2434 std::allocator<Magick::PathArcArgs>;
   2435 
   2436 // MagickDrawableExtern template class MagickPPExport
   2437 // std::vector<Magick::PathArcArgs, std::allocator<Magick::PathArcArgs> >;
   2438 
   2439 #endif // MagickDLLExplicitTemplate
   2440 
   2441 // Path Arc (Elliptical Arc)
   2442 class MagickPPExport PathArcAbs : public VPathBase
   2443 {
   2444 public:
   2445   // Draw a single arc segment
   2446   PathArcAbs ( const PathArcArgs &coordinates_ );
   2447 
   2448   // Draw multiple arc segments
   2449   PathArcAbs ( const PathArcArgsList &coordinates_ );
   2450 
   2451   // Copy constructor
   2452   PathArcAbs ( const PathArcAbs& original_ );
   2453 
   2454   // Destructor
   2455   /*virtual*/ ~PathArcAbs ( void );
   2456 
   2457   // Operator to invoke equivalent draw API call
   2458   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2459 
   2460   // Return polymorphic copy of object
   2461   /*virtual*/ VPathBase* copy() const;
   2462 
   2463 private:
   2464   PathArcArgsList _coordinates;
   2465 };
   2466 class MagickPPExport PathArcRel : public VPathBase
   2467 {
   2468 public:
   2469   // Draw a single arc segment
   2470   PathArcRel ( const PathArcArgs &coordinates_ );
   2471 
   2472   // Draw multiple arc segments
   2473   PathArcRel ( const PathArcArgsList &coordinates_ );
   2474 
   2475   PathArcRel ( const PathArcRel& original_ );
   2476 
   2477   /*virtual*/ ~PathArcRel ( void );
   2478 
   2479   // Operator to invoke equivalent draw API call
   2480   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2481 
   2482   // Return polymorphic copy of object
   2483   /*virtual*/ VPathBase* copy() const;
   2484 
   2485 private:
   2486   PathArcArgsList _coordinates;
   2487 };
   2488 
   2489 // Path Closepath
   2490 class MagickPPExport PathClosePath : public VPathBase
   2491 {
   2492 public:
   2493   PathClosePath ( void )
   2494     : _dummy(0)
   2495     {
   2496     }
   2497 
   2498   /*virtual*/ ~PathClosePath ( void );
   2499 
   2500   // Operator to invoke equivalent draw API call
   2501   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2502 
   2503   // Return polymorphic copy of object
   2504   /*virtual*/ VPathBase* copy() const;
   2505 
   2506 private:
   2507   ::ssize_t   _dummy;
   2508 };
   2509 
   2510 //
   2511 // Curveto (Cubic Bezier)
   2512 //
   2513 class MagickPPExport PathCurvetoArgs
   2514 {
   2515 public:
   2516   PathCurvetoArgs( void );
   2517 
   2518   PathCurvetoArgs( double x1_, double y1_,
   2519                    double x2_, double y2_,
   2520                    double x_, double y_ );
   2521 
   2522   PathCurvetoArgs( const PathCurvetoArgs &original_ );
   2523 
   2524   ~PathCurvetoArgs ( void );
   2525 
   2526   void x1( double x1_ )
   2527     {
   2528       _x1 = x1_;
   2529     }
   2530 double x1( void ) const
   2531 {
   2532   return _x1;
   2533 }
   2534 
   2535 void y1( double y1_ )
   2536 {
   2537   _y1 = y1_;
   2538 }
   2539 double y1( void ) const
   2540 {
   2541   return _y1;
   2542 }
   2543 
   2544 void x2( double x2_ )
   2545 {
   2546   _x2 = x2_;
   2547 }
   2548 double x2( void ) const
   2549 {
   2550   return _x2;
   2551 }
   2552 
   2553 void y2( double y2_ )
   2554 {
   2555   _y2 = y2_;
   2556 }
   2557 double y2( void ) const
   2558 {
   2559   return _y2;
   2560 }
   2561 
   2562 void x( double x_ )
   2563 {
   2564   _x = x_;
   2565 }
   2566 double x( void ) const
   2567 {
   2568   return _x;
   2569 }
   2570 
   2571 void y( double y_ )
   2572 {
   2573   _y = y_;
   2574 }
   2575 double y( void ) const
   2576 {
   2577   return _y;
   2578 }
   2579 
   2580 private:
   2581 double _x1;
   2582 double _y1;
   2583 double _x2;
   2584 double _y2;
   2585 double _x;
   2586 double _y;
   2587 };
   2588 
   2589 // Compare two PathCurvetoArgs objects regardless of LHS/RHS
   2590 extern MagickPPExport int operator == ( const PathCurvetoArgs& left_,
   2591                                       const PathCurvetoArgs& right_ );
   2592 extern MagickPPExport int operator != ( const PathCurvetoArgs& left_,
   2593                                       const PathCurvetoArgs& right_ );
   2594 extern MagickPPExport int operator >  ( const PathCurvetoArgs& left_,
   2595                                       const PathCurvetoArgs& right_ );
   2596 extern MagickPPExport int operator <  ( const PathCurvetoArgs& left_,
   2597                                       const PathCurvetoArgs& right_ );
   2598 extern MagickPPExport int operator >= ( const PathCurvetoArgs& left_,
   2599                                       const PathCurvetoArgs& right_ );
   2600 extern MagickPPExport int operator <= ( const PathCurvetoArgs& left_,
   2601                                       const PathCurvetoArgs& right_ );
   2602 
   2603 typedef std::vector<Magick::PathCurvetoArgs> PathCurveToArgsList;
   2604 
   2605 #if defined(MagickDLLExplicitTemplate)
   2606 
   2607 MagickDrawableExtern template class MagickPPExport
   2608 std::allocator<Magick::PathCurvetoArgs>;
   2609 
   2610 // MagickDrawableExtern template class MagickPPExport
   2611 // std::vector<Magick::PathCurvetoArgs, std::allocator<Magick::PathCurvetoArgs> >;
   2612 
   2613 #endif // MagickDLLExplicitTemplate
   2614 
   2615 class MagickPPExport PathCurvetoAbs : public VPathBase
   2616 {
   2617 public:
   2618   // Draw a single curve
   2619   PathCurvetoAbs ( const PathCurvetoArgs &args_ );
   2620 
   2621   // Draw multiple curves
   2622   PathCurvetoAbs ( const PathCurveToArgsList &args_ );
   2623 
   2624   // Copy constructor
   2625   PathCurvetoAbs ( const PathCurvetoAbs& original_ );
   2626 
   2627   // Destructor
   2628   /*virtual*/ ~PathCurvetoAbs ( void );
   2629 
   2630   // Operator to invoke equivalent draw API call
   2631   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2632 
   2633   // Return polymorphic copy of object
   2634   /*virtual*/ VPathBase* copy() const;
   2635 
   2636 private:
   2637   PathCurveToArgsList _args;
   2638 };
   2639 class MagickPPExport PathCurvetoRel : public VPathBase
   2640 {
   2641 public:
   2642   // Draw a single curve
   2643   PathCurvetoRel ( const PathCurvetoArgs &args_ );
   2644 
   2645   // Draw multiple curves
   2646   PathCurvetoRel ( const PathCurveToArgsList &args_ );
   2647 
   2648   // Copy constructor
   2649   PathCurvetoRel ( const PathCurvetoRel& original_ );
   2650 
   2651   /*virtual*/ ~PathCurvetoRel ( void );
   2652 
   2653   // Operator to invoke equivalent draw API call
   2654   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2655 
   2656   // Return polymorphic copy of object
   2657   /*virtual*/ VPathBase* copy() const;
   2658 
   2659 private:
   2660   PathCurveToArgsList _args;
   2661 };
   2662 class MagickPPExport PathSmoothCurvetoAbs : public VPathBase
   2663 {
   2664 public:
   2665   // Draw a single curve
   2666   PathSmoothCurvetoAbs ( const Magick::Coordinate &coordinates_ );
   2667 
   2668   // Draw multiple curves
   2669   PathSmoothCurvetoAbs ( const CoordinateList &coordinates_ );
   2670 
   2671   // Copy constructor
   2672   PathSmoothCurvetoAbs ( const PathSmoothCurvetoAbs& original_ );
   2673 
   2674   /*virtual*/ ~PathSmoothCurvetoAbs ( void );
   2675 
   2676   // Operator to invoke equivalent draw API call
   2677   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2678 
   2679   // Return polymorphic copy of object
   2680   /*virtual*/
   2681   VPathBase* copy() const;
   2682 
   2683 private:
   2684   CoordinateList _coordinates;
   2685 };
   2686 class MagickPPExport PathSmoothCurvetoRel : public VPathBase
   2687 {
   2688 public:
   2689   // Draw a single curve
   2690   PathSmoothCurvetoRel ( const Coordinate &coordinates_ );
   2691 
   2692   // Draw multiple curves
   2693   PathSmoothCurvetoRel ( const CoordinateList &coordinates_ );
   2694 
   2695   // Copy constructor
   2696   PathSmoothCurvetoRel ( const PathSmoothCurvetoRel& original_ );
   2697 
   2698   // Destructor
   2699   /*virtual*/ ~PathSmoothCurvetoRel ( void );
   2700 
   2701   // Operator to invoke equivalent draw API call
   2702   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2703 
   2704   // Return polymorphic copy of object
   2705   /*virtual*/
   2706   VPathBase* copy() const;
   2707 
   2708 private:
   2709   CoordinateList _coordinates;
   2710 };
   2711 
   2712 //
   2713 // Quadratic Curveto (Quadratic Bezier)
   2714 //
   2715 class MagickPPExport PathQuadraticCurvetoArgs
   2716 {
   2717 public:
   2718   PathQuadraticCurvetoArgs( void );
   2719 
   2720   PathQuadraticCurvetoArgs( double x1_, double y1_,
   2721                             double x_, double y_ );
   2722 
   2723   PathQuadraticCurvetoArgs( const PathQuadraticCurvetoArgs &original_ );
   2724 
   2725   ~PathQuadraticCurvetoArgs ( void );
   2726 
   2727   void x1( double x1_ )
   2728     {
   2729       _x1 = x1_;
   2730     }
   2731   double x1( void ) const
   2732     {
   2733       return _x1;
   2734     }
   2735 
   2736   void y1( double y1_ )
   2737     {
   2738       _y1 = y1_;
   2739     }
   2740   double y1( void ) const
   2741     {
   2742       return _y1;
   2743     }
   2744 
   2745   void x( double x_ )
   2746     {
   2747       _x = x_;
   2748     }
   2749   double x( void ) const
   2750     {
   2751       return _x;
   2752     }
   2753 
   2754   void y( double y_ )
   2755     {
   2756       _y = y_;
   2757     }
   2758   double y( void ) const
   2759     {
   2760       return _y;
   2761     }
   2762 
   2763 private:
   2764   double _x1;
   2765   double _y1;
   2766   double _x;
   2767   double _y;
   2768 };
   2769 
   2770 // Compare two PathQuadraticCurvetoArgs objects regardless of LHS/RHS
   2771 extern MagickPPExport int operator == ( const PathQuadraticCurvetoArgs& left_,
   2772                                       const PathQuadraticCurvetoArgs& right_ );
   2773 extern MagickPPExport int operator != ( const PathQuadraticCurvetoArgs& left_,
   2774                                       const PathQuadraticCurvetoArgs& right_);
   2775 extern MagickPPExport int operator >  ( const PathQuadraticCurvetoArgs& left_,
   2776                                       const PathQuadraticCurvetoArgs& right_);
   2777 extern MagickPPExport int operator <  ( const PathQuadraticCurvetoArgs& left_,
   2778                                       const PathQuadraticCurvetoArgs& right_);
   2779 extern MagickPPExport int operator >= ( const PathQuadraticCurvetoArgs& left_,
   2780                                       const PathQuadraticCurvetoArgs& right_ );
   2781 extern MagickPPExport int operator <= ( const PathQuadraticCurvetoArgs& left_,
   2782                                       const PathQuadraticCurvetoArgs& right_ );
   2783 
   2784 typedef std::vector<Magick::PathQuadraticCurvetoArgs> PathQuadraticCurvetoArgsList;
   2785 
   2786 #if defined(MagickDLLExplicitTemplate)
   2787 
   2788 MagickDrawableExtern template class MagickPPExport
   2789 std::allocator<Magick::PathQuadraticCurvetoArgs>;
   2790 
   2791 // MagickDrawableExtern template class MagickPPExport
   2792 // std::vector<Magick::PathQuadraticCurvetoArgs, std::allocator<Magick::PathQuadraticCurvetoArgs> >;
   2793 
   2794 #endif // MagickDLLExplicitTemplate
   2795 
   2796 class MagickPPExport PathQuadraticCurvetoAbs : public VPathBase
   2797 {
   2798 public:
   2799   // Draw a single curve
   2800   PathQuadraticCurvetoAbs ( const Magick::PathQuadraticCurvetoArgs &args_ );
   2801 
   2802   // Draw multiple curves
   2803   PathQuadraticCurvetoAbs ( const PathQuadraticCurvetoArgsList &args_ );
   2804 
   2805   // Copy constructor
   2806   PathQuadraticCurvetoAbs ( const PathQuadraticCurvetoAbs& original_ );
   2807 
   2808   // Destructor
   2809   /*virtual*/ ~PathQuadraticCurvetoAbs ( void );
   2810 
   2811   // Operator to invoke equivalent draw API call
   2812   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2813 
   2814   // Return polymorphic copy of object
   2815   /*virtual*/ VPathBase* copy() const;
   2816 
   2817 private:
   2818   PathQuadraticCurvetoArgsList _args;
   2819 };
   2820 class MagickPPExport PathQuadraticCurvetoRel : public VPathBase
   2821 {
   2822 public:
   2823   // Draw a single curve
   2824   PathQuadraticCurvetoRel ( const Magick::PathQuadraticCurvetoArgs &args_ );
   2825 
   2826   // Draw multiple curves
   2827   PathQuadraticCurvetoRel ( const PathQuadraticCurvetoArgsList &args_ );
   2828 
   2829   // Copy constructor
   2830   PathQuadraticCurvetoRel ( const PathQuadraticCurvetoRel& original_ );
   2831 
   2832   // Destructor
   2833   /*virtual*/ ~PathQuadraticCurvetoRel ( void );
   2834 
   2835   // Operator to invoke equivalent draw API call
   2836   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2837 
   2838   // Return polymorphic copy of object
   2839   /*virtual*/ VPathBase* copy() const;
   2840 
   2841 private:
   2842   PathQuadraticCurvetoArgsList _args;
   2843 };
   2844 class MagickPPExport PathSmoothQuadraticCurvetoAbs : public VPathBase
   2845 {
   2846 public:
   2847   // Draw a single curve
   2848   PathSmoothQuadraticCurvetoAbs ( const Magick::Coordinate &coordinate_ );
   2849 
   2850   // Draw multiple curves
   2851   PathSmoothQuadraticCurvetoAbs ( const CoordinateList &coordinates_ );
   2852 
   2853   // Copy constructor
   2854   PathSmoothQuadraticCurvetoAbs ( const PathSmoothQuadraticCurvetoAbs& original_ );
   2855 
   2856   // Destructor
   2857   /*virtual*/ ~PathSmoothQuadraticCurvetoAbs ( void );
   2858 
   2859   // Operator to invoke equivalent draw API call
   2860   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2861 
   2862   // Return polymorphic copy of object
   2863   /*virtual*/ VPathBase* copy() const;
   2864 
   2865 private:
   2866   CoordinateList _coordinates;
   2867 };
   2868 class MagickPPExport PathSmoothQuadraticCurvetoRel : public VPathBase
   2869 {
   2870 public:
   2871   // Draw a single curve
   2872   PathSmoothQuadraticCurvetoRel ( const Magick::Coordinate &coordinate_ );
   2873 
   2874   // Draw multiple curves
   2875   PathSmoothQuadraticCurvetoRel ( const CoordinateList &coordinates_ );
   2876 
   2877   // Copy constructor
   2878   PathSmoothQuadraticCurvetoRel ( const PathSmoothQuadraticCurvetoRel& original_ );
   2879 
   2880   // Destructor
   2881   /*virtual*/ ~PathSmoothQuadraticCurvetoRel ( void );
   2882 
   2883   // Operator to invoke equivalent draw API call
   2884   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2885 
   2886   // Return polymorphic copy of object
   2887   /*virtual*/ VPathBase* copy() const;
   2888 
   2889 private:
   2890   CoordinateList _coordinates;
   2891 };
   2892 
   2893 //
   2894 // Path Lineto
   2895 //
   2896 class MagickPPExport PathLinetoAbs : public VPathBase
   2897 {
   2898 public:
   2899   // Draw to a single point
   2900   PathLinetoAbs ( const Magick::Coordinate& coordinate_  );
   2901 
   2902   // Draw to multiple points
   2903   PathLinetoAbs ( const CoordinateList &coordinates_ );
   2904 
   2905   // Copy constructor
   2906   PathLinetoAbs ( const PathLinetoAbs& original_ );
   2907 
   2908   // Destructor
   2909   /*virtual*/ ~PathLinetoAbs ( void );
   2910 
   2911   // Operator to invoke equivalent draw API call
   2912   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2913 
   2914   // Return polymorphic copy of object
   2915   /*virtual*/ VPathBase* copy() const;
   2916 
   2917 private:
   2918   CoordinateList _coordinates;
   2919 };
   2920 class MagickPPExport PathLinetoRel : public VPathBase
   2921 {
   2922 public:
   2923   // Draw to a single point
   2924   PathLinetoRel ( const Magick::Coordinate& coordinate_ );
   2925 
   2926   // Draw to multiple points
   2927   PathLinetoRel ( const CoordinateList &coordinates_ );
   2928 
   2929   // Copy constructor
   2930   PathLinetoRel ( const PathLinetoRel& original_ );
   2931 
   2932   // Destructor
   2933   /*virtual*/ ~PathLinetoRel ( void );
   2934 
   2935   // Operator to invoke equivalent draw API call
   2936   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2937 
   2938   // Return polymorphic copy of object
   2939   /*virtual*/ VPathBase* copy() const;
   2940 
   2941 private:
   2942   CoordinateList _coordinates;
   2943 };
   2944 
   2945 // Path Horizontal Lineto
   2946 class MagickPPExport PathLinetoHorizontalAbs : public VPathBase
   2947 {
   2948 public:
   2949   PathLinetoHorizontalAbs ( double x_ )
   2950     : _x(x_)
   2951     {
   2952     }
   2953 
   2954   /*virtual*/ ~PathLinetoHorizontalAbs ( void );
   2955 
   2956   // Operator to invoke equivalent draw API call
   2957   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2958 
   2959   // Return polymorphic copy of object
   2960   /*virtual*/ VPathBase* copy() const;
   2961 
   2962   void x( double x_ )
   2963     {
   2964       _x = x_;
   2965     }
   2966   double x( void ) const
   2967     {
   2968       return _x;
   2969     }
   2970 
   2971 private:
   2972   double _x;
   2973 };
   2974 class MagickPPExport PathLinetoHorizontalRel : public VPathBase
   2975 {
   2976 public:
   2977   PathLinetoHorizontalRel ( double x_ )
   2978     : _x(x_)
   2979     {
   2980     }
   2981 
   2982   /*virtual*/ ~PathLinetoHorizontalRel ( void );
   2983 
   2984   // Operator to invoke equivalent draw API call
   2985   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   2986 
   2987   // Return polymorphic copy of object
   2988   /*virtual*/ VPathBase* copy() const;
   2989 
   2990   void x( double x_ )
   2991     {
   2992       _x = x_;
   2993     }
   2994   double x( void ) const
   2995     {
   2996       return _x;
   2997     }
   2998 
   2999 private:
   3000   double _x;
   3001 };
   3002 
   3003 // Path Vertical Lineto
   3004 class MagickPPExport PathLinetoVerticalAbs : public VPathBase
   3005 {
   3006 public:
   3007   PathLinetoVerticalAbs ( double y_ )
   3008     : _y(y_)
   3009     {
   3010     }
   3011 
   3012   /*virtual*/ ~PathLinetoVerticalAbs ( void );
   3013 
   3014   // Operator to invoke equivalent draw API call
   3015   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   3016 
   3017   // Return polymorphic copy of object
   3018   /*virtual*/ VPathBase* copy() const;
   3019 
   3020   void y( double y_ )
   3021     {
   3022       _y = y_;
   3023     }
   3024   double y( void ) const
   3025     {
   3026       return _y;
   3027     }
   3028 
   3029 private:
   3030   double _y;
   3031 };
   3032 class MagickPPExport PathLinetoVerticalRel : public VPathBase
   3033 {
   3034 public:
   3035   PathLinetoVerticalRel ( double y_ )
   3036     : _y(y_)
   3037     {
   3038     }
   3039 
   3040   /*virtual*/ ~PathLinetoVerticalRel ( void );
   3041 
   3042   // Operator to invoke equivalent draw API call
   3043   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   3044 
   3045   // Return polymorphic copy of object
   3046   /*virtual*/ VPathBase* copy() const;
   3047 
   3048   void y( double y_ )
   3049     {
   3050       _y = y_;
   3051     }
   3052   double y( void ) const
   3053     {
   3054       return _y;
   3055     }
   3056 
   3057 private:
   3058   double _y;
   3059 };
   3060 
   3061 // Path Moveto
   3062 class MagickPPExport PathMovetoAbs : public VPathBase
   3063 {
   3064 public:
   3065   // Simple moveto
   3066   PathMovetoAbs ( const Magick::Coordinate &coordinate_ );
   3067 
   3068   // Moveto followed by implicit linetos
   3069   PathMovetoAbs ( const CoordinateList &coordinates_ );
   3070 
   3071   // Copy constructor
   3072   PathMovetoAbs ( const PathMovetoAbs& original_ );
   3073 
   3074   // Destructor
   3075   /*virtual*/ ~PathMovetoAbs ( void );
   3076 
   3077   // Operator to invoke equivalent draw API call
   3078   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   3079 
   3080   // Return polymorphic copy of object
   3081   /*virtual*/ VPathBase* copy() const;
   3082 
   3083 private:
   3084   CoordinateList _coordinates;
   3085 };
   3086 class MagickPPExport PathMovetoRel : public VPathBase
   3087 {
   3088 public:
   3089   // Simple moveto
   3090   PathMovetoRel ( const Magick::Coordinate &coordinate_ );
   3091 
   3092   // Moveto followed by implicit linetos
   3093   PathMovetoRel ( const CoordinateList &coordinates_ );
   3094 
   3095   // Copy constructor
   3096   PathMovetoRel ( const PathMovetoRel& original_ );
   3097 
   3098   // Destructor
   3099   /*virtual*/ ~PathMovetoRel ( void );
   3100 
   3101   // Operator to invoke equivalent draw API call
   3102   /*virtual*/ void operator()( MagickCore::DrawingWand *context_ ) const;
   3103 
   3104   // Return polymorphic copy of object
   3105   /*virtual*/ VPathBase* copy() const;
   3106 
   3107 private:
   3108   CoordinateList _coordinates;
   3109 };
   3110 
   3111 } // namespace Magick
   3112 
   3113 #endif // Magick_Drawable_header
   3114