blob: ef3f6c38e7c69652ff9c166daa948185f3fbdf60 [file] [log] [blame]
// 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_);
}