<!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>[169412] 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/169412">169412</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2014-05-27 21:46:18 -0700 (Tue, 27 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION (Margin tiles): Background gradient on dom.spec.whatwg.org is very slow to render
https://bugs.webkit.org/show_bug.cgi?id=133335
&lt;rdar://problem/17011392&gt;

Reviewed by Simon Fraser.

* platform/graphics/Image.cpp:
(WebCore::Image::drawTiled):
Make cross-platform and use some iOS code which avoids patterned drawing when the pattern buffer
would be very large. Instead, it calls draw() repeatedly over the pattern space, avoiding the allocation
of a huge (in the case of bug 133335, nearly 2GB) buffer.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsImagecpp">trunk/Source/WebCore/platform/graphics/Image.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (169411 => 169412)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-05-28 04:44:56 UTC (rev 169411)
+++ trunk/Source/WebCore/ChangeLog        2014-05-28 04:46:18 UTC (rev 169412)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2014-05-27  Timothy Horton  &lt;timothy_horton@apple.com&gt;
+
+        REGRESSION (Margin tiles): Background gradient on dom.spec.whatwg.org is very slow to render
+        https://bugs.webkit.org/show_bug.cgi?id=133335
+        &lt;rdar://problem/17011392&gt;
+
+        Reviewed by Simon Fraser.
+
+        * platform/graphics/Image.cpp:
+        (WebCore::Image::drawTiled):
+        Make cross-platform and use some iOS code which avoids patterned drawing when the pattern buffer
+        would be very large. Instead, it calls draw() repeatedly over the pattern space, avoiding the allocation
+        of a huge (in the case of bug 133335, nearly 2GB) buffer.
+
</ins><span class="cx"> 2014-05-27  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS WK2] Fix behavior of position:sticky inside accelerated overflow-scroll
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/Image.cpp (169411 => 169412)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/Image.cpp        2014-05-28 04:44:56 UTC (rev 169411)
+++ trunk/Source/WebCore/platform/graphics/Image.cpp        2014-05-28 04:46:18 UTC (rev 169412)
</span><span class="lines">@@ -118,7 +118,7 @@
</span><span class="cx">     oneTileRect.setY(destRect.y() + fmodf(fmodf(-srcPoint.y(), actualTileSize.height()) - actualTileSize.height(), actualTileSize.height()));
</span><span class="cx">     oneTileRect.setSize(scaledTileSize);
</span><span class="cx">     
</span><del>-    // Check and see if a single draw of the image can cover the entire area we are supposed to tile.    
</del><ins>+    // Check and see if a single draw of the image can cover the entire area we are supposed to tile.
</ins><span class="cx">     if (oneTileRect.contains(destRect) &amp;&amp; !ctxt-&gt;drawLuminanceMask()) {
</span><span class="cx">         FloatRect visibleSrcRect;
</span><span class="cx">         visibleSrcRect.setX((destRect.x() - oneTileRect.x()) / scale.width());
</span><span class="lines">@@ -153,22 +153,27 @@
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+
+    // Patterned images and gradients can use lots of memory for caching when the
+    // tile size is large (&lt;rdar://problem/4691859&gt;, &lt;rdar://problem/6239505&gt;).
+    // Memory consumption depends on the transformed tile size which can get
+    // larger than the original tile if user zooms in enough.
</ins><span class="cx"> #if PLATFORM(IOS)
</span><del>-    // CGPattern uses lots of memory got caching when the tile size is large (&lt;rdar://problem/4691859&gt;,
-    // &lt;rdar://problem/6239505&gt;). Memory consumption depends on the transformed tile size which can get
-    // larger than the original tile if user zooms in enough.
</del><span class="cx">     const float maxPatternTilePixels = 512 * 512;
</span><ins>+#else
+    const float maxPatternTilePixels = 2048 * 2048;
+#endif
</ins><span class="cx">     FloatRect transformedTileSize = ctxt-&gt;getCTM().mapRect(FloatRect(FloatPoint(), scaledTileSize));
</span><span class="cx">     float transformedTileSizePixels = transformedTileSize.width() * transformedTileSize.height();
</span><span class="cx">     if (transformedTileSizePixels &gt; maxPatternTilePixels) {
</span><span class="cx">         float fromY = (destRect.y() - oneTileRect.y()) / scale.height();
</span><span class="cx">         float toY = oneTileRect.y();
</span><del>-        while (toY &lt; CGRectGetMaxY(destRect)) {
</del><ins>+        while (toY &lt; destRect.maxY()) {
</ins><span class="cx">             float fromX = (destRect.x() - oneTileRect.x()) / scale.width();
</span><span class="cx">             float toX = oneTileRect.x();
</span><del>-            while (toX &lt; CGRectGetMaxX(destRect)) {
-                CGRect toRect = CGRectIntersection(destRect, CGRectMake(toX, toY, oneTileRect.width(), oneTileRect.height()));
-                CGRect fromRect = CGRectMake(fromX, fromY, toRect.size.width / scale.width(), toRect.size.height / scale.height());
</del><ins>+            while (toX &lt; destRect.maxX()) {
+                FloatRect toRect(toX, toY, oneTileRect.width(), oneTileRect.height());
+                FloatRect fromRect(fromX, fromY, oneTileRect.width() / scale.width(), oneTileRect.height() / scale.height());
</ins><span class="cx">                 draw(ctxt, toRect, fromRect, styleColorSpace, op, BlendModeNormal, ImageOrientationDescription());
</span><span class="cx">                 toX += oneTileRect.width();
</span><span class="cx">                 fromX = 0;
</span><span class="lines">@@ -178,7 +183,6 @@
</span><span class="cx">         }
</span><span class="cx">         return;
</span><span class="cx">     }
</span><del>-#endif    
</del><span class="cx"> 
</span><span class="cx">     AffineTransform patternTransform = AffineTransform().scaleNonUniform(scale.width(), scale.height());
</span><span class="cx">     FloatRect tileRect(FloatPoint(), intrinsicTileSize);
</span></span></pre>
</div>
</div>

</body>
</html>