Magick++ 7.1.1
Loading...
Searching...
No Matches
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
29Magick::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
47Magick::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
55Magick::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
67void Magick::Options::adjoin(const bool flag_)
68{
69 _imageInfo->adjoin=static_cast<MagickBooleanType>(
70 flag_ ? MagickTrue : MagickFalse);
71}
72
73bool Magick::Options::adjoin(void) const
74{
75 return(static_cast<bool>(_imageInfo->adjoin));
76}
77
78void Magick::Options::matteColor(const Color &matteColor_)
79{
80 _imageInfo->matte_color=matteColor_;
81}
82
83Magick::Color Magick::Options::matteColor(void) const
84{
85 return(Magick::Color(_imageInfo->matte_color));
86}
87
88void Magick::Options::backgroundColor(const Color &color_)
89{
90 _imageInfo->background_color=color_;
91}
92
93Magick::Color Magick::Options::backgroundColor(void) const
94{
95 return(Color(_imageInfo->background_color));
96}
97
98void 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
106std::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
114void Magick::Options::borderColor(const Color &color_)
115{
116 _imageInfo->border_color=color_;
117 _drawInfo->border_color=color_;
118}
119
120Magick::Color Magick::Options::borderColor(void) const
121{
122 return(Color(_imageInfo->border_color));
123}
124
125void Magick::Options::boxColor(const Color &boxColor_)
126{
127 _drawInfo->undercolor=boxColor_;
128}
129
130Magick::Color Magick::Options::boxColor(void) const
131{
132 return(Color(_drawInfo->undercolor));
133}
134
135void Magick::Options::colorspaceType(const ColorspaceType colorspace_)
136{
137 _imageInfo->colorspace=colorspace_;
138}
139
140Magick::ColorspaceType Magick::Options::colorspaceType(void) const
141{
142 return(static_cast<Magick::ColorspaceType>(_imageInfo->colorspace));
143}
144
145void Magick::Options::compressType(const CompressionType compressType_)
146{
147 _imageInfo->compression=compressType_;
148}
149
150Magick::CompressionType Magick::Options::compressType(void) const
151{
152 return(static_cast<Magick::CompressionType>(_imageInfo->compression));
153}
154
155void Magick::Options::colorFuzz(const double fuzz_)
156{
157 _imageInfo->fuzz=fuzz_;
158}
159
160double Magick::Options::colorFuzz(void) const
161{
162 return(_imageInfo->fuzz);
163}
164
165void Magick::Options::debug(const bool flag_)
166{
167 if (flag_)
168 SetLogEventMask("All");
169 else
170 SetLogEventMask("None");
171}
172
173bool Magick::Options::debug(void) const
174{
175 if (IsEventLogging())
176 return(true);
177 return(false);
178}
179
180void 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
188Magick::Point Magick::Options::density(void) const
189{
190 if (_imageInfo->density)
191 return(Point(_imageInfo->density));
192
193 return(Point());
194}
195
196void Magick::Options::depth(const size_t depth_)
197{
198 _imageInfo->depth=depth_;
199}
200
201size_t Magick::Options::depth(void) const
202{
203 return(_imageInfo->depth);
204}
205
206void Magick::Options::endian(const Magick::EndianType endian_)
207{
208 _imageInfo->endian=endian_;
209}
210
211Magick::EndianType Magick::Options::endian(void) const
212{
213 return(_imageInfo->endian);
214}
215
216void Magick::Options::file(FILE *file_)
217{
218 SetImageInfoFile(_imageInfo,file_);
219}
220
221FILE *Magick::Options::file(void) const
222{
223 return(GetImageInfoFile(_imageInfo));
224}
225
226void 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
239std::string Magick::Options::fileName(void) const
240{
241 return(std::string(_imageInfo->filename));
242}
243
244void 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
252Magick::Color Magick::Options::fillColor(void) const
253{
254 return(_drawInfo->fill);
255}
256
257void 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
272const MagickCore::Image *Magick::Options::fillPattern(void) const
273{
274 return(_drawInfo->fill_pattern);
275}
276
277void Magick::Options::fillRule(const FillRule &fillRule_)
278{
279 _drawInfo->fill_rule=fillRule_;
280}
281
282Magick::FillRule Magick::Options::fillRule(void) const
283{
284 return(_drawInfo->fill_rule);
285}
286
287void 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
301std::string Magick::Options::font(void) const
302{
303 if (_imageInfo->font)
304 return(std::string(_imageInfo->font));
305
306 return(std::string());
307}
308
309void Magick::Options::fontFamily(const std::string &family_)
310{
311 if (family_.length() == 0)
312 {
313 _drawInfo->family=(char *) RelinquishMagickMemory(_drawInfo->font);
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
323std::string Magick::Options::fontFamily(void) const
324{
325 if (_drawInfo->family)
326 return(std::string(_drawInfo->family));
327
328 return(std::string());
329}
330
331void Magick::Options::fontPointsize(const double pointSize_)
332{
333 _imageInfo->pointsize=pointSize_;
334 _drawInfo->pointsize=pointSize_;
335}
336
337double Magick::Options::fontPointsize(void) const
338{
339 return(_imageInfo->pointsize);
340}
341
342void Magick::Options::fontStyle(const StyleType style_)
343{
344 _drawInfo->style=style_;
345 (void) SetImageOption(_imageInfo,"style",CommandOptionToMnemonic(
346 MagickStyleOptions,(ssize_t) style_));
347}
348
349Magick::StyleType Magick::Options::fontStyle(void) const
350{
351 return(_drawInfo->style);
352}
353
354void Magick::Options::fontWeight(const size_t weight_)
355{
356 _drawInfo->weight=weight_;
357 setOption("weight",(double) weight_);
358}
359
360size_t Magick::Options::fontWeight(void) const
361{
362 return(_drawInfo->weight);
363}
364
365std::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
381void Magick::Options::interlaceType(const InterlaceType interlace_)
382{
383 _imageInfo->interlace=interlace_;
384}
385
386Magick::InterlaceType Magick::Options::interlaceType(void) const
387{
388 return(static_cast<Magick::InterlaceType>(_imageInfo->interlace));
389}
390
391void 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
409std::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
417void Magick::Options::monochrome(const bool monochromeFlag_)
418{
419 _imageInfo->monochrome=(MagickBooleanType) monochromeFlag_;
420}
421
422bool Magick::Options::monochrome(void) const
423{
424 return(static_cast<bool>(_imageInfo->monochrome));
425}
426
427void 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
435Magick::Geometry Magick::Options::page(void) const
436{
437 if (_imageInfo->page)
438 return(Geometry(_imageInfo->page));
439
440 return(Geometry());
441}
442
443void Magick::Options::quality(const size_t quality_)
444{
445 _imageInfo->quality=quality_;
446}
447
448size_t Magick::Options::quality(void) const
449{
450 return(_imageInfo->quality);
451}
452
453void Magick::Options::quantizeColors(const size_t colors_)
454{
455 _quantizeInfo->number_colors=colors_;
456}
457
458size_t Magick::Options::quantizeColors(void) const
459{
460 return(_quantizeInfo->number_colors);
461}
462
463void Magick::Options::quantizeColorSpace(const ColorspaceType colorSpace_)
464{
465 _quantizeInfo->colorspace=colorSpace_;
466}
467
468Magick::ColorspaceType Magick::Options::quantizeColorSpace(void) const
469{
470 return(static_cast<Magick::ColorspaceType>(_quantizeInfo->colorspace));
471}
472
473void Magick::Options::quantizeDither(const bool ditherFlag_)
474{
475 quantizeDither(ditherFlag_ ? RiemersmaDitherMethod : NoDitherMethod);
476}
477
478bool Magick::Options::quantizeDither(void) const
479{
480 return(static_cast<bool>(_imageInfo->dither));
481}
482
483void Magick::Options::quantizeDither(const DitherMethod ditherMethod_)
484{
485 _imageInfo->dither=(MagickBooleanType) (ditherMethod_ != NoDitherMethod);
486 _quantizeInfo->dither_method=ditherMethod_;
487}
488
489void Magick::Options::quantizeDitherMethod(const DitherMethod ditherMethod_)
490{
491 _quantizeInfo->dither_method=ditherMethod_;
492}
493
494MagickCore::DitherMethod Magick::Options::quantizeDitherMethod(void) const
495{
496 return(_quantizeInfo->dither_method);
497}
498
499void Magick::Options::quantizeTreeDepth(const size_t treeDepth_)
500{
501 _quantizeInfo->tree_depth=treeDepth_;
502}
503
504size_t Magick::Options::quantizeTreeDepth(void) const
505{
506 return(_quantizeInfo->tree_depth);
507}
508
509void Magick::Options::quiet(const bool quiet_)
510{
511 _quiet=quiet_;
512}
513
514bool Magick::Options::quiet(void) const
515{
516 return(_quiet);
517}
518
519void Magick::Options::resolutionUnits(const ResolutionType resolutionUnits_)
520{
521 _imageInfo->units=resolutionUnits_;
522}
523
524Magick::ResolutionType Magick::Options::resolutionUnits(void) const
525{
526 return(_imageInfo->units);
527}
528
529void 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
538std::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
546void 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
554Magick::Geometry Magick::Options::size(void) const
555{
556 if (_imageInfo->size)
557 return(Geometry(_imageInfo->size));
558
559 return(Geometry());
560}
561
562void Magick::Options::strokeAntiAlias(const bool flag_)
563{
564 flag_ ? _drawInfo->stroke_antialias=MagickTrue :
565 _drawInfo->stroke_antialias=MagickFalse;
566}
567
568bool Magick::Options::strokeAntiAlias(void) const
569{
570 return(_drawInfo->stroke_antialias != 0 ? true : false);
571}
572
573void 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
581Magick::Color Magick::Options::strokeColor(void) const
582{
583 return(_drawInfo->stroke);
584}
585
586void 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 // Count elements in dash array
596 for (x=0; strokeDashArray_[x]; x++) ;
597 // Allocate elements
598 _drawInfo->dash_pattern=static_cast<double*>(AcquireMagickMemory((x+1)*
599 sizeof(double)));
600 if (!_drawInfo->dash_pattern)
601 throwExceptionExplicit(MagickCore::ResourceLimitError,
602 "Unable to allocate dash-pattern memory");
603 else
604 {
605 // Copy elements
606 memcpy(_drawInfo->dash_pattern,strokeDashArray_,(x+1)*sizeof(double));
607 _drawInfo->dash_pattern[x]=0.0;
608 }
609 }
610}
611
612const double *Magick::Options::strokeDashArray(void) const
613{
614 return(_drawInfo->dash_pattern);
615}
616
617void Magick::Options::strokeDashOffset(const double strokeDashOffset_)
618{
619 _drawInfo->dash_offset=strokeDashOffset_;
620}
621
622double Magick::Options::strokeDashOffset(void) const
623{
624 return(_drawInfo->dash_offset);
625}
626
627void Magick::Options::strokeLineCap(const LineCap lineCap_)
628{
629 _drawInfo->linecap=lineCap_;
630}
631
632Magick::LineCap Magick::Options::strokeLineCap(void) const
633{
634 return(_drawInfo->linecap);
635}
636
637void Magick::Options::strokeLineJoin(const LineJoin lineJoin_)
638{
639 _drawInfo->linejoin=lineJoin_;
640}
641
642Magick::LineJoin Magick::Options::strokeLineJoin(void) const
643{
644 return(_drawInfo->linejoin);
645}
646
647void Magick::Options::strokeMiterLimit(const size_t miterLimit_)
648{
649 _drawInfo->miterlimit=miterLimit_;
650}
651
652size_t Magick::Options::strokeMiterLimit(void) const
653{
654 return(_drawInfo->miterlimit);
655}
656
657void Magick::Options::strokePattern(const MagickCore::Image *strokePattern_)
658{
659 if (_drawInfo->stroke_pattern)
660 _drawInfo->stroke_pattern=DestroyImageList(_drawInfo->stroke_pattern);
661
662 if (strokePattern_)
663 {
664 GetPPException;
665 _drawInfo->stroke_pattern=CloneImage(const_cast<MagickCore::Image*>(
666 strokePattern_),0,0,MagickTrue,exceptionInfo);
667 ThrowPPException(_quiet);
668 }
669}
670
671const MagickCore::Image *Magick::Options::strokePattern(void) const
672{
673 return(_drawInfo->stroke_pattern);
674}
675
676void Magick::Options::strokeWidth(const double strokeWidth_)
677{
678 _drawInfo->stroke_width=strokeWidth_;
679 setOption("strokewidth",strokeWidth_);
680}
681
682double Magick::Options::strokeWidth(void) const
683{
684 return(_drawInfo->stroke_width);
685}
686
687void Magick::Options::subImage(const size_t subImage_)
688{
689 _imageInfo->scene=subImage_;
690}
691
692size_t Magick::Options::subImage(void) const
693{
694 return(_imageInfo->scene);
695}
696
697void Magick::Options::subRange(const size_t subRange_)
698{
699 _imageInfo->number_scenes=subRange_;
700}
701
702size_t Magick::Options::subRange(void) const
703{
704 return(_imageInfo->number_scenes);
705}
706
707void Magick::Options::textAntiAlias(const bool flag_)
708{
709 _drawInfo->text_antialias=static_cast<MagickBooleanType>(
710 flag_ ? MagickTrue : MagickFalse);
711}
712
713bool Magick::Options::textAntiAlias(void) const
714{
715 return(static_cast<bool>(_drawInfo->text_antialias));
716}
717
718void Magick::Options::textDirection(const DirectionType direction_)
719{
720 _drawInfo->direction=direction_;
721 (void) SetImageOption(_imageInfo,"direction",CommandOptionToMnemonic(
722 MagickDirectionOptions,(ssize_t) direction_));
723}
724
725Magick::DirectionType Magick::Options::textDirection() const
726{
727 return(_drawInfo->direction);
728}
729
730void Magick::Options::textEncoding(const std::string &encoding_)
731{
732 CloneString(&_drawInfo->encoding,encoding_.c_str());
733 (void) SetImageOption(imageInfo(),"encoding",encoding_.c_str());
734}
735
736std::string Magick::Options::textEncoding(void) const
737{
738 if (_drawInfo->encoding && *_drawInfo->encoding)
739 return(std::string(_drawInfo->encoding));
740
741 return(std::string());
742}
743
744void Magick::Options::textGravity(const GravityType gravity_)
745{
746 _drawInfo->gravity=gravity_;
747 (void) SetImageOption(_imageInfo,"gravity",CommandOptionToMnemonic(
748 MagickGravityOptions,(ssize_t) gravity_));
749}
750
751Magick::GravityType Magick::Options::textGravity() const
752{
753 return(_drawInfo->gravity);
754}
755
756void Magick::Options::textInterlineSpacing(const double spacing_)
757{
758 _drawInfo->interline_spacing=spacing_;
759 setOption("interline-spacing",spacing_);
760}
761
762double Magick::Options::textInterlineSpacing(void) const
763{
764 return(_drawInfo->interline_spacing);
765}
766
767void Magick::Options::textInterwordSpacing(const double spacing_)
768{
769 _drawInfo->interword_spacing=spacing_;
770 setOption("interword-spacing",spacing_);
771}
772
773double Magick::Options::textInterwordSpacing(void) const
774{
775 return(_drawInfo->interword_spacing);
776}
777
778void Magick::Options::textKerning(const double kerning_)
779{
780 _drawInfo->kerning=kerning_;
781 setOption("kerning",kerning_);
782}
783
784double Magick::Options::textKerning(void) const
785{
786 return(_drawInfo->kerning);
787}
788
789void Magick::Options::textUnderColor(const Color &undercolor_)
790{
791 _drawInfo->undercolor=undercolor_;
792 setOption("undercolor",undercolor_);
793}
794
795Magick::Color Magick::Options::textUnderColor(void) const
796{
797 return(_drawInfo->undercolor);
798}
799
800void Magick::Options::transformOrigin(const double tx_,const double ty_)
801{
802 AffineMatrix
803 affine,
804 current=_drawInfo->affine;
805
806 affine.sx=1.0;
807 affine.rx=0.0;
808 affine.ry=0.0;
809 affine.sy=1.0;
810 affine.tx=tx_;
811 affine.ty=ty_;
812
813 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
814 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
815 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
816 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
817 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
818 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
819}
820
821void Magick::Options::transformReset(void)
822{
823 _drawInfo->affine.sx=1.0;
824 _drawInfo->affine.rx=0.0;
825 _drawInfo->affine.ry=0.0;
826 _drawInfo->affine.sy=1.0;
827 _drawInfo->affine.tx=0.0;
828 _drawInfo->affine.ty=0.0;
829}
830
831void Magick::Options::transformRotation(const double angle_)
832{
833 AffineMatrix
834 affine,
835 current=_drawInfo->affine;
836
837 affine.sx=cos(DegreesToRadians(fmod(angle_,360.0)));
838 affine.rx=(-sin(DegreesToRadians(fmod(angle_,360.0))));
839 affine.ry=sin(DegreesToRadians(fmod(angle_,360.0)));
840 affine.sy=cos(DegreesToRadians(fmod(angle_,360.0)));
841 affine.tx=0.0;
842 affine.ty=0.0;
843
844 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
845 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
846 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
847 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
848 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
849 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
850}
851
852void Magick::Options::transformScale(const double sx_,const double sy_)
853{
854 AffineMatrix
855 affine,
856 current=_drawInfo->affine;
857
858 affine.sx=sx_;
859 affine.rx=0.0;
860 affine.ry=0.0;
861 affine.sy=sy_;
862 affine.tx=0.0;
863 affine.ty=0.0;
864
865 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
866 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
867 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
868 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
869 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
870 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
871}
872
873void Magick::Options::transformSkewX(const double skewx_)
874{
875 AffineMatrix
876 affine,
877 current=_drawInfo->affine;
878
879 affine.sx=1.0;
880 affine.rx=0.0;
881 affine.ry=tan(DegreesToRadians(fmod(skewx_,360.0)));
882 affine.sy=1.0;
883 affine.tx=0.0;
884 affine.ty=0.0;
885
886 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
887 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
888 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
889 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
890 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
891 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
892}
893
894void Magick::Options::transformSkewY(const double skewy_)
895{
896 AffineMatrix
897 affine,
898 current=_drawInfo->affine;
899
900 affine.sx=1.0;
901 affine.rx=tan(DegreesToRadians(fmod(skewy_,360.0)));
902 affine.ry=0.0;
903 affine.sy=1.0;
904 affine.tx=0.0;
905 affine.ty=0.0;
906
907 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
908 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
909 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
910 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
911 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
912 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
913}
914
915void Magick::Options::type(const ImageType type_)
916{
917 _imageInfo->type=type_;
918}
919
920Magick::ImageType Magick::Options::type(void) const
921{
922 return(_imageInfo->type);
923}
924
925void Magick::Options::verbose(const bool verboseFlag_)
926{
927 _imageInfo->verbose=(MagickBooleanType) verboseFlag_;
928}
929
930bool Magick::Options::verbose(void) const
931{
932 return(static_cast<bool>(_imageInfo->verbose));
933}
934
935void Magick::Options::x11Display(const std::string &display_)
936{
937 if (display_.length() == 0)
938 _imageInfo->server_name=(char *) RelinquishMagickMemory(
939 _imageInfo->server_name);
940 else
941 Magick::CloneString(&_imageInfo->server_name,display_);
942}
943
944std::string Magick::Options::x11Display(void) const
945{
946 if (_imageInfo->server_name)
947 return(std::string( _imageInfo->server_name));
948
949 return(std::string());
950}
951
952MagickCore::DrawInfo *Magick::Options::drawInfo(void)
953{
954 return(_drawInfo);
955}
956
957MagickCore::ImageInfo *Magick::Options::imageInfo(void)
958{
959 return(_imageInfo);
960}
961
962MagickCore::QuantizeInfo *Magick::Options::quantizeInfo(void)
963{
964 return(_quantizeInfo);
965}
966
967Magick::Options::Options(const MagickCore::ImageInfo* imageInfo_,
968 const MagickCore::QuantizeInfo* quantizeInfo_,
969 const MagickCore::DrawInfo* drawInfo_)
970: _imageInfo((MagickCore::ImageInfo* ) NULL),
971 _quantizeInfo((MagickCore::QuantizeInfo* ) NULL),
972 _drawInfo((MagickCore::DrawInfo* ) NULL),
973 _quiet(false)
974{
975 _imageInfo=CloneImageInfo(imageInfo_);
976 _quantizeInfo=CloneQuantizeInfo(quantizeInfo_);
977 _drawInfo=CloneDrawInfo(imageInfo_,drawInfo_);
978}
979
980void Magick::Options::setOption(const char *name,const Color &value_)
981{
982 std::string
983 option;
984
985 option=value_;
986 (void) SetImageOption(imageInfo(),name,option.c_str());
987}
988
989void Magick::Options::setOption(const char *name,const double value_)
990{
991 char
992 option[MagickPathExtent];
993
994 (void) FormatLocaleString(option,MagickPathExtent,"%.20g",value_);
995 (void) SetImageOption(_imageInfo,name,option);
996}
997