2007-08-15 Maciej Stachowiak <mjs@apple.com>
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Aug 2007 04:34:11 +0000 (04:34 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 16 Aug 2007 04:34:11 +0000 (04:34 +0000)
        Reviewed by Geoff.

        <rdar://problem/5389696> leak of 32-byte NSData object (and more?) in WebIconDatabase code path with each refresh of http://www.apple.com

        * platform/graphics/BitmapImage.h: Use RetainPtr for m_nsImage and m_tiffRep
        * platform/graphics/mac/ImageMac.mm:
        (WebCore::BitmapImage::initPlatformData): No need to do anything now
        (WebCore::BitmapImage::invalidatePlatformData): Simplify
        (WebCore::BitmapImage::getTIFFRepresentation): Use RetainPtr to avoid leaks
        (WebCore::BitmapImage::getNSImage): Use RetainPtr to avoid leaks

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@25105 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/platform/graphics/BitmapImage.h
WebCore/platform/graphics/mac/ImageMac.mm

index 5a70808..3b92708 100644 (file)
@@ -32,6 +32,7 @@
 #include "IntSize.h"
 
 #if PLATFORM(MAC)
+#include <wtf/RetainPtr.h>
 #ifdef __OBJC__
 @class NSImage;
 #else
@@ -175,8 +176,8 @@ private:
     int m_repetitionsComplete;  // How many repetitions we've finished.
 
 #if PLATFORM(MAC)
-    mutable NSImage* m_nsImage; // A cached NSImage of frame 0. Only built lazily if someone actually queries for one.
-    mutable CFDataRef m_tiffRep; // Cached TIFF rep for frame 0.  Only built lazily if someone queries for one.
+    mutable RetainPtr<NSImage> m_nsImage; // A cached NSImage of frame 0. Only built lazily if someone actually queries for one.
+    mutable RetainPtr<CFDataRef> m_tiffRep; // Cached TIFF rep for frame 0.  Only built lazily if someone queries for one.
 #endif
 
     Color m_solidColor;  // If we're a 1x1 solid color, this is the color to use to fill.
index 4a91a95..28b79c9 100644 (file)
@@ -37,8 +37,6 @@ namespace WebCore {
 
 void BitmapImage::initPlatformData()
 {
-    m_nsImage = 0;
-    m_tiffRep = 0;
 }
 
 void BitmapImage::invalidatePlatformData()
@@ -46,15 +44,8 @@ void BitmapImage::invalidatePlatformData()
     if (m_frames.size() != 1)
         return;
 
-    if (m_nsImage) {
-        CFRelease(m_nsImage);
-        m_nsImage = 0;
-    }
-
-    if (m_tiffRep) {
-        CFRelease(m_tiffRep);
-        m_tiffRep = 0;
-    }
+    m_nsImage = 0;
+    m_tiffRep = 0;
 }
 
 Image* Image::loadPlatformResource(const char *name)
@@ -73,7 +64,7 @@ Image* Image::loadPlatformResource(const char *name)
 CFDataRef BitmapImage::getTIFFRepresentation()
 {
     if (m_tiffRep)
-        return m_tiffRep;
+        return m_tiffRep.get();
     
     unsigned numFrames = frameCount();
     
@@ -92,9 +83,9 @@ CFDataRef BitmapImage::getTIFFRepresentation()
 
     unsigned numValidFrames = images.size();
     
-    CFMutableDataRef data = CFDataCreateMutable(0, 0);
+    RetainPtr<CFMutableDataRef> data(AdoptCF, CFDataCreateMutable(0, 0));
     // FIXME:  Use type kCGImageTypeIdentifierTIFF constant once is becomes available in the API
-    CGImageDestinationRef destination = CGImageDestinationCreateWithData(data, CFSTR("public.tiff"), numValidFrames, 0);
+    CGImageDestinationRef destination = CGImageDestinationCreateWithData(data.get(), CFSTR("public.tiff"), numValidFrames, 0);
     
     if (!destination)
         return 0;
@@ -106,20 +97,20 @@ CFDataRef BitmapImage::getTIFFRepresentation()
     CFRelease(destination);
 
     m_tiffRep = data;
-    return m_tiffRep;
+    return m_tiffRep.get();
 }
 
 NSImage* BitmapImage::getNSImage()
 {
     if (m_nsImage)
-        return m_nsImage;
+        return m_nsImage.get();
 
     CFDataRef data = getTIFFRepresentation();
     if (!data)
         return 0;
     
-    m_nsImage = HardRetainWithNSRelease([[NSImage alloc] initWithData:(NSData*)data]);
-    return m_nsImage;
+    m_nsImage.adoptNS([[NSImage alloc] initWithData:(NSData*)data]);
+    return m_nsImage.get();
 }
 
 }