Reviewed by Hyatt.
authorantti <antti@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 28 Mar 2007 21:28:17 +0000 (21:28 +0000)
committerantti <antti@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 28 Mar 2007 21:28:17 +0000 (21:28 +0000)
        Fix <rdar://problem/5092653>
        REGRESSION: Image decoding making scrolling slow

        If decoder gave back a null frame (which I think happens regularly if you don't have full frame
        data yet for image that does not decode incrementally) m_decodedSize was incremented anyway. This
        led to massive growth in calculated image size and eventually made cache prune constantly.

        No test, I don't know how to make one for this.

        * platform/graphics/BitmapImage.cpp:
        (WebCore::BitmapImage::cacheFrame):

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

WebCore/ChangeLog
WebCore/platform/graphics/BitmapImage.cpp

index 05ea7c587a68608250635cbf023518dbbb6d464c..1755c0b672ea2c91ffb089c6f3e8629b1d0e6e01 100644 (file)
@@ -1,3 +1,19 @@
+2007-03-28  Antti Koivisto  <antti@apple.com>
+
+        Reviewed by Hyatt.
+
+        Fix <rdar://problem/5092653>
+        REGRESSION: Image decoding making scrolling slow
+        
+        If decoder gave back a null frame (which I think happens regularly if you don't have full frame 
+        data yet for image that does not decode incrementally) m_decodedSize was incremented anyway. This
+        led to massive growth in calculated image size and eventually made cache prune constantly. 
+        
+        No test, I don't know how to make one for this.
+
+        * platform/graphics/BitmapImage.cpp:
+        (WebCore::BitmapImage::cacheFrame):
+
 2007-03-28  Adele Peterson  <adele@apple.com>
 
         Reviewed by Kevin M.
index f2cba18c9f1d30d582657adeb27e39bc81c67c65..41ce1a82e0d56fdf1c0b0ef28352494c39196e6a 100644 (file)
@@ -103,6 +103,8 @@ void BitmapImage::destroyDecodedData(bool incremental)
 void BitmapImage::cacheFrame(size_t index)
 {
     size_t numFrames = frameCount();
+    ASSERT(m_decodedSize == 0 || numFrames > 1);
+    
     if (!m_frames.size() && shouldAnimate()) {            
         // Snag the repetition count.
         m_repetitionCount = m_source.repetitionCount();
@@ -121,7 +123,7 @@ void BitmapImage::cacheFrame(size_t index)
         m_frames[index].m_duration = m_source.frameDurationAtIndex(index);
     m_frames[index].m_hasAlpha = m_source.frameHasAlphaAtIndex(index);
     
-    int sizeChange = m_size.width() * m_size.height() * 4;
+    int sizeChange = m_frames[index].m_frame ? m_size.width() * m_size.height() * 4 : 0;
     if (sizeChange) {
         if (imageObserver())
             imageObserver()->decodedSizeWillChange(this, sizeChange);