REGRESSION(198782): ImageSource::subsamplingLevelForScale() does not cache the Maximu...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Apr 2016 17:02:57 +0000 (17:02 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Apr 2016 17:02:57 +0000 (17:02 +0000)
https://bugs.webkit.org/show_bug.cgi?id=156766

Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2016-04-21
Reviewed by Darin Adler.

Ensure the MaximumSubsamplingLevel for the ImageSource is calculated
only once and is cached for subsequent uses.

The image subsampling is on by default only for iOS. So the and this
patch currently affects the iOS port.

* platform/graphics/ImageSource.cpp:
(WebCore::ImageSource::cacheMetadata): Cache m_maximumSubsamplingLevel.
Use m_frameCount as a flag for having_the_cache_done.
(WebCore::ImageSource::subsamplingLevelForScale): Call cacheMetadata()
before using m_maximumSubsamplingLevel.
(WebCore::ImageSource::frameCount): Call cacheMetadata() before returning
m_frameCount.
* platform/graphics/ImageSource.h:

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

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/ImageSource.cpp
Source/WebCore/platform/graphics/ImageSource.h

index d2b4539..a6e048a 100644 (file)
@@ -1,3 +1,25 @@
+2016-04-21  Said Abou-Hallawa  <sabouhallawa@apple.com>
+
+        REGRESSION(198782): ImageSource::subsamplingLevelForScale() does not cache the MaximumSubsamplingLevel for this ImageSource
+        https://bugs.webkit.org/show_bug.cgi?id=156766
+
+        Reviewed by Darin Adler.
+
+        Ensure the MaximumSubsamplingLevel for the ImageSource is calculated
+        only once and is cached for subsequent uses. 
+        
+        The image subsampling is on by default only for iOS. So the and this
+        patch currently affects the iOS port.
+
+        * platform/graphics/ImageSource.cpp:
+        (WebCore::ImageSource::cacheMetadata): Cache m_maximumSubsamplingLevel.
+        Use m_frameCount as a flag for having_the_cache_done.
+        (WebCore::ImageSource::subsamplingLevelForScale): Call cacheMetadata()
+        before using m_maximumSubsamplingLevel.
+        (WebCore::ImageSource::frameCount): Call cacheMetadata() before returning
+        m_frameCount.
+        * platform/graphics/ImageSource.h:
+
 2016-04-21  Antoine Quint  <graouts@apple.com>
 
         Creating a large number of WebGL contexts should recycle older contexts
index 7d34f6d..f1e9547 100644 (file)
@@ -104,18 +104,27 @@ SubsamplingLevel ImageSource::calculateMaximumSubsamplingLevel() const
     return maxSubsamplingLevel;
 }
 
-SubsamplingLevel ImageSource::subsamplingLevelForScale(float scale) const
+void ImageSource::cacheMetadata()
+{
+    if (m_frameCount || !isSizeAvailable())
+        return;
+    
+    m_frameCount = m_decoder->frameCount();
+    m_maximumSubsamplingLevel = calculateMaximumSubsamplingLevel();
+}
+    
+SubsamplingLevel ImageSource::subsamplingLevelForScale(float scale)
 {
     if (!(scale > 0 && scale <= 1))
         return 0;
     
-    SubsamplingLevel maximumSubsamplingLevel = calculateMaximumSubsamplingLevel();
-    if (!maximumSubsamplingLevel)
+    cacheMetadata();
+    if (!m_maximumSubsamplingLevel)
         return 0;
 
     // There are four subsampling levels: 0 = 1x, 1 = 0.5x, 2 = 0.25x, 3 = 0.125x.
     SubsamplingLevel result = std::ceil(std::log2(1 / scale));
-    return std::min(result, maximumSubsamplingLevel);
+    return std::min(result, m_maximumSubsamplingLevel);
 }
 
 size_t ImageSource::bytesDecodedToDetermineProperties()
@@ -138,9 +147,10 @@ IntSize ImageSource::sizeRespectingOrientation() const
     return frameSizeAtIndex(0, 0, RespectImageOrientation);
 }
 
-size_t ImageSource::frameCount() const
+size_t ImageSource::frameCount()
 {
-    return initialized() ? m_decoder->frameCount() : 0;
+    cacheMetadata();
+    return m_frameCount;
 }
 
 int ImageSource::repetitionCount()
index 409cb4e..e5a1fff 100644 (file)
@@ -110,7 +110,7 @@ public:
 
     void setData(SharedBuffer* data, bool allDataReceived);
 
-    SubsamplingLevel subsamplingLevelForScale(float) const;
+    SubsamplingLevel subsamplingLevelForScale(float);
     void setAllowSubsampling(bool allowSubsampling) { m_allowSubsampling = allowSubsampling; }
     static size_t bytesDecodedToDetermineProperties();
     
@@ -119,7 +119,7 @@ public:
     IntSize size() const;
     IntSize sizeRespectingOrientation() const;
 
-    size_t frameCount() const;
+    size_t frameCount();
     int repetitionCount();
     String filenameExtension() const;
     Optional<IntPoint> hotSpot() const;
@@ -145,9 +145,13 @@ public:
 private:
     void clearFrameBufferCache(size_t);
     SubsamplingLevel calculateMaximumSubsamplingLevel() const;
+    void cacheMetadata();
     void dump(TextStream&) const;
     
     std::unique_ptr<ImageDecoder> m_decoder;
+    
+    size_t m_frameCount { 0 };
+    SubsamplingLevel m_maximumSubsamplingLevel { 0 };
 
     // The default value of m_allowSubsampling should be the same as defaultImageSubsamplingEnabled in Settings.cpp
 #if PLATFORM(IOS)