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