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:
parent
f8516f2e19
commit
021209e216
7 changed files with 22 additions and 30 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -635,7 +635,7 @@ public:
|
|||
sendDataChangeMessage();
|
||||
}
|
||||
|
||||
ImagePixelData* clone() override
|
||||
ImagePixelData::Ptr clone() override
|
||||
{
|
||||
jassertfalse;
|
||||
return nullptr;
|
||||
|
|
|
|||
|
|
@ -385,7 +385,7 @@ public:
|
|||
sendDataChangeMessage();
|
||||
}
|
||||
|
||||
ImagePixelData* clone() override
|
||||
ImagePixelData:Ptr clone() override
|
||||
{
|
||||
WindowsBitmapImage* im = new WindowsBitmapImage (pixelFormat, width, height, false);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue