From a7c1e5c12b9aec82327d2cae6ff71712c4b875d4 Mon Sep 17 00:00:00 2001 From: dirk Date: Mon, 9 Jun 2014 17:11:00 +0000 Subject: [PATCH] Moved exportPixels to separate class. --- Magick++/lib/Image.cpp | 56 ------------------- Magick++/lib/Magick++/Image.h | 5 -- Magick++/lib/Magick++/Pixels.h | 41 ++++++++++++++ Magick++/lib/Pixels.cpp | 98 ++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 61 deletions(-) diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp index 29406f1c4..5bb7d9fcb 100644 --- a/Magick++/lib/Image.cpp +++ b/Magick++/lib/Image.cpp @@ -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 diff --git a/Magick++/lib/Magick++/Image.h b/Magick++/lib/Magick++/Image.h index 2a955581b..edb70e995 100644 --- a/Magick++/lib/Magick++/Image.h +++ b/Magick++/lib/Magick++/Image.h @@ -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); diff --git a/Magick++/lib/Magick++/Pixels.h b/Magick++/lib/Magick++/Pixels.h index 93ce3c0ff..7d65e6055 100644 --- a/Magick++/lib/Magick++/Pixels.h +++ b/Magick++/lib/Magick++/Pixels.h @@ -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 // diff --git a/Magick++/lib/Pixels.cpp b/Magick++/lib/Pixels.cpp index a347d0615..2f93b7c50 100644 --- a/Magick++/lib/Pixels.cpp +++ b/Magick++/lib/Pixels.cpp @@ -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 -- 2.40.0