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