<!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>[184158] releases/WebKitGTK/webkit-2.8/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/184158">184158</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-05-12 00:12:58 -0700 (Tue, 12 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/183636">r183636</a> - Avoid containingBlock() calls when no writing mode flipping is needed.
https://bugs.webkit.org/show_bug.cgi?id=144407

Reviewed by Simon Fraser.

Add a bool to RenderView that indicates whether or not any flipped blocks have been
added to the view. Once tainted, the view just stays dirty forever. If no flipped
blocks are ever seen, we can then optimize away calls to containingBlock().

The motivation for this patch is to improve layer position updating, which makes many
calls to topLeftLocationOffset(), one of the functions that can be optimized by this
change.

* rendering/RenderBox.cpp:
(WebCore::RenderBox::layoutOverflowRectForPropagation):
* rendering/RenderBoxModelObject.cpp:
(WebCore::RenderBoxModelObject::updateFromStyle):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::calculateClipRects):
* rendering/RenderLineBoxList.cpp:
(WebCore::RenderLineBoxList::rangeIntersectsRect):
* rendering/RenderView.cpp:
(WebCore::RenderView::RenderView):
* rendering/RenderView.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCorerenderingRenderBoxcpp">releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBox.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCorerenderingRenderBoxModelObjectcpp">releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBoxModelObject.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCorerenderingRenderLayercpp">releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderLayer.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCorerenderingRenderLineBoxListcpp">releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderLineBoxList.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCorerenderingRenderViewcpp">releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCorerenderingRenderViewh">releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit28SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog (184157 => 184158)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog        2015-05-12 07:07:04 UTC (rev 184157)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog        2015-05-12 07:12:58 UTC (rev 184158)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2015-04-29  David Hyatt  &lt;hyatt@apple.com&gt;
+
+        Avoid containingBlock() calls when no writing mode flipping is needed.
+        https://bugs.webkit.org/show_bug.cgi?id=144407
+
+        Reviewed by Simon Fraser.
+
+        Add a bool to RenderView that indicates whether or not any flipped blocks have been
+        added to the view. Once tainted, the view just stays dirty forever. If no flipped
+        blocks are ever seen, we can then optimize away calls to containingBlock().
+
+        The motivation for this patch is to improve layer position updating, which makes many
+        calls to topLeftLocationOffset(), one of the functions that can be optimized by this
+        change.
+
+        * rendering/RenderBox.cpp:
+        (WebCore::RenderBox::layoutOverflowRectForPropagation):
+        * rendering/RenderBoxModelObject.cpp:
+        (WebCore::RenderBoxModelObject::updateFromStyle):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::calculateClipRects):
+        * rendering/RenderLineBoxList.cpp:
+        (WebCore::RenderLineBoxList::rangeIntersectsRect):
+        * rendering/RenderView.cpp:
+        (WebCore::RenderView::RenderView):
+        * rendering/RenderView.h:
+
</ins><span class="cx"> 2015-04-29  Hyungwook Lee  &lt;hyungwook.lee@navercorp.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix crash in WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::setBlock().
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCorerenderingRenderBoxcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBox.cpp (184157 => 184158)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBox.cpp        2015-05-12 07:07:04 UTC (rev 184157)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBox.cpp        2015-05-12 07:12:58 UTC (rev 184158)
</span><span class="lines">@@ -4749,6 +4749,9 @@
</span><span class="cx"> 
</span><span class="cx"> LayoutPoint RenderBox::topLeftLocation() const
</span><span class="cx"> {
</span><ins>+    if (!view().hasFlippedBlockDescendants())
+        return location();
+    
</ins><span class="cx">     RenderBlock* containerBlock = containingBlock();
</span><span class="cx">     if (!containerBlock || containerBlock == this)
</span><span class="cx">         return location();
</span><span class="lines">@@ -4757,6 +4760,9 @@
</span><span class="cx"> 
</span><span class="cx"> LayoutSize RenderBox::topLeftLocationOffset() const
</span><span class="cx"> {
</span><ins>+    if (!view().hasFlippedBlockDescendants())
+        return LayoutSize(m_frameRect.x(), m_frameRect.y());
+
</ins><span class="cx">     RenderBlock* containerBlock = containingBlock();
</span><span class="cx">     if (!containerBlock || containerBlock == this)
</span><span class="cx">         return locationOffset();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCorerenderingRenderBoxModelObjectcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBoxModelObject.cpp (184157 => 184158)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBoxModelObject.cpp        2015-05-12 07:07:04 UTC (rev 184157)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBoxModelObject.cpp        2015-05-12 07:12:58 UTC (rev 184158)
</span><span class="lines">@@ -219,6 +219,8 @@
</span><span class="cx">     setInline(styleToUse.isDisplayInlineType());
</span><span class="cx">     setPositionState(styleToUse.position());
</span><span class="cx">     setHorizontalWritingMode(styleToUse.isHorizontalWritingMode());
</span><ins>+    if (styleToUse.isFlippedBlocksWritingMode())
+        view().setHasFlippedBlockDescendants(true);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static LayoutSize accumulateInFlowPositionOffsets(const RenderObject* child)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCorerenderingRenderLayercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderLayer.cpp (184157 => 184158)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderLayer.cpp        2015-05-12 07:07:04 UTC (rev 184157)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderLayer.cpp        2015-05-12 07:12:58 UTC (rev 184158)
</span><span class="lines">@@ -5802,11 +5802,13 @@
</span><span class="cx"> LayoutRect RenderLayer::boundingBox(const RenderLayer* ancestorLayer, const LayoutSize&amp; offsetFromRoot, CalculateLayerBoundsFlags flags) const
</span><span class="cx"> {    
</span><span class="cx">     LayoutRect result = localBoundingBox(flags);
</span><del>-    if (renderer().isBox())
-        renderBox()-&gt;flipForWritingMode(result);
-    else
-        renderer().containingBlock()-&gt;flipForWritingMode(result);
-    
</del><ins>+    if (renderer().view().hasFlippedBlockDescendants()) {
+        if (renderer().isBox())
+            renderBox()-&gt;flipForWritingMode(result);
+        else
+            renderer().containingBlock()-&gt;flipForWritingMode(result);
+    }
+
</ins><span class="cx">     PaginationInclusionMode inclusionMode = ExcludeCompositedPaginatedLayers;
</span><span class="cx">     if (flags &amp; UseFragmentBoxesIncludingCompositing)
</span><span class="cx">         inclusionMode = IncludeCompositedPaginatedLayers;
</span><span class="lines">@@ -5865,10 +5867,12 @@
</span><span class="cx"> 
</span><span class="cx">     LayoutRect boundingBoxRect = localBoundingBox(flags);
</span><span class="cx"> 
</span><del>-    if (is&lt;RenderBox&gt;(renderer()))
-        downcast&lt;RenderBox&gt;(renderer()).flipForWritingMode(boundingBoxRect);
-    else
-        renderer().containingBlock()-&gt;flipForWritingMode(boundingBoxRect);
</del><ins>+    if (renderer().view().hasFlippedBlockDescendants()) {
+        if (is&lt;RenderBox&gt;(renderer()))
+            downcast&lt;RenderBox&gt;(renderer()).flipForWritingMode(boundingBoxRect);
+        else
+            renderer().containingBlock()-&gt;flipForWritingMode(boundingBoxRect);
+    }
</ins><span class="cx"> 
</span><span class="cx">     if (renderer().isRoot()) {
</span><span class="cx">         // If the root layer becomes composited (e.g. because some descendant with negative z-index is composited),
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCorerenderingRenderLineBoxListcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderLineBoxList.cpp (184157 => 184158)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderLineBoxList.cpp        2015-05-12 07:07:04 UTC (rev 184157)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderLineBoxList.cpp        2015-05-12 07:12:58 UTC (rev 184158)
</span><span class="lines">@@ -152,13 +152,18 @@
</span><span class="cx"> // FIXME: This should take a RenderBoxModelObject&amp;.
</span><span class="cx"> bool RenderLineBoxList::rangeIntersectsRect(RenderBoxModelObject* renderer, LayoutUnit logicalTop, LayoutUnit logicalBottom, const LayoutRect&amp; rect, const LayoutPoint&amp; offset) const
</span><span class="cx"> {
</span><del>-    RenderBox* block;
-    if (is&lt;RenderBox&gt;(*renderer))
-        block = downcast&lt;RenderBox&gt;(renderer);
-    else
-        block = renderer-&gt;containingBlock();
-    LayoutUnit physicalStart = block-&gt;flipForWritingMode(logicalTop);
-    LayoutUnit physicalEnd = block-&gt;flipForWritingMode(logicalBottom);
</del><ins>+    LayoutUnit physicalStart = logicalTop;
+    LayoutUnit physicalEnd = logicalBottom;
+    if (renderer-&gt;view().hasFlippedBlockDescendants()) {
+        RenderBox* block;
+        if (is&lt;RenderBox&gt;(*renderer))
+            block = downcast&lt;RenderBox&gt;(renderer);
+        else
+            block = renderer-&gt;containingBlock();
+        physicalStart = block-&gt;flipForWritingMode(logicalTop);
+        physicalEnd = block-&gt;flipForWritingMode(logicalBottom);
+    }
+
</ins><span class="cx">     LayoutUnit physicalExtent = absoluteValue(physicalEnd - physicalStart);
</span><span class="cx">     physicalStart = std::min(physicalStart, physicalEnd);
</span><span class="cx">     
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCorerenderingRenderViewcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.cpp (184157 => 184158)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.cpp        2015-05-12 07:07:04 UTC (rev 184157)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.cpp        2015-05-12 07:12:58 UTC (rev 184158)
</span><span class="lines">@@ -111,6 +111,7 @@
</span><span class="cx">     , m_renderCounterCount(0)
</span><span class="cx">     , m_selectionWasCaret(false)
</span><span class="cx">     , m_hasSoftwareFilters(false)
</span><ins>+    , m_hasFlippedBlockDescendants(false)
</ins><span class="cx"> #if ENABLE(SERVICE_CONTROLS)
</span><span class="cx">     , m_selectionRectGatherer(*this)
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCorerenderingRenderViewh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.h (184157 => 184158)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.h        2015-05-12 07:07:04 UTC (rev 184157)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.h        2015-05-12 07:12:58 UTC (rev 184158)
</span><span class="lines">@@ -103,6 +103,9 @@
</span><span class="cx"> 
</span><span class="cx">     LayoutRect viewRect() const;
</span><span class="cx"> 
</span><ins>+    bool hasFlippedBlockDescendants() const { return m_hasFlippedBlockDescendants; }
+    void setHasFlippedBlockDescendants(bool b) { m_hasFlippedBlockDescendants = b; }
+
</ins><span class="cx">     // layoutDelta is used transiently during layout to store how far an object has moved from its
</span><span class="cx">     // last layout location, in order to repaint correctly.
</span><span class="cx">     // If we're doing a full repaint m_layoutState will be 0, but in that case layoutDelta doesn't matter.
</span><span class="lines">@@ -357,6 +360,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool m_selectionWasCaret;
</span><span class="cx">     bool m_hasSoftwareFilters;
</span><ins>+    bool m_hasFlippedBlockDescendants;
</ins><span class="cx"> 
</span><span class="cx">     HashSet&lt;RenderElement*&gt; m_renderersWithPausedImageAnimation;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>