Magick++ 7.1.2
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
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
611const double *Magick::Options::strokeDashArray(void) const
612{
613 return(_drawInfo->dash_pattern);
614}
615
616void Magick::Options::strokeDashOffset(const double strokeDashOffset_)
617{
618 _drawInfo->dash_offset=strokeDashOffset_;
619}
620
621double Magick::Options::strokeDashOffset(void) const
622{
623 return(_drawInfo->dash_offset);
624}
625
626void Magick::Options::strokeLineCap(const LineCap lineCap_)
627{
628 _drawInfo->linecap=lineCap_;
629}
630
631Magick::LineCap Magick::Options::strokeLineCap(void) const
632{
633 return(_drawInfo->linecap);
634}
635
636void Magick::Options::strokeLineJoin(const LineJoin lineJoin_)
637{
638 _drawInfo->linejoin=lineJoin_;
639}
640
641Magick::LineJoin Magick::Options::strokeLineJoin(void) const
642{
643 return(_drawInfo->linejoin);
644}
645
646void Magick::Options::strokeMiterLimit(const size_t miterLimit_)
647{
648 _drawInfo->miterlimit=miterLimit_;
649}
650
651size_t Magick::Options::strokeMiterLimit(void) const
652{
653 return(_drawInfo->miterlimit);
654}
655
656void 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
670const MagickCore::Image *Magick::Options::strokePattern(void) const
671{
672 return(_drawInfo->stroke_pattern);
673}
674
675void Magick::Options::strokeWidth(const double strokeWidth_)
676{
677 _drawInfo->stroke_width=strokeWidth_;
678 setOption("strokewidth",strokeWidth_);
679}
680
681double Magick::Options::strokeWidth(void) const
682{
683 return(_drawInfo->stroke_width);
684}
685
686void Magick::Options::subImage(const size_t subImage_)
687{
688 _imageInfo->scene=subImage_;
689}
690
691size_t Magick::Options::subImage(void) const
692{
693 return(_imageInfo->scene);
694}
695
696void Magick::Options::subRange(const size_t subRange_)
697{
698 _imageInfo->number_scenes=subRange_;
699}
700
701size_t Magick::Options::subRange(void) const
702{
703 return(_imageInfo->number_scenes);
704}
705
706void Magick::Options::textAntiAlias(const bool flag_)
707{
708 _drawInfo->text_antialias=static_cast<MagickBooleanType>(
709 flag_ ? MagickTrue : MagickFalse);
710}
711
712bool Magick::Options::textAntiAlias(void) const
713{
714 return(static_cast<bool>(_drawInfo->text_antialias));
715}
716
717void Magick::Options::textDirection(const DirectionType direction_)
718{
719 _drawInfo->direction=direction_;
720 (void) SetImageOption(_imageInfo,"direction",CommandOptionToMnemonic(
721 MagickDirectionOptions,(ssize_t) direction_));
722}
723
724Magick::DirectionType Magick::Options::textDirection() const
725{
726 return(_drawInfo->direction);
727}
728
729void 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
735std::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
743void Magick::Options::textGravity(const GravityType gravity_)
744{
745 _drawInfo->gravity=gravity_;
746 (void) SetImageOption(_imageInfo,"gravity",CommandOptionToMnemonic(
747 MagickGravityOptions,(ssize_t) gravity_));
748}
749
750Magick::GravityType Magick::Options::textGravity() const
751{
752 return(_drawInfo->gravity);
753}
754
755void Magick::Options::textInterlineSpacing(const double spacing_)
756{
757 _drawInfo->interline_spacing=spacing_;
758 setOption("interline-spacing",spacing_);
759}
760
761double Magick::Options::textInterlineSpacing(void) const
762{
763 return(_drawInfo->interline_spacing);
764}
765
766void Magick::Options::textInterwordSpacing(const double spacing_)
767{
768 _drawInfo->interword_spacing=spacing_;
769 setOption("interword-spacing",spacing_);
770}
771
772double Magick::Options::textInterwordSpacing(void) const
773{
774 return(_drawInfo->interword_spacing);
775}
776
777void Magick::Options::textKerning(const double kerning_)
778{
779 _drawInfo->kerning=kerning_;
780 setOption("kerning",kerning_);
781}
782
783double Magick::Options::textKerning(void) const
784{
785 return(_drawInfo->kerning);
786}
787
788void Magick::Options::textUnderColor(const Color &undercolor_)
789{
790 _drawInfo->undercolor=undercolor_;
791 setOption("undercolor",undercolor_);
792}
793
794Magick::Color Magick::Options::textUnderColor(void) const
795{
796 return(_drawInfo->undercolor);
797}
798
799void 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
820void 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
830void 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
851void 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
872void 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
893void 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
914void Magick::Options::type(const ImageType type_)
915{
916 _imageInfo->type=type_;
917}
918
919Magick::ImageType Magick::Options::type(void) const
920{
921 return(_imageInfo->type);
922}
923
924void Magick::Options::verbose(const bool verboseFlag_)
925{
926 _imageInfo->verbose=(MagickBooleanType) verboseFlag_;
927}
928
929bool Magick::Options::verbose(void) const
930{
931 return(static_cast<bool>(_imageInfo->verbose));
932}
933
934void 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
943std::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
951MagickCore::DrawInfo *Magick::Options::drawInfo(void)
952{
953 return(_drawInfo);
954}
955
956MagickCore::ImageInfo *Magick::Options::imageInfo(void)
957{
958 return(_imageInfo);
959}
960
961MagickCore::QuantizeInfo *Magick::Options::quantizeInfo(void)
962{
963 return(_quantizeInfo);
964}
965
966Magick::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
979void 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
988void Magick::Options::setOption(const char *name,const double value_)
989{
990 char
991 option[MagickPathExtent];
992
993 (void) FormatLocaleString(option,MagickPathExtent,"%.20g",value_);
994 (void) SetImageOption(_imageInfo,name,option);
995}
996