<!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>[160179] 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/160179">160179</a></dd>
<dt>Author</dt> <dd>bdakin@apple.com</dd>
<dt>Date</dt> <dd>2013-12-05 09:57:26 -0800 (Thu, 05 Dec 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>Bad repaints on twitter when the tile cache has a margin
https://bugs.webkit.org/show_bug.cgi?id=125263
-and corresponding-
&lt;rdar://problem/15576884&gt;

Reviewed by Tim Horton.

When tiles that used to be margin tiles become real-content tiles, they need to be 
invalidated.

Two new helper functions will make it so that we don’t have to manually factor out 
the margin from the bounds in more than one place in the code.
* platform/graphics/ca/mac/TileController.h:
* platform/graphics/ca/mac/TileController.mm:
(WebCore::TileController::boundsWithoutMargin):
(WebCore::TileController::boundsAtLastRevalidateWithoutMargin):

 Here is one existing place where we used to factor out the margin, but now we can 
call boundsWithoutMargin().
(WebCore::TileController::adjustRectAtTileIndexForMargin):

And here is where we invalidate the formerly-margin tiles.
(WebCore::TileController::revalidateTiles):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscamacTileControllerh">trunk/Source/WebCore/platform/graphics/ca/mac/TileController.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscamacTileControllermm">trunk/Source/WebCore/platform/graphics/ca/mac/TileController.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (160178 => 160179)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2013-12-05 17:54:48 UTC (rev 160178)
+++ trunk/Source/WebCore/ChangeLog        2013-12-05 17:57:26 UTC (rev 160179)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2013-12-05  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Bad repaints on twitter when the tile cache has a margin
+        https://bugs.webkit.org/show_bug.cgi?id=125263
+        -and corresponding-
+        &lt;rdar://problem/15576884&gt;
+
+        Reviewed by Tim Horton.
+
+        When tiles that used to be margin tiles become real-content tiles, they need to be 
+        invalidated.
+
+        Two new helper functions will make it so that we don’t have to manually factor out 
+        the margin from the bounds in more than one place in the code.
+        * platform/graphics/ca/mac/TileController.h:
+        * platform/graphics/ca/mac/TileController.mm:
+        (WebCore::TileController::boundsWithoutMargin):
+        (WebCore::TileController::boundsAtLastRevalidateWithoutMargin):
+
+         Here is one existing place where we used to factor out the margin, but now we can 
+        call boundsWithoutMargin().
+        (WebCore::TileController::adjustRectAtTileIndexForMargin):
+
+        And here is where we invalidate the formerly-margin tiles.
+        (WebCore::TileController::revalidateTiles):
+
</ins><span class="cx"> 2013-12-05  Zoltan Horvath  &lt;zoltan@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove the forward declaration of BidiContext class from RenderBlock.h
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscamacTileControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/mac/TileController.h (160178 => 160179)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/mac/TileController.h        2013-12-05 17:54:48 UTC (rev 160178)
+++ trunk/Source/WebCore/platform/graphics/ca/mac/TileController.h        2013-12-05 17:57:26 UTC (rev 160179)
</span><span class="lines">@@ -148,6 +148,8 @@
</span><span class="cx">     virtual float platformCALayerDeviceScaleFactor() const OVERRIDE;
</span><span class="cx"> 
</span><span class="cx">     IntRect bounds() const;
</span><ins>+    IntRect boundsWithoutMargin() const;
+    IntRect boundsAtLastRevalidateWithoutMargin() const;
</ins><span class="cx"> 
</span><span class="cx">     IntRect rectForTileIndex(const TileIndex&amp;) const;
</span><span class="cx">     void adjustRectAtTileIndexForMargin(const TileIndex&amp;, IntRect&amp;) const;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscamacTileControllermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/mac/TileController.mm (160178 => 160179)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/mac/TileController.mm        2013-12-05 17:54:48 UTC (rev 160178)
+++ trunk/Source/WebCore/platform/graphics/ca/mac/TileController.mm        2013-12-05 17:57:26 UTC (rev 160179)
</span><span class="lines">@@ -403,6 +403,18 @@
</span><span class="cx">     return IntRect(boundsOriginIncludingMargin, boundsSizeIncludingMargin);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+IntRect TileController::boundsWithoutMargin() const
+{
+    return IntRect(IntPoint(), expandedIntSize(m_tileCacheLayer-&gt;bounds().size()));
+}
+
+IntRect TileController::boundsAtLastRevalidateWithoutMargin() const
+{
+    IntRect boundsWithoutMargin = IntRect(IntPoint(), m_boundsAtLastRevalidate.size());
+    boundsWithoutMargin.contract(IntSize(leftMarginWidth() + rightMarginWidth(), topMarginHeight() + bottomMarginHeight()));
+    return boundsWithoutMargin;
+}
+
</ins><span class="cx"> void TileController::adjustRectAtTileIndexForMargin(const TileIndex&amp; tileIndex, IntRect&amp; rect) const
</span><span class="cx"> {
</span><span class="cx">     if (!hasMargins())
</span><span class="lines">@@ -420,10 +432,9 @@
</span><span class="cx">         rect.setWidth(leftMarginWidth());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    IntRect boundsWithoutMargin = IntRect(IntPoint(), expandedIntSize(m_tileCacheLayer-&gt;bounds().size()));
</del><span class="cx">     TileIndex contentTopLeft;
</span><span class="cx">     TileIndex contentBottomRight;
</span><del>-    getTileIndexRangeForRect(boundsWithoutMargin, contentTopLeft, contentBottomRight);
</del><ins>+    getTileIndexRangeForRect(boundsWithoutMargin(), contentTopLeft, contentBottomRight);
</ins><span class="cx"> 
</span><span class="cx">     // This is a tile in the bottom margin.
</span><span class="cx">     if (m_marginBottom &amp;&amp; tileIndex.y() &gt; contentBottomRight.y())
</span><span class="lines">@@ -752,6 +763,27 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (m_boundsAtLastRevalidate != bounds) {
</span><ins>+        // If there are margin tiles and the bounds have grown taller or wider, then the tiles that used to
+        // be bottom or right margin tiles need to be invalidated.
+        if (hasMargins()) {
+            if (bounds.width() &gt; m_boundsAtLastRevalidate.width() || bounds.height() &gt; m_boundsAtLastRevalidate.height()) {
+                IntRect boundsWithoutMargin = this-&gt;boundsWithoutMargin();
+                IntRect oldBoundsWithoutMargin = boundsAtLastRevalidateWithoutMargin();
+
+                if (bounds.height() &gt; m_boundsAtLastRevalidate.height()) {
+                    IntRect formerBottomMarginRect = IntRect(oldBoundsWithoutMargin.x(), oldBoundsWithoutMargin.height(),
+                        oldBoundsWithoutMargin.width(), boundsWithoutMargin.height() - oldBoundsWithoutMargin.height());
+                    setNeedsDisplayInRect(formerBottomMarginRect);
+                }
+
+                if (bounds.width() &gt; m_boundsAtLastRevalidate.width()) {
+                    IntRect formerRightMarginRect = IntRect(oldBoundsWithoutMargin.width(), oldBoundsWithoutMargin.y(),
+                        boundsWithoutMargin.width() - oldBoundsWithoutMargin.width(), oldBoundsWithoutMargin.height());
+                    setNeedsDisplayInRect(formerRightMarginRect);
+                }
+            }
+        }
+
</ins><span class="cx">         FloatRect scaledBounds(bounds);
</span><span class="cx">         scaledBounds.scale(m_scale);
</span><span class="cx">         IntRect boundsInTileCoords(enclosingIntRect(scaledBounds));
</span></span></pre>
</div>
</div>

</body>
</html>