Home | History | Annotate | Download | only in lib
      1 // This may look like C code, but it is really -*- C++ -*-
      2 //
      3 // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
      4 // Copyright Dirk Lemstra 2013-2015
      5 //
      6 // Pixels Implementation
      7 //
      8 
      9 #define MAGICKCORE_IMPLEMENTATION  1
     10 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1
     11 
     12 #include <cstring>
     13 #include "Magick++/Include.h"
     14 #include <string> // This is here to compile with Visual C++
     15 #include "Magick++/Thread.h"
     16 #include "Magick++/Exception.h"
     17 #include "Magick++/Pixels.h"
     18 
     19 Magick::Pixels::Pixels(Magick::Image &image_)
     20   : _image(image_),
     21     _x(0),
     22     _y(0),
     23     _columns(0),
     24     _rows(0)
     25 {
     26   GetPPException;
     27     _view=AcquireVirtualCacheView(image_.image(),exceptionInfo),
     28   ThrowPPException(image_.quiet());
     29 }
     30 
     31 Magick::Pixels::~Pixels(void)
     32 {
     33   if (_view)
     34     _view=DestroyCacheView(_view);
     35 }
     36 
     37 Magick::Quantum* Magick::Pixels::get(const ssize_t x_,const ssize_t y_,
     38   const size_t columns_,const size_t rows_)
     39 {
     40   _x=x_;
     41   _y=y_;
     42   _columns=columns_;
     43   _rows=rows_;
     44 
     45   GetPPException;
     46   Quantum* pixels=GetCacheViewAuthenticPixels(_view,x_,y_,columns_,rows_,
     47     exceptionInfo);
     48   ThrowPPException(_image.quiet());
     49 
     50   return pixels;
     51 }
     52 
     53 const Magick::Quantum* Magick::Pixels::getConst(const ssize_t x_,
     54   const ssize_t y_,const size_t columns_,const size_t rows_)
     55 {
     56   _x=x_;
     57   _y=y_;
     58   _columns=columns_;
     59   _rows=rows_;
     60 
     61   GetPPException;
     62   const Quantum* pixels=GetCacheViewVirtualPixels(_view,x_,y_,columns_,rows_,
     63     exceptionInfo);
     64   ThrowPPException(_image.quiet());
     65 
     66   return pixels;
     67 }
     68 
     69 ssize_t Magick::Pixels::offset(PixelChannel channel) const
     70 {
     71   if (_image.constImage()->channel_map[channel].traits == UndefinedPixelTrait)
     72     return -1;
     73   return _image.constImage()->channel_map[channel].offset;
     74 }
     75 
     76 Magick::Quantum* Magick::Pixels::set(const ssize_t x_,const ssize_t y_,
     77   const size_t columns_,const size_t rows_)
     78 {
     79   _x=x_;
     80   _y=y_;
     81   _columns=columns_;
     82   _rows=rows_;
     83 
     84   GetPPException;
     85   Quantum* pixels=QueueCacheViewAuthenticPixels(_view,x_,y_,columns_,rows_,
     86     exceptionInfo);
     87   ThrowPPException(_image.quiet());
     88 
     89   return pixels;
     90 }
     91 
     92 void Magick::Pixels::sync(void)
     93 {
     94   GetPPException;
     95   (void) SyncCacheViewAuthenticPixels(_view,exceptionInfo);
     96   ThrowPPException(_image.quiet());
     97 }
     98 
     99 // Return pixel colormap index array
    100 /*
    101 Magick::void* Magick::Pixels::metacontent(void)
    102 {
    103   void* pixel_metacontent=GetCacheViewAuthenticMetacontent(_view);
    104 
    105   if (!pixel_metacontent)
    106     _image.throwImageException();
    107 
    108   return pixel_metacontent;
    109 }
    110 */
    111 
    112 Magick::PixelData::PixelData(Magick::Image &image_,std::string map_,
    113   const StorageType type_)
    114 {
    115   init(image_,0,0,image_.columns(),image_.rows(),map_,type_);
    116 }
    117 
    118 Magick::PixelData::PixelData(Magick::Image &image_,const ::ssize_t x_,
    119   const ::ssize_t y_,const size_t width_,const size_t height_,std::string map_,
    120   const StorageType type_)
    121 {
    122   init(image_,x_,y_,width_,height_,map_,type_);
    123 }
    124 
    125 Magick::PixelData::~PixelData(void)
    126 {
    127   relinquish();
    128 }
    129 
    130 const void *Magick::PixelData::data(void) const
    131 {
    132   return(_data);
    133 }
    134 
    135 ::ssize_t Magick::PixelData::length(void) const
    136 {
    137   return(_length);
    138 }
    139 
    140 ::ssize_t Magick::PixelData::size(void) const
    141 {
    142   return(_size);
    143 }
    144 
    145 void Magick::PixelData::init(Magick::Image &image_,const ::ssize_t x_,
    146   const ::ssize_t y_,const size_t width_,const size_t height_,
    147   std::string map_,const StorageType type_)
    148 {
    149   size_t
    150     size;
    151 
    152   _data=(void *) NULL;
    153   _length=0;
    154   _size=0;
    155   if ((x_ < 0) || (width_ == 0) || (y_ < 0) || (height_ == 0) ||
    156       (x_ > (ssize_t) image_.columns()) || ((width_ + x_) > image_.columns())
    157       || (y_ > (ssize_t) image_.rows()) || ((height_ + y_) > image_.rows())
    158       || (map_.length() == 0))
    159     return;
    160 
    161   switch(type_)
    162   {
    163     case CharPixel:
    164       size=sizeof(unsigned char);
    165       break;
    166     case DoublePixel:
    167       size=sizeof(double);
    168       break;
    169     case FloatPixel:
    170       size=sizeof(float);
    171       break;
    172     case LongPixel:
    173       size=sizeof(unsigned int);
    174       break;
    175     case LongLongPixel:
    176       size=sizeof(MagickSizeType);
    177       break;
    178     case QuantumPixel:
    179       size=sizeof(Quantum);
    180       break;
    181     case ShortPixel:
    182       size=sizeof(unsigned short);
    183       break;
    184     default:
    185       throwExceptionExplicit(MagickCore::OptionError,"Invalid type");
    186       return;
    187   }
    188 
    189   _length=width_*height_*map_.length();
    190   _size=_length*size;
    191   _data=AcquireMagickMemory(_size);
    192 
    193   GetPPException;
    194   MagickCore::ExportImagePixels(image_.image(),x_,y_,width_,height_,
    195     map_.c_str(),type_,_data,exceptionInfo);
    196   if (exceptionInfo->severity != MagickCore::UndefinedException)
    197     relinquish();
    198   ThrowPPException(image_.quiet());
    199 }
    200 
    201 void Magick::PixelData::relinquish(void) throw()
    202 {
    203   if (_data != (void *)NULL)
    204     _data=RelinquishMagickMemory(_data);
    205   _length=0;
    206   _size=0;
    207 }
    208