<!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>[184395] 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/184395">184395</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2015-05-15 10:39:05 -0700 (Fri, 15 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>White edge on animating panel on http://rokkosunnyvale.com
https://bugs.webkit.org/show_bug.cgi?id=144986
rdar://problem/20907683

Reviewed by Simon Fraser.

Background image geometry calculation needs to be based on the final painting size of the container
in order to accurately compute tile sizes, repeating positions etc.
The container's size is pixelsnapped at painting using absolute coordinates. This patch
ensures that we snap to the same size while computing background geometry.

Source/WebCore:

Test: fast/images/background-image-size-changes-fractional-position.html

* rendering/InlineFlowBox.cpp:
(WebCore::InlineFlowBox::paintBoxDecorations):
* rendering/RenderBox.cpp:
(WebCore::RenderBox::paintBoxDecorations):
(WebCore::RenderBox::paintBackground):
(WebCore::RenderBox::getBackgroundPaintedExtent):
(WebCore::RenderBox::computeBackgroundIsKnownToBeObscured):
(WebCore::RenderBox::maskClipRect):
(WebCore::RenderBox::repaintLayerRectsForImage): unable to get absolute coords.
* rendering/RenderBox.h:
* rendering/RenderBoxModelObject.cpp:
(WebCore::RenderBoxModelObject::paintFillLayerExtended):
(WebCore::RenderBoxModelObject::calculateBackgroundImageGeometry):
(WebCore::RenderBoxModelObject::getGeometryForBackgroundImage):
(WebCore::RenderBoxModelObject::boxShadowShouldBeAppliedToBackground):
* rendering/RenderBoxModelObject.h:
* rendering/RenderFieldset.cpp:
(WebCore::RenderFieldset::paintBoxDecorations):
* rendering/RenderImage.cpp:
(WebCore::RenderImage::boxShadowShouldBeAppliedToBackground):
(WebCore::RenderImage::computeBackgroundIsKnownToBeObscured):
* rendering/RenderImage.h:
* rendering/RenderLayer.cpp: unable to get absolute coords.
(WebCore::RenderLayer::calculateClipRects):
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateDirectlyCompositedBackgroundImage): currently not used.
* rendering/RenderObject.h:
(WebCore::RenderObject::computeBackgroundIsKnownToBeObscured):
(WebCore::RenderObject::backgroundIsKnownToBeObscured):
* rendering/RenderTable.cpp:
(WebCore::RenderTable::paintBoxDecorations):
* rendering/RenderTableCell.cpp:
(WebCore::RenderTableCell::boxShadowShouldBeAppliedToBackground):
* rendering/RenderTableCell.h:

LayoutTests:

