]> granicus.if.org Git - imagemagick/commitdiff
Added ReadOptions class for the readImages method.
authordirk <dirk@git.imagemagick.org>
Thu, 31 Jul 2014 19:56:17 +0000 (19:56 +0000)
committerdirk <dirk@git.imagemagick.org>
Thu, 31 Jul 2014 19:56:17 +0000 (19:56 +0000)
Magick++/lib/Magick++/STL.h
Magick++/lib/STL.cpp

index 8c9a691c393dd30bb3da73ea71044cc874addaf1..8c3f62c7afdfb304f503e5128e77aa8ed46794cd 100644 (file)
@@ -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<Image&,void>
   {
@@ -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 <class Container>
-  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<class Container>
+  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 <class Container>
-  void readImages( Container *sequence_,
-       const Blob &blob_ ) {
-    MagickCore::ImageInfo *imageInfo = MagickCore::CloneImageInfo(0);
+
+  template<class Container>
+  void readImages(Container *sequence_,const std::string &imageSpec_)
+  {
+    ReadOptions options;
+    readImages(sequence_,imageSpec_,options);
+  }
+
+  template<class Container>
+  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<class Container>
+  void readImages(Container *sequence_,const Blob &blob_)
+  {
+    ReadOptions options;
+    readImages(sequence_,blob_,options);
+  }
+
   // Returns a separate grayscale image for each channel specified.
   template <class Container >
   void separateImages( Container *separatedImages_,
index 3b86a69de81fb17e103a0df6498d6c15cc15b2b7..79aba3002d6ea1678e5fb4621863f3a4dc228730 100644 (file)
@@ -8,6 +8,7 @@
 #define MAGICKCORE_IMPLEMENTATION  1
 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1
 
+#include <Magick++/Functions.h>
 #include <Magick++/Image.h>
 #include <Magick++/STL.h>
 
@@ -780,6 +781,70 @@ void Magick::raiseImage::operator()( Magick::Image &image_ ) const
   image_.raise( _geometry, _raisedFlag );
 }
 
+Magick::ReadOptions::ReadOptions(void)
+  : _imageInfo(static_cast<ImageInfo*>(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)