// This may look like C code, but it is really -*- C++ -*- // // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 // Copyright Dirk Lemstra 2014-2015 // // Implementation of ImageRef // // This is an internal implementation class. // #define MAGICKCORE_IMPLEMENTATION 1 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1 #include "Magick++/ImageRef.h" #include "Magick++/Exception.h" #include "Magick++/Options.h" Magick::ImageRef::ImageRef(void) : _image(0), _mutexLock(), _options(new Options), _refCount(1) { GetPPException; _image=AcquireImage(_options->imageInfo(),exceptionInfo); ThrowPPException(false); } Magick::ImageRef::ImageRef(MagickCore::Image *image_) : _image(image_), _mutexLock(), _options(new Options), _refCount(1) { } Magick::ImageRef::~ImageRef(void) { // Deallocate image if (_image != (MagickCore::Image*) NULL) _image=DestroyImageList(_image); // Deallocate image options delete _options; _options=(Options *) NULL; } size_t Magick::ImageRef::decrease() { size_t count; _mutexLock.lock(); if (_refCount == 0) { _mutexLock.unlock(); throwExceptionExplicit(MagickCore::OptionError, "Invalid call to decrease"); return(0); } count=--_refCount; _mutexLock.unlock(); return(count); } MagickCore::Image *&Magick::ImageRef::image(void) { return(_image); } void Magick::ImageRef::increase() { _mutexLock.lock(); _refCount++; _mutexLock.unlock(); } bool Magick::ImageRef::isShared() { bool isShared; _mutexLock.lock(); isShared=(_refCount > 1); _mutexLock.unlock(); return(isShared); } void Magick::ImageRef::options(Magick::Options *options_) { delete _options; _options=options_; } Magick::Options *Magick::ImageRef::options(void) { return(_options); } Magick::ImageRef *Magick::ImageRef::replaceImage(ImageRef *imgRef, MagickCore::Image *replacement_) { Magick::ImageRef *instance; imgRef->_mutexLock.lock(); if (imgRef->_refCount == 1) { // We can replace the image if we own it. instance=imgRef; if (imgRef->_image != (MagickCore::Image*) NULL) (void) DestroyImageList(imgRef->_image); imgRef->_image=replacement_; imgRef->_mutexLock.unlock(); } else { // We don't own the image, create a new ImageRef instance. instance=new ImageRef(replacement_,imgRef->_options); imgRef->_refCount--; imgRef->_mutexLock.unlock(); } return(instance); } std::string Magick::ImageRef::signature(const bool force_) { const char *property; // Re-calculate image signature if necessary GetPPException; _mutexLock.lock(); property=(const char *) NULL; if (!force_ && (_image->taint == MagickFalse)) property=GetImageProperty(_image,"Signature",exceptionInfo); if (property == (const char *) NULL) { (void) SignatureImage(_image,exceptionInfo); property=GetImageProperty(_image,"Signature",exceptionInfo); } _mutexLock.unlock(); ThrowPPException(true); return(std::string(property)); } Magick::ImageRef::ImageRef(MagickCore::Image *image_,const Options *options_) : _image(image_), _mutexLock(), _options(0), _refCount(1) { _options=new Options(*options_); }