From: dirk Date: Thu, 31 Jul 2014 19:56:17 +0000 (+0000) Subject: Added ReadOptions class for the readImages method. X-Git-Tag: 7.0.1-0~2133 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cf9e54702eac3e23864eec78b1f72fc0c41829e8;p=imagemagick Added ReadOptions class for the readImages method. --- diff --git a/Magick++/lib/Magick++/STL.h b/Magick++/lib/Magick++/STL.h index 8c9a691c3..8c3f62c7a 100644 --- a/Magick++/lib/Magick++/STL.h +++ b/Magick++/lib/Magick++/STL.h @@ -855,6 +855,45 @@ namespace Magick bool _raisedFlag; }; + class MagickPPExport ReadOptions + { + public: + + // Default constructor + ReadOptions(void); + + // Copy constructor + ReadOptions(const ReadOptions& options_); + + // Destructor + ~ReadOptions(); + + // Vertical and horizontal resolution in pixels of the image + void density(const Geometry &geomery_); + Geometry density(void) const; + + // Image depth (8 or 16) + void depth(size_t depth_); + size_t depth(void) const; + + // Image size (required for raw formats) + void size(const Geometry &geometry_); + Geometry size(void) const; + + // + // Internal implementation methods. Please do not use. + // + + MagickCore::ImageInfo *imageInfo(void); + + private: + + // Assignment not supported + ReadOptions& operator=(const ReadOptions&); + + MagickCore::ImageInfo *_imageInfo; + }; + // Reduce noise in image using a noise peak elimination filter class MagickPPExport reduceNoiseImage : public std::unary_function { @@ -2532,31 +2571,55 @@ namespace Magick // Read images into existing container (appending to container) // FIXME: need a way to specify options like size, depth, and density. - template - void readImages( Container *sequence_, - const std::string &imageSpec_ ) { - MagickCore::ImageInfo *imageInfo = MagickCore::CloneImageInfo(0); - imageSpec_.copy( imageInfo->filename, MaxTextExtent-1 ); - imageInfo->filename[ imageSpec_.length() ] = 0; + template + void readImages(Container *sequence_,const std::string &imageSpec_, + ReadOptions &options) + { + MagickCore::Image + *images; + + MagickCore::ImageInfo + *imageInfo; + + imageInfo=options.imageInfo(); + imageSpec_.copy(imageInfo->filename,MaxTextExtent-1); + imageInfo->filename[imageSpec_.length()] = 0; GetPPException; - MagickCore::Image* images = MagickCore::ReadImage( imageInfo, exceptionInfo ); - MagickCore::DestroyImageInfo(imageInfo); - insertImages( sequence_, images); + images=MagickCore::ReadImage(imageInfo,exceptionInfo); + insertImages(sequence_,images); ThrowPPException; } - template - void readImages( Container *sequence_, - const Blob &blob_ ) { - MagickCore::ImageInfo *imageInfo = MagickCore::CloneImageInfo(0); + + template + void readImages(Container *sequence_,const std::string &imageSpec_) + { + ReadOptions options; + readImages(sequence_,imageSpec_,options); + } + + template + void readImages(Container *sequence_,const Blob &blob_,ReadOptions &options) + { + MagickCore::Image + *images; + + MagickCore::ImageInfo + *imageInfo; + GetPPException; - MagickCore::Image *images = MagickCore::BlobToImage( imageInfo, - blob_.data(), - blob_.length(), exceptionInfo ); - MagickCore::DestroyImageInfo(imageInfo); - insertImages( sequence_, images ); + images=MagickCore::BlobToImage(imageInfo,blob_.data(),blob_.length(), + exceptionInfo); + insertImages(sequence_,images); ThrowPPException; } + template + void readImages(Container *sequence_,const Blob &blob_) + { + ReadOptions options; + readImages(sequence_,blob_,options); + } + // Returns a separate grayscale image for each channel specified. template void separateImages( Container *separatedImages_, diff --git a/Magick++/lib/STL.cpp b/Magick++/lib/STL.cpp index 3b86a69de..79aba3002 100644 --- a/Magick++/lib/STL.cpp +++ b/Magick++/lib/STL.cpp @@ -8,6 +8,7 @@ #define MAGICKCORE_IMPLEMENTATION 1 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1 +#include #include #include @@ -780,6 +781,70 @@ void Magick::raiseImage::operator()( Magick::Image &image_ ) const image_.raise( _geometry, _raisedFlag ); } +Magick::ReadOptions::ReadOptions(void) + : _imageInfo(static_cast(AcquireMagickMemory( + sizeof(ImageInfo)))) +{ + GetImageInfo(_imageInfo); +} + +Magick::ReadOptions::ReadOptions(const Magick::ReadOptions& options_) + : _imageInfo(CloneImageInfo(options_._imageInfo)) +{ +} + +Magick::ReadOptions::~ReadOptions() +{ + _imageInfo=DestroyImageInfo(_imageInfo); +} + +void Magick::ReadOptions::density(const Magick::Geometry &density_) +{ + if (!density_.isValid()) + _imageInfo->density=(char *) RelinquishMagickMemory(_imageInfo->density); + else + Magick::CloneString(&_imageInfo->density,density_); +} + +Magick::Geometry Magick::ReadOptions::density(void) const +{ + if (_imageInfo->density) + return(Geometry(_imageInfo->density)); + + return(Geometry()); +} + +void Magick::ReadOptions::depth(size_t depth_) +{ + _imageInfo->depth=depth_; +} + +size_t Magick::ReadOptions::depth(void) const +{ + return(_imageInfo->depth); +} + +void Magick::ReadOptions::size(const Geometry &geometry_) +{ + _imageInfo->size=(char *) RelinquishMagickMemory(_imageInfo->size); + + if ( geometry_.isValid() ) + Magick::CloneString(&_imageInfo->size,geometry_); +} + +Magick::Geometry Magick::ReadOptions::size(void) const +{ + if (_imageInfo->size) + return(Geometry(_imageInfo->size)); + + return(Geometry()); +} + +MagickCore::ImageInfo *Magick::ReadOptions::imageInfo(void) +{ + return(_imageInfo); +} + // Reduce noise in image using a noise peak elimination filter Magick::reduceNoiseImage::reduceNoiseImage( void ) : _order(3)