- 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;