diff --git a/modules/juce_graphics/images/juce_Image.cpp b/modules/juce_graphics/images/juce_Image.cpp index cb51d5d881..2bf79eb8d6 100644 --- a/modules/juce_graphics/images/juce_Image.cpp +++ b/modules/juce_graphics/images/juce_Image.cpp @@ -102,7 +102,7 @@ public: sendDataChangeMessage(); } - ImagePixelData* clone() override + ImagePixelData::Ptr clone() override { SoftwarePixelData* s = new SoftwarePixelData (pixelFormat, width, height, false); memcpy (s->imageData, imageData, (size_t) (lineStride * height)); @@ -153,13 +153,13 @@ class SubsectionPixelData : public ImagePixelData public: SubsectionPixelData (ImagePixelData* const im, const Rectangle& r) : ImagePixelData (im->pixelFormat, r.getWidth(), r.getHeight()), - image (im), area (r) + sourceImage (im), area (r) { } LowLevelGraphicsContext* createLowLevelContext() override { - LowLevelGraphicsContext* g = image->createLowLevelContext(); + LowLevelGraphicsContext* g = sourceImage->createLowLevelContext(); g->clipToRectangle (area); g->setOrigin (area.getPosition()); return g; @@ -167,16 +167,16 @@ public: void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override { - image->initialiseBitmapData (bitmap, x + area.getX(), y + area.getY(), mode); + sourceImage->initialiseBitmapData (bitmap, x + area.getX(), y + area.getY(), mode); if (mode != Image::BitmapData::readOnly) sendDataChangeMessage(); } - ImagePixelData* clone() override + ImagePixelData::Ptr clone() override { jassert (getReferenceCount() > 0); // (This method can't be used on an unowned pointer, as it will end up self-deleting) - const ScopedPointer type (image->createType()); + const ScopedPointer type (createType()); Image newImage (type->create (pixelFormat, area.getWidth(), area.getHeight(), pixelFormat != Image::RGB)); @@ -185,18 +185,17 @@ public: g.drawImageAt (Image (this), 0, 0); } - newImage.getPixelData()->incReferenceCount(); return newImage.getPixelData(); } - ImageType* createType() const override { return image->createType(); } + ImageType* createType() const override { return sourceImage->createType(); } /* as we always hold a reference to image, don't double count */ - int getSharedCount() const noexcept override { return getReferenceCount() + image->getSharedCount() - 1; } + int getSharedCount() const noexcept override { return getReferenceCount() + sourceImage->getSharedCount() - 1; } private: friend class Image; - const ImagePixelData::Ptr image; + const ImagePixelData::Ptr sourceImage; const Rectangle area; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SubsectionPixelData) diff --git a/modules/juce_graphics/images/juce_Image.h b/modules/juce_graphics/images/juce_Image.h index 189094c9fb..d246739c12 100644 --- a/modules/juce_graphics/images/juce_Image.h +++ b/modules/juce_graphics/images/juce_Image.h @@ -435,10 +435,12 @@ public: ImagePixelData (Image::PixelFormat, int width, int height); ~ImagePixelData(); + typedef ReferenceCountedObjectPtr Ptr; + /** Creates a context that will draw into this image. */ virtual LowLevelGraphicsContext* createLowLevelContext() = 0; /** Creates a copy of this image. */ - virtual ImagePixelData* clone() = 0; + virtual Ptr clone() = 0; /** Creates an instance of the type of this image. */ virtual ImageType* createType() const = 0; /** Initialises a BitmapData object. */ @@ -458,8 +460,6 @@ public: */ NamedValueSet userData; - typedef ReferenceCountedObjectPtr Ptr; - //============================================================================== struct Listener { diff --git a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm index 584e6e7945..90ff506bc2 100644 --- a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm +++ b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm @@ -72,7 +72,7 @@ public: } } - ImagePixelData* clone() override + ImagePixelData::Ptr clone() override { CoreGraphicsImage* im = new CoreGraphicsImage (pixelFormat, width, height, false); memcpy (im->imageData, imageData, (size_t) (lineStride * height)); diff --git a/modules/juce_gui_basics/native/juce_android_Windowing.cpp b/modules/juce_gui_basics/native/juce_android_Windowing.cpp index 79f091e4f6..09bc0674de 100644 --- a/modules/juce_gui_basics/native/juce_android_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_android_Windowing.cpp @@ -572,9 +572,8 @@ private: int sizeAllocated; float scale; - class PreallocatedImage : public ImagePixelData + struct PreallocatedImage : public ImagePixelData { - public: PreallocatedImage (const int width_, const int height_, jint* data_, bool hasAlpha_) : ImagePixelData (Image::ARGB, width_, height_), data (data_), hasAlpha (hasAlpha_) { @@ -607,7 +606,7 @@ private: bm.data = (uint8*) (data + x + y * width); } - ImagePixelData* clone() + ImagePixelData::Ptr clone() { PreallocatedImage* s = new PreallocatedImage (width, height, 0, hasAlpha); s->allocatedData.malloc (sizeof (jint) * width * height); diff --git a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp index ea90c91aae..925ee0d5e5 100644 --- a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp @@ -635,7 +635,7 @@ public: sendDataChangeMessage(); } - ImagePixelData* clone() override + ImagePixelData::Ptr clone() override { jassertfalse; return nullptr; diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 2b3a4b5343..d6c9fc768f 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -385,7 +385,7 @@ public: sendDataChangeMessage(); } - ImagePixelData* clone() override + ImagePixelData:Ptr clone() override { WindowsBitmapImage* im = new WindowsBitmapImage (pixelFormat, width, height, false); diff --git a/modules/juce_opengl/opengl/juce_OpenGLImage.cpp b/modules/juce_opengl/opengl/juce_OpenGLImage.cpp index 4a9dacc4ad..e0eae4fdd6 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLImage.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLImage.cpp @@ -46,19 +46,13 @@ public: ImageType* createType() const override { return new OpenGLImageType(); } - ImagePixelData* clone() override + ImagePixelData::Ptr clone() override { - OpenGLFrameBufferImage* im = new OpenGLFrameBufferImage (context, width, height); - im->incReferenceCount(); + Image newImage (new OpenGLFrameBufferImage (context, width, height)); + Graphics g (newImage); + g.drawImageAt (Image (this), 0, 0, false); - { - Image newImage (im); - Graphics g (newImage); - g.drawImageAt (Image (this), 0, 0, false); - } - - im->resetReferenceCount(); - return im; + return newImage.getPixelData(); } void initialiseBitmapData (Image::BitmapData& bitmapData, int x, int y, Image::BitmapData::ReadWriteMode mode) override