Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(600)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutObject.cpp

Issue 1813383002: Move all fast-path paint invalidation mapping into PaintInvalidationState (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reorganize conditions in PaintInvalidationState constructor Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/LayoutObject.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
index f7fefe576aff17d0c7013f36525d5b7ed36552cc..8a811d86a8beb6b95221eb7f13bd1567ea5ce816 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -1192,12 +1192,6 @@ static PassOwnPtr<TracedValue> jsonObjectForPaintInvalidationInfo(const LayoutRe
return value.release();
}
-LayoutRect LayoutObject::computePaintInvalidationRect(const LayoutBoxModelObject& paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState) const
-{
- return clippedOverflowRectForPaintInvalidation(&paintInvalidationContainer, paintInvalidationState);
-}
-
-
static void invalidatePaintRectangleOnWindow(const LayoutBoxModelObject& paintInvalidationContainer, const IntRect& dirtyRect)
{
FrameView* frameView = paintInvalidationContainer.frameView();
@@ -1295,11 +1289,6 @@ void LayoutObject::invalidateDisplayItemClientsWithPaintInvalidationState(const
invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason);
}
-LayoutRect LayoutObject::boundsRectForPaintInvalidation(const LayoutBoxModelObject& paintInvalidationContainer, const PaintInvalidationState* paintInvalidationState) const
-{
- return PaintLayer::computePaintInvalidationRect(*this, paintInvalidationContainer.layer(), paintInvalidationState);
-}
-
const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(const LayoutRect& dirtyRect) const
{
RELEASE_ASSERT(isRooted());
@@ -1312,7 +1301,7 @@ const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(const
const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintInvalidation();
LayoutRect dirtyRectOnBacking = dirtyRect;
- PaintLayer::mapRectToPaintInvalidationBacking(this, &paintInvalidationContainer, dirtyRectOnBacking);
+ PaintLayer::mapRectToPaintInvalidationBacking(*this, paintInvalidationContainer, dirtyRectOnBacking);
invalidatePaintUsingContainer(paintInvalidationContainer, dirtyRectOnBacking, PaintInvalidationRectangle);
return &paintInvalidationContainer;
}
@@ -1340,12 +1329,14 @@ void LayoutObject::invalidateTreeIfNeeded(const PaintInvalidationState& paintInv
if (!shouldCheckForPaintInvalidation(paintInvalidationState))
return;
- PaintInvalidationReason reason = invalidatePaintIfNeeded(paintInvalidationState);
- clearPaintInvalidationFlags(paintInvalidationState);
+ PaintInvalidationState newPaintInvalidationState(paintInvalidationState, *this);
+ PaintInvalidationReason reason = invalidatePaintIfNeeded(newPaintInvalidationState);
+ clearPaintInvalidationFlags(newPaintInvalidationState);
if (reason == PaintInvalidationDelayedFull)
- paintInvalidationState.pushDelayedPaintInvalidationTarget(*this);
+ newPaintInvalidationState.pushDelayedPaintInvalidationTarget(*this);
+ newPaintInvalidationState.updateForChildren();
invalidatePaintOfSubtreesIfNeeded(paintInvalidationState);
}
@@ -1369,7 +1360,10 @@ static PassOwnPtr<TracedValue> jsonObjectForOldAndNewRects(const LayoutRect& old
LayoutRect LayoutObject::selectionRectInViewCoordinates() const
{
- return selectionRectForPaintInvalidation(view());
chrishtr 2016/03/24 00:53:52 Delete the selectionRectForPaintInvalidation() fun
Xianzhu 2016/03/25 16:35:54 Already deleted. (Actually, renamed to localSelect
+ LayoutRect selectionRect = localSelectionRect();
+ if (!selectionRect.isEmpty())
+ mapToVisibleRectInAncestorSpace(view(), selectionRect);
+ return selectionRect;
}
LayoutRect LayoutObject::previousSelectionRectForPaintInvalidation() const
@@ -1404,13 +1398,16 @@ inline void LayoutObject::invalidateSelectionIfNeeded(const LayoutBoxModelObject
return;
LayoutRect oldSelectionRect = previousSelectionRectForPaintInvalidation();
- LayoutRect newSelectionRect = selectionRectForPaintInvalidation(&paintInvalidationContainer);
-
- // Composited scrolling should not be included in the bounds and position tracking, because the graphics layer backing the scroller
- // does not move on scroll.
- if (paintInvalidationContainer.usesCompositedScrolling() && &paintInvalidationContainer != this) {
- LayoutSize inverseOffset(toLayoutBox(&paintInvalidationContainer)->scrolledContentOffset());
- newSelectionRect.move(inverseOffset);
+ LayoutRect newSelectionRect = localSelectionRect();
+ if (!newSelectionRect.isEmpty()) {
chrishtr 2016/03/24 00:53:52 Make mapLocalRectToPaintInvalidationBacking() earl
Xianzhu 2016/03/25 16:35:54 I tried that but it broke some cases because somet
+ paintInvalidationState.mapLocalRectToPaintInvalidationBacking(newSelectionRect);
+
+ // Composited scrolling should not be included in the bounds and position tracking, because the graphics layer backing the scroller
+ // does not move on scroll.
+ if (paintInvalidationContainer.usesCompositedScrolling() && &paintInvalidationContainer != this) {
+ LayoutSize inverseOffset(toLayoutBox(&paintInvalidationContainer)->scrolledContentOffset());
+ newSelectionRect.move(inverseOffset);
+ }
}
setPreviousSelectionRectForPaintInvalidation(newSelectionRect);
@@ -1426,6 +1423,8 @@ inline void LayoutObject::invalidateSelectionIfNeeded(const LayoutBoxModelObject
PaintInvalidationReason LayoutObject::invalidatePaintIfNeeded(const PaintInvalidationState& paintInvalidationState)
{
+ ASSERT(&paintInvalidationState.currentObject() == this);
+
if (styleRef().hasOutline()) {
PaintLayer& layer = paintInvalidationState.enclosingSelfPaintingLayer(*this);
if (layer.layoutObject() != this)
@@ -1442,8 +1441,8 @@ PaintInvalidationReason LayoutObject::invalidatePaintIfNeeded(const PaintInvalid
const LayoutRect oldBounds = previousPaintInvalidationRect();
const LayoutPoint oldLocation = RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() ? LayoutPoint() : previousPositionFromPaintInvalidationBacking();
- LayoutRect newBounds = boundsRectForPaintInvalidation(paintInvalidationContainer, &paintInvalidationState);
- LayoutPoint newLocation = RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() ? LayoutPoint() : PaintLayer::positionFromPaintInvalidationBacking(this, &paintInvalidationContainer, &paintInvalidationState);
+ LayoutRect newBounds = paintInvalidationState.computePaintInvalidationRectInBacking();
+ LayoutPoint newLocation = RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() ? LayoutPoint() : paintInvalidationState.computePositionFromPaintInvalidationBacking();
// Composited scrolling should not be included in the bounds and position tracking, because the graphics layer backing the scroller
// does not move on scroll.
@@ -1629,25 +1628,22 @@ void LayoutObject::invalidatePaintForOverflowIfNeeded()
LayoutRect LayoutObject::absoluteClippedOverflowRect() const
{
- return clippedOverflowRectForPaintInvalidation(view());
+ LayoutRect rect = localOverflowRectForPaintInvalidation();
+ mapToVisibleRectInAncestorSpace(view(), rect);
+ return rect;
}
-LayoutRect LayoutObject::clippedOverflowRectForPaintInvalidation(const LayoutBoxModelObject*, const PaintInvalidationState*) const
+LayoutRect LayoutObject::localOverflowRectForPaintInvalidation() const
{
ASSERT_NOT_REACHED();
return LayoutRect();
}
-void LayoutObject::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ancestor, LayoutRect& rect, const PaintInvalidationState* paintInvalidationState) const
+void LayoutObject::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* ancestor, LayoutRect& rect) const
{
if (ancestor == this)
return;
- if (paintInvalidationState && paintInvalidationState->canMapToAncestor(ancestor)) {
- paintInvalidationState->mapObjectRectToAncestor(*this, ancestor, rect);
- return;
- }
-
if (LayoutObject* parent = this->parent()) {
if (parent->hasOverflowClip()) {
LayoutBox* parentBox = toLayoutBox(parent);
@@ -1658,7 +1654,7 @@ void LayoutObject::mapToVisibleRectInAncestorSpace(const LayoutBoxModelObject* a
return;
}
- parent->mapToVisibleRectInAncestorSpace(ancestor, rect, nullptr);
+ parent->mapToVisibleRectInAncestorSpace(ancestor, rect);
}
}
@@ -2243,21 +2239,11 @@ FloatQuad LayoutObject::ancestorToLocalQuad(LayoutBoxModelObject* ancestor, cons
return transformState.lastPlanarQuad();
}
-void LayoutObject::mapLocalToAncestor(const LayoutBoxModelObject* ancestor, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed, const PaintInvalidationState* paintInvalidationState) const
+void LayoutObject::mapLocalToAncestor(const LayoutBoxModelObject* ancestor, TransformState& transformState, MapCoordinatesFlags mode, bool* wasFixed) const
{
if (ancestor == this)
return;
- if (paintInvalidationState && paintInvalidationState->canMapToAncestor(ancestor)) {
- LayoutSize offset = paintInvalidationState->paintOffset();
- if (const LayoutBox* layoutBox = isBox() ? toLayoutBox(this) : nullptr)
- offset += layoutBox->locationOffset();
- if (const PaintLayer* layer = style()->hasInFlowPosition() && hasLayer() ? toLayoutBoxModelObject(this)->layer() : nullptr)
- offset += layer->offsetForInFlowPosition();
- transformState.move(offset);
- return;
- }
-
if (wasFixed)
*wasFixed = mode & IsFixed;
@@ -2304,7 +2290,7 @@ void LayoutObject::mapLocalToAncestor(const LayoutBoxModelObject* ancestor, Tran
return;
}
- o->mapLocalToAncestor(ancestor, transformState, mode, wasFixed, paintInvalidationState);
+ o->mapLocalToAncestor(ancestor, transformState, mode, wasFixed);
}
const LayoutObject* LayoutObject::pushMappingToContainer(const LayoutBoxModelObject* ancestorToStopAt, LayoutGeometryMap& geometryMap) const
@@ -2403,10 +2389,10 @@ FloatQuad LayoutObject::localToAncestorQuad(const FloatQuad& localQuad, const La
return transformState.lastPlanarQuad();
}
-FloatPoint LayoutObject::localToAncestorPoint(const FloatPoint& localPoint, const LayoutBoxModelObject* ancestor, MapCoordinatesFlags mode, bool* wasFixed, const PaintInvalidationState* paintInvalidationState) const
+FloatPoint LayoutObject::localToAncestorPoint(const FloatPoint& localPoint, const LayoutBoxModelObject* ancestor, MapCoordinatesFlags mode, bool* wasFixed) const
{
TransformState transformState(TransformState::ApplyTransformDirection, localPoint);
- mapLocalToAncestor(ancestor, transformState, mode | ApplyContainerFlip | UseTransforms, wasFixed, paintInvalidationState);
+ mapLocalToAncestor(ancestor, transformState, mode | ApplyContainerFlip | UseTransforms, wasFixed);
transformState.flatten();
return transformState.lastPlanarPoint();
@@ -2449,7 +2435,7 @@ FloatPoint LayoutObject::localToInvalidationBackingPoint(const LayoutPoint& loca
if (paintInvalidationContainer.layer()->compositingState() == NotComposited)
return containerPoint;
- PaintLayer::mapPointToPaintBackingCoordinates(&paintInvalidationContainer, containerPoint);
+ PaintLayer::mapPointInPaintInvalidationContainerToBacking(paintInvalidationContainer, containerPoint);
return containerPoint;
}

Powered by Google App Engine
This is Rietveld 408576698