From e83a69560a5ce71689045d7f561296ef6d1cd08f Mon Sep 17 00:00:00 2001 From: hogliux Date: Wed, 22 Apr 2015 17:38:32 +0100 Subject: [PATCH] Fix for duplicateIfShared when image depends on other image via SubsectionImageData --- modules/juce_graphics/images/juce_Image.cpp | 13 +++++++++++-- modules/juce_graphics/images/juce_Image.h | 5 +++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/modules/juce_graphics/images/juce_Image.cpp b/modules/juce_graphics/images/juce_Image.cpp index e7be9a3f47..17d20e5122 100644 --- a/modules/juce_graphics/images/juce_Image.cpp +++ b/modules/juce_graphics/images/juce_Image.cpp @@ -39,6 +39,11 @@ void ImagePixelData::sendDataChangeMessage() listeners.call (&Listener::imageDataChanged, this); } +int ImagePixelData::getSharedCount() const noexcept +{ + return getReferenceCount(); +} + //============================================================================== ImageType::ImageType() {} ImageType::~ImageType() {} @@ -179,7 +184,11 @@ public: ImageType* createType() const override { return image->createType(); } + /* as we always hold a reference to image, don't double count */ + int getSharedCount() const noexcept { return getReferenceCount() + image->getSharedCount() - 1; } + private: + friend class Image; const ImagePixelData::Ptr image; const Rectangle area; @@ -246,7 +255,7 @@ Image::~Image() const Image Image::null; -int Image::getReferenceCount() const noexcept { return image == nullptr ? 0 : image->getReferenceCount(); } +int Image::getReferenceCount() const noexcept { return image == nullptr ? 0 : image->getSharedCount(); } int Image::getWidth() const noexcept { return image == nullptr ? 0 : image->width; } int Image::getHeight() const noexcept { return image == nullptr ? 0 : image->height; } Rectangle Image::getBounds() const noexcept { return image == nullptr ? Rectangle() : Rectangle (image->width, image->height); } @@ -263,7 +272,7 @@ LowLevelGraphicsContext* Image::createLowLevelContext() const void Image::duplicateIfShared() { - if (image != nullptr && image->getReferenceCount() > 1) + if (getReferenceCount() > 1) image = image->clone(); } diff --git a/modules/juce_graphics/images/juce_Image.h b/modules/juce_graphics/images/juce_Image.h index 0f67b4eefe..0e624ebcc8 100644 --- a/modules/juce_graphics/images/juce_Image.h +++ b/modules/juce_graphics/images/juce_Image.h @@ -443,6 +443,11 @@ public: virtual ImageType* createType() const = 0; /** Initialises a BitmapData object. */ virtual void initialiseBitmapData (Image::BitmapData&, int x, int y, Image::BitmapData::ReadWriteMode) = 0; + /** Returns the number of Image objects which are currently referring to the same internal + shared image data. This is different to the reference count as an instance of ImagePixelData + can internally depend on another ImagePixelData via it's member variables. */ + virtual int getSharedCount() const noexcept; + /** The pixel format of the image data. */ const Image::PixelFormat pixelFormat;