blob: c439992550f1567e409bcb50d5d19590d236bf51 [file] [log] [blame]
// This may look like C code, but it is really -*- C++ -*-
//
// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
// Copyright Dirk Lemstra 2014-2016
//
// Implementation of Options
//
// A wrapper around DrawInfo, ImageInfo, and QuantizeInfo
//
#define MAGICKCORE_IMPLEMENTATION 1
#define MAGICK_PLUSPLUS_IMPLEMENTATION 1
#include "Magick++/Include.h"
#include <string>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "Magick++/Options.h"
#include "Magick++/Functions.h"
#include "Magick++/Exception.h"
#define MagickPI 3.14159265358979323846264338327950288419716939937510
#define DegreesToRadians(x) (MagickPI*(x)/180.0)
Magick::Options::Options(void)
: _imageInfo(static_cast<ImageInfo*>(AcquireMagickMemory(
sizeof(ImageInfo)))),
_quantizeInfo(static_cast<QuantizeInfo*>(AcquireMagickMemory(
sizeof(QuantizeInfo)))),
_drawInfo(static_cast<DrawInfo*>(AcquireMagickMemory(sizeof(DrawInfo)))),
_quiet(false)
{
// Initialize image info with defaults
GetImageInfo(_imageInfo);
// Initialize quantization info
GetQuantizeInfo(_quantizeInfo);
// Initialize drawing info
GetDrawInfo(_imageInfo,_drawInfo);
}
Magick::Options::Options(const Options& options_)
: _imageInfo(CloneImageInfo(options_._imageInfo)),
_quantizeInfo(CloneQuantizeInfo(options_._quantizeInfo)),
_drawInfo(CloneDrawInfo(_imageInfo,options_._drawInfo)),
_quiet(options_._quiet)
{
}
Magick::Options::~Options()
{
// Destroy image info
_imageInfo=DestroyImageInfo(_imageInfo);
// Destroy quantization info
_quantizeInfo=DestroyQuantizeInfo(_quantizeInfo);
// Destroy drawing info
_drawInfo=DestroyDrawInfo(_drawInfo);
}
void Magick::Options::adjoin(bool flag_)
{
_imageInfo->adjoin=static_cast<MagickBooleanType>(
flag_ ? MagickTrue : MagickFalse);
}
bool Magick::Options::adjoin(void) const
{
return(static_cast<bool>(_imageInfo->adjoin));
}
void Magick::Options::backgroundColor(const Color &color_)
{
_imageInfo->background_color=color_;
}
Magick::Color Magick::Options::backgroundColor(void) const
{
return(Color(_imageInfo->background_color));
}
void Magick::Options::backgroundTexture(const std::string &backgroundTexture_)
{
if (backgroundTexture_.length() == 0)
_imageInfo->texture=(char *) RelinquishMagickMemory(_imageInfo->texture);
else
Magick::CloneString(&_imageInfo->texture,backgroundTexture_);
}
std::string Magick::Options::backgroundTexture(void) const
{
if (_imageInfo->texture)
return(std::string(_imageInfo->texture));
else
return(std::string());
}
void Magick::Options::borderColor(const Color &color_)
{
_imageInfo->border_color=color_;
_drawInfo->border_color=color_;
}
Magick::Color Magick::Options::borderColor(void) const
{
return(Color(_imageInfo->border_color));
}
void Magick::Options::boxColor(const Color &boxColor_)
{
_drawInfo->undercolor=boxColor_;
}
Magick::Color Magick::Options::boxColor(void) const
{
return(Color(_drawInfo->undercolor));
}
void Magick::Options::colorspaceType(ColorspaceType colorspace_)
{
_imageInfo->colorspace=colorspace_;
}
Magick::ColorspaceType Magick::Options::colorspaceType(void) const
{
return(static_cast<Magick::ColorspaceType>(_imageInfo->colorspace));
}
void Magick::Options::compressType(CompressionType compressType_)
{
_imageInfo->compression=compressType_;
}
Magick::CompressionType Magick::Options::compressType(void) const
{
return(static_cast<Magick::CompressionType>(_imageInfo->compression));
}
void Magick::Options::colorFuzz(double fuzz_)
{
_imageInfo->fuzz=fuzz_;
}
double Magick::Options::colorFuzz(void) const
{
return(_imageInfo->fuzz);
}
void Magick::Options::debug(bool flag_)
{
if (flag_)
SetLogEventMask("All");
else
SetLogEventMask("None");
}
bool Magick::Options::debug(void) const
{
if (IsEventLogging())
return(true);
return(false);
}
void Magick::Options::density(const Point &density_)
{
if (!density_.isValid())
_imageInfo->density=(char *) RelinquishMagickMemory(_imageInfo->density);
else
CloneString(&_imageInfo->density,density_);
}
Magick::Point Magick::Options::density(void) const
{
if (_imageInfo->density)
return(Point(_imageInfo->density));
return(Point());
}
void Magick::Options::depth(size_t depth_)
{
_imageInfo->depth=depth_;
}
size_t Magick::Options::depth(void) const
{
return(_imageInfo->depth);
}
void Magick::Options::endian(Magick::EndianType endian_)
{
_imageInfo->endian=endian_;
}
Magick::EndianType Magick::Options::endian(void) const
{
return(_imageInfo->endian);
}
void Magick::Options::file(FILE *file_)
{
SetImageInfoFile(_imageInfo,file_);
}
FILE *Magick::Options::file(void) const
{
return(GetImageInfoFile(_imageInfo));
}
void Magick::Options::fileName(const std::string &fileName_)
{
fileName_.copy(_imageInfo->filename,MagickPathExtent-1);
if (fileName_.length() > MagickPathExtent-1)
_imageInfo->filename[MagickPathExtent-1]=0;
else
_imageInfo->filename[fileName_.length()]=0;
}
std::string Magick::Options::fileName(void) const
{
return(std::string(_imageInfo->filename));
}
void Magick::Options::fillColor(const Color &fillColor_)
{
_drawInfo->fill=fillColor_;
if (fillColor_ == Color())
fillPattern((const MagickCore::Image*) NULL);
setOption("fill",fillColor_);
}
Magick::Color Magick::Options::fillColor(void) const
{
return(_drawInfo->fill);
}
void Magick::Options::fillPattern(const MagickCore::Image *fillPattern_)
{
if (_drawInfo->fill_pattern)
_drawInfo->fill_pattern=DestroyImageList(_drawInfo->fill_pattern);
if (fillPattern_)
{
GetPPException;
_drawInfo->fill_pattern=CloneImage(const_cast<MagickCore::Image*>(
fillPattern_),0,0,static_cast<MagickBooleanType>(MagickTrue),
exceptionInfo);
ThrowPPException(_quiet);
}
}
const MagickCore::Image *Magick::Options::fillPattern(void) const
{
return(_drawInfo->fill_pattern);
}
void Magick::Options::fillRule(const FillRule &fillRule_)
{
_drawInfo->fill_rule=fillRule_;
}
Magick::FillRule Magick::Options::fillRule(void) const
{
return(_drawInfo->fill_rule);
}
void Magick::Options::font(const std::string &font_)
{
if (font_.length() == 0)
{
_imageInfo->font=(char *) RelinquishMagickMemory(_imageInfo->font);
_drawInfo->font=(char *) RelinquishMagickMemory(_drawInfo->font);
}
else
{
Magick::CloneString(&_imageInfo->font,font_);
Magick::CloneString(&_drawInfo->font,font_);
}
}
std::string Magick::Options::font(void) const
{
if (_imageInfo->font)
return(std::string(_imageInfo->font));
return(std::string());
}
void Magick::Options::fontFamily(const std::string &family_)
{
if (family_.length() == 0)
{
_drawInfo->family=(char *) RelinquishMagickMemory(_drawInfo->font);
DestroyString(RemoveImageOption(imageInfo(),"family"));
}
else
{
Magick::CloneString(&_drawInfo->family,family_);
(void) SetImageOption(imageInfo(),"family",family_.c_str());
}
}
std::string Magick::Options::fontFamily(void) const
{
if (_drawInfo->family)
return(std::string(_drawInfo->family));
return(std::string());
}
void Magick::Options::fontPointsize(double pointSize_)
{
_imageInfo->pointsize=pointSize_;
_drawInfo->pointsize=pointSize_;
}
double Magick::Options::fontPointsize(void) const
{
return(_imageInfo->pointsize);
}
void Magick::Options::fontStyle(StyleType style_)
{
_drawInfo->style=style_;
(void) SetImageOption(_imageInfo,"style",CommandOptionToMnemonic(
MagickStyleOptions,(ssize_t) style_));
}
Magick::StyleType Magick::Options::fontStyle(void) const
{
return(_drawInfo->style);
}
void Magick::Options::fontWeight(size_t weight_)
{
_drawInfo->weight=weight_;
setOption("weight",(double) weight_);
}
size_t Magick::Options::fontWeight(void) const
{
return(_drawInfo->weight);
}
std::string Magick::Options::format(void) const
{
const MagickInfo
*magick_info=0;
GetPPException;
if (*_imageInfo->magick != '\0' )
magick_info = GetMagickInfo(_imageInfo->magick,exceptionInfo);
ThrowPPException(_quiet);
if ((magick_info != 0) && (*magick_info->description != '\0'))
return(std::string( magick_info->description));
return(std::string());
}
void Magick::Options::interlaceType(InterlaceType interlace_)
{
_imageInfo->interlace=interlace_;
}
Magick::InterlaceType Magick::Options::interlaceType(void) const
{
return(static_cast<Magick::InterlaceType>(_imageInfo->interlace));
}
void Magick::Options::magick(const std::string &magick_)
{
if (magick_.empty())
{
_imageInfo->magick[0] = '\0';
return;
}
FormatLocaleString(_imageInfo->filename,MagickPathExtent,"%.1024s:",
magick_.c_str());
GetPPException;
SetImageInfo(_imageInfo,1,exceptionInfo);
if ( _imageInfo->magick[0] == '\0' )
throwExceptionExplicit(MagickCore::OptionError,"Unrecognized image format",
magick_.c_str());
ThrowPPException(_quiet);
}
std::string Magick::Options::magick(void) const
{
if ( _imageInfo->magick[0] != '\0' )
return(std::string(_imageInfo->magick));
return(std::string());
}
void Magick::Options::matteColor(const Color &matteColor_)
{
_imageInfo->matte_color=matteColor_;
}
Magick::Color Magick::Options::matteColor(void) const
{
return(Magick::Color(_imageInfo->matte_color));
}
void Magick::Options::monochrome(bool monochromeFlag_)
{
_imageInfo->monochrome=(MagickBooleanType) monochromeFlag_;
}
bool Magick::Options::monochrome(void) const
{
return(static_cast<bool>(_imageInfo->monochrome));
}
void Magick::Options::page(const Geometry &pageSize_)
{
if (!pageSize_.isValid())
_imageInfo->page=(char *) RelinquishMagickMemory(_imageInfo->page);
else
Magick::CloneString(&_imageInfo->page,pageSize_);
}
Magick::Geometry Magick::Options::page(void) const
{
if (_imageInfo->page)
return(Geometry(_imageInfo->page));
return(Geometry());
}
void Magick::Options::quality(size_t quality_)
{
_imageInfo->quality=quality_;
}
size_t Magick::Options::quality(void) const
{
return(_imageInfo->quality);
}
void Magick::Options::quantizeColors(size_t colors_)
{
_quantizeInfo->number_colors=colors_;
}
size_t Magick::Options::quantizeColors(void) const
{
return(_quantizeInfo->number_colors);
}
void Magick::Options::quantizeColorSpace(ColorspaceType colorSpace_)
{
_quantizeInfo->colorspace=colorSpace_;
}
Magick::ColorspaceType Magick::Options::quantizeColorSpace(void) const
{
return(static_cast<Magick::ColorspaceType>(_quantizeInfo->colorspace));
}
void Magick::Options::quantizeDither(bool ditherFlag_)
{
_imageInfo->dither=(MagickBooleanType) ditherFlag_;
_quantizeInfo->dither_method=ditherFlag_ ? RiemersmaDitherMethod :
NoDitherMethod;
}
bool Magick::Options::quantizeDither(void) const
{
return(static_cast<bool>(_imageInfo->dither));
}
void Magick::Options::quantizeDitherMethod(DitherMethod ditherMethod_)
{
_quantizeInfo->dither_method=ditherMethod_;
}
MagickCore::DitherMethod Magick::Options::quantizeDitherMethod(void) const
{
return(_quantizeInfo->dither_method);
}
void Magick::Options::quantizeTreeDepth(size_t treeDepth_)
{
_quantizeInfo->tree_depth=treeDepth_;
}
size_t Magick::Options::quantizeTreeDepth(void) const
{
return(_quantizeInfo->tree_depth);
}
void Magick::Options::quiet(const bool quiet_)
{
_quiet=quiet_;
}
bool Magick::Options::quiet(void) const
{
return(_quiet);
}
void Magick::Options::resolutionUnits(ResolutionType resolutionUnits_)
{
_imageInfo->units=resolutionUnits_;
}
Magick::ResolutionType Magick::Options::resolutionUnits(void) const
{
return(_imageInfo->units);
}
void Magick::Options::samplingFactor(const std::string &samplingFactor_)
{
if (samplingFactor_.length() == 0)
_imageInfo->sampling_factor=(char *) RelinquishMagickMemory(
_imageInfo->sampling_factor);
else
Magick::CloneString(&_imageInfo->sampling_factor,samplingFactor_);
}
std::string Magick::Options::samplingFactor(void) const
{
if (_imageInfo->sampling_factor)
return(std::string(_imageInfo->sampling_factor));
return(std::string());
}
void Magick::Options::size(const Geometry &geometry_)
{
_imageInfo->size=(char *) RelinquishMagickMemory(_imageInfo->size);
if (geometry_.isValid())
Magick::CloneString(&_imageInfo->size,geometry_);
}
Magick::Geometry Magick::Options::size(void) const
{
if (_imageInfo->size)
return(Geometry(_imageInfo->size));
return(Geometry());
}
void Magick::Options::strokeAntiAlias(bool flag_)
{
flag_ ? _drawInfo->stroke_antialias=MagickTrue :
_drawInfo->stroke_antialias=MagickFalse;
}
bool Magick::Options::strokeAntiAlias(void) const
{
return(_drawInfo->stroke_antialias != 0 ? true : false);
}
void Magick::Options::strokeColor(const Color &strokeColor_)
{
_drawInfo->stroke=strokeColor_;
if (strokeColor_ == Color())
strokePattern((const MagickCore::Image*) NULL);
setOption("stroke",strokeColor_);
}
Magick::Color Magick::Options::strokeColor(void) const
{
return(_drawInfo->stroke);
}
void Magick::Options::strokeDashArray(const double *strokeDashArray_)
{
_drawInfo->dash_pattern=(double *) RelinquishMagickMemory(
_drawInfo->dash_pattern);
if(strokeDashArray_)
{
size_t
x;
// Count elements in dash array
for (x=0; strokeDashArray_[x]; x++) ;
// Allocate elements
_drawInfo->dash_pattern=static_cast<double*>(AcquireMagickMemory((x+1)*
sizeof(double)));
// Copy elements
memcpy(_drawInfo->dash_pattern,strokeDashArray_,(x+1)*sizeof(double));
_drawInfo->dash_pattern[x]=0.0;
}
}
const double *Magick::Options::strokeDashArray(void) const
{
return(_drawInfo->dash_pattern);
}
void Magick::Options::strokeDashOffset(double strokeDashOffset_)
{
_drawInfo->dash_offset=strokeDashOffset_;
}
double Magick::Options::strokeDashOffset(void) const
{
return(_drawInfo->dash_offset);
}
void Magick::Options::strokeLineCap(LineCap lineCap_)
{
_drawInfo->linecap=lineCap_;
}
Magick::LineCap Magick::Options::strokeLineCap(void) const
{
return(_drawInfo->linecap);
}
void Magick::Options::strokeLineJoin(LineJoin lineJoin_)
{
_drawInfo->linejoin=lineJoin_;
}
Magick::LineJoin Magick::Options::strokeLineJoin(void) const
{
return(_drawInfo->linejoin);
}
void Magick::Options::strokeMiterLimit(size_t miterLimit_)
{
_drawInfo->miterlimit=miterLimit_;
}
size_t Magick::Options::strokeMiterLimit(void) const
{
return(_drawInfo->miterlimit);
}
void Magick::Options::strokePattern(const MagickCore::Image *strokePattern_)
{
if (_drawInfo->stroke_pattern)
_drawInfo->stroke_pattern=DestroyImageList(_drawInfo->stroke_pattern);
if (strokePattern_)
{
GetPPException;
_drawInfo->stroke_pattern=CloneImage(const_cast<MagickCore::Image*>(
strokePattern_),0,0,MagickTrue,exceptionInfo);
ThrowPPException(_quiet);
}
}
const MagickCore::Image *Magick::Options::strokePattern(void) const
{
return(_drawInfo->stroke_pattern);
}
void Magick::Options::strokeWidth(double strokeWidth_)
{
_drawInfo->stroke_width=strokeWidth_;
setOption("strokewidth",strokeWidth_);
}
double Magick::Options::strokeWidth(void) const
{
return(_drawInfo->stroke_width);
}
void Magick::Options::subImage(size_t subImage_)
{
_imageInfo->scene=subImage_;
}
size_t Magick::Options::subImage(void) const
{
return(_imageInfo->scene);
}
void Magick::Options::subRange(size_t subRange_)
{
_imageInfo->number_scenes=subRange_;
}
size_t Magick::Options::subRange(void) const
{
return(_imageInfo->number_scenes);
}
void Magick::Options::textAntiAlias(bool flag_)
{
_drawInfo->text_antialias=static_cast<MagickBooleanType>(
flag_ ? MagickTrue : MagickFalse);
}
bool Magick::Options::textAntiAlias(void) const
{
return(static_cast<bool>(_drawInfo->text_antialias));
}
void Magick::Options::textDirection(DirectionType direction_)
{
_drawInfo->direction=direction_;
(void) SetImageOption(_imageInfo,"direction",CommandOptionToMnemonic(
MagickDirectionOptions,(ssize_t) direction_));
}
Magick::DirectionType Magick::Options::textDirection() const
{
return(_drawInfo->direction);
}
void Magick::Options::textEncoding(const std::string &encoding_)
{
CloneString(&_drawInfo->encoding,encoding_.c_str());
(void) SetImageOption(imageInfo(),"encoding",encoding_.c_str());
}
std::string Magick::Options::textEncoding(void) const
{
if (_drawInfo->encoding && *_drawInfo->encoding)
return(std::string(_drawInfo->encoding));
return(std::string());
}
void Magick::Options::textGravity(GravityType gravity_)
{
_drawInfo->gravity=gravity_;
(void) SetImageOption(_imageInfo,"gravity",CommandOptionToMnemonic(
MagickGravityOptions,(ssize_t) gravity_));
}
Magick::GravityType Magick::Options::textGravity() const
{
return(_drawInfo->gravity);
}
void Magick::Options::textInterlineSpacing(double spacing_)
{
_drawInfo->interline_spacing=spacing_;
setOption("interline-spacing",spacing_);
}
double Magick::Options::textInterlineSpacing(void) const
{
return(_drawInfo->interline_spacing);
}
void Magick::Options::textInterwordSpacing(double spacing_)
{
_drawInfo->interword_spacing=spacing_;
setOption("interword-spacing",spacing_);
}
double Magick::Options::textInterwordSpacing(void) const
{
return(_drawInfo->interword_spacing);
}
void Magick::Options::textKerning(double kerning_)
{
_drawInfo->kerning=kerning_;
setOption("kerning",kerning_);
}
double Magick::Options::textKerning(void) const
{
return(_drawInfo->kerning);
}
void Magick::Options::textUnderColor(const Color &undercolor_)
{
_drawInfo->undercolor=undercolor_;
setOption("undercolor",undercolor_);
}
Magick::Color Magick::Options::textUnderColor(void) const
{
return(_drawInfo->undercolor);
}
void Magick::Options::transformOrigin(double tx_,double ty_)
{
AffineMatrix
affine,
current=_drawInfo->affine;
affine.sx=1.0;
affine.rx=0.0;
affine.ry=0.0;
affine.sy=1.0;
affine.tx=0.0;
affine.ty=0.0;
affine.tx=tx_;
affine.ty=ty_;
_drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
_drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
_drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
_drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
_drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
_drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
}
void Magick::Options::transformReset(void)
{
_drawInfo->affine.sx=1.0;
_drawInfo->affine.rx=0.0;
_drawInfo->affine.ry=0.0;
_drawInfo->affine.sy=1.0;
_drawInfo->affine.tx=0.0;
_drawInfo->affine.ty=0.0;
}
void Magick::Options::transformRotation(double angle_)
{
AffineMatrix
affine,
current=_drawInfo->affine;
affine.sx=1.0;
affine.rx=0.0;
affine.ry=0.0;
affine.sy=1.0;
affine.tx=0.0;
affine.ty=0.0;
affine.sx=cos(DegreesToRadians(fmod(angle_,360.0)));
affine.rx=(-sin(DegreesToRadians(fmod(angle_,360.0))));
affine.ry=sin(DegreesToRadians(fmod(angle_,360.0)));
affine.sy=cos(DegreesToRadians(fmod(angle_,360.0)));
_drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
_drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
_drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
_drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
_drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
_drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
}
void Magick::Options::transformScale(double sx_,double sy_)
{
AffineMatrix
affine,
current=_drawInfo->affine;
affine.sx=1.0;
affine.rx=0.0;
affine.ry=0.0;
affine.sy=1.0;
affine.tx=0.0;
affine.ty=0.0;
affine.sx=sx_;
affine.sy=sy_;
_drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
_drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
_drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
_drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
_drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
_drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
}
void Magick::Options::transformSkewX(double skewx_)
{
AffineMatrix
affine,
current=_drawInfo->affine;
affine.sx=1.0;
affine.rx=0.0;
affine.ry=0.0;
affine.sy=1.0;
affine.tx=0.0;
affine.ty=0.0;
affine.sx=1.0;
affine.ry=tan(DegreesToRadians(fmod(skewx_,360.0)));
affine.sy=1.0;
_drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
_drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
_drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
_drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
_drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
_drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
}
void Magick::Options::transformSkewY(double skewy_)
{
AffineMatrix
affine,
current=_drawInfo->affine;
affine.sx=1.0;
affine.rx=0.0;
affine.ry=0.0;
affine.sy=1.0;
affine.tx=0.0;
affine.ty=0.0;
affine.sx=1.0;
affine.rx=tan(DegreesToRadians(fmod(skewy_,360.0)));
affine.sy=1.0;
_drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
_drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
_drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
_drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
_drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx;
_drawInfo->affine.ty=current.rx*affine.tx+current.sy*affine.ty+current.ty;
}
void Magick::Options::type(const ImageType type_)
{
_imageInfo->type=type_;
}
Magick::ImageType Magick::Options::type(void) const
{
return(_imageInfo->type);
}
void Magick::Options::verbose(bool verboseFlag_)
{
_imageInfo->verbose=(MagickBooleanType) verboseFlag_;
}
bool Magick::Options::verbose(void) const
{
return(static_cast<bool>(_imageInfo->verbose));
}
void Magick::Options::x11Display(const std::string &display_)
{
if (display_.length() == 0)
_imageInfo->server_name=(char *) RelinquishMagickMemory(
_imageInfo->server_name);
else
Magick::CloneString(&_imageInfo->server_name,display_);
}
std::string Magick::Options::x11Display(void) const
{
if (_imageInfo->server_name)
return(std::string( _imageInfo->server_name));
return(std::string());
}
MagickCore::DrawInfo *Magick::Options::drawInfo(void)
{
return(_drawInfo);
}
MagickCore::ImageInfo *Magick::Options::imageInfo(void)
{
return(_imageInfo);
}
MagickCore::QuantizeInfo *Magick::Options::quantizeInfo(void)
{
return(_quantizeInfo);
}
Magick::Options::Options(const MagickCore::ImageInfo* imageInfo_,
const MagickCore::QuantizeInfo* quantizeInfo_,
const MagickCore::DrawInfo* drawInfo_)
: _imageInfo((MagickCore::ImageInfo* ) NULL),
_quantizeInfo((MagickCore::QuantizeInfo* ) NULL),
_drawInfo((MagickCore::DrawInfo* ) NULL),
_quiet(false)
{
_imageInfo=CloneImageInfo(imageInfo_);
_quantizeInfo=CloneQuantizeInfo(quantizeInfo_);
_drawInfo=CloneDrawInfo(imageInfo_,drawInfo_);
}
void Magick::Options::setOption(const char *name,const Color &value_)
{
std::string
option;
option=value_;
(void) SetImageOption(imageInfo(),name,option.c_str());
}
void Magick::Options::setOption(const char *name,const double value_)
{
char
option[MagickPathExtent];
(void) FormatLocaleString(option,MagickPathExtent,"%.20g",value_);
(void) SetImageOption(_imageInfo,name,option);
}