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 _imageInfo->dither=(MagickBooleanType) ditherFlag_;
476 _quantizeInfo->dither_method=ditherFlag_ ? RiemersmaDitherMethod :
477 NoDitherMethod;
478}
479
480bool Magick::Options::quantizeDither(void) const
481{
482 return(static_cast<bool>(_imageInfo->dither));
483}
484
485void Magick::Options::quantizeDitherMethod(const DitherMethod ditherMethod_)
486{
487 _quantizeInfo->dither_method=ditherMethod_;
488}
489
490MagickCore::DitherMethod Magick::Options::quantizeDitherMethod(void) const
491{
492 return(_quantizeInfo->dither_method);
493}
494
495void Magick::Options::quantizeTreeDepth(const size_t treeDepth_)
496{
497 _quantizeInfo->tree_depth=treeDepth_;
498}
499
500size_t Magick::Options::quantizeTreeDepth(void) const
501{
502 return(_quantizeInfo->tree_depth);
503}
504
505void Magick::Options::quiet(const bool quiet_)
506{
507 _quiet=quiet_;
508}
509
510bool Magick::Options::quiet(void) const
511{
512 return(_quiet);
513}
514
515void Magick::Options::resolutionUnits(const ResolutionType resolutionUnits_)
516{
517 _imageInfo->units=resolutionUnits_;
518}
519
520Magick::ResolutionType Magick::Options::resolutionUnits(void) const
521{
522 return(_imageInfo->units);
523}
524
525void Magick::Options::samplingFactor(const std::string &samplingFactor_)
526{
527 if (samplingFactor_.length() == 0)
528 _imageInfo->sampling_factor=(char *) RelinquishMagickMemory(
529 _imageInfo->sampling_factor);
530 else
531 Magick::CloneString(&_imageInfo->sampling_factor,samplingFactor_);
532}
533
534std::string Magick::Options::samplingFactor(void) const
535{
536 if (_imageInfo->sampling_factor)
537 return(std::string(_imageInfo->sampling_factor));
538
539 return(std::string());
540}
541
542void Magick::Options::size(const Geometry &geometry_)
543{
544 _imageInfo->size=(char *) RelinquishMagickMemory(_imageInfo->size);
545
546 if (geometry_.isValid())
547 Magick::CloneString(&_imageInfo->size,geometry_);
548}
549
550Magick::Geometry Magick::Options::size(void) const
551{
552 if (_imageInfo->size)
553 return(Geometry(_imageInfo->size));
554
555 return(Geometry());
556}
557
558void Magick::Options::strokeAntiAlias(const bool flag_)
559{
560 flag_ ? _drawInfo->stroke_antialias=MagickTrue :
561 _drawInfo->stroke_antialias=MagickFalse;
562}
563
564bool Magick::Options::strokeAntiAlias(void) const
565{
566 return(_drawInfo->stroke_antialias != 0 ? true : false);
567}
568
569void Magick::Options::strokeColor(const Color &strokeColor_)
570{
571 _drawInfo->stroke=strokeColor_;
572 if (strokeColor_ == Color())
573 strokePattern((const MagickCore::Image*) NULL);
574 setOption("stroke",strokeColor_);
575}
576
577Magick::Color Magick::Options::strokeColor(void) const
578{
579 return(_drawInfo->stroke);
580}
581
582void Magick::Options::strokeDashArray(const double *strokeDashArray_)
583{
584 _drawInfo->dash_pattern=(double *) RelinquishMagickMemory(
585 _drawInfo->dash_pattern);
586
587 if(strokeDashArray_)
588 {
589 size_t
590 x;
591 // Count elements in dash array
592 for (x=0; strokeDashArray_[x]; x++) ;
593 // Allocate elements
594 _drawInfo->dash_pattern=static_cast<double*>(AcquireMagickMemory((x+1)*
595 sizeof(double)));
596 if (!_drawInfo->dash_pattern)
597 throwExceptionExplicit(MagickCore::ResourceLimitError,
598 "Unable to allocate dash-pattern memory");
599 else
600 {
601 // Copy elements
602 memcpy(_drawInfo->dash_pattern,strokeDashArray_,(x+1)*sizeof(double));
603 _drawInfo->dash_pattern[x]=0.0;
604 }
605 }
606}
607
608const double *Magick::Options::strokeDashArray(void) const
609{
610 return(_drawInfo->dash_pattern);
611}
612
613void Magick::Options::strokeDashOffset(const double strokeDashOffset_)
614{
615 _drawInfo->dash_offset=strokeDashOffset_;
616}
617
618double Magick::Options::strokeDashOffset(void) const
619{
620 return(_drawInfo->dash_offset);
621}
622
623void Magick::Options::strokeLineCap(const LineCap lineCap_)
624{
625 _drawInfo->linecap=lineCap_;
626}
627
628Magick::LineCap Magick::Options::strokeLineCap(void) const
629{
630 return(_drawInfo->linecap);
631}
632
633void Magick::Options::strokeLineJoin(const LineJoin lineJoin_)
634{
635 _drawInfo->linejoin=lineJoin_;
636}
637
638Magick::LineJoin Magick::Options::strokeLineJoin(void) const
639{
640 return(_drawInfo->linejoin);
641}
642
643void Magick::Options::strokeMiterLimit(const size_t miterLimit_)
644{
645 _drawInfo->miterlimit=miterLimit_;
646}
647
648size_t Magick::Options::strokeMiterLimit(void) const
649{
650 return(_drawInfo->miterlimit);
651}
652
653void Magick::Options::strokePattern(const MagickCore::Image *strokePattern_)
654{
655 if (_drawInfo->stroke_pattern)
656 _drawInfo->stroke_pattern=DestroyImageList(_drawInfo->stroke_pattern);
657
658 if (strokePattern_)
659 {
660 GetPPException;
661 _drawInfo->stroke_pattern=CloneImage(const_cast<MagickCore::Image*>(
662 strokePattern_),0,0,MagickTrue,exceptionInfo);
663 ThrowPPException(_quiet);
664 }
665}
666
667const MagickCore::Image *Magick::Options::strokePattern(void) const
668{
669 return(_drawInfo->stroke_pattern);
670}
671
672void Magick::Options::strokeWidth(const double strokeWidth_)
673{
674 _drawInfo->stroke_width=strokeWidth_;
675 setOption("strokewidth",strokeWidth_);
676}
677
678double Magick::Options::strokeWidth(void) const
679{
680 return(_drawInfo->stroke_width);
681}
682
683void Magick::Options::subImage(const size_t subImage_)
684{
685 _imageInfo->scene=subImage_;
686}
687
688size_t Magick::Options::subImage(void) const
689{
690 return(_imageInfo->scene);
691}
692
693void Magick::Options::subRange(const size_t subRange_)
694{
695 _imageInfo->number_scenes=subRange_;
696}
697
698size_t Magick::Options::subRange(void) const
699{
700 return(_imageInfo->number_scenes);
701}
702
703void Magick::Options::textAntiAlias(const bool flag_)
704{
705 _drawInfo->text_antialias=static_cast<MagickBooleanType>(
706 flag_ ? MagickTrue : MagickFalse);
707}
708
709bool Magick::Options::textAntiAlias(void) const
710{
711 return(static_cast<bool>(_drawInfo->text_antialias));
712}
713
714void Magick::Options::textDirection(const DirectionType direction_)
715{
716 _drawInfo->direction=direction_;
717 (void) SetImageOption(_imageInfo,"direction",CommandOptionToMnemonic(
718 MagickDirectionOptions,(ssize_t) direction_));
719}
720
721Magick::DirectionType Magick::Options::textDirection() const
722{
723 return(_drawInfo->direction);
724}
725
726void Magick::Options::textEncoding(const std::string &encoding_)
727{
728 CloneString(&_drawInfo->encoding,encoding_.c_str());
729 (void) SetImageOption(imageInfo(),"encoding",encoding_.c_str());
730}
731
732std::string Magick::Options::textEncoding(void) const
733{
734 if (_drawInfo->encoding && *_drawInfo->encoding)
735 return(std::string(_drawInfo->encoding));
736
737 return(std::string());
738}
739
740void Magick::Options::textGravity(const GravityType gravity_)
741{
742 _drawInfo->gravity=gravity_;
743 (void) SetImageOption(_imageInfo,"gravity",CommandOptionToMnemonic(
744 MagickGravityOptions,(ssize_t) gravity_));
745}
746
747Magick::GravityType Magick::Options::textGravity() const
748{
749 return(_drawInfo->gravity);
750}
751
752void Magick::Options::textInterlineSpacing(const double spacing_)
753{
754 _drawInfo->interline_spacing=spacing_;
755 setOption("interline-spacing",spacing_);
756}
757
758double Magick::Options::textInterlineSpacing(void) const
759{
760 return(_drawInfo->interline_spacing);
761}
762
763void Magick::Options::textInterwordSpacing(const double spacing_)
764{
765 _drawInfo->interword_spacing=spacing_;
766 setOption("interword-spacing",spacing_);
767}
768
769double Magick::Options::textInterwordSpacing(void) const
770{
771 return(_drawInfo->interword_spacing);
772}
773
774void Magick::Options::textKerning(const double kerning_)
775{
776 _drawInfo->kerning=kerning_;
777 setOption("kerning",kerning_);
778}
779
780double Magick::Options::textKerning(void) const
781{
782 return(_drawInfo->kerning);
783}
784
785void Magick::Options::textUnderColor(const Color &undercolor_)
786{
787 _drawInfo->undercolor=undercolor_;
788 setOption("undercolor",undercolor_);
789}
790
791Magick::Color Magick::Options::textUnderColor(void) const
792{
793 return(_drawInfo->undercolor);
794}
795
796void Magick::Options::transformOrigin(const double tx_,const double ty_)
797{
798 AffineMatrix
799 affine,
800 current=_drawInfo->affine;
801
802 affine.sx=1.0;
803 affine.rx=0.0;
804 affine.ry=0.0;
805 affine.sy=1.0;
806 affine.tx=tx_;
807 affine.ty=ty_;
808
809 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
810 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
811 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
812 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
813 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
814 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
815}
816
817void Magick::Options::transformReset(void)
818{
819 _drawInfo->affine.sx=1.0;
820 _drawInfo->affine.rx=0.0;
821 _drawInfo->affine.ry=0.0;
822 _drawInfo->affine.sy=1.0;
823 _drawInfo->affine.tx=0.0;
824 _drawInfo->affine.ty=0.0;
825}
826
827void Magick::Options::transformRotation(const double angle_)
828{
829 AffineMatrix
830 affine,
831 current=_drawInfo->affine;
832
833 affine.sx=cos(DegreesToRadians(fmod(angle_,360.0)));
834 affine.rx=(-sin(DegreesToRadians(fmod(angle_,360.0))));
835 affine.ry=sin(DegreesToRadians(fmod(angle_,360.0)));
836 affine.sy=cos(DegreesToRadians(fmod(angle_,360.0)));
837 affine.tx=0.0;
838 affine.ty=0.0;
839
840 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
841 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
842 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
843 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
844 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
845 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
846}
847
848void Magick::Options::transformScale(const double sx_,const double sy_)
849{
850 AffineMatrix
851 affine,
852 current=_drawInfo->affine;
853
854 affine.sx=sx_;
855 affine.rx=0.0;
856 affine.ry=0.0;
857 affine.sy=sy_;
858 affine.tx=0.0;
859 affine.ty=0.0;
860
861 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
862 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
863 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
864 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
865 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
866 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
867}
868
869void Magick::Options::transformSkewX(const double skewx_)
870{
871 AffineMatrix
872 affine,
873 current=_drawInfo->affine;
874
875 affine.sx=1.0;
876 affine.rx=0.0;
877 affine.ry=tan(DegreesToRadians(fmod(skewx_,360.0)));
878 affine.sy=1.0;
879 affine.tx=0.0;
880 affine.ty=0.0;
881
882 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
883 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
884 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
885 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
886 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
887 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
888}
889
890void Magick::Options::transformSkewY(const double skewy_)
891{
892 AffineMatrix
893 affine,
894 current=_drawInfo->affine;
895
896 affine.sx=1.0;
897 affine.rx=tan(DegreesToRadians(fmod(skewy_,360.0)));
898 affine.ry=0.0;
899 affine.sy=1.0;
900 affine.tx=0.0;
901 affine.ty=0.0;
902
903 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
904 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
905 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
906 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
907 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
908 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
909}
910
911void Magick::Options::type(const ImageType type_)
912{
913 _imageInfo->type=type_;
914}
915
916Magick::ImageType Magick::Options::type(void) const
917{
918 return(_imageInfo->type);
919}
920
921void Magick::Options::verbose(const bool verboseFlag_)
922{
923 _imageInfo->verbose=(MagickBooleanType) verboseFlag_;
924}
925
926bool Magick::Options::verbose(void) const
927{
928 return(static_cast<bool>(_imageInfo->verbose));
929}
930
931void Magick::Options::x11Display(const std::string &display_)
932{
933 if (display_.length() == 0)
934 _imageInfo->server_name=(char *) RelinquishMagickMemory(
935 _imageInfo->server_name);
936 else
937 Magick::CloneString(&_imageInfo->server_name,display_);
938}
939
940std::string Magick::Options::x11Display(void) const
941{
942 if (_imageInfo->server_name)
943 return(std::string( _imageInfo->server_name));
944
945 return(std::string());
946}
947
948MagickCore::DrawInfo *Magick::Options::drawInfo(void)
949{
950 return(_drawInfo);
951}
952
953MagickCore::ImageInfo *Magick::Options::imageInfo(void)
954{
955 return(_imageInfo);
956}
957
958MagickCore::QuantizeInfo *Magick::Options::quantizeInfo(void)
959{
960 return(_quantizeInfo);
961}
962
963Magick::Options::Options(const MagickCore::ImageInfo* imageInfo_,
964 const MagickCore::QuantizeInfo* quantizeInfo_,
965 const MagickCore::DrawInfo* drawInfo_)
966: _imageInfo((MagickCore::ImageInfo* ) NULL),
967 _quantizeInfo((MagickCore::QuantizeInfo* ) NULL),
968 _drawInfo((MagickCore::DrawInfo* ) NULL),
969 _quiet(false)
970{
971 _imageInfo=CloneImageInfo(imageInfo_);
972 _quantizeInfo=CloneQuantizeInfo(quantizeInfo_);
973 _drawInfo=CloneDrawInfo(imageInfo_,drawInfo_);
974}
975
976void Magick::Options::setOption(const char *name,const Color &value_)
977{
978 std::string
979 option;
980
981 option=value_;
982 (void) SetImageOption(imageInfo(),name,option.c_str());
983}
984
985void Magick::Options::setOption(const char *name,const double value_)
986{
987 char
988 option[MagickPathExtent];
989
990 (void) FormatLocaleString(option,MagickPathExtent,"%.20g",value_);
991 (void) SetImageOption(_imageInfo,name,option);
992}
993