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