<!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>[171210] 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/171210">171210</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2014-07-17 18:56:12 -0700 (Thu, 17 Jul 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Subpixel rendering: Embedded non-compositing rotate transform paints to wrong position.
https://bugs.webkit.org/show_bug.cgi?id=135028

Reviewed by Simon Fraser.

CTM always translates to where the layer's renderer() is going to paint.
It ensures that the pixel snapped renderer() always end up painting to (0, 0) which is
required to be able to position properly on transformed context.

Source/WebCore:
Test: fast/layers/hidpi-transform-on-child-content-is-mispositioned.html

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::beginTransparencyLayers):
(WebCore::RenderLayer::clipToRect):
(WebCore::RenderLayer::paintLayerByApplyingTransform):
(WebCore::RenderLayer::paintBackgroundForFragments):
(WebCore::RenderLayer::paintForegroundForFragmentsWithPhase):
(WebCore::RenderLayer::paintOutlineForFragments):
(WebCore::RenderLayer::paintMaskForFragments):
(WebCore::RenderLayer::paintOverflowControlsForFragments):
(WebCore::RenderLayer::calculateClipRects):
* rendering/RenderLayer.h:

LayoutTests:
* fast/layers/hidpi-transform-on-child-content-is-mispositioned-expected.html: Added.
* fast/layers/hidpi-transform-on-child-content-is-mispositioned.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="#trunkSourceWebCorerenderingRenderLayercpp">trunk/Source/WebCore/rendering/RenderLayer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerh">trunk/Source/WebCore/rendering/RenderLayer.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastlayershidpitransformonchildcontentismispositionedexpectedhtml">trunk/LayoutTests/fast/layers/hidpi-transform-on-child-content-is-mispositioned-expected.html</a></li>
<li><a href="#trunkLayoutTestsfastlayershidpitransformonchildcontentismispositionedhtml">trunk/LayoutTests/fast/layers/hidpi-transform-on-child-content-is-mispositioned.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (171209 => 171210)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-07-18 01:16:40 UTC (rev 171209)
+++ trunk/LayoutTests/ChangeLog        2014-07-18 01:56:12 UTC (rev 171210)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2014-07-17  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Subpixel rendering: Embedded non-compositing rotate transform paints to wrong position.
+        https://bugs.webkit.org/show_bug.cgi?id=135028
+
+        Reviewed by Simon Fraser.
+
+        CTM always translates to where the layer's renderer() is going to paint.
+        It ensures that the pixel snapped renderer() always end up painting to (0, 0) which is
+        required to be able to position properly on transformed context.
+
+        * fast/layers/hidpi-transform-on-child-content-is-mispositioned-expected.html: Added.
+        * fast/layers/hidpi-transform-on-child-content-is-mispositioned.html: Added.
+
</ins><span class="cx"> 2014-07-17  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         fast/repaint/obscured-background-no-repaint.html is very flaky
</span></span></pre></div>
<a id="trunkLayoutTestsfastlayershidpitransformonchildcontentismispositionedexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/layers/hidpi-transform-on-child-content-is-mispositioned-expected.html (0 => 171210)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/layers/hidpi-transform-on-child-content-is-mispositioned-expected.html                                (rev 0)
+++ trunk/LayoutTests/fast/layers/hidpi-transform-on-child-content-is-mispositioned-expected.html        2014-07-18 01:56:12 UTC (rev 171210)
</span><span class="lines">@@ -0,0 +1,45 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;&lt;/title&gt;
+&lt;style&gt;
+  div {
+    position: absolute;
+    left: 0.3px;
+    top: 0.3px;
+    width: 10px;
+    height: 10px;
+  }
+  
+  .child {
+    border: 0.5px solid red;
+    -webkit-transform: rotate(180deg);
+  }
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;p id=&quot;container&quot;&gt;&lt;/p&gt;
+&lt;script&gt;
+  var container = document.getElementById(&quot;container&quot;);
+  adjustmentY = 0;
+  for (i = 0; i &lt; 30; ++i) {
+    adjustmentX = 0;
+    adjustmentY += 0.1;
+    for (j = 0; j &lt; 30; ++j) {
+      var e = document.createElement(&quot;div&quot;);
+      e.style.top = (14 * i) + j * adjustmentY + &quot;px&quot;;
+      e.style.left = (14 * j) + i * adjustmentX + &quot;px&quot;;
+
+      var c = document.createElement(&quot;div&quot;);
+      c.className = &quot;child&quot;;
+      c.style.top = adjustmentY + &quot;px&quot;;
+      c.style.left = adjustmentX + &quot;px&quot;;
+
+      e.appendChild(c);
+      container.appendChild(e);
+      adjustmentX += 0.1;
+    }
+  }
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastlayershidpitransformonchildcontentismispositionedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/layers/hidpi-transform-on-child-content-is-mispositioned.html (0 => 171210)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/layers/hidpi-transform-on-child-content-is-mispositioned.html                                (rev 0)
+++ trunk/LayoutTests/fast/layers/hidpi-transform-on-child-content-is-mispositioned.html        2014-07-18 01:56:12 UTC (rev 171210)
</span><span class="lines">@@ -0,0 +1,50 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;&lt;/title&gt;
+&lt;style&gt;
+  div {
+    position: absolute;
+    left: 0.3px;
+    top: 0.3px;
+    width: 10px;
+    height: 10px;
+  }
+  
+  .parent {
+    -webkit-transform: translateZ(0);
+  }
+
+  .child {
+    border: 0.5px solid red;
+    -webkit-transform: rotate(180deg);
+  }
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;p id=&quot;container&quot;&gt;&lt;/p&gt;
+&lt;script&gt;
+  var container = document.getElementById(&quot;container&quot;);
+  adjustmentY = 0;
+  for (i = 0; i &lt; 30; ++i) {
+    adjustmentX = 0;
+    adjustmentY += 0.1;
+    for (j = 0; j &lt; 30; ++j) {
+      var e = document.createElement(&quot;div&quot;);
+      e.className = &quot;parent&quot;;
+      e.style.top = (14 * i) + j * adjustmentY + &quot;px&quot;;
+      e.style.left = (14 * j) + i * adjustmentX + &quot;px&quot;;
+
+      var c = document.createElement(&quot;div&quot;);
+      c.className = &quot;child&quot;;
+      c.style.top = adjustmentY + &quot;px&quot;;
+      c.style.left = adjustmentX + &quot;px&quot;;
+
+      e.appendChild(c);
+      container.appendChild(e);
+      adjustmentX += 0.1;
+    }
+  }
+&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 (171209 => 171210)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-07-18 01:16:40 UTC (rev 171209)
+++ trunk/Source/WebCore/ChangeLog        2014-07-18 01:56:12 UTC (rev 171210)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2014-07-17  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Subpixel rendering: Embedded non-compositing rotate transform paints to wrong position.
+        https://bugs.webkit.org/show_bug.cgi?id=135028
+
+        Reviewed by Simon Fraser.
+
+        CTM always translates to where the layer's renderer() is going to paint.
+        It ensures that the pixel snapped renderer() always end up painting to (0, 0) which is
+        required to be able to position properly on transformed context.
+
+        Test: fast/layers/hidpi-transform-on-child-content-is-mispositioned.html
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::beginTransparencyLayers):
+        (WebCore::RenderLayer::clipToRect):
+        (WebCore::RenderLayer::paintLayerByApplyingTransform):
+        (WebCore::RenderLayer::paintBackgroundForFragments):
+        (WebCore::RenderLayer::paintForegroundForFragmentsWithPhase):
+        (WebCore::RenderLayer::paintOutlineForFragments):
+        (WebCore::RenderLayer::paintMaskForFragments):
+        (WebCore::RenderLayer::paintOverflowControlsForFragments):
+        (WebCore::RenderLayer::calculateClipRects):
+        * rendering/RenderLayer.h:
+
</ins><span class="cx"> 2014-07-17  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fixed position elements are misplaced when a WK1 view has contentInsets set
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (171209 => 171210)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-07-18 01:16:40 UTC (rev 171209)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp        2014-07-18 01:56:12 UTC (rev 171210)
</span><span class="lines">@@ -1694,7 +1694,7 @@
</span><span class="cx">         m_usedTransparency = true;
</span><span class="cx">         context-&gt;save();
</span><span class="cx">         LayoutRect adjustedClipRect = paintingExtent(*this, paintingInfo.rootLayer, dirtyRect, paintingInfo.paintBehavior);
</span><del>-        adjustedClipRect.move(paintingInfo.subPixelAccumulation);
</del><ins>+        adjustedClipRect.move(paintingInfo.subpixelAccumulation);
</ins><span class="cx">         FloatRect pixelSnappedClipRect = pixelSnappedForPainting(adjustedClipRect, renderer().document().deviceScaleFactor());
</span><span class="cx">         context-&gt;clip(pixelSnappedClipRect);
</span><span class="cx"> 
</span><span class="lines">@@ -3589,7 +3589,7 @@
</span><span class="cx">     if (clipRect.rect() != paintingInfo.paintDirtyRect || clipRect.hasRadius()) {
</span><span class="cx">         context-&gt;save();
</span><span class="cx">         LayoutRect adjustedClipRect = clipRect.rect();
</span><del>-        adjustedClipRect.move(paintingInfo.subPixelAccumulation);
</del><ins>+        adjustedClipRect.move(paintingInfo.subpixelAccumulation);
</ins><span class="cx">         context-&gt;clip(pixelSnappedForPainting(adjustedClipRect, deviceScaleFactor));
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -3602,7 +3602,7 @@
</span><span class="cx">     for (RenderLayer* layer = rule == IncludeSelfForBorderRadius ? this : parent(); layer; layer = layer-&gt;parent()) {
</span><span class="cx">         if (layer-&gt;renderer().hasOverflowClip() &amp;&amp; layer-&gt;renderer().style().hasBorderRadius() &amp;&amp; inContainingBlockChain(this, layer)) {
</span><span class="cx">             LayoutRect adjustedClipRect = LayoutRect(toLayoutPoint(layer-&gt;offsetFromAncestor(paintingInfo.rootLayer)), layer-&gt;size());
</span><del>-            adjustedClipRect.move(paintingInfo.subPixelAccumulation);
</del><ins>+            adjustedClipRect.move(paintingInfo.subpixelAccumulation);
</ins><span class="cx">             context-&gt;clipRoundedRect(layer-&gt;renderer().style().getRoundedInnerBorderFor(adjustedClipRect).pixelSnappedRoundedRectForPainting(deviceScaleFactor));
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -4149,21 +4149,21 @@
</span><span class="cx">     LayoutSize offsetFromParent = offsetFromAncestor(paintingInfo.rootLayer);
</span><span class="cx">     offsetFromParent += translationOffset;
</span><span class="cx">     TransformationMatrix transform(renderableTransform(paintingInfo.paintBehavior));
</span><del>-    FloatSize devicePixelSnappedOffsetFromParent = toFloatSize(roundedForPainting(toLayoutPoint(offsetFromParent), deviceScaleFactor));
</del><ins>+    // Add the subpixel accumulation to the current layer's offset so that we can always snap the translateRight value to where the renderer() is supposed to be painting.
+    LayoutSize offsetForThisLayer = offsetFromParent + paintingInfo.subpixelAccumulation;
+    FloatSize devicePixelSnappedOffsetForThisLayer = toFloatSize(roundedForPainting(toLayoutPoint(offsetForThisLayer), deviceScaleFactor));
+    // We handle accumulated subpixels through nested layers here. Since the context gets translated to device pixels,
+    // all we need to do is add the delta to the accumulated pixels coming from ancestor layers.
</ins><span class="cx">     // Translate the graphics context to the snapping position to avoid off-device-pixel positing.
</span><del>-    transform.translateRight(devicePixelSnappedOffsetFromParent.width(), devicePixelSnappedOffsetFromParent.height());
-    // We handle accumulated subpixels through nested layers here. Since the context gets translated to device pixels,
-    // all we need to do is add the delta to the accumulated pixels coming from ancestor layers. With deep nesting of subpixel positioned
-    // boxes, this could grow to a relatively large number, but the translateRight() balances it.
-    FloatSize delta = offsetFromParent - devicePixelSnappedOffsetFromParent;
-    LayoutSize adjustedSubPixelAccumulation = paintingInfo.subPixelAccumulation + LayoutSize(delta);
</del><ins>+    transform.translateRight(devicePixelSnappedOffsetForThisLayer.width(), devicePixelSnappedOffsetForThisLayer.height());
</ins><span class="cx">     // Apply the transform.
</span><span class="cx">     GraphicsContextStateSaver stateSaver(*context);
</span><span class="cx">     context-&gt;concatCTM(transform.toAffineTransform());
</span><span class="cx"> 
</span><span class="cx">     // Now do a paint with the root layer shifted to be us.
</span><del>-    LayerPaintingInfo transformedPaintingInfo(this, LayoutRect(enclosingRectForPainting(transform.inverse().mapRect(paintingInfo.paintDirtyRect), deviceScaleFactor)), paintingInfo.paintBehavior,
-        adjustedSubPixelAccumulation, paintingInfo.subtreePaintRoot, paintingInfo.overlapTestRequests);
</del><ins>+    LayoutSize adjustedSubpixelAccumulation = offsetForThisLayer - LayoutSize(devicePixelSnappedOffsetForThisLayer);
+    LayerPaintingInfo transformedPaintingInfo(this, LayoutRect(enclosingRectForPainting(transform.inverse().mapRect(paintingInfo.paintDirtyRect), deviceScaleFactor)),
+        paintingInfo.paintBehavior, adjustedSubpixelAccumulation, paintingInfo.subtreePaintRoot, paintingInfo.overlapTestRequests);
</ins><span class="cx">     paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -4419,7 +4419,7 @@
</span><span class="cx">         // Paint the background.
</span><span class="cx">         // FIXME: Eventually we will collect the region from the fragment itself instead of just from the paint info.
</span><span class="cx">         PaintInfo paintInfo(context, fragment.backgroundRect.rect(), PaintPhaseBlockBackground, paintBehavior, subtreePaintRootForRenderer, nullptr, nullptr, &amp;localPaintingInfo.rootLayer-&gt;renderer());
</span><del>-        renderer().paint(paintInfo, toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subPixelAccumulation));
</del><ins>+        renderer().paint(paintInfo, toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subpixelAccumulation));
</ins><span class="cx"> 
</span><span class="cx">         if (localPaintingInfo.clipToDirtyRect)
</span><span class="cx">             restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.backgroundRect);
</span><span class="lines">@@ -4494,7 +4494,7 @@
</span><span class="cx">         PaintInfo paintInfo(context, fragment.foregroundRect.rect(), phase, paintBehavior, subtreePaintRootForRenderer, nullptr, nullptr, &amp;localPaintingInfo.rootLayer-&gt;renderer());
</span><span class="cx">         if (phase == PaintPhaseForeground)
</span><span class="cx">             paintInfo.overlapTestRequests = localPaintingInfo.overlapTestRequests;
</span><del>-        renderer().paint(paintInfo, toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subPixelAccumulation));
</del><ins>+        renderer().paint(paintInfo, toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subpixelAccumulation));
</ins><span class="cx">         
</span><span class="cx">         if (shouldClip)
</span><span class="cx">             restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.foregroundRect);
</span><span class="lines">@@ -4512,7 +4512,7 @@
</span><span class="cx">         // Paint our own outline
</span><span class="cx">         PaintInfo paintInfo(context, fragment.outlineRect.rect(), PaintPhaseSelfOutline, paintBehavior, subtreePaintRootForRenderer, nullptr, nullptr, &amp;localPaintingInfo.rootLayer-&gt;renderer());
</span><span class="cx">         clipToRect(localPaintingInfo, context, fragment.outlineRect, DoNotIncludeSelfForBorderRadius);
</span><del>-        renderer().paint(paintInfo, toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subPixelAccumulation));
</del><ins>+        renderer().paint(paintInfo, toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subpixelAccumulation));
</ins><span class="cx">         restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.outlineRect);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -4531,7 +4531,7 @@
</span><span class="cx">         // Paint the mask.
</span><span class="cx">         // FIXME: Eventually we will collect the region from the fragment itself instead of just from the paint info.
</span><span class="cx">         PaintInfo paintInfo(context, fragment.backgroundRect.rect(), PaintPhaseMask, PaintBehaviorNormal, subtreePaintRootForRenderer, nullptr, nullptr, &amp;localPaintingInfo.rootLayer-&gt;renderer());
</span><del>-        renderer().paint(paintInfo, toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subPixelAccumulation));
</del><ins>+        renderer().paint(paintInfo, toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subpixelAccumulation));
</ins><span class="cx">         
</span><span class="cx">         if (localPaintingInfo.clipToDirtyRect)
</span><span class="cx">             restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.backgroundRect);
</span><span class="lines">@@ -4543,7 +4543,7 @@
</span><span class="cx">     for (size_t i = 0; i &lt; layerFragments.size(); ++i) {
</span><span class="cx">         const LayerFragment&amp; fragment = layerFragments.at(i);
</span><span class="cx">         clipToRect(localPaintingInfo, context, fragment.backgroundRect);
</span><del>-        paintOverflowControls(context, roundedIntPoint(toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subPixelAccumulation)),
</del><ins>+        paintOverflowControls(context, roundedIntPoint(toLayoutPoint(fragment.layerBounds.location() - renderBoxLocation() + localPaintingInfo.subpixelAccumulation)),
</ins><span class="cx">             pixelSnappedIntRect(fragment.backgroundRect.rect()), true);
</span><span class="cx">         restoreClip(context, localPaintingInfo.paintDirtyRect, fragment.backgroundRect);
</span><span class="cx">     }
</span><span class="lines">@@ -6731,7 +6731,8 @@
</span><span class="cx">         if (shouldClip)
</span><span class="cx">             clipToRect(paintingInfo, context, clipRect);
</span><span class="cx"> 
</span><del>-        flowThreadLayer-&gt;paintNamedFlowThreadInsideRegion(context, flowFragment, paintingInfo.paintDirtyRect, fragment.layerBounds.location() + paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior, paintFlags);
</del><ins>+        flowThreadLayer-&gt;paintNamedFlowThreadInsideRegion(context, flowFragment, paintingInfo.paintDirtyRect, fragment.layerBounds.location() + paintingInfo.subpixelAccumulation,
+            paintingInfo.paintBehavior, paintFlags);
</ins><span class="cx"> 
</span><span class="cx">         if (shouldClip)
</span><span class="cx">             restoreClip(context, paintingInfo.paintDirtyRect, clipRect);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.h (171209 => 171210)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.h        2014-07-18 01:16:40 UTC (rev 171209)
+++ trunk/Source/WebCore/rendering/RenderLayer.h        2014-07-18 01:56:12 UTC (rev 171210)
</span><span class="lines">@@ -887,11 +887,11 @@
</span><span class="cx">     enum CollectLayersBehavior { StopAtStackingContexts, StopAtStackingContainers };
</span><span class="cx"> 
</span><span class="cx">     struct LayerPaintingInfo {
</span><del>-        LayerPaintingInfo(RenderLayer* inRootLayer, const LayoutRect&amp; inDirtyRect, PaintBehavior inPaintBehavior, const LayoutSize&amp; inSubPixelAccumulation, RenderObject* inSubtreePaintRoot = nullptr, OverlapTestRequestMap* inOverlapTestRequests = nullptr)
</del><ins>+        LayerPaintingInfo(RenderLayer* inRootLayer, const LayoutRect&amp; inDirtyRect, PaintBehavior inPaintBehavior, const LayoutSize&amp; inSubpixelAccumulation, RenderObject* inSubtreePaintRoot = nullptr, OverlapTestRequestMap* inOverlapTestRequests = nullptr)
</ins><span class="cx">             : rootLayer(inRootLayer)
</span><span class="cx">             , subtreePaintRoot(inSubtreePaintRoot)
</span><span class="cx">             , paintDirtyRect(inDirtyRect)
</span><del>-            , subPixelAccumulation(inSubPixelAccumulation)
</del><ins>+            , subpixelAccumulation(inSubpixelAccumulation)
</ins><span class="cx">             , overlapTestRequests(inOverlapTestRequests)
</span><span class="cx">             , paintBehavior(inPaintBehavior)
</span><span class="cx">             , clipToDirtyRect(true)
</span><span class="lines">@@ -899,7 +899,7 @@
</span><span class="cx">         RenderLayer* rootLayer;
</span><span class="cx">         RenderObject* subtreePaintRoot; // only paint descendants of this object
</span><span class="cx">         LayoutRect paintDirtyRect; // relative to rootLayer;
</span><del>-        LayoutSize subPixelAccumulation;
</del><ins>+        LayoutSize subpixelAccumulation;
</ins><span class="cx">         OverlapTestRequestMap* overlapTestRequests; // May be null.
</span><span class="cx">         PaintBehavior paintBehavior;
</span><span class="cx">         bool clipToDirtyRect;
</span></span></pre>
</div>
</div>

</body>
</html>