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