<!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>[215157] trunk</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/215157">215157</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2017-04-08 19:39:28 -0700 (Sat, 08 Apr 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>A synchronous DecodingOptions should be compatible with any asynchronous sizeForDrawing DecodingOptions
https://bugs.webkit.org/show_bug.cgi?id=170577

Patch by Said Abou-Hallawa &lt;sabouhallawa@apple.com&gt; on 2017-04-08
Reviewed by Simon Fraser.

Source/WebCore:

Once a synchronous decoded frame is found, there is no need to decode it
again. This decoded frame is suitable for any sizeForDrawing. This will
prevent double decoding if one image client wants synchronous decoded
frame while the other needs an asynchronous decode frame for a specific
sizeForDrawing.

Test: fast/images/async-image-background-image-repeated.html

* platform/graphics/DecodingOptions.h:
(WebCore::DecodingOptions::DecodingOptions):
(WebCore::DecodingOptions::isNone):
(WebCore::DecodingOptions::isAsynchronousCompatibleWith):

LayoutTests:

* fast/images/async-image-background-image-repeated-expected.html: Added.
* fast/images/async-image-background-image-repeated.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsDecodingOptionsh">trunk/Source/WebCore/platform/graphics/DecodingOptions.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastimagesasyncimagebackgroundimagerepeatedexpectedhtml">trunk/LayoutTests/fast/images/async-image-background-image-repeated-expected.html</a></li>
<li><a href="#trunkLayoutTestsfastimagesasyncimagebackgroundimagerepeatedhtml">trunk/LayoutTests/fast/images/async-image-background-image-repeated.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (215156 => 215157)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-04-09 00:50:32 UTC (rev 215156)
+++ trunk/LayoutTests/ChangeLog        2017-04-09 02:39:28 UTC (rev 215157)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2017-04-08  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        A synchronous DecodingOptions should be compatible with any asynchronous sizeForDrawing DecodingOptions
+        https://bugs.webkit.org/show_bug.cgi?id=170577
+
+        Reviewed by Simon Fraser.
+
+        * fast/images/async-image-background-image-repeated-expected.html: Added.
+        * fast/images/async-image-background-image-repeated.html: Added.
+
</ins><span class="cx"> 2017-04-08  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unprefix CSS cursor values grab and grabbing
</span></span></pre></div>
<a id="trunkLayoutTestsfastimagesasyncimagebackgroundimagerepeatedexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/images/async-image-background-image-repeated-expected.html (0 => 215157)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/images/async-image-background-image-repeated-expected.html                                (rev 0)
+++ trunk/LayoutTests/fast/images/async-image-background-image-repeated-expected.html        2017-04-09 02:39:28 UTC (rev 215157)
</span><span class="lines">@@ -0,0 +1,50 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;style&gt;
+    .box {
+        height: 100px;
+        display: inline-block;
+    }
+    .green-box {
+        width: 100px;
+    }
+    .repeat-box {
+        width: 400px;
+    }
+    .green-background {
+        background-color: green;
+    }
+    .rgb-background {
+        background: linear-gradient(
+            to right,
+            red,
+            red 12.5%,
+            green 12.5%,
+            green 37.5%,
+            blue 37.5%,
+            blue 50%,
+            red 50%,
+            red 62.5%,
+            green 62.5%,
+            green 87.5%,
+            blue 87.5%
+        );
+    }
+    @media (-webkit-min-device-pixel-ratio: 2) {
+        .box {
+            height: 50px;
+        }
+        .green-box {
+            width: 50px;
+        }
+        .repeat-box {
+            width: 200px;
+        }
+    }
+&lt;/style&gt;
+&lt;body&gt;
+    &lt;div class=&quot;box green-box green-background&quot;&gt;&lt;/div&gt;
+    &lt;br&gt;
+    &lt;div class=&quot;box repeat-box rgb-background&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastimagesasyncimagebackgroundimagerepeatedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/images/async-image-background-image-repeated.html (0 => 215157)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/images/async-image-background-image-repeated.html                                (rev 0)
+++ trunk/LayoutTests/fast/images/async-image-background-image-repeated.html        2017-04-09 02:39:28 UTC (rev 215157)
</span><span class="lines">@@ -0,0 +1,71 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;style&gt;
+    .box {
+        height: 100px;
+        display: inline-block;
+    }
+    .green-box {
+        width: 100px;
+        background-position: -50px -1000px;
+    }
+    .repeat-box {
+        width: 400px;
+        background-position: 0px -1000px;
+        background-repeat: repeat-x;
+    }
+    .image-background {
+        background-image: url(resources/sprite-sheet-red-green-blue.png);
+    }
+    @media (-webkit-min-device-pixel-ratio: 2) {
+        .box {
+            height: 50px;
+        }
+        .green-box {
+            width: 50px;
+            background-position: -25px -500px;
+        }
+        .repeat-box {
+            width: 200px;
+            background-position: 0px -500px;
+        }
+        .image-background {
+            background-size: 100px, 1050px;
+        }
+    }
+&lt;/style&gt;
+&lt;body&gt;
+    &lt;div class=&quot;box green-box image-background&quot;&gt;&lt;/div&gt;
+    &lt;br&gt;
+    &lt;div class=&quot;box repeat-box image-background&quot;&gt;&lt;/div&gt;
+    &lt;script&gt;
+        function forceRedraw(elements) {
+            for(var i = 0; i &lt; elements.length; i++)
+                elements[i].style.display = 'none';
+
+            var trick = element.offsetHeight;
+            
+            for(var i = 0; i &lt; elements.length; i++)
+                elements[i].style.display = 'inline-block';
+        }
+
+        (function() {
+            var elements = document.getElementsByClassName(&quot;image-background&quot;);
+
+            if (window.internals) {
+                internals.clearMemoryCache();
+                internals.settings.setLargeImageAsyncDecodingEnabled(true);
+            }
+
+            if (window.testRunner) {
+                testRunner.waitUntilDone();
+                forceRedraw(elements);
+                setTimeout(function() {
+                    forceRedraw(elements);
+                    testRunner.notifyDone();
+                }, 50);
+            }
+        }
+    &lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (215156 => 215157)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-04-09 00:50:32 UTC (rev 215156)
+++ trunk/Source/WebCore/ChangeLog        2017-04-09 02:39:28 UTC (rev 215157)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2017-04-08  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        A synchronous DecodingOptions should be compatible with any asynchronous sizeForDrawing DecodingOptions
+        https://bugs.webkit.org/show_bug.cgi?id=170577
+
+        Reviewed by Simon Fraser.
+
+        Once a synchronous decoded frame is found, there is no need to decode it
+        again. This decoded frame is suitable for any sizeForDrawing. This will
+        prevent double decoding if one image client wants synchronous decoded
+        frame while the other needs an asynchronous decode frame for a specific
+        sizeForDrawing.
+
+        Test: fast/images/async-image-background-image-repeated.html
+
+        * platform/graphics/DecodingOptions.h:
+        (WebCore::DecodingOptions::DecodingOptions):
+        (WebCore::DecodingOptions::isNone):
+        (WebCore::DecodingOptions::isAsynchronousCompatibleWith):
+
</ins><span class="cx"> 2017-04-08  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Align the timers for throttled rAF to reduce power usage
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsDecodingOptionsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/DecodingOptions.h (215156 => 215157)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/DecodingOptions.h        2017-04-09 00:50:32 UTC (rev 215156)
+++ trunk/Source/WebCore/platform/graphics/DecodingOptions.h        2017-04-09 02:39:28 UTC (rev 215157)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> enum class DecodingMode {
</span><ins>+    None,
</ins><span class="cx">     Synchronous,
</span><span class="cx">     Asynchronous
</span><span class="cx"> };
</span><span class="lines">@@ -37,7 +38,7 @@
</span><span class="cx"> 
</span><span class="cx"> class DecodingOptions {
</span><span class="cx"> public:
</span><del>-    DecodingOptions(DecodingMode decodingMode = DecodingMode::Synchronous)
</del><ins>+    DecodingOptions(DecodingMode decodingMode = DecodingMode::None)
</ins><span class="cx">         : m_decodingModeOrSize(decodingMode)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="lines">@@ -52,6 +53,11 @@
</span><span class="cx">         return m_decodingModeOrSize == other.m_decodingModeOrSize;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool isNone() const
+    {
+        return hasDecodingMode() &amp;&amp; WTF::get&lt;DecodingMode&gt;(m_decodingModeOrSize) == DecodingMode::None;
+    }
+    
</ins><span class="cx">     bool isSynchronous() const
</span><span class="cx">     {
</span><span class="cx">         return hasDecodingMode() &amp;&amp; WTF::get&lt;DecodingMode&gt;(m_decodingModeOrSize) == DecodingMode::Synchronous;
</span><span class="lines">@@ -62,24 +68,32 @@
</span><span class="cx">         return hasDecodingMode() &amp;&amp; WTF::get&lt;DecodingMode&gt;(m_decodingModeOrSize) == DecodingMode::Asynchronous;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool isAsynchronousCompatibleWith(const DecodingOptions&amp; DecodingOptions) const
</del><ins>+    bool isAsynchronousCompatibleWith(const DecodingOptions&amp; decodingOptions) const
</ins><span class="cx">     {
</span><del>-        if (!hasSize() || DecodingOptions.isSynchronous())
</del><ins>+        if (isNone() || decodingOptions.isNone())
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        if (DecodingOptions.isAsynchronous())
</del><ins>+        // Comparing DecodingOptions with isAsynchronous() should not happen.
+        ASSERT(!isAsynchronous());
+        if (isAsynchronous() || decodingOptions.isSynchronous())
+            return false;
+        
+        // If the image was synchronously decoded, then it should fit any size.
+        // If we want an image regardless of its size, then the current decoded
+        // image should be fine.
+        if (isSynchronous() || decodingOptions.isAsynchronous())
</ins><span class="cx">             return true;
</span><span class="cx"> 
</span><del>-        ASSERT(DecodingOptions.hasSize());
-        if (DecodingOptions.hasFullSize())
</del><ins>+        ASSERT(decodingOptions.hasSize());
+        if (decodingOptions.hasFullSize())
</ins><span class="cx">             return hasFullSize();
</span><span class="cx"> 
</span><del>-        ASSERT(DecodingOptions.hasSizeForDrawing());
</del><ins>+        ASSERT(decodingOptions.hasSizeForDrawing());
</ins><span class="cx">         if (hasFullSize())
</span><span class="cx">             return true;
</span><span class="cx"> 
</span><span class="cx">         ASSERT(hasSizeForDrawing());
</span><del>-        return maxDimension(*sizeForDrawing()) &gt;= maxDimension(*DecodingOptions.sizeForDrawing());
</del><ins>+        return maxDimension(*sizeForDrawing()) &gt;= maxDimension(*decodingOptions.sizeForDrawing());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool hasFullSize() const
</span></span></pre>
</div>
</div>

</body>
</html>