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