Title: [184158] releases/WebKitGTK/webkit-2.8/Source/WebCore
Revision
184158
Author
[email protected]
Date
2015-05-12 00:12:58 -0700 (Tue, 12 May 2015)

Log Message

Merge r183636 - 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:

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog (184157 => 184158)


--- 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)
@@ -1,3 +1,30 @@
+2015-04-29  David Hyatt  <[email protected]>
+
+        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:
+
 2015-04-29  Hyungwook Lee  <[email protected]>
 
         Fix crash in WebCore::LogicalSelectionOffsetCaches::ContainingBlockInfo::setBlock().

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBox.cpp (184157 => 184158)


--- 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)
@@ -4749,6 +4749,9 @@
 
 LayoutPoint RenderBox::topLeftLocation() const
 {
+    if (!view().hasFlippedBlockDescendants())
+        return location();
+    
     RenderBlock* containerBlock = containingBlock();
     if (!containerBlock || containerBlock == this)
         return location();
@@ -4757,6 +4760,9 @@
 
 LayoutSize RenderBox::topLeftLocationOffset() const
 {
+    if (!view().hasFlippedBlockDescendants())
+        return LayoutSize(m_frameRect.x(), m_frameRect.y());
+
     RenderBlock* containerBlock = containingBlock();
     if (!containerBlock || containerBlock == this)
         return locationOffset();

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBoxModelObject.cpp (184157 => 184158)


--- 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)
@@ -219,6 +219,8 @@
     setInline(styleToUse.isDisplayInlineType());
     setPositionState(styleToUse.position());
     setHorizontalWritingMode(styleToUse.isHorizontalWritingMode());
+    if (styleToUse.isFlippedBlocksWritingMode())
+        view().setHasFlippedBlockDescendants(true);
 }
 
 static LayoutSize accumulateInFlowPositionOffsets(const RenderObject* child)

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderLayer.cpp (184157 => 184158)


--- 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)
@@ -5802,11 +5802,13 @@
 LayoutRect RenderLayer::boundingBox(const RenderLayer* ancestorLayer, const LayoutSize& offsetFromRoot, CalculateLayerBoundsFlags flags) const
 {    
     LayoutRect result = localBoundingBox(flags);
-    if (renderer().isBox())
-        renderBox()->flipForWritingMode(result);
-    else
-        renderer().containingBlock()->flipForWritingMode(result);
-    
+    if (renderer().view().hasFlippedBlockDescendants()) {
+        if (renderer().isBox())
+            renderBox()->flipForWritingMode(result);
+        else
+            renderer().containingBlock()->flipForWritingMode(result);
+    }
+
     PaginationInclusionMode inclusionMode = ExcludeCompositedPaginatedLayers;
     if (flags & UseFragmentBoxesIncludingCompositing)
         inclusionMode = IncludeCompositedPaginatedLayers;
@@ -5865,10 +5867,12 @@
 
     LayoutRect boundingBoxRect = localBoundingBox(flags);
 
-    if (is<RenderBox>(renderer()))
-        downcast<RenderBox>(renderer()).flipForWritingMode(boundingBoxRect);
-    else
-        renderer().containingBlock()->flipForWritingMode(boundingBoxRect);
+    if (renderer().view().hasFlippedBlockDescendants()) {
+        if (is<RenderBox>(renderer()))
+            downcast<RenderBox>(renderer()).flipForWritingMode(boundingBoxRect);
+        else
+            renderer().containingBlock()->flipForWritingMode(boundingBoxRect);
+    }
 
     if (renderer().isRoot()) {
         // If the root layer becomes composited (e.g. because some descendant with negative z-index is composited),

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderLineBoxList.cpp (184157 => 184158)


--- 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)
@@ -152,13 +152,18 @@
 // FIXME: This should take a RenderBoxModelObject&.
 bool RenderLineBoxList::rangeIntersectsRect(RenderBoxModelObject* renderer, LayoutUnit logicalTop, LayoutUnit logicalBottom, const LayoutRect& rect, const LayoutPoint& offset) const
 {
-    RenderBox* block;
-    if (is<RenderBox>(*renderer))
-        block = downcast<RenderBox>(renderer);
-    else
-        block = renderer->containingBlock();
-    LayoutUnit physicalStart = block->flipForWritingMode(logicalTop);
-    LayoutUnit physicalEnd = block->flipForWritingMode(logicalBottom);
+    LayoutUnit physicalStart = logicalTop;
+    LayoutUnit physicalEnd = logicalBottom;
+    if (renderer->view().hasFlippedBlockDescendants()) {
+        RenderBox* block;
+        if (is<RenderBox>(*renderer))
+            block = downcast<RenderBox>(renderer);
+        else
+            block = renderer->containingBlock();
+        physicalStart = block->flipForWritingMode(logicalTop);
+        physicalEnd = block->flipForWritingMode(logicalBottom);
+    }
+
     LayoutUnit physicalExtent = absoluteValue(physicalEnd - physicalStart);
     physicalStart = std::min(physicalStart, physicalEnd);
     

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.cpp (184157 => 184158)


--- 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)
@@ -111,6 +111,7 @@
     , m_renderCounterCount(0)
     , m_selectionWasCaret(false)
     , m_hasSoftwareFilters(false)
+    , m_hasFlippedBlockDescendants(false)
 #if ENABLE(SERVICE_CONTROLS)
     , m_selectionRectGatherer(*this)
 #endif

Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderView.h (184157 => 184158)


--- 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)
@@ -103,6 +103,9 @@
 
     LayoutRect viewRect() const;
 
+    bool hasFlippedBlockDescendants() const { return m_hasFlippedBlockDescendants; }
+    void setHasFlippedBlockDescendants(bool b) { m_hasFlippedBlockDescendants = b; }
+
     // layoutDelta is used transiently during layout to store how far an object has moved from its
     // last layout location, in order to repaint correctly.
     // If we're doing a full repaint m_layoutState will be 0, but in that case layoutDelta doesn't matter.
@@ -357,6 +360,7 @@
 
     bool m_selectionWasCaret;
     bool m_hasSoftwareFilters;
+    bool m_hasFlippedBlockDescendants;
 
     HashSet<RenderElement*> m_renderersWithPausedImageAnimation;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to