1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Changed ImagePixelData::clone to return a smart pointer rather than a raw one, to avoid a reference-count leak

This commit is contained in:
jules 2016-06-22 16:33:09 +01:00
parent f8516f2e19
commit 021209e216
7 changed files with 22 additions and 30 deletions

View file

@ -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<int>& 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<ImageType> type (image->createType());
const ScopedPointer<ImageType> 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<int> area;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SubsectionPixelData)

View file

@ -435,10 +435,12 @@ public:
ImagePixelData (Image::PixelFormat, int width, int height);
~ImagePixelData();
typedef ReferenceCountedObjectPtr<ImagePixelData> 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<ImagePixelData> Ptr;
//==============================================================================
struct Listener
{

View file

@ -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));

View file

@ -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);

View file

@ -635,7 +635,7 @@ public:
sendDataChangeMessage();
}
ImagePixelData* clone() override
ImagePixelData::Ptr clone() override
{
jassertfalse;
return nullptr;

View file

@ -385,7 +385,7 @@ public:
sendDataChangeMessage();
}
ImagePixelData* clone() override
ImagePixelData:Ptr clone() override
{
WindowsBitmapImage* im = new WindowsBitmapImage (pixelFormat, width, height, false);

View file

@ -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