<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[199821] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/199821">199821</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-04-21 10:02:57 -0700 (Thu, 21 Apr 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION(198782): ImageSource::subsamplingLevelForScale() does not cache the MaximumSubsamplingLevel for this ImageSource
https://bugs.webkit.org/show_bug.cgi?id=156766

Patch by Said Abou-Hallawa &lt;sabouhallawa@apple.com&gt; 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:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsImageSourcecpp">trunk/Source/WebCore/platform/graphics/ImageSource.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsImageSourceh">trunk/Source/WebCore/platform/graphics/ImageSource.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (199820 => 199821)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-04-21 16:44:50 UTC (rev 199820)
+++ trunk/Source/WebCore/ChangeLog        2016-04-21 17:02:57 UTC (rev 199821)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2016-04-21  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        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:
+
</ins><span class="cx"> 2016-04-21  Antoine Quint  &lt;graouts@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Creating a large number of WebGL contexts should recycle older contexts
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsImageSourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ImageSource.cpp (199820 => 199821)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ImageSource.cpp        2016-04-21 16:44:50 UTC (rev 199820)
+++ trunk/Source/WebCore/platform/graphics/ImageSource.cpp        2016-04-21 17:02:57 UTC (rev 199821)
</span><span class="lines">@@ -104,18 +104,27 @@
</span><span class="cx">     return maxSubsamplingLevel;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-SubsamplingLevel ImageSource::subsamplingLevelForScale(float scale) const
</del><ins>+void ImageSource::cacheMetadata()
</ins><span class="cx"> {
</span><ins>+    if (m_frameCount || !isSizeAvailable())
+        return;
+    
+    m_frameCount = m_decoder-&gt;frameCount();
+    m_maximumSubsamplingLevel = calculateMaximumSubsamplingLevel();
+}
+    
+SubsamplingLevel ImageSource::subsamplingLevelForScale(float scale)
+{
</ins><span class="cx">     if (!(scale &gt; 0 &amp;&amp; scale &lt;= 1))
</span><span class="cx">         return 0;
</span><span class="cx">     
</span><del>-    SubsamplingLevel maximumSubsamplingLevel = calculateMaximumSubsamplingLevel();
-    if (!maximumSubsamplingLevel)
</del><ins>+    cacheMetadata();
+    if (!m_maximumSubsamplingLevel)
</ins><span class="cx">         return 0;
</span><span class="cx"> 
</span><span class="cx">     // There are four subsampling levels: 0 = 1x, 1 = 0.5x, 2 = 0.25x, 3 = 0.125x.
</span><span class="cx">     SubsamplingLevel result = std::ceil(std::log2(1 / scale));
</span><del>-    return std::min(result, maximumSubsamplingLevel);
</del><ins>+    return std::min(result, m_maximumSubsamplingLevel);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> size_t ImageSource::bytesDecodedToDetermineProperties()
</span><span class="lines">@@ -138,9 +147,10 @@
</span><span class="cx">     return frameSizeAtIndex(0, 0, RespectImageOrientation);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-size_t ImageSource::frameCount() const
</del><ins>+size_t ImageSource::frameCount()
</ins><span class="cx"> {
</span><del>-    return initialized() ? m_decoder-&gt;frameCount() : 0;
</del><ins>+    cacheMetadata();
+    return m_frameCount;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> int ImageSource::repetitionCount()
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsImageSourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ImageSource.h (199820 => 199821)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ImageSource.h        2016-04-21 16:44:50 UTC (rev 199820)
+++ trunk/Source/WebCore/platform/graphics/ImageSource.h        2016-04-21 17:02:57 UTC (rev 199821)
</span><span class="lines">@@ -110,7 +110,7 @@
</span><span class="cx"> 
</span><span class="cx">     void setData(SharedBuffer* data, bool allDataReceived);
</span><span class="cx"> 
</span><del>-    SubsamplingLevel subsamplingLevelForScale(float) const;
</del><ins>+    SubsamplingLevel subsamplingLevelForScale(float);
</ins><span class="cx">     void setAllowSubsampling(bool allowSubsampling) { m_allowSubsampling = allowSubsampling; }
</span><span class="cx">     static size_t bytesDecodedToDetermineProperties();
</span><span class="cx">     
</span><span class="lines">@@ -119,7 +119,7 @@
</span><span class="cx">     IntSize size() const;
</span><span class="cx">     IntSize sizeRespectingOrientation() const;
</span><span class="cx"> 
</span><del>-    size_t frameCount() const;
</del><ins>+    size_t frameCount();
</ins><span class="cx">     int repetitionCount();
</span><span class="cx">     String filenameExtension() const;
</span><span class="cx">     Optional&lt;IntPoint&gt; hotSpot() const;
</span><span class="lines">@@ -145,9 +145,13 @@
</span><span class="cx"> private:
</span><span class="cx">     void clearFrameBufferCache(size_t);
</span><span class="cx">     SubsamplingLevel calculateMaximumSubsamplingLevel() const;
</span><ins>+    void cacheMetadata();
</ins><span class="cx">     void dump(TextStream&amp;) const;
</span><span class="cx">     
</span><span class="cx">     std::unique_ptr&lt;ImageDecoder&gt; m_decoder;
</span><ins>+    
+    size_t m_frameCount { 0 };
+    SubsamplingLevel m_maximumSubsamplingLevel { 0 };
</ins><span class="cx"> 
</span><span class="cx">     // The default value of m_allowSubsampling should be the same as defaultImageSubsamplingEnabled in Settings.cpp
</span><span class="cx"> #if PLATFORM(IOS)
</span></span></pre>
</div>
</div>

</body>
</html>