Options.cpp revision d4774283661e770ee52d54a7199b7c4d38208c35
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 DegreesToRadians(x) (MagickPI*(x)/180.0) 24 25// Constructor 26Magick::Options::Options( void ) 27 : _imageInfo(static_cast<ImageInfo*>(AcquireMagickMemory(sizeof(ImageInfo)))), 28 _quantizeInfo(static_cast<QuantizeInfo*>(AcquireMagickMemory(sizeof(QuantizeInfo)))), 29 _drawInfo(static_cast<DrawInfo*>(AcquireMagickMemory( sizeof(DrawInfo)))) 30{ 31 // Initialize image info with defaults 32 GetImageInfo( _imageInfo ); 33 34 // Initialize quantization info 35 GetQuantizeInfo( _quantizeInfo ); 36 37 // Initialize drawing info 38 GetDrawInfo( _imageInfo, _drawInfo ); 39} 40 41// Copy constructor 42Magick::Options::Options( const Magick::Options& options_ ) 43 : _imageInfo(CloneImageInfo( options_._imageInfo )), 44 _quantizeInfo(CloneQuantizeInfo(options_._quantizeInfo)), 45 _drawInfo(CloneDrawInfo(_imageInfo, options_._drawInfo)) 46{ 47} 48 49// Construct using raw structures 50Magick::Options::Options( const MagickCore::ImageInfo* imageInfo_, 51 const MagickCore::QuantizeInfo* quantizeInfo_, 52 const MagickCore::DrawInfo* drawInfo_ ) 53: _imageInfo(0), 54 _quantizeInfo(0), 55 _drawInfo(0) 56{ 57 _imageInfo = CloneImageInfo(imageInfo_); 58 _quantizeInfo = CloneQuantizeInfo(quantizeInfo_); 59 _drawInfo = CloneDrawInfo(imageInfo_,drawInfo_); 60} 61 62// Destructor 63Magick::Options::~Options() 64{ 65 // Destroy image info 66 _imageInfo =DestroyImageInfo( _imageInfo ); 67 _imageInfo=0; 68 69 // Destroy quantization info 70 _quantizeInfo =DestroyQuantizeInfo( _quantizeInfo ); 71 _quantizeInfo=0; 72 73 // Destroy drawing info 74 _drawInfo =DestroyDrawInfo( _drawInfo ); 75 _drawInfo=0; 76} 77 78/* 79 * Methods for setting image attributes 80 * 81 */ 82 83// Anti-alias Postscript and TrueType fonts (default true) 84void Magick::Options::antiAlias( bool flag_ ) 85{ 86 _drawInfo->text_antialias = static_cast<MagickBooleanType> 87 (flag_ ? MagickTrue : MagickFalse); 88} 89bool Magick::Options::antiAlias( void ) const 90{ 91 return static_cast<bool>(_drawInfo->text_antialias); 92} 93 94void Magick::Options::adjoin ( bool flag_ ) 95{ 96 _imageInfo->adjoin = static_cast<MagickBooleanType> 97 (flag_ ? MagickTrue : MagickFalse); 98} 99bool Magick::Options::adjoin ( void ) const 100{ 101 return static_cast<bool>(_imageInfo->adjoin); 102} 103 104void Magick::Options::backgroundColor ( const Magick::Color &color_ ) 105{ 106 _imageInfo->background_color = color_; 107} 108Magick::Color Magick::Options::backgroundColor ( void ) const 109{ 110 return Magick::Color( _imageInfo->background_color ); 111} 112 113void Magick::Options::backgroundTexture ( const std::string &backgroundTexture_ ) 114{ 115 if ( backgroundTexture_.length() == 0 ) 116 _imageInfo->texture=(char *) RelinquishMagickMemory(_imageInfo->texture); 117 else 118 Magick::CloneString( &_imageInfo->texture, backgroundTexture_ ); 119} 120std::string Magick::Options::backgroundTexture ( void ) const 121{ 122 if ( _imageInfo->texture ) 123 return std::string( _imageInfo->texture ); 124 else 125 return std::string(); 126} 127 128void Magick::Options::borderColor ( const Color &color_ ) 129{ 130 _imageInfo->border_color = color_; 131 _drawInfo->border_color = color_; 132} 133Magick::Color Magick::Options::borderColor ( void ) const 134{ 135 return Magick::Color( _imageInfo->border_color ); 136} 137 138// Text bounding-box base color 139void Magick::Options::boxColor ( const Magick::Color &boxColor_ ) 140{ 141 _drawInfo->undercolor = boxColor_; 142} 143Magick::Color Magick::Options::boxColor ( void ) const 144{ 145 return Magick::Color( _drawInfo->undercolor ); 146} 147 148void Magick::Options::colorspaceType ( Magick::ColorspaceType colorspace_ ) 149{ 150 _imageInfo->colorspace = colorspace_; 151} 152Magick::ColorspaceType Magick::Options::colorspaceType ( void ) const 153{ 154 return static_cast<Magick::ColorspaceType>(_imageInfo->colorspace); 155} 156 157void Magick::Options::compressType ( CompressionType compressType_ ) 158{ 159 _imageInfo->compression = compressType_; 160} 161Magick::CompressionType Magick::Options::compressType ( void ) const 162{ 163 return static_cast<Magick::CompressionType>(_imageInfo->compression); 164} 165 166void Magick::Options::colorFuzz ( double fuzz_ ) 167{ 168 _imageInfo->fuzz = fuzz_; 169} 170double Magick::Options::colorFuzz ( void ) const 171{ 172 return _imageInfo->fuzz; 173} 174 175// Enable printing of debug messages from ImageMagick 176void Magick::Options::debug ( bool flag_ ) 177{ 178 if(flag_) 179 { 180 SetLogEventMask("All"); 181 } 182 else 183 { 184 SetLogEventMask("None"); 185 } 186} 187bool Magick::Options::debug ( void ) const 188{ 189 if( IsEventLogging() ) 190 { 191 return true; 192 } 193 return false; 194} 195 196void Magick::Options::density ( const Magick::Geometry &density_ ) 197{ 198 if ( !density_.isValid() ) 199 _imageInfo->density=(char *) RelinquishMagickMemory(_imageInfo->density); 200 else 201 Magick::CloneString( &_imageInfo->density, density_ ); 202} 203Magick::Geometry Magick::Options::density ( void ) const 204{ 205 if ( _imageInfo->density ) 206 return Geometry( _imageInfo->density ); 207 208 return Geometry(); 209} 210 211void Magick::Options::depth ( size_t depth_ ) 212{ 213 _imageInfo->depth = depth_; 214} 215size_t Magick::Options::depth ( void ) const 216{ 217 return _imageInfo->depth; 218} 219 220// Endianness (little like Intel or big like SPARC) for image 221// formats which support endian-specific options. 222void Magick::Options::endian ( Magick::EndianType endian_ ) 223{ 224 _imageInfo->endian = endian_; 225} 226Magick::EndianType Magick::Options::endian ( void ) const 227{ 228 return _imageInfo->endian; 229} 230 231void Magick::Options::file ( FILE *file_ ) 232{ 233 SetImageInfoFile( _imageInfo, file_ ); 234} 235FILE *Magick::Options::file ( void ) const 236{ 237 return GetImageInfoFile( _imageInfo ); 238} 239 240void Magick::Options::fileName ( const std::string &fileName_ ) 241{ 242 fileName_.copy( _imageInfo->filename, MaxTextExtent-1 ); 243 _imageInfo->filename[ fileName_.length() ] = 0; 244} 245std::string Magick::Options::fileName ( void ) const 246{ 247 return std::string( _imageInfo->filename ); 248} 249 250// Color to use when drawing inside an object 251void Magick::Options::fillColor ( const Magick::Color &fillColor_ ) 252{ 253 _drawInfo->fill = fillColor_; 254 if (fillColor_ == Magick::Color()) 255 fillPattern((const MagickCore::Image*) NULL); 256} 257Magick::Color Magick::Options::fillColor ( void ) const 258{ 259 return _drawInfo->fill; 260} 261// Pattern image to use when filling objects 262void Magick::Options::fillPattern ( const MagickCore::Image *fillPattern_ ) 263{ 264 if ( _drawInfo->fill_pattern ) 265 { 266 DestroyImageList( _drawInfo->fill_pattern ); 267 _drawInfo->fill_pattern = 0; 268 } 269 if ( fillPattern_ ) 270 { 271 ExceptionInfo exceptionInfo; 272 GetExceptionInfo( &exceptionInfo ); 273 _drawInfo->fill_pattern = 274 CloneImage( const_cast<MagickCore::Image*>(fillPattern_), 275 0, 276 0, 277 static_cast<MagickBooleanType>(MagickTrue), 278 &exceptionInfo ); 279 throwException( exceptionInfo ); 280 (void) DestroyExceptionInfo( &exceptionInfo ); 281 } 282} 283const MagickCore::Image* Magick::Options::fillPattern ( void ) const 284{ 285 return _drawInfo->fill_pattern; 286} 287 288// Rule to use when filling drawn objects 289void Magick::Options::fillRule ( const Magick::FillRule &fillRule_ ) 290{ 291 _drawInfo->fill_rule = fillRule_; 292} 293Magick::FillRule Magick::Options::fillRule ( void ) const 294{ 295 return _drawInfo->fill_rule; 296} 297 298void Magick::Options::font ( const std::string &font_ ) 299{ 300 if ( font_.length() == 0 ) 301 { 302 _imageInfo->font=(char *) RelinquishMagickMemory(_imageInfo->font); 303 _drawInfo->font=(char *) RelinquishMagickMemory(_drawInfo->font); 304 } 305 else 306 { 307 Magick::CloneString( &_imageInfo->font, font_ ); 308 Magick::CloneString( &_drawInfo->font, font_ ); 309 } 310} 311std::string Magick::Options::font ( void ) const 312{ 313 if ( _imageInfo->font ) 314 return std::string( _imageInfo->font ); 315 316 return std::string(); 317} 318 319void Magick::Options::fontPointsize ( double pointSize_ ) 320{ 321 _imageInfo->pointsize = pointSize_; 322 _drawInfo->pointsize = pointSize_; 323} 324double Magick::Options::fontPointsize ( void ) const 325{ 326 return _imageInfo->pointsize; 327} 328 329std::string Magick::Options::format ( void ) const 330{ 331 ExceptionInfo exception; 332 333 const MagickInfo * magick_info = 0; 334 GetExceptionInfo(&exception); 335 if ( *_imageInfo->magick != '\0' ) 336 magick_info = GetMagickInfo( _imageInfo->magick , &exception); 337 throwException( exception ); 338 (void) DestroyExceptionInfo( &exception ); 339 340 if (( magick_info != 0 ) && 341 ( *magick_info->description != '\0' )) 342 return std::string( magick_info->description ); 343 344 return std::string(); 345} 346 347void Magick::Options::interlaceType ( Magick::InterlaceType interlace_ ) 348{ 349 _imageInfo->interlace = interlace_; 350} 351Magick::InterlaceType Magick::Options::interlaceType ( void ) const 352{ 353 return static_cast<Magick::InterlaceType>(_imageInfo->interlace); 354} 355 356void Magick::Options::magick ( const std::string &magick_ ) 357{ 358 ExceptionInfo exception; 359 360 FormatLocaleString( _imageInfo->filename, MaxTextExtent, "%.1024s:", magick_.c_str() ); 361 GetExceptionInfo(&exception); 362 SetImageInfo( _imageInfo, 1, &exception); 363 if ( *_imageInfo->magick == '\0' ) 364 throwExceptionExplicit( OptionWarning, "Unrecognized image format", 365 magick_.c_str() ); 366 (void) DestroyExceptionInfo( &exception ); 367} 368std::string Magick::Options::magick ( void ) const 369{ 370 if ( _imageInfo->magick && *_imageInfo->magick ) 371 return std::string( _imageInfo->magick ); 372 373 return std::string(); 374} 375 376void Magick::Options::matteColor ( const Magick::Color &matteColor_ ) 377{ 378 _imageInfo->matte_color = matteColor_; 379} 380Magick::Color Magick::Options::matteColor ( void ) const 381{ 382 return Magick::Color( _imageInfo->matte_color ); 383} 384 385void Magick::Options::monochrome ( bool monochromeFlag_ ) 386{ 387 _imageInfo->monochrome = (MagickBooleanType) monochromeFlag_; 388} 389bool Magick::Options::monochrome ( void ) const 390{ 391 return static_cast<bool>(_imageInfo->monochrome); 392} 393 394void Magick::Options::page ( const Magick::Geometry &pageSize_ ) 395{ 396 if ( !pageSize_.isValid() ) 397 _imageInfo->page=(char *) RelinquishMagickMemory(_imageInfo->page); 398 else 399 Magick::CloneString( &_imageInfo->page, pageSize_ ); 400} 401Magick::Geometry Magick::Options::page ( void ) const 402{ 403 if ( _imageInfo->page ) 404 return Geometry( _imageInfo->page ); 405 406 return Geometry(); 407} 408 409void Magick::Options::quality ( size_t quality_ ) 410{ 411 _imageInfo->quality = quality_; 412} 413size_t Magick::Options::quality ( void ) const 414{ 415 return _imageInfo->quality; 416} 417 418void Magick::Options::quantizeColors ( size_t colors_ ) 419{ 420 _quantizeInfo->number_colors = colors_; 421} 422size_t Magick::Options::quantizeColors ( void ) const 423{ 424 return _quantizeInfo->number_colors; 425} 426 427void Magick::Options::quantizeColorSpace ( Magick::ColorspaceType colorSpace_ ) 428{ 429 _quantizeInfo->colorspace = colorSpace_; 430} 431Magick::ColorspaceType Magick::Options::quantizeColorSpace ( void ) const 432{ 433 return static_cast<Magick::ColorspaceType>(_quantizeInfo->colorspace); 434} 435 436void Magick::Options::quantizeDither ( bool ditherFlag_ ) 437{ 438 _imageInfo->dither = (MagickBooleanType) ditherFlag_; 439 _quantizeInfo->dither_method = ditherFlag_ ? RiemersmaDitherMethod : 440 NoDitherMethod; 441} 442bool Magick::Options::quantizeDither ( void ) const 443{ 444 return static_cast<bool>(_imageInfo->dither); 445} 446 447void Magick::Options::quantizeTreeDepth ( size_t treeDepth_ ) 448{ 449 _quantizeInfo->tree_depth = treeDepth_; 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} 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(_imageInfo->sampling_factor); 469 else 470 Magick::CloneString( &_imageInfo->sampling_factor, samplingFactor_ ); 471} 472std::string Magick::Options::samplingFactor ( void ) const 473{ 474 if ( _imageInfo->sampling_factor ) 475 return std::string( _imageInfo->sampling_factor ); 476 477 return std::string(); 478} 479 480void Magick::Options::size ( const Geometry &geometry_ ) 481{ 482 _imageInfo->size=(char *) RelinquishMagickMemory(_imageInfo->size); 483 484 if ( geometry_.isValid() ) 485 Magick::CloneString( &_imageInfo->size, geometry_ ); 486} 487Magick::Geometry Magick::Options::size ( void ) const 488{ 489 if ( _imageInfo->size ) 490 return Geometry( _imageInfo->size ); 491 492 return Geometry(); 493} 494 495void Magick::Options::strokeAntiAlias( bool flag_ ) 496{ 497 flag_ ? _drawInfo->stroke_antialias=MagickTrue : _drawInfo->stroke_antialias=MagickFalse; 498} 499bool Magick::Options::strokeAntiAlias( void ) const 500{ 501 return (_drawInfo->stroke_antialias != 0 ? true : false); 502} 503 504// Color to use when drawing object outlines 505void Magick::Options::strokeColor ( const Magick::Color &strokeColor_ ) 506{ 507 _drawInfo->stroke = strokeColor_; 508} 509Magick::Color Magick::Options::strokeColor ( void ) const 510{ 511 return _drawInfo->stroke; 512} 513 514void Magick::Options::strokeDashArray ( const double* strokeDashArray_ ) 515{ 516 _drawInfo->dash_pattern=(double *) 517 RelinquishMagickMemory(_drawInfo->dash_pattern); 518 519 if(strokeDashArray_) 520 { 521 // Count elements in dash array 522 size_t x; 523 for (x=0; strokeDashArray_[x]; x++) ; 524 // Allocate elements 525 _drawInfo->dash_pattern = 526 static_cast<double*>(AcquireMagickMemory((x+1)*sizeof(double))); 527 // Copy elements 528 memcpy(_drawInfo->dash_pattern,strokeDashArray_, 529 (x+1)*sizeof(double)); 530 } 531} 532const double* Magick::Options::strokeDashArray ( void ) const 533{ 534 return _drawInfo->dash_pattern; 535} 536 537void Magick::Options::strokeDashOffset ( double strokeDashOffset_ ) 538{ 539 _drawInfo->dash_offset = strokeDashOffset_; 540} 541double Magick::Options::strokeDashOffset ( void ) const 542{ 543 return _drawInfo->dash_offset; 544} 545 546// Specify the shape to be used at the end of open subpaths when they 547// are stroked. Values of LineCap are ButtCap, RoundCap, and 548// SquareCap. 549void Magick::Options::strokeLineCap ( Magick::LineCap lineCap_ ) 550{ 551 _drawInfo->linecap = lineCap_; 552} 553Magick::LineCap Magick::Options::strokeLineCap ( void ) const 554{ 555 return _drawInfo->linecap; 556} 557 558// Specify the shape to be used at the corners of paths (or other 559// vector shapes) when they are stroked. 560void Magick::Options::strokeLineJoin ( Magick::LineJoin lineJoin_ ) 561{ 562 _drawInfo->linejoin = lineJoin_; 563} 564Magick::LineJoin Magick::Options::strokeLineJoin ( void ) const 565{ 566 return _drawInfo->linejoin; 567} 568 569// miterLimit for drawing lines, circles, ellipses, etc. 570void Magick::Options::strokeMiterLimit ( size_t miterLimit_ ) 571{ 572 _drawInfo->miterlimit = miterLimit_; 573} 574size_t Magick::Options::strokeMiterLimit ( void ) const 575{ 576 return _drawInfo->miterlimit; 577} 578 579// Pattern image to use for stroked outlines 580void Magick::Options::strokePattern ( const MagickCore::Image *strokePattern_ ) 581{ 582 if ( _drawInfo->stroke_pattern ) 583 { 584 DestroyImageList( _drawInfo->stroke_pattern ); 585 _drawInfo->stroke_pattern = 0; 586 } 587 588 if ( strokePattern_ ) 589 { 590 ExceptionInfo exceptionInfo; 591 GetExceptionInfo( &exceptionInfo ); 592 _drawInfo->stroke_pattern = 593 CloneImage( const_cast<MagickCore::Image*>(strokePattern_), 594 0, 595 0, 596 MagickTrue, 597 &exceptionInfo ); 598 throwException( exceptionInfo ); 599 (void) DestroyExceptionInfo( &exceptionInfo ); 600 } 601} 602const MagickCore::Image* Magick::Options::strokePattern ( void ) const 603{ 604 return _drawInfo->stroke_pattern; 605} 606 607// Stroke width for drawing lines, circles, ellipses, etc. 608void Magick::Options::strokeWidth ( double strokeWidth_ ) 609{ 610 _drawInfo->stroke_width = strokeWidth_; 611} 612double Magick::Options::strokeWidth ( void ) const 613{ 614 return _drawInfo->stroke_width; 615} 616 617void Magick::Options::subImage ( size_t subImage_ ) 618{ 619 _imageInfo->scene = subImage_; 620} 621size_t Magick::Options::subImage ( void ) const 622{ 623 return _imageInfo->scene; 624} 625 626void Magick::Options::subRange ( size_t subRange_ ) 627{ 628 _imageInfo->number_scenes = subRange_; 629} 630size_t Magick::Options::subRange ( void ) const 631{ 632 return _imageInfo->number_scenes; 633} 634 635// Annotation text encoding (e.g. "UTF-16") 636void Magick::Options::textEncoding ( const std::string &encoding_ ) 637{ 638 CloneString(&_drawInfo->encoding, encoding_.c_str()); 639} 640std::string Magick::Options::textEncoding ( void ) const 641{ 642 if ( _drawInfo->encoding && *_drawInfo->encoding ) 643 return std::string( _drawInfo->encoding ); 644 645 return std::string(); 646} 647 648// Image representation type 649void Magick::Options::type ( const Magick::ImageType type_ ) 650{ 651 _imageInfo->type = type_; 652} 653Magick::ImageType Magick::Options::type ( void ) const 654{ 655 return _imageInfo->type; 656} 657 658// Origin of coordinate system to use when annotating with text or drawing 659void Magick::Options::transformOrigin ( double tx_, double ty_ ) 660{ 661 AffineMatrix current = _drawInfo->affine; 662 AffineMatrix affine; 663 affine.sx=1.0; 664 affine.rx=0.0; 665 affine.ry=0.0; 666 affine.sy=1.0; 667 affine.tx=0.0; 668 affine.ty=0.0; 669 670 affine.tx = tx_; 671 affine.ty = ty_; 672 673 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; 674 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; 675 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; 676 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; 677 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; 678 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; 679} 680 681// Reset transformation parameters to default 682void Magick::Options::transformReset ( void ) 683{ 684 _drawInfo->affine.sx=1.0; 685 _drawInfo->affine.rx=0.0; 686 _drawInfo->affine.ry=0.0; 687 _drawInfo->affine.sy=1.0; 688 _drawInfo->affine.tx=0.0; 689 _drawInfo->affine.ty=0.0; 690} 691 692// Rotation to use when annotating with text or drawing 693void Magick::Options::transformRotation ( double angle_ ) 694{ 695 AffineMatrix current = _drawInfo->affine; 696 AffineMatrix affine; 697 affine.sx=1.0; 698 affine.rx=0.0; 699 affine.ry=0.0; 700 affine.sy=1.0; 701 affine.tx=0.0; 702 affine.ty=0.0; 703 704 affine.sx=cos(DegreesToRadians(fmod(angle_,360.0))); 705 affine.rx=(-sin(DegreesToRadians(fmod(angle_,360.0)))); 706 affine.ry=sin(DegreesToRadians(fmod(angle_,360.0))); 707 affine.sy=cos(DegreesToRadians(fmod(angle_,360.0))); 708 709 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; 710 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; 711 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; 712 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; 713 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; 714 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; 715} 716 717// Scale to use when annotating with text or drawing 718void Magick::Options::transformScale ( double sx_, double sy_ ) 719{ 720 AffineMatrix current = _drawInfo->affine; 721 AffineMatrix affine; 722 affine.sx=1.0; 723 affine.rx=0.0; 724 affine.ry=0.0; 725 affine.sy=1.0; 726 affine.tx=0.0; 727 affine.ty=0.0; 728 729 affine.sx = sx_; 730 affine.sy = sy_; 731 732 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; 733 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; 734 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; 735 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; 736 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; 737 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; 738} 739 740// Skew to use in X axis when annotating with text or drawing 741void Magick::Options::transformSkewX ( double skewx_ ) 742{ 743 AffineMatrix current = _drawInfo->affine; 744 AffineMatrix affine; 745 affine.sx=1.0; 746 affine.rx=0.0; 747 affine.ry=0.0; 748 affine.sy=1.0; 749 affine.tx=0.0; 750 affine.ty=0.0; 751 752 affine.sx=1.0; 753 affine.ry=tan(DegreesToRadians(fmod(skewx_,360.0))); 754 affine.sy=1.0; 755 756 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; 757 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; 758 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; 759 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; 760 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; 761 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; 762} 763 764// Skew to use in Y axis when annotating with text or drawing 765void Magick::Options::transformSkewY ( double skewy_ ) 766{ 767 AffineMatrix current = _drawInfo->affine; 768 AffineMatrix affine; 769 affine.sx=1.0; 770 affine.rx=0.0; 771 affine.ry=0.0; 772 affine.sy=1.0; 773 affine.tx=0.0; 774 affine.ty=0.0; 775 776 affine.sx=1.0; 777 affine.rx=tan(DegreesToRadians(fmod(skewy_,360.0))); 778 affine.sy=1.0; 779 780 _drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx; 781 _drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx; 782 _drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy; 783 _drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy; 784 _drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; 785 _drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty; 786} 787 788void Magick::Options::verbose ( bool verboseFlag_ ) 789{ 790 _imageInfo->verbose = (MagickBooleanType) verboseFlag_; 791} 792bool Magick::Options::verbose ( void ) const 793{ 794 return static_cast<bool>(_imageInfo->verbose); 795} 796 797void Magick::Options::view ( const std::string &view_ ) 798{ 799 if ( view_.length() == 0 ) 800 _imageInfo->view=(char *) RelinquishMagickMemory(_imageInfo->view); 801 else 802 Magick::CloneString( &_imageInfo->view, view_ ); 803} 804std::string Magick::Options::view ( void ) const 805{ 806 if ( _imageInfo->view ) 807 return std::string( _imageInfo->view ); 808 809 return std::string(); 810} 811 812void Magick::Options::x11Display ( const std::string &display_ ) 813{ 814 if ( display_.length() == 0 ) 815 _imageInfo->server_name=(char *) RelinquishMagickMemory(_imageInfo->server_name); 816 else 817 Magick::CloneString( &_imageInfo->server_name, display_ ); 818} 819std::string Magick::Options::x11Display ( void ) const 820{ 821 if ( _imageInfo->server_name ) 822 return std::string( _imageInfo->server_name ); 823 824 return std::string(); 825} 826 827// 828// Internal implementation methods. Please do not use. 829// 830 831MagickCore::DrawInfo * Magick::Options::drawInfo( void ) 832{ 833 return _drawInfo; 834} 835 836MagickCore::ImageInfo * Magick::Options::imageInfo( void ) 837{ 838 return _imageInfo; 839} 840 841MagickCore::QuantizeInfo * Magick::Options::quantizeInfo( void ) 842{ 843 return _quantizeInfo; 844} 845