Magick++  7.1.2-29
Convert, Edit, Or Compose Bitmap Images
Options.cpp
1 // This may look like C code, but it is really -*- C++ -*-
2 //
3 // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
4 //
5 // Copyright @ 2014 ImageMagick Studio LLC, a non-profit organization
6 // dedicated to making software imaging solutions freely available.
7 //
8 // Implementation of Options
9 //
10 // A wrapper around DrawInfo, ImageInfo, and QuantizeInfo
11 //
12 
13 #define MAGICKCORE_IMPLEMENTATION 1
14 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1
15 
16 #include "Magick++/Include.h"
17 #include <string>
18 #include <string.h>
19 #include <stdlib.h>
20 #include <math.h>
21 
22 #include "Magick++/Options.h"
23 #include "Magick++/Functions.h"
24 #include "Magick++/Exception.h"
25 
26 #define MagickPI 3.14159265358979323846264338327950288419716939937510
27 #define DegreesToRadians(x) (MagickPI*(x)/180.0)
28 
29 Magick::Options::Options(void)
30  : _imageInfo(static_cast<ImageInfo*>(AcquireMagickMemory(
31  sizeof(ImageInfo)))),
32  _quantizeInfo(static_cast<QuantizeInfo*>(AcquireMagickMemory(
33  sizeof(QuantizeInfo)))),
34  _drawInfo(static_cast<DrawInfo*>(AcquireMagickMemory(sizeof(DrawInfo)))),
35  _quiet(false)
36 {
37  // Initialize image info with defaults
38  GetImageInfo(_imageInfo);
39 
40  // Initialize quantization info
41  GetQuantizeInfo(_quantizeInfo);
42 
43  // Initialize drawing info
44  GetDrawInfo(_imageInfo,_drawInfo);
45 }
46 
47 Magick::Options::Options(const Options& options_)
48  : _imageInfo(CloneImageInfo(options_._imageInfo)),
49  _quantizeInfo(CloneQuantizeInfo(options_._quantizeInfo)),
50  _drawInfo(CloneDrawInfo(_imageInfo,options_._drawInfo)),
51  _quiet(options_._quiet)
52 {
53 }
54 
55 Magick::Options::~Options()
56 {
57  // Destroy image info
58  _imageInfo=DestroyImageInfo(_imageInfo);
59 
60  // Destroy quantization info
61  _quantizeInfo=DestroyQuantizeInfo(_quantizeInfo);
62 
63  // Destroy drawing info
64  _drawInfo=DestroyDrawInfo(_drawInfo);
65 }
66 
67 void Magick::Options::adjoin(const bool flag_)
68 {
69  _imageInfo->adjoin=static_cast<MagickBooleanType>(
70  flag_ ? MagickTrue : MagickFalse);
71 }
72 
73 bool Magick::Options::adjoin(void) const
74 {
75  return(static_cast<bool>(_imageInfo->adjoin));
76 }
77 
78 void Magick::Options::matteColor(const Color &matteColor_)
79 {
80  _imageInfo->matte_color=matteColor_;
81 }
82 
83 Magick::Color Magick::Options::matteColor(void) const
84 {
85  return(Magick::Color(_imageInfo->matte_color));
86 }
87 
88 void Magick::Options::backgroundColor(const Color &color_)
89 {
90  _imageInfo->background_color=color_;
91 }
92 
93 Magick::Color Magick::Options::backgroundColor(void) const
94 {
95  return(Color(_imageInfo->background_color));
96 }
97 
98 void Magick::Options::backgroundTexture(const std::string &backgroundTexture_)
99 {
100  if (backgroundTexture_.length() == 0)
101  _imageInfo->texture=(char *) RelinquishMagickMemory(_imageInfo->texture);
102  else
103  Magick::CloneString(&_imageInfo->texture,backgroundTexture_);
104 }
105 
106 std::string Magick::Options::backgroundTexture(void) const
107 {
108  if (_imageInfo->texture)
109  return(std::string(_imageInfo->texture));
110  else
111  return(std::string());
112 }
113 
114 void Magick::Options::borderColor(const Color &color_)
115 {
116  _imageInfo->border_color=color_;
117  _drawInfo->border_color=color_;
118 }
119 
120 Magick::Color Magick::Options::borderColor(void) const
121 {
122  return(Color(_imageInfo->border_color));
123 }
124 
125 void Magick::Options::boxColor(const Color &boxColor_)
126 {
127  _drawInfo->undercolor=boxColor_;
128 }
129 
130 Magick::Color Magick::Options::boxColor(void) const
131 {
132  return(Color(_drawInfo->undercolor));
133 }
134 
135 void Magick::Options::colorspaceType(const ColorspaceType colorspace_)
136 {
137  _imageInfo->colorspace=colorspace_;
138 }
139 
140 Magick::ColorspaceType Magick::Options::colorspaceType(void) const
141 {
142  return(static_cast<Magick::ColorspaceType>(_imageInfo->colorspace));
143 }
144 
145 void Magick::Options::compressType(const CompressionType compressType_)
146 {
147  _imageInfo->compression=compressType_;
148 }
149 
150 Magick::CompressionType Magick::Options::compressType(void) const
151 {
152  return(static_cast<Magick::CompressionType>(_imageInfo->compression));
153 }
154 
155 void Magick::Options::colorFuzz(const double fuzz_)
156 {
157  _imageInfo->fuzz=fuzz_;
158 }
159 
160 double Magick::Options::colorFuzz(void) const
161 {
162  return(_imageInfo->fuzz);
163 }
164 
165 void Magick::Options::debug(const bool flag_)
166 {
167  if (flag_)
168  SetLogEventMask("All");
169  else
170  SetLogEventMask("None");
171 }
172 
173 bool Magick::Options::debug(void) const
174 {
175  if (IsEventLogging())
176  return(true);
177  return(false);
178 }
179 
180 void Magick::Options::density(const Point &density_)
181 {
182  if (!density_.isValid())
183  _imageInfo->density=(char *) RelinquishMagickMemory(_imageInfo->density);
184  else
185  CloneString(&_imageInfo->density,density_);
186 }
187 
188 Magick::Point Magick::Options::density(void) const
189 {
190  if (_imageInfo->density)
191  return(Point(_imageInfo->density));
192 
193  return(Point());
194 }
195 
196 void Magick::Options::depth(const size_t depth_)
197 {
198  _imageInfo->depth=depth_;
199 }
200 
201 size_t Magick::Options::depth(void) const
202 {
203  return(_imageInfo->depth);
204 }
205 
206 void Magick::Options::endian(const Magick::EndianType endian_)
207 {
208  _imageInfo->endian=endian_;
209 }
210 
211 Magick::EndianType Magick::Options::endian(void) const
212 {
213  return(_imageInfo->endian);
214 }
215 
216 void Magick::Options::file(FILE *file_)
217 {
218  SetImageInfoFile(_imageInfo,file_);
219 }
220 
221 FILE *Magick::Options::file(void) const
222 {
223  return(GetImageInfoFile(_imageInfo));
224 }
225 
226 void Magick::Options::fileName(const std::string &fileName_)
227 {
228  ssize_t
229  max_length;
230 
231  max_length=sizeof(_imageInfo->filename)-1;
232  fileName_.copy(_imageInfo->filename,(size_t) max_length);
233  if ((ssize_t) fileName_.length() > max_length)
234  _imageInfo->filename[max_length]=0;
235  else
236  _imageInfo->filename[fileName_.length()]=0;
237 }
238 
239 std::string Magick::Options::fileName(void) const
240 {
241  return(std::string(_imageInfo->filename));
242 }
243 
244 void Magick::Options::fillColor(const Color &fillColor_)
245 {
246  _drawInfo->fill=fillColor_;
247  if (fillColor_ == Color())
248  fillPattern((const MagickCore::Image*) NULL);
249  setOption("fill",fillColor_);
250 }
251 
252 Magick::Color Magick::Options::fillColor(void) const
253 {
254  return(_drawInfo->fill);
255 }
256 
257 void Magick::Options::fillPattern(const MagickCore::Image *fillPattern_)
258 {
259  if (_drawInfo->fill_pattern)
260  _drawInfo->fill_pattern=DestroyImageList(_drawInfo->fill_pattern);
261 
262  if (fillPattern_)
263  {
264  GetPPException;
265  _drawInfo->fill_pattern=CloneImage(const_cast<MagickCore::Image*>(
266  fillPattern_),0,0,static_cast<MagickBooleanType>(MagickTrue),
267  exceptionInfo);
268  ThrowPPException(_quiet);
269  }
270 }
271 
272 const MagickCore::Image *Magick::Options::fillPattern(void) const
273 {
274  return(_drawInfo->fill_pattern);
275 }
276 
277 void Magick::Options::fillRule(const FillRule &fillRule_)
278 {
279  _drawInfo->fill_rule=fillRule_;
280 }
281 
282 Magick::FillRule Magick::Options::fillRule(void) const
283 {
284  return(_drawInfo->fill_rule);
285 }
286 
287 void Magick::Options::font(const std::string &font_)
288 {
289  if (font_.length() == 0)
290  {
291  _imageInfo->font=(char *) RelinquishMagickMemory(_imageInfo->font);
292  _drawInfo->font=(char *) RelinquishMagickMemory(_drawInfo->font);
293  }
294  else
295  {
296  Magick::CloneString(&_imageInfo->font,font_);
297  Magick::CloneString(&_drawInfo->font,font_);
298  }
299 }
300 
301 std::string Magick::Options::font(void) const
302 {
303  if (_imageInfo->font)
304  return(std::string(_imageInfo->font));
305 
306  return(std::string());
307 }
308 
309 void Magick::Options::fontFamily(const std::string &family_)
310 {
311  if (family_.length() == 0)
312  {
313  _drawInfo->family=(char *) RelinquishMagickMemory(_drawInfo->family);
314  DestroyString(RemoveImageOption(imageInfo(),"family"));
315  }
316  else
317  {
318  Magick::CloneString(&_drawInfo->family,family_);
319  (void) SetImageOption(imageInfo(),"family",family_.c_str());
320  }
321 }
322 
323 std::string Magick::Options::fontFamily(void) const
324 {
325  if (_drawInfo->family)
326  return(std::string(_drawInfo->family));
327 
328  return(std::string());
329 }
330 
331 void Magick::Options::fontPointsize(const double pointSize_)
332 {
333  _imageInfo->pointsize=pointSize_;
334  _drawInfo->pointsize=pointSize_;
335 }
336 
337 double Magick::Options::fontPointsize(void) const
338 {
339  return(_imageInfo->pointsize);
340 }
341 
342 void Magick::Options::fontStyle(const StyleType style_)
343 {
344  _drawInfo->style=style_;
345  (void) SetImageOption(_imageInfo,"style",CommandOptionToMnemonic(
346  MagickStyleOptions,(ssize_t) style_));
347 }
348 
349 Magick::StyleType Magick::Options::fontStyle(void) const
350 {
351  return(_drawInfo->style);
352 }
353 
354 void Magick::Options::fontWeight(const size_t weight_)
355 {
356  _drawInfo->weight=weight_;
357  setOption("weight",(double) weight_);
358 }
359 
360 size_t Magick::Options::fontWeight(void) const
361 {
362  return(_drawInfo->weight);
363 }
364 
365 std::string Magick::Options::format(void) const
366 {
367  const MagickInfo
368  *magick_info=0;
369 
370  GetPPException;
371  if (*_imageInfo->magick != '\0' )
372  magick_info = GetMagickInfo(_imageInfo->magick,exceptionInfo);
373  ThrowPPException(_quiet);
374 
375  if ((magick_info != 0) && (*magick_info->description != '\0'))
376  return(std::string( magick_info->description));
377 
378  return(std::string());
379 }
380 
381 void Magick::Options::interlaceType(const InterlaceType interlace_)
382 {
383  _imageInfo->interlace=interlace_;
384 }
385 
386 Magick::InterlaceType Magick::Options::interlaceType(void) const
387 {
388  return(static_cast<Magick::InterlaceType>(_imageInfo->interlace));
389 }
390 
391 void Magick::Options::magick(const std::string &magick_)
392 {
393  if (magick_.empty())
394  {
395  _imageInfo->magick[0] = '\0';
396  return;
397  }
398 
399  FormatLocaleString(_imageInfo->filename,MagickPathExtent,"%.1024s:",
400  magick_.c_str());
401  GetPPException;
402  SetImageInfo(_imageInfo,1,exceptionInfo);
403  ThrowPPException(_quiet);
404  if ( _imageInfo->magick[0] == '\0' )
405  throwExceptionExplicit(MagickCore::OptionError,"Unrecognized image format",
406  magick_.c_str());
407 }
408 
409 std::string Magick::Options::magick(void) const
410 {
411  if ( _imageInfo->magick[0] != '\0' )
412  return(std::string(_imageInfo->magick));
413 
414  return(std::string());
415 }
416 
417 void Magick::Options::monochrome(const bool monochromeFlag_)
418 {
419  _imageInfo->monochrome=(MagickBooleanType) monochromeFlag_;
420 }
421 
422 bool Magick::Options::monochrome(void) const
423 {
424  return(static_cast<bool>(_imageInfo->monochrome));
425 }
426 
427 void Magick::Options::page(const Geometry &pageSize_)
428 {
429  if (!pageSize_.isValid())
430  _imageInfo->page=(char *) RelinquishMagickMemory(_imageInfo->page);
431  else
432  Magick::CloneString(&_imageInfo->page,pageSize_);
433 }
434 
435 Magick::Geometry Magick::Options::page(void) const
436 {
437  if (_imageInfo->page)
438  return(Geometry(_imageInfo->page));
439 
440  return(Geometry());
441 }
442 
443 void Magick::Options::quality(const size_t quality_)
444 {
445  _imageInfo->quality=quality_;
446 }
447 
448 size_t Magick::Options::quality(void) const
449 {
450  return(_imageInfo->quality);
451 }
452 
453 void Magick::Options::quantizeColors(const size_t colors_)
454 {
455  _quantizeInfo->number_colors=colors_;
456 }
457 
458 size_t Magick::Options::quantizeColors(void) const
459 {
460  return(_quantizeInfo->number_colors);
461 }
462 
463 void Magick::Options::quantizeColorSpace(const ColorspaceType colorSpace_)
464 {
465  _quantizeInfo->colorspace=colorSpace_;
466 }
467 
468 Magick::ColorspaceType Magick::Options::quantizeColorSpace(void) const
469 {
470  return(static_cast<Magick::ColorspaceType>(_quantizeInfo->colorspace));
471 }
472 
473 void Magick::Options::quantizeDither(const bool ditherFlag_)
474 {
475  quantizeDither(ditherFlag_ ? RiemersmaDitherMethod : NoDitherMethod);
476 }
477 
478 bool Magick::Options::quantizeDither(void) const
479 {
480  return(static_cast<bool>(_imageInfo->dither));
481 }
482 
483 void Magick::Options::quantizeDither(const DitherMethod ditherMethod_)
484 {
485  _imageInfo->dither=(MagickBooleanType) (ditherMethod_ != NoDitherMethod);
486  _quantizeInfo->dither_method=ditherMethod_;
487 }
488 
489 void Magick::Options::quantizeDitherMethod(const DitherMethod ditherMethod_)
490 {
491  _quantizeInfo->dither_method=ditherMethod_;
492 }
493 
494 MagickCore::DitherMethod Magick::Options::quantizeDitherMethod(void) const
495 {
496  return(_quantizeInfo->dither_method);
497 }
498 
499 void Magick::Options::quantizeTreeDepth(const size_t treeDepth_)
500 {
501  _quantizeInfo->tree_depth=treeDepth_;
502 }
503 
504 size_t Magick::Options::quantizeTreeDepth(void) const
505 {
506  return(_quantizeInfo->tree_depth);
507 }
508 
509 void Magick::Options::quiet(const bool quiet_)
510 {
511  _quiet=quiet_;
512 }
513 
514 bool Magick::Options::quiet(void) const
515 {
516  return(_quiet);
517 }
518 
519 void Magick::Options::resolutionUnits(const ResolutionType resolutionUnits_)
520 {
521  _imageInfo->units=resolutionUnits_;
522 }
523 
524 Magick::ResolutionType Magick::Options::resolutionUnits(void) const
525 {
526  return(_imageInfo->units);
527 }
528 
529 void Magick::Options::samplingFactor(const std::string &samplingFactor_)
530 {
531  if (samplingFactor_.length() == 0)
532  _imageInfo->sampling_factor=(char *) RelinquishMagickMemory(
533  _imageInfo->sampling_factor);
534  else
535  Magick::CloneString(&_imageInfo->sampling_factor,samplingFactor_);
536 }
537 
538 std::string Magick::Options::samplingFactor(void) const
539 {
540  if (_imageInfo->sampling_factor)
541  return(std::string(_imageInfo->sampling_factor));
542 
543  return(std::string());
544 }
545 
546 void Magick::Options::size(const Geometry &geometry_)
547 {
548  _imageInfo->size=(char *) RelinquishMagickMemory(_imageInfo->size);
549 
550  if (geometry_.isValid())
551  Magick::CloneString(&_imageInfo->size,geometry_);
552 }
553 
554 Magick::Geometry Magick::Options::size(void) const
555 {
556  if (_imageInfo->size)
557  return(Geometry(_imageInfo->size));
558 
559  return(Geometry());
560 }
561 
562 void Magick::Options::strokeAntiAlias(const bool flag_)
563 {
564  flag_ ? _drawInfo->stroke_antialias=MagickTrue :
565  _drawInfo->stroke_antialias=MagickFalse;
566 }
567 
568 bool Magick::Options::strokeAntiAlias(void) const
569 {
570  return(_drawInfo->stroke_antialias != 0 ? true : false);
571 }
572 
573 void Magick::Options::strokeColor(const Color &strokeColor_)
574 {
575  _drawInfo->stroke=strokeColor_;
576  if (strokeColor_ == Color())
577  strokePattern((const MagickCore::Image*) NULL);
578  setOption("stroke",strokeColor_);
579 }
580 
581 Magick::Color Magick::Options::strokeColor(void) const
582 {
583  return(_drawInfo->stroke);
584 }
585 
586 void Magick::Options::strokeDashArray(const double *strokeDashArray_)
587 {
588  _drawInfo->dash_pattern=(double *) RelinquishMagickMemory(
589  _drawInfo->dash_pattern);
590 
591  if(strokeDashArray_)
592  {
593  size_t
594  x;
595 
596  for (x=0; fabs(strokeDashArray_[x]) >= MagickEpsilon; x++) ;
597  _drawInfo->dash_pattern=static_cast<double*>(AcquireMagickMemory((x+1)*
598  sizeof(double)));
599  if (!_drawInfo->dash_pattern)
600  throwExceptionExplicit(MagickCore::ResourceLimitError,
601  "Unable to allocate dash-pattern memory");
602  else
603  {
604  (void) memset(_drawInfo->dash_pattern,0,(size_t) (x+1)*sizeof(double));
605  memcpy(_drawInfo->dash_pattern,strokeDashArray_,x*sizeof(double));
606  _drawInfo->dash_pattern[x]=0.0;
607  }
608  }
609 }
610 
611 const double *Magick::Options::strokeDashArray(void) const
612 {
613  return(_drawInfo->dash_pattern);
614 }
615 
616 void Magick::Options::strokeDashOffset(const double strokeDashOffset_)
617 {
618  _drawInfo->dash_offset=strokeDashOffset_;
619 }
620 
621 double Magick::Options::strokeDashOffset(void) const
622 {
623  return(_drawInfo->dash_offset);
624 }
625 
626 void Magick::Options::strokeLineCap(const LineCap lineCap_)
627 {
628  _drawInfo->linecap=lineCap_;
629 }
630 
631 Magick::LineCap Magick::Options::strokeLineCap(void) const
632 {
633  return(_drawInfo->linecap);
634 }
635 
636 void Magick::Options::strokeLineJoin(const LineJoin lineJoin_)
637 {
638  _drawInfo->linejoin=lineJoin_;
639 }
640 
641 Magick::LineJoin Magick::Options::strokeLineJoin(void) const
642 {
643  return(_drawInfo->linejoin);
644 }
645 
646 void Magick::Options::strokeMiterLimit(const size_t miterLimit_)
647 {
648  _drawInfo->miterlimit=miterLimit_;
649 }
650 
651 size_t Magick::Options::strokeMiterLimit(void) const
652 {
653  return(_drawInfo->miterlimit);
654 }
655 
656 void Magick::Options::strokePattern(const MagickCore::Image *strokePattern_)
657 {
658  if (_drawInfo->stroke_pattern)
659  _drawInfo->stroke_pattern=DestroyImageList(_drawInfo->stroke_pattern);
660 
661  if (strokePattern_)
662  {
663  GetPPException;
664  _drawInfo->stroke_pattern=CloneImage(const_cast<MagickCore::Image*>(
665  strokePattern_),0,0,MagickTrue,exceptionInfo);
666  ThrowPPException(_quiet);
667  }
668 }
669 
670 const MagickCore::Image *Magick::Options::strokePattern(void) const
671 {
672  return(_drawInfo->stroke_pattern);
673 }
674 
675 void Magick::Options::strokeWidth(const double strokeWidth_)
676 {
677  _drawInfo->stroke_width=strokeWidth_;
678  setOption("strokewidth",strokeWidth_);
679 }
680 
681 double Magick::Options::strokeWidth(void) const
682 {
683  return(_drawInfo->stroke_width);
684 }
685 
686 void Magick::Options::subImage(const size_t subImage_)
687 {
688  _imageInfo->scene=subImage_;
689 }
690 
691 size_t Magick::Options::subImage(void) const
692 {
693  return(_imageInfo->scene);
694 }
695 
696 void Magick::Options::subRange(const size_t subRange_)
697 {
698  _imageInfo->number_scenes=subRange_;
699 }
700 
701 size_t Magick::Options::subRange(void) const
702 {
703  return(_imageInfo->number_scenes);
704 }
705 
706 void Magick::Options::textAntiAlias(const bool flag_)
707 {
708  _drawInfo->text_antialias=static_cast<MagickBooleanType>(
709  flag_ ? MagickTrue : MagickFalse);
710 }
711 
712 bool Magick::Options::textAntiAlias(void) const
713 {
714  return(static_cast<bool>(_drawInfo->text_antialias));
715 }
716 
717 void Magick::Options::textDirection(const DirectionType direction_)
718 {
719  _drawInfo->direction=direction_;
720  (void) SetImageOption(_imageInfo,"direction",CommandOptionToMnemonic(
721  MagickDirectionOptions,(ssize_t) direction_));
722 }
723 
724 Magick::DirectionType Magick::Options::textDirection() const
725 {
726  return(_drawInfo->direction);
727 }
728 
729 void Magick::Options::textEncoding(const std::string &encoding_)
730 {
731  CloneString(&_drawInfo->encoding,encoding_.c_str());
732  (void) SetImageOption(imageInfo(),"encoding",encoding_.c_str());
733 }
734 
735 std::string Magick::Options::textEncoding(void) const
736 {
737  if (_drawInfo->encoding && *_drawInfo->encoding)
738  return(std::string(_drawInfo->encoding));
739 
740  return(std::string());
741 }
742 
743 void Magick::Options::textGravity(const GravityType gravity_)
744 {
745  _drawInfo->gravity=gravity_;
746  (void) SetImageOption(_imageInfo,"gravity",CommandOptionToMnemonic(
747  MagickGravityOptions,(ssize_t) gravity_));
748 }
749 
750 Magick::GravityType Magick::Options::textGravity() const
751 {
752  return(_drawInfo->gravity);
753 }
754 
755 void Magick::Options::textInterlineSpacing(const double spacing_)
756 {
757  _drawInfo->interline_spacing=spacing_;
758  setOption("interline-spacing",spacing_);
759 }
760 
761 double Magick::Options::textInterlineSpacing(void) const
762 {
763  return(_drawInfo->interline_spacing);
764 }
765 
766 void Magick::Options::textInterwordSpacing(const double spacing_)
767 {
768  _drawInfo->interword_spacing=spacing_;
769  setOption("interword-spacing",spacing_);
770 }
771 
772 double Magick::Options::textInterwordSpacing(void) const
773 {
774  return(_drawInfo->interword_spacing);
775 }
776 
777 void Magick::Options::textKerning(const double kerning_)
778 {
779  _drawInfo->kerning=kerning_;
780  setOption("kerning",kerning_);
781 }
782 
783 double Magick::Options::textKerning(void) const
784 {
785  return(_drawInfo->kerning);
786 }
787 
788 void Magick::Options::textUnderColor(const Color &undercolor_)
789 {
790  _drawInfo->undercolor=undercolor_;
791  setOption("undercolor",undercolor_);
792 }
793 
794 Magick::Color Magick::Options::textUnderColor(void) const
795 {
796  return(_drawInfo->undercolor);
797 }
798 
799 void Magick::Options::transformOrigin(const double tx_,const double ty_)
800 {
801  AffineMatrix
802  affine,
803  current=_drawInfo->affine;
804 
805  affine.sx=1.0;
806  affine.rx=0.0;
807  affine.ry=0.0;
808  affine.sy=1.0;
809  affine.tx=tx_;
810  affine.ty=ty_;
811 
812  _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
813  _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
814  _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
815  _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
816  _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
817  _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
818 }
819 
820 void Magick::Options::transformReset(void)
821 {
822  _drawInfo->affine.sx=1.0;
823  _drawInfo->affine.rx=0.0;
824  _drawInfo->affine.ry=0.0;
825  _drawInfo->affine.sy=1.0;
826  _drawInfo->affine.tx=0.0;
827  _drawInfo->affine.ty=0.0;
828 }
829 
830 void Magick::Options::transformRotation(const double angle_)
831 {
832  AffineMatrix
833  affine,
834  current=_drawInfo->affine;
835 
836  affine.sx=cos(DegreesToRadians(fmod(angle_,360.0)));
837  affine.rx=(-sin(DegreesToRadians(fmod(angle_,360.0))));
838  affine.ry=sin(DegreesToRadians(fmod(angle_,360.0)));
839  affine.sy=cos(DegreesToRadians(fmod(angle_,360.0)));
840  affine.tx=0.0;
841  affine.ty=0.0;
842 
843  _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
844  _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
845  _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
846  _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
847  _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
848  _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
849 }
850 
851 void Magick::Options::transformScale(const double sx_,const double sy_)
852 {
853  AffineMatrix
854  affine,
855  current=_drawInfo->affine;
856 
857  affine.sx=sx_;
858  affine.rx=0.0;
859  affine.ry=0.0;
860  affine.sy=sy_;
861  affine.tx=0.0;
862  affine.ty=0.0;
863 
864  _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
865  _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
866  _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
867  _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
868  _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
869  _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
870 }
871 
872 void Magick::Options::transformSkewX(const double skewx_)
873 {
874  AffineMatrix
875  affine,
876  current=_drawInfo->affine;
877 
878  affine.sx=1.0;
879  affine.rx=0.0;
880  affine.ry=tan(DegreesToRadians(fmod(skewx_,360.0)));
881  affine.sy=1.0;
882  affine.tx=0.0;
883  affine.ty=0.0;
884 
885  _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
886  _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
887  _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
888  _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
889  _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
890  _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
891 }
892 
893 void Magick::Options::transformSkewY(const double skewy_)
894 {
895  AffineMatrix
896  affine,
897  current=_drawInfo->affine;
898 
899  affine.sx=1.0;
900  affine.rx=tan(DegreesToRadians(fmod(skewy_,360.0)));
901  affine.ry=0.0;
902  affine.sy=1.0;
903  affine.tx=0.0;
904  affine.ty=0.0;
905 
906  _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
907  _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
908  _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
909  _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
910  _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
911  _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
912 }
913 
914 void Magick::Options::type(const ImageType type_)
915 {
916  _imageInfo->type=type_;
917 }
918 
919 Magick::ImageType Magick::Options::type(void) const
920 {
921  return(_imageInfo->type);
922 }
923 
924 void Magick::Options::verbose(const bool verboseFlag_)
925 {
926  _imageInfo->verbose=(MagickBooleanType) verboseFlag_;
927 }
928 
929 bool Magick::Options::verbose(void) const
930 {
931  return(static_cast<bool>(_imageInfo->verbose));
932 }
933 
934 void Magick::Options::x11Display(const std::string &display_)
935 {
936  if (display_.length() == 0)
937  _imageInfo->server_name=(char *) RelinquishMagickMemory(
938  _imageInfo->server_name);
939  else
940  Magick::CloneString(&_imageInfo->server_name,display_);
941 }
942 
943 std::string Magick::Options::x11Display(void) const
944 {
945  if (_imageInfo->server_name)
946  return(std::string( _imageInfo->server_name));
947 
948  return(std::string());
949 }
950 
951 MagickCore::DrawInfo *Magick::Options::drawInfo(void)
952 {
953  return(_drawInfo);
954 }
955 
956 MagickCore::ImageInfo *Magick::Options::imageInfo(void)
957 {
958  return(_imageInfo);
959 }
960 
961 MagickCore::QuantizeInfo *Magick::Options::quantizeInfo(void)
962 {
963  return(_quantizeInfo);
964 }
965 
966 Magick::Options::Options(const MagickCore::ImageInfo* imageInfo_,
967  const MagickCore::QuantizeInfo* quantizeInfo_,
968  const MagickCore::DrawInfo* drawInfo_)
969 : _imageInfo((MagickCore::ImageInfo* ) NULL),
970  _quantizeInfo((MagickCore::QuantizeInfo* ) NULL),
971  _drawInfo((MagickCore::DrawInfo* ) NULL),
972  _quiet(false)
973 {
974  _imageInfo=CloneImageInfo(imageInfo_);
975  _quantizeInfo=CloneQuantizeInfo(quantizeInfo_);
976  _drawInfo=CloneDrawInfo(imageInfo_,drawInfo_);
977 }
978 
979 void Magick::Options::setOption(const char *name,const Color &value_)
980 {
981  std::string
982  option;
983 
984  option=value_;
985  (void) SetImageOption(imageInfo(),name,option.c_str());
986 }
987 
988 void Magick::Options::setOption(const char *name,const double value_)
989 {
990  char
991  option[MagickPathExtent];
992 
993  (void) FormatLocaleString(option,MagickPathExtent,"%.17g",value_);
994  (void) SetImageOption(_imageInfo,name,option);
995 }
996