]> granicus.if.org Git - imagemagick/commitdiff
Moved exportPixels to separate class.
authordirk <dirk@git.imagemagick.org>
Mon, 9 Jun 2014 17:11:00 +0000 (17:11 +0000)
committerdirk <dirk@git.imagemagick.org>
Mon, 9 Jun 2014 17:11:00 +0000 (17:11 +0000)
Magick++/lib/Image.cpp
Magick++/lib/Magick++/Image.h
Magick++/lib/Magick++/Pixels.h
Magick++/lib/Pixels.cpp

index 29406f1c4473e86fc8ff5e2f4cf8b5121a7ac7c9..5bb7d9fcb01c9c82ab7f136dba36e4da33454534 100644 (file)
@@ -2818,62 +2818,6 @@ void Magick::Image::erase(void)
   ThrowPPException;
 }
 
-void *Magick::Image::exportPixels(const ::ssize_t x_,const ::ssize_t y_,
-  const size_t width_,const size_t height_,std::string map_,
-  const StorageType type_)
-{
-  size_t
-    size;
-
-  void
-    *result;
-
-  result=(void *) NULL;
-  if ((x_ < 0) || (width_ < 0) || (y_ < 0) || (height_ < 0) ||
-      (x_ > image()->columns) || (width_ + x_ > image()->columns) ||
-      (y_ > image()->rows) || (height_ + y_ > image()->rows) ||
-      (map_.length() == 0))
-    return(result);
-
-  switch(type_)
-  {
-    case CharPixel:
-      size=sizeof(unsigned char);
-      break;
-    case DoublePixel:
-      size=sizeof(double);
-      break;
-    case FloatPixel:
-      size=sizeof(float);
-      break;
-    case LongPixel:
-      size=sizeof(unsigned int);
-      break;
-    case LongLongPixel:
-      size=sizeof(MagickSizeType);
-      break;
-    case QuantumPixel:
-      size=sizeof(Quantum);
-      break;
-    case ShortPixel:
-      size=sizeof(unsigned short);
-      break;
-    default:
-      throwExceptionExplicit(OptionError,"Invalid type");
-      return(result);
-  }
-
-  result=AcquireMagickMemory(width_*height_*map_.length()*size);
-
-  GetPPException;
-  MagickCore::ExportImagePixels(image(),x_,y_,width_,height_,map_.c_str(),
-    type_,result,&exceptionInfo);
-  if (exceptionInfo.severity != UndefinedException)
-    result=RelinquishMagickMemory(result);
-  ThrowPPException;
-  return(result);
-}
-
 void Magick::Image::extent(const Geometry &geometry_ )
 {
   MagickCore::Image
index 2a955581b738de31d3969dc4b565bdd6597b025d..edb70e995ac11b3bf6cae6734abe1bb146a857da 100644 (file)
@@ -878,11 +878,6 @@ namespace Magick
     // Erase image to current "background color"
     void erase(void);
 
-    // Returns a copy of the pixels at the specified location
-    void *exportPixels(const ::ssize_t x_,const ::ssize_t y_,
-      const size_t width_,const size_t height_,std::string map_,
-      const StorageType type_);
-
     // Extend the image as defined by the geometry.
     void extent(const Geometry &geometry_);
     void extent(const Geometry &geometry_,const Color &backgroundColor);
index 93ce3c0ff5f26ba9c2129a7323e14db28ae43082..7d65e60550925a7ecb4ae156ceed1f4409c96b3d 100644 (file)
@@ -78,6 +78,47 @@ namespace Magick
 
   }; // class Pixels
 
