// This may look like C code, but it is really -*- C++ -*- // // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003 // Copyright Dirk Lemstra 2014-2018 // // Implementation of Options // // A wrapper around DrawInfo, ImageInfo, and QuantizeInfo // #define MAGICKCORE_IMPLEMENTATION 1 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1 #include "Magick++/Include.h" #include #include #include #include #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(AcquireMagickMemory( sizeof(ImageInfo)))), _quantizeInfo(static_cast(AcquireMagickMemory( sizeof(QuantizeInfo)))), _drawInfo(static_cast(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(const bool flag_) { _imageInfo->adjoin=static_cast( flag_ ? MagickTrue : MagickFalse); } bool Magick::Options::adjoin(void) const { return(static_cast(_imageInfo->adjoin)); } 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::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(const ColorspaceType colorspace_) { _imageInfo->colorspace=colorspace_; } Magick::ColorspaceType Magick::Options::colorspaceType(void) const { return(static_cast(_imageInfo->colorspace)); } void Magick::Options::compressType(const CompressionType compressType_) { _imageInfo->compression=compressType_; } Magick::CompressionType Magick::Options::compressType(void) const { return(static_cast(_imageInfo->compression)); } void Magick::Options::colorFuzz(const double fuzz_) { _imageInfo->fuzz=fuzz_; } double Magick::Options::colorFuzz(void) const { return(_imageInfo->fuzz); } void Magick::Options::debug(const 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(const size_t depth_) { _imageInfo->depth=depth_; } size_t Magick::Options::depth(void) const { return(_imageInfo->depth); } void Magick::Options::endian(const 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_) { ssize_t max_length; max_length=sizeof(_imageInfo->filename)-1; fileName_.copy(_imageInfo->filename,max_length); if ((ssize_t) fileName_.length() > max_length) _imageInfo->filename[max_length]=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( fillPattern_),0,0,static_cast(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(const double pointSize_) { _imageInfo->pointsize=pointSize_; _drawInfo->pointsize=pointSize_; } double Magick::Options::fontPointsize(void) const { return(_imageInfo->pointsize); } void Magick::Options::fontStyle(const 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(const 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(const InterlaceType interlace_) { _imageInfo->interlace=interlace_; } Magick::InterlaceType Magick::Options::interlaceType(void) const { return(static_cast(_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); ThrowPPException(_quiet); if ( _imageInfo->magick[0] == '\0' ) throwExceptionExplicit(MagickCore::OptionError,"Unrecognized image format", magick_.c_str()); } std::string Magick::Options::magick(void) const { if ( _imageInfo->magick[0] != '\0' ) return(std::string(_imageInfo->magick)); return(std::string()); } void Magick::Options::monochrome(const bool monochromeFlag_) { _imageInfo->monochrome=(MagickBooleanType) monochromeFlag_; } bool Magick::Options::monochrome(void) const { return(static_cast(_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(const size_t quality_) { _imageInfo->quality=quality_; } size_t Magick::Options::quality(void) const { return(_imageInfo->quality); } void Magick::Options::quantizeColors(const size_t colors_) { _quantizeInfo->number_colors=colors_; } size_t Magick::Options::quantizeColors(void) const { return(_quantizeInfo->number_colors); } void Magick::Options::quantizeColorSpace(const ColorspaceType colorSpace_) { _quantizeInfo->colorspace=colorSpace_; } Magick::ColorspaceType Magick::Options::quantizeColorSpace(void) const { return(static_cast(_quantizeInfo->colorspace)); } void Magick::Options::quantizeDither(const bool ditherFlag_) { _imageInfo->dither=(MagickBooleanType) ditherFlag_; _quantizeInfo->dither_method=ditherFlag_ ? RiemersmaDitherMethod : NoDitherMethod; } bool Magick::Options::quantizeDither(void) const { return(static_cast(_imageInfo->dither)); } void Magick::Options::quantizeDitherMethod(const DitherMethod ditherMethod_) { _quantizeInfo->dither_method=ditherMethod_; } MagickCore::DitherMethod Magick::Options::quantizeDitherMethod(void) const { return(_quantizeInfo->dither_method); } void Magick::Options::quantizeTreeDepth(const 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(const 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(const 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(AcquireMagickMemory((x+1)* sizeof(double))); if (!_drawInfo->dash_pattern) throwExceptionExplicit(MagickCore::ResourceLimitError, "Unable to allocate dash-pattern memory"); // 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(const double strokeDashOffset_) { _drawInfo->dash_offset=strokeDashOffset_; } double Magick::Options::strokeDashOffset(void) const { return(_drawInfo->dash_offset); } void Magick::Options::strokeLineCap(const LineCap lineCap_) { _drawInfo->linecap=lineCap_; } Magick::LineCap Magick::Options::strokeLineCap(void) const { return(_drawInfo->linecap); } void Magick::Options::strokeLineJoin(const LineJoin lineJoin_) { _drawInfo->linejoin=lineJoin_; } Magick::LineJoin Magick::Options::strokeLineJoin(void) const { return(_drawInfo->linejoin); } void Magick::Options::strokeMiterLimit(const 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( strokePattern_),0,0,MagickTrue,exceptionInfo); ThrowPPException(_quiet); } } const MagickCore::Image *Magick::Options::strokePattern(void) const { return(_drawInfo->stroke_pattern); } void Magick::Options::strokeWidth(const double strokeWidth_) { _drawInfo->stroke_width=strokeWidth_; setOption("strokewidth",strokeWidth_); } double Magick::Options::strokeWidth(void) const { return(_drawInfo->stroke_width); } void Magick::Options::subImage(const size_t subImage_) { _imageInfo->scene=subImage_; } size_t Magick::Options::subImage(void) const { return(_imageInfo->scene); } void Magick::Options::subRange(const size_t subRange_) { _imageInfo->number_scenes=subRange_; } size_t Magick::Options::subRange(void) const { return(_imageInfo->number_scenes); } void Magick::Options::textAntiAlias(const bool flag_) { _drawInfo->text_antialias=static_cast( flag_ ? MagickTrue : MagickFalse); } bool Magick::Options::textAntiAlias(void) const { return(static_cast(_drawInfo->text_antialias)); } void Magick::Options::textDirection(const 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(const 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(const double spacing_) { _drawInfo->interline_spacing=spacing_; setOption("interline-spacing",spacing_); } double Magick::Options::textInterlineSpacing(void) const { return(_drawInfo->interline_spacing); } void Magick::Options::textInterwordSpacing(const double spacing_) { _drawInfo->interword_spacing=spacing_; setOption("interword-spacing",spacing_); } double Magick::Options::textInterwordSpacing(void) const { return(_drawInfo->interword_spacing); } void Magick::Options::textKerning(const 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(const double tx_,const 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=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(const double angle_) { AffineMatrix affine, current=_drawInfo->affine; 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))); affine.tx=0.0; affine.ty=0.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(const double sx_,const double sy_) { AffineMatrix affine, current=_drawInfo->affine; affine.sx=sx_; affine.rx=0.0; affine.ry=0.0; affine.sy=sy_; affine.tx=0.0; affine.ty=0.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::transformSkewX(const double skewx_) { AffineMatrix affine, current=_drawInfo->affine; affine.sx=1.0; affine.rx=0.0; affine.ry=tan(DegreesToRadians(fmod(skewx_,360.0))); affine.sy=1.0; affine.tx=0.0; affine.ty=0.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(const double skewy_) { AffineMatrix affine, current=_drawInfo->affine; affine.sx=1.0; affine.rx=tan(DegreesToRadians(fmod(skewy_,360.0))); affine.ry=0.0; affine.sy=1.0; affine.tx=0.0; affine.ty=0.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(const bool verboseFlag_) { _imageInfo->verbose=(MagickBooleanType) verboseFlag_; } bool Magick::Options::verbose(void) const { return(static_cast(_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); }