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