+  class MagickPPExport PixelData
+  {
+  public:
+
+    // Construct pixel data using specified image
+    PixelData(Magick::Image &image_,std::string map_,const StorageType type_);
+
+    // Construct pixel data using specified image
+    PixelData(Magick::Image &image_,const ::ssize_t x_,const ::ssize_t y_,
+      const size_t width_,const size_t height_,std::string map_,
+      const StorageType type_);
+
+    // Destroy pixel data
+    ~PixelData(void);
+
+    // Pixel data buffer
+    const void *data(void) const;
+
+    // Length of the buffer
+    const ::ssize_t length(void) const;
+
+    // Size of the buffer in bytes
+    const ::ssize_t size(void) const;
+
+  private:
+
+    // Copying and assigning PixelData is not supported
+    PixelData(const PixelData& pixels_);
+    const PixelData& operator=(const PixelData& pixels_);
+
+    void init(Magick::Image &image_,const ::ssize_t x_,const ::ssize_t y_,
+      const size_t width_,const size_t height_,std::string map_,
+      const StorageType type_);
+
+    void relinquish(void) throw();
+
+    void      *_data;  // The pixel data
+    ::ssize_t _length; // Length of the data
+    ::ssize_t _size;   // Size of the data
+  }; // class PixelData
+
 } // Magick namespace
 
 //
index a347d06153e9a6ee25f40306ce792ca2fa0dadc7..2f93b7c50a13fa59bc36282952c116dabbd73deb 100644 (file)
@@ -113,3 +113,101 @@ Magick::void* Magick::Pixels::metacontent(void)
   return pixel_metacontent;
 }
 */
+
+Magick::PixelData::PixelData(Magick::Image &image_,std::string map_,
+  const StorageType type_)
+{
+  init(image_,0,0,image_.columns(),image_.rows(),map_,type_);
+}
+
+Magick::PixelData::PixelData(Magick::Image &image_,const ::ssize_t x_,
+  const ::ssize_t y_,const size_t width_,const size_t height_,std::string map_,
+  const StorageType type_)
+{
+  init(image_,x_,y_,width_,height_,map_,type_);
+}
+
+Magick::PixelData::~PixelData(void)
+{
+  relinquish();
+}
+
+const void *Magick::PixelData::data(void) const
+{
+  return(_data);
+}
+
+const ::ssize_t Magick::PixelData::length(void) const
+{
+  return(_length);
+}
+
+const ::ssize_t Magick::PixelData::size(void) const
+{
+  return(_size);
+}
+
+
+void Magick::PixelData::init(Magick::Image &image_,const ::ssize_t x_,
+  const ::ssize_t y_,const size_t width_,const size_t height_,
+  std::string map_,const StorageType type_)
+{
+  size_t
+    size;
+
+  _data=(void *) NULL;
+  _length=0;
+  _size=0;
+  if ((x_ < 0) || (width_ < 0) || (y_ < 0) || (height_ < 0) ||
+      (x_ > image_.columns()) || (width_ + x_ > image_.columns()) ||
+      (y_ > image_.rows()) || (height_ + y_ > image_.rows()) ||
+      (map_.length() == 0))
+    return;
+
+  switch(type_)
+  {
+    case CharPixel:
+      size=sizeof(unsigned char);
+      break;
+    case DoublePixel:
+      size=sizeof(double);
+      break;
+    case FloatPixel:
+      size=sizeof(float);
+      break;
+    case LongPixel:
+      size=sizeof(unsigned int);
+      break;
+    case LongLongPixel:
+      size=sizeof(MagickSizeType);
+      break;
+    case QuantumPixel:
+      size=sizeof(Quantum);
+      break;
+    case ShortPixel:
+      size=sizeof(unsigned short);
+      break;
+    default:
+      throwExceptionExplicit(OptionError,"Invalid type");
+      return;
+  }
+
+  _length=width_*height_*map_.length();
+  _size=_length*size;
+  _data=AcquireMagickMemory(_size);
+
+  GetPPException;
+  MagickCore::ExportImagePixels(image_.constImage(),x_,y_,width_,height_,
+    map_.c_str(),type_,_data,&exceptionInfo);
+  if (exceptionInfo.severity != UndefinedException)
+    relinquish();
+  ThrowPPException;
+}
+
+void Magick::PixelData::relinquish(void) throw()
+{
+  if (_data != (void *)NULL)
+    _data=RelinquishMagickMemory(_data);
+  _length=0;
+  _size=0;
+}
\ No newline at end of file