<!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>[169161] 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/169161">169161</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2014-05-21 09:06:55 -0700 (Wed, 21 May 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Garbage when rubber-banding at the right edge of a page zoomed to non-integral scale.
https://bugs.webkit.org/show_bug.cgi?id=133139
&lt;rdar://problem/16503353&gt;

Reviewed by Simon Fraser.

Do not pixel align the root content layer. The alignment code expands the graphics's layer size
which makes the right and bottom tiles bigger than the content.
Painting the body's background color produces pixel cracks, because the content can not
fill the expanded tiles completely.

Not testable.

* platform/graphics/GraphicsLayerClient.h:
(WebCore::GraphicsLayerClient::needsPixelAligment):
* platform/graphics/ca/GraphicsLayerCA.cpp:
(WebCore::GraphicsLayerCA::updateGeometry):
(WebCore::GraphicsLayerCA::computePixelAlignment):
* platform/graphics/ca/mac/TileGrid.mm:
(WebCore::TileGrid::rectForTileIndex):
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::needsPixelAligment):
* rendering/RenderLayerBacking.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGraphicsLayerClienth">trunk/Source/WebCore/platform/graphics/GraphicsLayerClient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp">trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscamacTileGridmm">trunk/Source/WebCore/platform/graphics/ca/mac/TileGrid.mm</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerBackingcpp">trunk/Source/WebCore/rendering/RenderLayerBacking.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderLayerBackingh">trunk/Source/WebCore/rendering/RenderLayerBacking.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (169160 => 169161)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-05-21 15:31:20 UTC (rev 169160)
+++ trunk/Source/WebCore/ChangeLog        2014-05-21 16:06:55 UTC (rev 169161)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2014-05-21  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Garbage when rubber-banding at the right edge of a page zoomed to non-integral scale.
+        https://bugs.webkit.org/show_bug.cgi?id=133139
+        &lt;rdar://problem/16503353&gt;
+
+        Reviewed by Simon Fraser.
+
+        Do not pixel align the root content layer. The alignment code expands the graphics's layer size
+        which makes the right and bottom tiles bigger than the content.
+        Painting the body's background color produces pixel cracks, because the content can not
+        fill the expanded tiles completely.
+
+        Not testable.
+
+        * platform/graphics/GraphicsLayerClient.h:
+        (WebCore::GraphicsLayerClient::needsPixelAligment):
+        * platform/graphics/ca/GraphicsLayerCA.cpp:
+        (WebCore::GraphicsLayerCA::updateGeometry):
+        (WebCore::GraphicsLayerCA::computePixelAlignment):
+        * platform/graphics/ca/mac/TileGrid.mm:
+        (WebCore::TileGrid::rectForTileIndex):
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::needsPixelAligment):
+        * rendering/RenderLayerBacking.h:
+
</ins><span class="cx"> 2014-05-21  Radu Stavila  &lt;stavila@adobe.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION (r168046): Invalid layout in WebCore::RenderBox::containingBlockLogicalWidthForPositioned
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGraphicsLayerClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GraphicsLayerClient.h (169160 => 169161)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GraphicsLayerClient.h        2014-05-21 15:31:20 UTC (rev 169160)
+++ trunk/Source/WebCore/platform/graphics/GraphicsLayerClient.h        2014-05-21 16:06:55 UTC (rev 169161)
</span><span class="lines">@@ -99,6 +99,8 @@
</span><span class="cx">     virtual bool shouldAggressivelyRetainTiles(const GraphicsLayer*) const { return false; }
</span><span class="cx">     virtual bool shouldTemporarilyRetainTileCohorts(const GraphicsLayer*) const { return true; }
</span><span class="cx"> 
</span><ins>+    virtual bool needsPixelAligment() const { return false; }
+
</ins><span class="cx"> #ifndef NDEBUG
</span><span class="cx">     // RenderLayerBacking overrides this to verify that it is not
</span><span class="cx">     // currently painting contents. An ASSERT fails, if it is.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaGraphicsLayerCAcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp (169160 => 169161)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2014-05-21 15:31:20 UTC (rev 169160)
+++ trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp        2014-05-21 16:06:55 UTC (rev 169161)
</span><span class="lines">@@ -1529,12 +1529,15 @@
</span><span class="cx"> 
</span><span class="cx"> void GraphicsLayerCA::updateGeometry(float pageScaleFactor, const FloatPoint&amp; positionRelativeToBase)
</span><span class="cx"> {
</span><del>-    FloatPoint scaledPosition;
-    FloatPoint3D scaledAnchorPoint;
-    FloatSize scaledSize;
</del><ins>+    FloatPoint scaledPosition = m_position;
+    FloatPoint3D scaledAnchorPoint = m_anchorPoint;
+    FloatSize scaledSize = m_size;
</ins><span class="cx">     FloatSize pixelAlignmentOffset;
</span><del>-    computePixelAlignment(pageScaleFactor * deviceScaleFactor(), positionRelativeToBase, scaledPosition, scaledSize, scaledAnchorPoint, pixelAlignmentOffset);
</del><span class="cx"> 
</span><ins>+    // FIXME: figure out if we really need to pixel align the graphics layer here.
+    if (m_client.needsPixelAligment() &amp;&amp; !isIntegral(pageScaleFactor) &amp;&amp; m_drawsContent &amp;&amp; !m_masksToBounds)
+        computePixelAlignment(pageScaleFactor, positionRelativeToBase, scaledPosition, scaledSize, scaledAnchorPoint, pixelAlignmentOffset);
+
</ins><span class="cx">     FloatRect adjustedBounds(m_boundsOrigin - pixelAlignmentOffset, scaledSize);
</span><span class="cx"> 
</span><span class="cx">     // Update position.
</span><span class="lines">@@ -3433,14 +3436,6 @@
</span><span class="cx"> void GraphicsLayerCA::computePixelAlignment(float contentsScale, const FloatPoint&amp; positionRelativeToBase,
</span><span class="cx">     FloatPoint&amp; position, FloatSize&amp; size, FloatPoint3D&amp; anchorPoint, FloatSize&amp; alignmentOffset) const
</span><span class="cx"> {
</span><del>-    if (isIntegral(contentsScale) || !m_drawsContent || m_masksToBounds) {
-        position = m_position;
-        size = m_size;
-        anchorPoint = m_anchorPoint;
-        alignmentOffset = FloatSize();
-        return;
-    }
-    
</del><span class="cx">     FloatRect baseRelativeBounds(positionRelativeToBase, m_size);
</span><span class="cx">     FloatRect scaledBounds = baseRelativeBounds;
</span><span class="cx">     // Scale by the page scale factor to compute the screen-relative bounds.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscamacTileGridmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/mac/TileGrid.mm (169160 => 169161)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/mac/TileGrid.mm        2014-05-21 15:31:20 UTC (rev 169160)
+++ trunk/Source/WebCore/platform/graphics/ca/mac/TileGrid.mm        2014-05-21 16:06:55 UTC (rev 169161)
</span><span class="lines">@@ -215,6 +215,9 @@
</span><span class="cx"> 
</span><span class="cx"> IntRect TileGrid::rectForTileIndex(const TileIndex&amp; tileIndex) const
</span><span class="cx"> {
</span><ins>+    // FIXME: calculating the scaled size here should match with the rest of calculated sizes where we use the combination of
+    // enclosingIntRect, expandedIntSize (floor vs ceil).
+    // However enclosing this size could reveal gap on root layer's background. see RenderView::backgroundRect()
</ins><span class="cx">     IntSize tileSize = m_controller.tileSize();
</span><span class="cx">     IntRect rect(tileIndex.x() * tileSize.width(), tileIndex.y() * tileSize.height(), tileSize.width(), tileSize.height());
</span><span class="cx">     IntRect scaledBounds(m_controller.bounds());
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerBackingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (169160 => 169161)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2014-05-21 15:31:20 UTC (rev 169160)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp        2014-05-21 16:06:55 UTC (rev 169161)
</span><span class="lines">@@ -120,9 +120,7 @@
</span><span class="cx">     Page* page = renderer().frame().page();
</span><span class="cx"> 
</span><span class="cx">     if (layer.isRootLayer() &amp;&amp; page) {
</span><del>-        if (renderer().frame().isMainFrame())
-            m_isMainFrameRenderViewLayer = true;
-
</del><ins>+        m_isMainFrameRenderViewLayer = renderer().frame().isMainFrame();
</ins><span class="cx">         m_usingTiledCacheLayer = page-&gt;chrome().client().shouldUseTiledBackingForFrameView(renderer().frame().view());
</span><span class="cx">     }
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderLayerBackingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.h (169160 => 169161)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderLayerBacking.h        2014-05-21 15:31:20 UTC (rev 169160)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.h        2014-05-21 16:06:55 UTC (rev 169161)
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx"> // 
</span><span class="cx"> // There is one RenderLayerBacking for each RenderLayer that is composited.
</span><span class="cx"> 
</span><del>-class RenderLayerBacking : public GraphicsLayerClient {
</del><ins>+class RenderLayerBacking final : public GraphicsLayerClient {
</ins><span class="cx">     WTF_MAKE_NONCOPYABLE(RenderLayerBacking); WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><span class="cx">     explicit RenderLayerBacking(RenderLayer&amp;);
</span><span class="lines">@@ -195,6 +195,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual bool shouldAggressivelyRetainTiles(const GraphicsLayer*) const override;
</span><span class="cx">     virtual bool shouldTemporarilyRetainTileCohorts(const GraphicsLayer*) const override;
</span><ins>+    virtual bool needsPixelAligment() const override { return !m_isMainFrameRenderViewLayer; }
</ins><span class="cx"> 
</span><span class="cx"> #ifndef NDEBUG
</span><span class="cx">     virtual void verifyNotPainting();
</span></span></pre>
</div>
</div>

</body>
</html>