* fast/backgrounds/hidpi-bitmap-background-repeat-on-subpixel-position-expected.html: progression.
* fast/images/background-image-size-changes-fractional-position-expected.html: Added.
* fast/images/background-image-size-changes-fractional-position.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsfastbackgroundshidpibitmapbackgroundrepeatonsubpixelpositionexpectedhtml">trunk/LayoutTests/fast/backgrounds/hidpi-bitmap-background-repeat-on-subpixel-position-expected.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingInlineFlowBoxcpp">trunk/Source/WebCore/rendering/InlineFlowBox.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxcpp">trunk/Source/WebCore/rendering/RenderBox.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxh">trunk/Source/WebCore/rendering/RenderBox.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxModelObjectcpp">trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBoxModelObjecth">trunk/Source/WebCore/rendering/RenderBoxModelObject.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderFieldsetcpp">trunk/Source/WebCore/rendering/RenderFieldset.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderImagecpp">trunk/Source/WebCore/rendering/RenderImage.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderImageh">trunk/Source/WebCore/rendering/RenderImage.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayercpp">trunk/Source/WebCore/rendering/RenderLayer.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerBackingcpp">trunk/Source/WebCore/rendering/RenderLayerBacking.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderObjecth">trunk/Source/WebCore/rendering/RenderObject.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderTablecpp">trunk/Source/WebCore/rendering/RenderTable.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderTableCellcpp">trunk/Source/WebCore/rendering/RenderTableCell.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderTableCellh">trunk/Source/WebCore/rendering/RenderTableCell.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastimagesbackgroundimagesizechangesfractionalpositionexpectedhtml">trunk/LayoutTests/fast/images/background-image-size-changes-fractional-position-expected.html</a></li>
<li><a href="#trunkLayoutTestsfastimagesbackgroundimagesizechangesfractionalpositionhtml">trunk/LayoutTests/fast/images/background-image-size-changes-fractional-position.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/LayoutTests/ChangeLog        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2015-05-15  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        White edge on animating panel on http://rokkosunnyvale.com
+        https://bugs.webkit.org/show_bug.cgi?id=144986
+        rdar://problem/20907683
+
+        Reviewed by Simon Fraser.
+
+        Background image geometry calculation needs to be based on the final painting size of the container
+        in order to accurately compute tile sizes, repeating positions etc.
+        The container's size is pixelsnapped at painting using absolute coordinates. This patch
+        ensures that we snap to the same size while computing background geometry.
+
+        * fast/backgrounds/hidpi-bitmap-background-repeat-on-subpixel-position-expected.html: progression.
+        * fast/images/background-image-size-changes-fractional-position-expected.html: Added.
+        * fast/images/background-image-size-changes-fractional-position.html: Added.
+
</ins><span class="cx"> 2015-05-15  Marcos Chavarría Teijeiro  &lt;mchavarria@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Gardening 15th May.
</span></span></pre></div>
<a id="trunkLayoutTestsfastbackgroundshidpibitmapbackgroundrepeatonsubpixelpositionexpectedhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/fast/backgrounds/hidpi-bitmap-background-repeat-on-subpixel-position-expected.html (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/backgrounds/hidpi-bitmap-background-repeat-on-subpixel-position-expected.html        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/LayoutTests/fast/backgrounds/hidpi-bitmap-background-repeat-on-subpixel-position-expected.html        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -51,14 +51,11 @@
</span><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;div class=thin style=&quot;left: 151px; top: 25px; width: 255px;&quot;&gt;&lt;/div&gt;
</span><span class="cx"> &lt;div class=thick style=&quot;left: 406px; top: 25px; width: 105px;&quot;&gt;&lt;/div&gt;
</span><del>-&lt;div class=thin style=&quot;left: 151px; top: 0px; height: 50px;&quot;&gt;&lt;/div&gt;
-&lt;div class=thin style=&quot;left: 176.5px; top: 0px; height: 50px;&quot;&gt;&lt;/div&gt;
</del><span class="cx"> &lt;div class=thin style=&quot;left: 226.5px; top: 0px; height: 50px;&quot;&gt;&lt;/div&gt;
</span><span class="cx"> &lt;div class=thin style=&quot;left: 277.5px; top: 0px; height: 50px;&quot;&gt;&lt;/div&gt;
</span><span class="cx"> &lt;div class=thin style=&quot;left: 328.5px; top: 0px; height: 50px;&quot;&gt;&lt;/div&gt;
</span><span class="cx"> &lt;div class=thin style=&quot;left: 380px; top: 0px; height: 50px;&quot;&gt;&lt;/div&gt;
</span><del>-&lt;div class=thick style=&quot;left: 406px; top: 0px; height: 50px;&quot;&gt;&lt;/div&gt;
-&lt;div class=thick style=&quot;left: 432px; top: 0px; height: 50px;&quot;&gt;&lt;/div&gt;
</del><ins>+&lt;div class=thin style=&quot;left: 431.5px; top: 0px; height: 50px;&quot;&gt;&lt;/div&gt;
</ins><span class="cx"> &lt;div class=thick style=&quot;left: 483px; top: 0px; height: 50px;&quot;&gt;&lt;/div&gt;
</span><span class="cx"> &lt;/body&gt;
</span><span class="cx"> &lt;/html&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsfastimagesbackgroundimagesizechangesfractionalpositionexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/images/background-image-size-changes-fractional-position-expected.html (0 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/images/background-image-size-changes-fractional-position-expected.html                                (rev 0)
+++ trunk/LayoutTests/fast/images/background-image-size-changes-fractional-position-expected.html        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -0,0 +1,24 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that background image geometry is computed properly when size changes due to subpixel positioning.&lt;/title&gt;
+&lt;style&gt;
+        body {
+                background-color: green;
+        }
+
+        div {
+                position: absolute;
+                top: 0px;
+                left: 0px;
+                width: 667px;
+                height: 100px;
+                background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApoAAAAGCAYAAABjNz7uAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAI1JREFUeNrs1kEKwjAQBdDEbS7n/U8hYigiEgdX4i5towbfg0+7SMNPFmVyrbWlTjnntIc1+3zim9HrR/iFDjN2m7mrs/JtrTXn1XXafr0dRq/fci973WfvPqWUYzxOkXPkEqmRJXKN3CL3g18lAAAr5Jekt/cngyYAAEMYNAEAMGgCAGDQBADgzz0EGADSDSoT1JeLJQAAAABJRU5ErkJggg==);
+                background-position: 100% 0%;
+        }
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+        &lt;div&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfastimagesbackgroundimagesizechangesfractionalpositionhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/images/background-image-size-changes-fractional-position.html (0 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/images/background-image-size-changes-fractional-position.html                                (rev 0)
+++ trunk/LayoutTests/fast/images/background-image-size-changes-fractional-position.html        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -0,0 +1,24 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that background image geometry is computed properly when size changes due to subpixel positioning.&lt;/title&gt;
+&lt;style&gt;
+        body {
+                background-color: green;
+        }
+
+        div {
+                position: absolute;
+                top: 0px;
+                left: 0.4px;
+                width: 666.2px;
+                height: 100px;
+                background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAApoAAAAGCAYAAABjNz7uAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAI1JREFUeNrs1kEKwjAQBdDEbS7n/U8hYigiEgdX4i5towbfg0+7SMNPFmVyrbWlTjnntIc1+3zim9HrR/iFDjN2m7mrs/JtrTXn1XXafr0dRq/fci973WfvPqWUYzxOkXPkEqmRJXKN3CL3g18lAAAr5Jekt/cngyYAAEMYNAEAMGgCAGDQBADgzz0EGADSDSoT1JeLJQAAAABJRU5ErkJggg==);
+                background-position: 100% 0%;
+        }
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+        &lt;div&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/ChangeLog        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -1,3 +1,53 @@
</span><ins>+2015-05-15  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        White edge on animating panel on http://rokkosunnyvale.com
+        https://bugs.webkit.org/show_bug.cgi?id=144986
+        rdar://problem/20907683
+
+        Reviewed by Simon Fraser.
+
+        Background image geometry calculation needs to be based on the final painting size of the container
+        in order to accurately compute tile sizes, repeating positions etc.
+        The container's size is pixelsnapped at painting using absolute coordinates. This patch
+        ensures that we snap to the same size while computing background geometry.
+
+        Test: fast/images/background-image-size-changes-fractional-position.html
+
+        * rendering/InlineFlowBox.cpp:
+        (WebCore::InlineFlowBox::paintBoxDecorations):
+        * rendering/RenderBox.cpp:
+        (WebCore::RenderBox::paintBoxDecorations):
+        (WebCore::RenderBox::paintBackground):
+        (WebCore::RenderBox::getBackgroundPaintedExtent):
+        (WebCore::RenderBox::computeBackgroundIsKnownToBeObscured):
+        (WebCore::RenderBox::maskClipRect):
+        (WebCore::RenderBox::repaintLayerRectsForImage): unable to get absolute coords.
+        * rendering/RenderBox.h:
+        * rendering/RenderBoxModelObject.cpp:
+        (WebCore::RenderBoxModelObject::paintFillLayerExtended):
+        (WebCore::RenderBoxModelObject::calculateBackgroundImageGeometry):
+        (WebCore::RenderBoxModelObject::getGeometryForBackgroundImage):
+        (WebCore::RenderBoxModelObject::boxShadowShouldBeAppliedToBackground):
+        * rendering/RenderBoxModelObject.h:
+        * rendering/RenderFieldset.cpp:
+        (WebCore::RenderFieldset::paintBoxDecorations):
+        * rendering/RenderImage.cpp:
+        (WebCore::RenderImage::boxShadowShouldBeAppliedToBackground):
+        (WebCore::RenderImage::computeBackgroundIsKnownToBeObscured):
+        * rendering/RenderImage.h:
+        * rendering/RenderLayer.cpp: unable to get absolute coords.
+        (WebCore::RenderLayer::calculateClipRects):
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::updateDirectlyCompositedBackgroundImage): currently not used.
+        * rendering/RenderObject.h:
+        (WebCore::RenderObject::computeBackgroundIsKnownToBeObscured):
+        (WebCore::RenderObject::backgroundIsKnownToBeObscured):
+        * rendering/RenderTable.cpp:
+        (WebCore::RenderTable::paintBoxDecorations):
+        * rendering/RenderTableCell.cpp:
+        (WebCore::RenderTableCell::boxShadowShouldBeAppliedToBackground):
+        * rendering/RenderTableCell.h:
+
</ins><span class="cx"> 2015-05-15  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Crash in RenderFlowThread::popFlowThreadLayoutState() due to mismatched push/pop count
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingInlineFlowBoxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/InlineFlowBox.cpp (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/InlineFlowBox.cpp        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/InlineFlowBox.cpp        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -1340,7 +1340,7 @@
</span><span class="cx">     GraphicsContext* context = paintInfo.context;
</span><span class="cx">     LayoutRect paintRect = LayoutRect(adjustedPaintoffset, frameRect.size());
</span><span class="cx">     // Shadow comes first and is behind the background and border.
</span><del>-    if (!renderer().boxShadowShouldBeAppliedToBackground(BackgroundBleedNone, this))
</del><ins>+    if (!renderer().boxShadowShouldBeAppliedToBackground(adjustedPaintoffset, BackgroundBleedNone, this))
</ins><span class="cx">         paintBoxShadow(paintInfo, lineStyle, Normal, paintRect);
</span><span class="cx"> 
</span><span class="cx">     Color c = lineStyle.visitedDependentColor(CSSPropertyBackgroundColor);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBox.cpp (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBox.cpp        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderBox.cpp        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -1284,7 +1284,7 @@
</span><span class="cx"> 
</span><span class="cx">     // FIXME: Should eventually give the theme control over whether the box shadow should paint, since controls could have
</span><span class="cx">     // custom shadows of their own.
</span><del>-    if (!boxShadowShouldBeAppliedToBackground(bleedAvoidance))
</del><ins>+    if (!boxShadowShouldBeAppliedToBackground(paintRect.location(), bleedAvoidance))
</ins><span class="cx">         paintBoxShadow(paintInfo, paintRect, style(), Normal);
</span><span class="cx"> 
</span><span class="cx">     GraphicsContextStateSaver stateSaver(*paintInfo.context, false);
</span><span class="lines">@@ -1341,12 +1341,12 @@
</span><span class="cx">     }
</span><span class="cx">     if (isBody() &amp;&amp; skipBodyBackground(this))
</span><span class="cx">         return;
</span><del>-    if (backgroundIsKnownToBeObscured() &amp;&amp; !boxShadowShouldBeAppliedToBackground(bleedAvoidance))
</del><ins>+    if (backgroundIsKnownToBeObscured(paintRect.location()) &amp;&amp; !boxShadowShouldBeAppliedToBackground(paintRect.location(), bleedAvoidance))
</ins><span class="cx">         return;
</span><span class="cx">     paintFillLayers(paintInfo, style().visitedDependentColor(CSSPropertyBackgroundColor), style().backgroundLayers(), paintRect, bleedAvoidance);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool RenderBox::getBackgroundPaintedExtent(LayoutRect&amp; paintedExtent) const
</del><ins>+bool RenderBox::getBackgroundPaintedExtent(const LayoutPoint&amp; paintOffset, LayoutRect&amp; paintedExtent) const
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(hasBackground());
</span><span class="cx">     LayoutRect backgroundRect = snappedIntRect(borderBoxRect());
</span><span class="lines">@@ -1362,7 +1362,7 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    BackgroundImageGeometry geometry = calculateBackgroundImageGeometry(nullptr, *style().backgroundLayers(), backgroundRect);
</del><ins>+    BackgroundImageGeometry geometry = calculateBackgroundImageGeometry(nullptr, *style().backgroundLayers(), paintOffset, backgroundRect);
</ins><span class="cx">     paintedExtent = geometry.destRect();
</span><span class="cx">     return !geometry.hasNonLocalGeometry();
</span><span class="cx"> }
</span><span class="lines">@@ -1466,7 +1466,7 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool RenderBox::computeBackgroundIsKnownToBeObscured()
</del><ins>+bool RenderBox::computeBackgroundIsKnownToBeObscured(const LayoutPoint&amp; paintOffset)
</ins><span class="cx"> {
</span><span class="cx">     // Test to see if the children trivially obscure the background.
</span><span class="cx">     // FIXME: This test can be much more comprehensive.
</span><span class="lines">@@ -1477,7 +1477,7 @@
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     LayoutRect backgroundRect;
</span><del>-    if (!getBackgroundPaintedExtent(backgroundRect))
</del><ins>+    if (!getBackgroundPaintedExtent(paintOffset, backgroundRect))
</ins><span class="cx">         return false;
</span><span class="cx">     return foregroundIsKnownToBeOpaqueInRect(backgroundRect, backgroundObscurationTestMaxDepth);
</span><span class="cx"> }
</span><span class="lines">@@ -1559,7 +1559,7 @@
</span><span class="cx">         paintInfo.context-&gt;endTransparencyLayer();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-LayoutRect RenderBox::maskClipRect()
</del><ins>+LayoutRect RenderBox::maskClipRect(const LayoutPoint&amp; paintOffset)
</ins><span class="cx"> {
</span><span class="cx">     const NinePieceImage&amp; maskBoxImage = style().maskBoxImage();
</span><span class="cx">     if (maskBoxImage.image()) {
</span><span class="lines">@@ -1575,7 +1575,7 @@
</span><span class="cx">     for (const FillLayer* maskLayer = style().maskLayers(); maskLayer; maskLayer = maskLayer-&gt;next()) {
</span><span class="cx">         if (maskLayer-&gt;maskImage()) {
</span><span class="cx">             // Masks should never have fixed attachment, so it's OK for paintContainer to be null.
</span><del>-            BackgroundImageGeometry geometry = calculateBackgroundImageGeometry(nullptr, *maskLayer, borderBox);
</del><ins>+            BackgroundImageGeometry geometry = calculateBackgroundImageGeometry(nullptr, *maskLayer, paintOffset, borderBox);
</ins><span class="cx">             result.unite(geometry.destRect());
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -1700,8 +1700,8 @@
</span><span class="cx">                     rendererRect = borderBoxRect();
</span><span class="cx">                 }
</span><span class="cx">             }
</span><del>-
-            BackgroundImageGeometry geometry = layerRenderer-&gt;calculateBackgroundImageGeometry(nullptr, *curLayer, rendererRect);
</del><ins>+            // FIXME: Figure out how to pass absolute position to calculateBackgroundImageGeometry (for pixel snapping)
+            BackgroundImageGeometry geometry = layerRenderer-&gt;calculateBackgroundImageGeometry(nullptr, *curLayer, LayoutPoint(), rendererRect);
</ins><span class="cx">             if (geometry.hasNonLocalGeometry()) {
</span><span class="cx">                 // Rather than incur the costs of computing the paintContainer for renderers with fixed backgrounds
</span><span class="cx">                 // in order to get the right destRect, just repaint the entire renderer.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBox.h (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBox.h        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderBox.h        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -514,7 +514,7 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    LayoutRect maskClipRect();
</del><ins>+    LayoutRect maskClipRect(const LayoutPoint&amp; paintOffset);
</ins><span class="cx"> 
</span><span class="cx">     virtual VisiblePosition positionForPoint(const LayoutPoint&amp;, const RenderRegion*) override;
</span><span class="cx"> 
</span><span class="lines">@@ -638,9 +638,9 @@
</span><span class="cx">     bool createsNewFormattingContext() const;
</span><span class="cx"> 
</span><span class="cx">     // Returns false if it could not cheaply compute the extent (e.g. fixed background), in which case the returned rect may be incorrect.
</span><del>-    bool getBackgroundPaintedExtent(LayoutRect&amp;) const;
</del><ins>+    bool getBackgroundPaintedExtent(const LayoutPoint&amp; paintOffset, LayoutRect&amp;) const;
</ins><span class="cx">     virtual bool foregroundIsKnownToBeOpaqueInRect(const LayoutRect&amp; localRect, unsigned maxDepthToTest) const;
</span><del>-    virtual bool computeBackgroundIsKnownToBeObscured() override;
</del><ins>+    virtual bool computeBackgroundIsKnownToBeObscured(const LayoutPoint&amp; paintOffset) override;
</ins><span class="cx"> 
</span><span class="cx">     void paintBackground(const PaintInfo&amp;, const LayoutRect&amp;, BackgroundBleedAvoidance = BackgroundBleedNone);
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxModelObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -688,7 +688,7 @@
</span><span class="cx">         if (!colorVisible)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        bool boxShadowShouldBeAppliedToBackground = this-&gt;boxShadowShouldBeAppliedToBackground(bleedAvoidance, box);
</del><ins>+        bool boxShadowShouldBeAppliedToBackground = this-&gt;boxShadowShouldBeAppliedToBackground(rect.location(), bleedAvoidance, box);
</ins><span class="cx">         GraphicsContextStateSaver shadowStateSaver(*context, boxShadowShouldBeAppliedToBackground);
</span><span class="cx">         if (boxShadowShouldBeAppliedToBackground)
</span><span class="cx">             applyBoxShadowForBackground(context, &amp;style());
</span><span class="lines">@@ -811,7 +811,7 @@
</span><span class="cx">     // by verifying whether the background image covers the entire layout rect.
</span><span class="cx">     if (!bgLayer-&gt;next()) {
</span><span class="cx">         LayoutRect backgroundRect(scrolledPaintRect);
</span><del>-        bool boxShadowShouldBeAppliedToBackground = this-&gt;boxShadowShouldBeAppliedToBackground(bleedAvoidance, box);
</del><ins>+        bool boxShadowShouldBeAppliedToBackground = this-&gt;boxShadowShouldBeAppliedToBackground(rect.location(), bleedAvoidance, box);
</ins><span class="cx">         if (boxShadowShouldBeAppliedToBackground || !shouldPaintBackgroundImage || !bgLayer-&gt;hasOpaqueImage(*this) || !bgLayer-&gt;hasRepeatXY()) {
</span><span class="cx">             if (!boxShadowShouldBeAppliedToBackground)
</span><span class="cx">                 backgroundRect.intersect(paintInfo.rect);
</span><span class="lines">@@ -845,7 +845,7 @@
</span><span class="cx"> 
</span><span class="cx">     // no progressive loading of the background image
</span><span class="cx">     if (!baseBgColorOnly &amp;&amp; (shouldPaintBackgroundImage || bgLayer-&gt;hasMaskImage())) {
</span><del>-        BackgroundImageGeometry geometry = calculateBackgroundImageGeometry(paintInfo.paintContainer, *bgLayer, scrolledPaintRect, backgroundObject);
</del><ins>+        BackgroundImageGeometry geometry = calculateBackgroundImageGeometry(paintInfo.paintContainer, *bgLayer, rect.location(), scrolledPaintRect, backgroundObject);
</ins><span class="cx">         geometry.clip(LayoutRect(pixelSnappedRect));
</span><span class="cx"> 
</span><span class="cx">         if (!geometry.destRect().isEmpty()) {
</span><span class="lines">@@ -1069,8 +1069,8 @@
</span><span class="cx">     return space;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-BackgroundImageGeometry RenderBoxModelObject::calculateBackgroundImageGeometry(const RenderLayerModelObject* paintContainer, const FillLayer&amp; fillLayer, const LayoutRect&amp; paintRect,
-    RenderElement* backgroundObject) const
</del><ins>+BackgroundImageGeometry RenderBoxModelObject::calculateBackgroundImageGeometry(const RenderLayerModelObject* paintContainer, const FillLayer&amp; fillLayer, const LayoutPoint&amp; paintOffset,
+    const LayoutRect&amp; borderBoxRect, RenderElement* backgroundObject) const
</ins><span class="cx"> {
</span><span class="cx">     LayoutUnit left = 0;
</span><span class="cx">     LayoutUnit top = 0;
</span><span class="lines">@@ -1078,8 +1078,9 @@
</span><span class="cx">     // Determine the background positioning area and set destination rect to the background painting area.
</span><span class="cx">     // Destination rect will be adjusted later if the background is non-repeating.
</span><span class="cx">     // FIXME: transforms spec says that fixed backgrounds behave like scroll inside transforms. https://bugs.webkit.org/show_bug.cgi?id=15679
</span><del>-    LayoutRect destinationRect(paintRect);
</del><ins>+    LayoutRect destinationRect(borderBoxRect);
</ins><span class="cx">     bool fixedAttachment = fillLayer.attachment() == FixedBackgroundAttachment;
</span><ins>+    float deviceScaleFactor = document().deviceScaleFactor();
</ins><span class="cx">     if (!fixedAttachment) {
</span><span class="cx">         LayoutUnit right = 0;
</span><span class="cx">         LayoutUnit bottom = 0;
</span><span class="lines">@@ -1102,13 +1103,16 @@
</span><span class="cx">         // the background positioning area.
</span><span class="cx">         if (isRoot()) {
</span><span class="cx">             positioningAreaSize = downcast&lt;RenderBox&gt;(*this).size() - LayoutSize(left + right, top + bottom);
</span><ins>+            positioningAreaSize = LayoutSize(snapSizeToDevicePixel(positioningAreaSize, LayoutPoint(), deviceScaleFactor));
</ins><span class="cx">             if (view().frameView().hasExtendedBackgroundRectForPainting()) {
</span><span class="cx">                 LayoutRect extendedBackgroundRect = view().frameView().extendedBackgroundRectForPainting();
</span><span class="cx">                 left += (marginLeft() - extendedBackgroundRect.x());
</span><span class="cx">                 top += (marginTop() - extendedBackgroundRect.y());
</span><span class="cx">             }
</span><del>-        } else
-            positioningAreaSize = paintRect.size() - LayoutSize(left + right, top + bottom);
</del><ins>+        } else {
+            positioningAreaSize = borderBoxRect.size() - LayoutSize(left + right, top + bottom);
+            positioningAreaSize = LayoutSize(snapRectToDevicePixels(LayoutRect(paintOffset, positioningAreaSize), deviceScaleFactor).size());
+        }
</ins><span class="cx">     } else {
</span><span class="cx">         LayoutRect viewportRect;
</span><span class="cx">         float topContentInset = 0;
</span><span class="lines">@@ -1133,6 +1137,7 @@
</span><span class="cx">         destinationRect = viewportRect;
</span><span class="cx">         positioningAreaSize = destinationRect.size();
</span><span class="cx">         positioningAreaSize.setHeight(positioningAreaSize.height() - topContentInset);
</span><ins>+        positioningAreaSize = LayoutSize(snapRectToDevicePixels(LayoutRect(destinationRect.location(), positioningAreaSize), deviceScaleFactor).size());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     auto clientForBackgroundImage = backgroundObject ? backgroundObject : this;
</span><span class="lines">@@ -1216,18 +1221,18 @@
</span><span class="cx">         spaceSize.setHeight(0);
</span><span class="cx">     }
</span><span class="cx">     if (fixedAttachment) {
</span><del>-        LayoutPoint attachmentPoint = paintRect.location();
</del><ins>+        LayoutPoint attachmentPoint = borderBoxRect.location();
</ins><span class="cx">         phase.expand(std::max&lt;LayoutUnit&gt;(attachmentPoint.x() - destinationRect.x(), 0), std::max&lt;LayoutUnit&gt;(attachmentPoint.y() - destinationRect.y(), 0));
</span><span class="cx">     }
</span><del>-    destinationRect.intersect(paintRect);
-    pixelSnapBackgroundImageGeometryForPainting(destinationRect, tileSize, phase, spaceSize, document().deviceScaleFactor());
</del><ins>+    destinationRect.intersect(borderBoxRect);
+    pixelSnapBackgroundImageGeometryForPainting(destinationRect, tileSize, phase, spaceSize, deviceScaleFactor);
</ins><span class="cx">     return BackgroundImageGeometry(destinationRect, tileSize, phase, spaceSize, fixedAttachment);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderBoxModelObject::getGeometryForBackgroundImage(const RenderLayerModelObject* paintContainer, FloatRect&amp; destRect, FloatSize&amp; phase, FloatSize&amp; tileSize) const
</del><ins>+void RenderBoxModelObject::getGeometryForBackgroundImage(const RenderLayerModelObject* paintContainer, const LayoutPoint&amp; paintOffset, FloatRect&amp; destRect, FloatSize&amp; phase, FloatSize&amp; tileSize) const
</ins><span class="cx"> {
</span><span class="cx">     LayoutRect paintRect(destRect);
</span><del>-    BackgroundImageGeometry geometry = calculateBackgroundImageGeometry(paintContainer, *style().backgroundLayers(), paintRect);
</del><ins>+    BackgroundImageGeometry geometry = calculateBackgroundImageGeometry(paintContainer, *style().backgroundLayers(), paintOffset, paintRect);
</ins><span class="cx">     phase = geometry.phase();
</span><span class="cx">     tileSize = geometry.tileSize();
</span><span class="cx">     destRect = geometry.destRect();
</span><span class="lines">@@ -2301,7 +2306,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool RenderBoxModelObject::boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox* inlineFlowBox) const
</del><ins>+bool RenderBoxModelObject::boxShadowShouldBeAppliedToBackground(const LayoutPoint&amp;, BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox* inlineFlowBox) const
</ins><span class="cx"> {
</span><span class="cx">     if (bleedAvoidance != BackgroundBleedNone)
</span><span class="cx">         return false;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBoxModelObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.h (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBoxModelObject.h        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.h        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -205,7 +205,7 @@
</span><span class="cx">     void paintBoxShadow(const PaintInfo&amp;, const LayoutRect&amp;, const RenderStyle&amp;, ShadowStyle, bool includeLogicalLeftEdge = true, bool includeLogicalRightEdge = true);
</span><span class="cx">     void paintFillLayerExtended(const PaintInfo&amp;, const Color&amp;, const FillLayer*, const LayoutRect&amp;, BackgroundBleedAvoidance, InlineFlowBox* = nullptr, const LayoutSize&amp; = LayoutSize(), CompositeOperator = CompositeSourceOver, RenderElement* backgroundObject = nullptr, BaseBackgroundColorUsage = BaseBackgroundColorUse);
</span><span class="cx"> 
</span><del>-    virtual bool boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance, InlineFlowBox* = nullptr) const;
</del><ins>+    virtual bool boxShadowShouldBeAppliedToBackground(const LayoutPoint&amp; absolutePaintPostion, BackgroundBleedAvoidance, InlineFlowBox* = nullptr) const;
</ins><span class="cx"> 
</span><span class="cx">     // Overridden by subclasses to determine line height and baseline position.
</span><span class="cx">     virtual LayoutUnit lineHeight(bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const = 0;
</span><span class="lines">@@ -217,7 +217,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool canHaveBoxInfoInRegion() const { return !isFloating() &amp;&amp; !isReplaced() &amp;&amp; !isInline() &amp;&amp; !isTableCell() &amp;&amp; isRenderBlock() &amp;&amp; !isRenderSVGBlock(); }
</span><span class="cx"> 
</span><del>-    void getGeometryForBackgroundImage(const RenderLayerModelObject* paintContainer, FloatRect&amp; destRect, FloatSize&amp; phase, FloatSize&amp; tileSize) const;
</del><ins>+    void getGeometryForBackgroundImage(const RenderLayerModelObject* paintContainer, const LayoutPoint&amp; paintOffset, FloatRect&amp; destRect, FloatSize&amp; phase, FloatSize&amp; tileSize) const;
</ins><span class="cx">     void contentChanged(ContentChangeType);
</span><span class="cx">     bool hasAcceleratedCompositing() const;
</span><span class="cx"> 
</span><span class="lines">@@ -240,7 +240,8 @@
</span><span class="cx">     LayoutPoint adjustedPositionRelativeToOffsetParent(const LayoutPoint&amp;) const;
</span><span class="cx"> 
</span><span class="cx">     bool hasBoxDecorationStyle() const;
</span><del>-    BackgroundImageGeometry calculateBackgroundImageGeometry(const RenderLayerModelObject* paintContainer, const FillLayer&amp;, const LayoutRect&amp; paintRect, RenderElement* = nullptr) const;
</del><ins>+    BackgroundImageGeometry calculateBackgroundImageGeometry(const RenderLayerModelObject* paintContainer, const FillLayer&amp;, const LayoutPoint&amp; paintOffset,
+        const LayoutRect&amp; paintRect, RenderElement* = nullptr) const;
</ins><span class="cx">     bool borderObscuresBackgroundEdge(const FloatSize&amp; contextScale) const;
</span><span class="cx">     bool borderObscuresBackground() const;
</span><span class="cx">     RoundedRect backgroundRoundedRectAdjustedForBleedAvoidance(const GraphicsContext&amp;, const LayoutRect&amp;, BackgroundBleedAvoidance, InlineFlowBox*, const LayoutSize&amp;, bool includeLogicalLeftEdge, bool includeLogicalRightEdge) const;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderFieldsetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderFieldset.cpp (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderFieldset.cpp        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderFieldset.cpp        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -159,7 +159,7 @@
</span><span class="cx">         paintRect.setX(paintRect.x() + xOff);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!boxShadowShouldBeAppliedToBackground(determineBackgroundBleedAvoidance(paintInfo.context)))
</del><ins>+    if (!boxShadowShouldBeAppliedToBackground(paintRect.location(), determineBackgroundBleedAvoidance(paintInfo.context)))
</ins><span class="cx">         paintBoxShadow(paintInfo, paintRect, style(), Normal);
</span><span class="cx">     paintFillLayers(paintInfo, style().visitedDependentColor(CSSPropertyBackgroundColor), style().backgroundLayers(), paintRect);
</span><span class="cx">     paintBoxShadow(paintInfo, paintRect, style(), Inset);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderImagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderImage.cpp (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderImage.cpp        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderImage.cpp        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -555,12 +555,12 @@
</span><span class="cx">         ImagePaintingOptions(compositeOperator, BlendModeNormal, orientationDescription, useLowQualityScaling));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool RenderImage::boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox*) const
</del><ins>+bool RenderImage::boxShadowShouldBeAppliedToBackground(const LayoutPoint&amp; paintOffset, BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox*) const
</ins><span class="cx"> {
</span><del>-    if (!RenderBoxModelObject::boxShadowShouldBeAppliedToBackground(bleedAvoidance))
</del><ins>+    if (!RenderBoxModelObject::boxShadowShouldBeAppliedToBackground(paintOffset, bleedAvoidance))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    return !const_cast&lt;RenderImage*&gt;(this)-&gt;backgroundIsKnownToBeObscured();
</del><ins>+    return !const_cast&lt;RenderImage*&gt;(this)-&gt;backgroundIsKnownToBeObscured(paintOffset);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool RenderImage::foregroundIsKnownToBeOpaqueInRect(const LayoutRect&amp; localRect, unsigned maxDepthToTest) const
</span><span class="lines">@@ -587,13 +587,13 @@
</span><span class="cx">     return imageResource().cachedImage() &amp;&amp; imageResource().cachedImage()-&gt;currentFrameKnownToBeOpaque(this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool RenderImage::computeBackgroundIsKnownToBeObscured()
</del><ins>+bool RenderImage::computeBackgroundIsKnownToBeObscured(const LayoutPoint&amp; paintOffset)
</ins><span class="cx"> {
</span><span class="cx">     if (!hasBackground())
</span><span class="cx">         return false;
</span><span class="cx">     
</span><span class="cx">     LayoutRect paintedExtent;
</span><del>-    if (!getBackgroundPaintedExtent(paintedExtent))
</del><ins>+    if (!getBackgroundPaintedExtent(paintOffset, paintedExtent))
</ins><span class="cx">         return false;
</span><span class="cx">     return foregroundIsKnownToBeOpaqueInRect(paintedExtent, 0);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderImageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderImage.h (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderImage.h        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderImage.h        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -100,14 +100,14 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void paintReplaced(PaintInfo&amp;, const LayoutPoint&amp;) override;
</span><span class="cx"> 
</span><del>-    virtual bool computeBackgroundIsKnownToBeObscured() override final;
</del><ins>+    virtual bool computeBackgroundIsKnownToBeObscured(const LayoutPoint&amp; paintOffset) override final;
</ins><span class="cx"> 
</span><span class="cx">     virtual LayoutUnit minimumReplacedHeight() const override;
</span><span class="cx"> 
</span><span class="cx">     virtual void notifyFinished(CachedResource*) override final;
</span><span class="cx">     virtual bool nodeAtPoint(const HitTestRequest&amp;, HitTestResult&amp;, const HitTestLocation&amp; locationInContainer, const LayoutPoint&amp; accumulatedOffset, HitTestAction) override final;
</span><span class="cx"> 
</span><del>-    virtual bool boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance, InlineFlowBox*) const override final;
</del><ins>+    virtual bool boxShadowShouldBeAppliedToBackground(const LayoutPoint&amp; paintOffset, BackgroundBleedAvoidance, InlineFlowBox*) const override final;
</ins><span class="cx"> 
</span><span class="cx">     virtual bool shadowControlsNeedCustomLayoutMetrics() const { return false; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayer.cpp        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -5800,7 +5800,7 @@
</span><span class="cx">         RenderBox* box = renderBox();
</span><span class="cx">         ASSERT(box);
</span><span class="cx">         if (!(flags &amp; DontConstrainForMask) &amp;&amp; box-&gt;hasMask()) {
</span><del>-            result = box-&gt;maskClipRect();
</del><ins>+            result = box-&gt;maskClipRect(LayoutPoint());
</ins><span class="cx">             box-&gt;flipForWritingMode(result); // The mask clip rect is in physical coordinates, so we have to flip, since localBoundingBox is not.
</span><span class="cx">         } else {
</span><span class="cx">             LayoutRect bbox = box-&gt;borderBoxRect();
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerBackingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -1709,7 +1709,8 @@
</span><span class="cx">     FloatSize tileSize;
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;Image&gt; image = style.backgroundLayers()-&gt;image()-&gt;cachedImage()-&gt;image();
</span><del>-    downcast&lt;RenderBox&gt;(renderer()).getGeometryForBackgroundImage(&amp;renderer(), destRect, phase, tileSize);
</del><ins>+    // FIXME: absolute paint location is required here.
+    downcast&lt;RenderBox&gt;(renderer()).getGeometryForBackgroundImage(&amp;renderer(), LayoutPoint(), destRect, phase, tileSize);
</ins><span class="cx">     m_graphicsLayer-&gt;setContentsTileSize(tileSize);
</span><span class="cx">     m_graphicsLayer-&gt;setContentsTilePhase(phase);
</span><span class="cx">     m_graphicsLayer-&gt;setContentsRect(destRect);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderObject.h (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderObject.h        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderObject.h        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -530,7 +530,7 @@
</span><span class="cx">         HasBoxDecorationsAndBackgroundMayBeVisible,
</span><span class="cx">     };
</span><span class="cx">     bool hasBoxDecorations() const { return m_bitfields.boxDecorationState() != NoBoxDecorations; }
</span><del>-    bool backgroundIsKnownToBeObscured();
</del><ins>+    bool backgroundIsKnownToBeObscured(const LayoutPoint&amp; paintOffset);
</ins><span class="cx">     bool hasEntirelyFixedBackground() const;
</span><span class="cx"> 
</span><span class="cx">     bool needsLayout() const
</span><span class="lines">@@ -614,7 +614,7 @@
</span><span class="cx"> 
</span><span class="cx">     void setHasBoxDecorations(bool = true);
</span><span class="cx">     void invalidateBackgroundObscurationStatus();
</span><del>-    virtual bool computeBackgroundIsKnownToBeObscured() { return false; }
</del><ins>+    virtual bool computeBackgroundIsKnownToBeObscured(const LayoutPoint&amp;) { return false; }
</ins><span class="cx"> 
</span><span class="cx">     void setIsText() { ASSERT(!isBox()); m_bitfields.setIsTextOrRenderView(true); }
</span><span class="cx">     void setIsLineBreak() { m_bitfields.setIsLineBreak(true); }
</span><span class="lines">@@ -1123,10 +1123,10 @@
</span><span class="cx">     m_bitfields.setBoxDecorationState(HasBoxDecorationsAndBackgroundObscurationStatusInvalid);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline bool RenderObject::backgroundIsKnownToBeObscured()
</del><ins>+inline bool RenderObject::backgroundIsKnownToBeObscured(const LayoutPoint&amp; paintOffset)
</ins><span class="cx"> {
</span><span class="cx">     if (m_bitfields.boxDecorationState() == HasBoxDecorationsAndBackgroundObscurationStatusInvalid) {
</span><del>-        BoxDecorationState boxDecorationState = computeBackgroundIsKnownToBeObscured() ? HasBoxDecorationsAndBackgroundIsKnownToBeObscured : HasBoxDecorationsAndBackgroundMayBeVisible;
</del><ins>+        BoxDecorationState boxDecorationState = computeBackgroundIsKnownToBeObscured(paintOffset) ? HasBoxDecorationsAndBackgroundIsKnownToBeObscured : HasBoxDecorationsAndBackgroundMayBeVisible;
</ins><span class="cx">         m_bitfields.setBoxDecorationState(boxDecorationState);
</span><span class="cx">     }
</span><span class="cx">     return m_bitfields.boxDecorationState() == HasBoxDecorationsAndBackgroundIsKnownToBeObscured;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderTablecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderTable.cpp (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderTable.cpp        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderTable.cpp        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -748,7 +748,7 @@
</span><span class="cx">     subtractCaptionRect(rect);
</span><span class="cx"> 
</span><span class="cx">     BackgroundBleedAvoidance bleedAvoidance = determineBackgroundBleedAvoidance(paintInfo.context);
</span><del>-    if (!boxShadowShouldBeAppliedToBackground(bleedAvoidance))
</del><ins>+    if (!boxShadowShouldBeAppliedToBackground(rect.location(), bleedAvoidance))
</ins><span class="cx">         paintBoxShadow(paintInfo, rect, style(), Normal);
</span><span class="cx">     paintBackground(paintInfo, rect, bleedAvoidance);
</span><span class="cx">     paintBoxShadow(paintInfo, rect, style(), Inset);
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderTableCellcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderTableCell.cpp (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderTableCell.cpp        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderTableCell.cpp        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -1320,7 +1320,7 @@
</span><span class="cx">     paintMaskImages(paintInfo, LayoutRect(paintOffset, pixelSnappedSize()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool RenderTableCell::boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance, InlineFlowBox*) const
</del><ins>+bool RenderTableCell::boxShadowShouldBeAppliedToBackground(const LayoutPoint&amp;, BackgroundBleedAvoidance, InlineFlowBox*) const
</ins><span class="cx"> {
</span><span class="cx">     return false;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderTableCellh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderTableCell.h (184394 => 184395)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderTableCell.h        2015-05-15 17:15:16 UTC (rev 184394)
+++ trunk/Source/WebCore/rendering/RenderTableCell.h        2015-05-15 17:39:05 UTC (rev 184395)
</span><span class="lines">@@ -150,7 +150,7 @@
</span><span class="cx">     virtual void paintBoxDecorations(PaintInfo&amp;, const LayoutPoint&amp;) override;
</span><span class="cx">     virtual void paintMask(PaintInfo&amp;, const LayoutPoint&amp;) override;
</span><span class="cx"> 
</span><del>-    virtual bool boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance, InlineFlowBox*) const override;
</del><ins>+    virtual bool boxShadowShouldBeAppliedToBackground(const LayoutPoint&amp; paintOffset, BackgroundBleedAvoidance, InlineFlowBox*) const override;
</ins><span class="cx"> 
</span><span class="cx">     virtual LayoutSize offsetFromContainer(RenderElement&amp;, const LayoutPoint&amp;, bool* offsetDependsOnPoint = 0) const override;
</span><span class="cx">     virtual void computeRectForRepaint(const RenderLayerModelObject* repaintContainer, LayoutRect&amp;, bool fixed = false) const override;
</span></span></pre>
</div>
</div>

</body>
</html>