13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// This may look like C code, but it is really -*- C++ -*- 23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// 33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 41888443d44c6a29f8d0836521a9c6a34b3a12006dirk// Copyright Dirk Lemstra 2014-2015 53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// 63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// Definition of an Image reference 73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// 83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// This is a private implementation class which should never be 93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// referenced by any user code. 103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy// 113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(Magick_ImageRef_header) 133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define Magick_ImageRef_header 143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15debd02e3cb441e34f5b63bbfbf69e404f8135159dirk#include <string> 163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "Magick++/Include.h" 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "Magick++/Thread.h" 183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 193ed852eea50f9d4cd633efb8c2b054b8e33c253cristynamespace Magick 203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy class Options; 223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy // 243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy // Reference counted access to Image * 253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy // 269b8a73f22320ab8ec49212fc89934e4bb2b93097dirk class MagickPPExport ImageRef 279b8a73f22320ab8ec49212fc89934e4bb2b93097dirk { 28debd02e3cb441e34f5b63bbfbf69e404f8135159dirk public: 299b8a73f22320ab8ec49212fc89934e4bb2b93097dirk 309b8a73f22320ab8ec49212fc89934e4bb2b93097dirk // Construct with null image and default options 319b8a73f22320ab8ec49212fc89934e4bb2b93097dirk ImageRef(void); 329b8a73f22320ab8ec49212fc89934e4bb2b93097dirk 333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy // Construct with an image pointer and default options 349b8a73f22320ab8ec49212fc89934e4bb2b93097dirk ImageRef(MagickCore::Image *image_); 359b8a73f22320ab8ec49212fc89934e4bb2b93097dirk 363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy // Destroy image and options 379b8a73f22320ab8ec49212fc89934e4bb2b93097dirk ~ImageRef(void); 383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39debd02e3cb441e34f5b63bbfbf69e404f8135159dirk // Decreases reference count and return the new count 40debd02e3cb441e34f5b63bbfbf69e404f8135159dirk size_t decrease(); 413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 429b8a73f22320ab8ec49212fc89934e4bb2b93097dirk // Retrieve image from reference 439b8a73f22320ab8ec49212fc89934e4bb2b93097dirk MagickCore::Image *&image(void); 443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45debd02e3cb441e34f5b63bbfbf69e404f8135159dirk // Increases reference count 46debd02e3cb441e34f5b63bbfbf69e404f8135159dirk void increase(); 47debd02e3cb441e34f5b63bbfbf69e404f8135159dirk 484b39a1ba9e9e98ae9847be7f1dee1034eab7076fdirk // Returns true if the reference count is more than one 494b39a1ba9e9e98ae9847be7f1dee1034eab7076fdirk bool isShared(); 50debd02e3cb441e34f5b63bbfbf69e404f8135159dirk 519b8a73f22320ab8ec49212fc89934e4bb2b93097dirk // Retrieve Options from reference 529b8a73f22320ab8ec49212fc89934e4bb2b93097dirk void options(Options *options_); 539b8a73f22320ab8ec49212fc89934e4bb2b93097dirk Options *options(void); 543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 554b39a1ba9e9e98ae9847be7f1dee1034eab7076fdirk // Tries to replaces the images with the specified image, returns 561888443d44c6a29f8d0836521a9c6a34b3a12006dirk // a new instance when the current image is shared. 571888443d44c6a29f8d0836521a9c6a34b3a12006dirk static ImageRef *replaceImage(ImageRef *imgRef, 581888443d44c6a29f8d0836521a9c6a34b3a12006dirk MagickCore::Image *replacement_); 59debd02e3cb441e34f5b63bbfbf69e404f8135159dirk 60debd02e3cb441e34f5b63bbfbf69e404f8135159dirk // Image signature. Set force_ to true in order to re-calculate 61debd02e3cb441e34f5b63bbfbf69e404f8135159dirk // the signature regardless of whether the image data has been 62debd02e3cb441e34f5b63bbfbf69e404f8135159dirk // modified. 63debd02e3cb441e34f5b63bbfbf69e404f8135159dirk std::string signature(const bool force_=false); 64debd02e3cb441e34f5b63bbfbf69e404f8135159dirk 65debd02e3cb441e34f5b63bbfbf69e404f8135159dirk private: 66debd02e3cb441e34f5b63bbfbf69e404f8135159dirk 671888443d44c6a29f8d0836521a9c6a34b3a12006dirk // Construct with an image pointer and options 681888443d44c6a29f8d0836521a9c6a34b3a12006dirk ImageRef(MagickCore::Image *image_,const Options *options_); 691888443d44c6a29f8d0836521a9c6a34b3a12006dirk 70debd02e3cb441e34f5b63bbfbf69e404f8135159dirk // Copy constructor and assignment are not supported 71debd02e3cb441e34f5b63bbfbf69e404f8135159dirk ImageRef(const ImageRef&); 721888443d44c6a29f8d0836521a9c6a34b3a12006dirk 73debd02e3cb441e34f5b63bbfbf69e404f8135159dirk ImageRef& operator=(const ImageRef&); 74debd02e3cb441e34f5b63bbfbf69e404f8135159dirk 759b8a73f22320ab8ec49212fc89934e4bb2b93097dirk MagickCore::Image *_image; // ImageMagick Image 76debd02e3cb441e34f5b63bbfbf69e404f8135159dirk MutexLock _mutexLock; // Mutex lock 779b8a73f22320ab8ec49212fc89934e4bb2b93097dirk Options *_options; // User-specified options 789b8a73f22320ab8ec49212fc89934e4bb2b93097dirk ::ssize_t _refCount; // Reference count 799b8a73f22320ab8ec49212fc89934e4bb2b93097dirk }; 803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 819b8a73f22320ab8ec49212fc89934e4bb2b93097dirk} // end of namespace Magick 823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 839b8a73f22320ab8ec49212fc89934e4bb2b93097dirk#endif // Magick_ImageRef_header