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

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

Issue 1416053003: Let synchronized painting generate correct paint invalidation rects (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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 33ebe5d70e5514d82cfa6dbdc943c3469146d4cd..dfd8b14c5d93be04c7742c69b63332d441a764c6 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -1192,11 +1192,8 @@ static void invalidatePaintRectangleOnWindow(const LayoutBoxModelObject& paintIn
window->invalidateRect(frameView->contentsToRootFrame(paintRect));
}
-void LayoutObject::invalidatePaintUsingContainer(const LayoutBoxModelObject& paintInvalidationContainer, const LayoutRect& dirtyRect, PaintInvalidationReason invalidationReason) const
+void LayoutObject::invalidatePaintUsingContainer(const LayoutBoxModelObject& paintInvalidationContainer, const LayoutRect& dirtyRect, PaintInvalidationReason invalidationReason, Vector<LayoutRect>& paintInvalidationRects) const
{
- if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled())
- return;
-
if (paintInvalidationContainer.frameView()->shouldThrottleRendering())
return;
@@ -1207,6 +1204,11 @@ void LayoutObject::invalidatePaintUsingContainer(const LayoutBoxModelObject& pai
RELEASE_ASSERT(isRooted());
+ if (RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) {
+ paintInvalidationRects.append(dirtyRect);
+ return;
+ }
+
// FIXME: Unify "devtools.timeline.invalidationTracking" and "blink.invalidation". crbug.com/413527.
TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline.invalidationTracking"),
"PaintInvalidationTracking",
@@ -1231,18 +1233,17 @@ void LayoutObject::invalidateDisplayItemClient(const DisplayItemClientWrapper& d
if (PaintLayer* enclosingLayer = this->enclosingLayer()) {
// This is valid because we want to invalidate the client in the display item list of the current backing.
DisableCompositingQueryAsserts disabler;
- // Only the object needs to be invalidated, so use an empty invalidation rect.
- LayoutRect invalidationRect;
+ // Only the objects need to be invalidated, not any paint rectangles.
if (const PaintLayer* paintInvalidationLayer = enclosingLayer->enclosingLayerForPaintInvalidationCrossingFrameBoundaries())
- paintInvalidationLayer->layoutObject()->invalidateDisplayItemClientOnBacking(displayItemClient, PaintInvalidationFull, invalidationRect, invalidationRect);
+ paintInvalidationLayer->layoutObject()->invalidateDisplayItemClientOnBacking(displayItemClient, PaintInvalidationFull, Vector<LayoutRect>());
enclosingLayer->setNeedsRepaint();
}
}
-void LayoutObject::invalidateDisplayItemClients(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason, const LayoutRect& previousPaintInvalidationRect, const LayoutRect& newPaintInvalidationRect) const
+void LayoutObject::invalidateDisplayItemClients(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason, const Vector<LayoutRect>& paintInvalidationRects) const
{
- paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*this, invalidationReason, previousPaintInvalidationRect, newPaintInvalidationRect);
+ paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*this, invalidationReason, paintInvalidationRects);
if (PaintLayer* enclosingLayer = this->enclosingLayer())
enclosingLayer->setNeedsRepaint();
@@ -1255,35 +1256,25 @@ LayoutRect LayoutObject::boundsRectForPaintInvalidation(const LayoutBoxModelObje
return PaintLayer::computePaintInvalidationRect(this, paintInvalidationContainer->layer(), paintInvalidationState);
}
-const LayoutBoxModelObject* LayoutObject::invalidatePaintRectangleInternal(LayoutRect& dirtyRect) const
+void LayoutObject::invalidatePaintRectangleForDisplayItemClient(const DisplayItemClientWrapper& displayItemClient, const LayoutRect& dirtyRect) const
{
RELEASE_ASSERT(isRooted());
if (dirtyRect.isEmpty())
- return nullptr;
+ return;
if (view()->document().printing())
- return nullptr; // Don't invalidate paints if we're printing.
+ return; // Don't invalidate paints if we're printing.
const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintInvalidationOnRootedTree();
- PaintLayer::mapRectToPaintInvalidationBacking(this, &paintInvalidationContainer, dirtyRect);
- invalidatePaintUsingContainer(paintInvalidationContainer, dirtyRect, PaintInvalidationRectangle);
- return &paintInvalidationContainer;
-}
-
-void LayoutObject::invalidatePaintRectangle(const LayoutRect& rect) const
-{
- LayoutRect dirtyRect(rect);
- const LayoutBoxModelObject* paintInvalidationContainer = invalidatePaintRectangleInternal(dirtyRect);
- if (paintInvalidationContainer) {
- invalidateDisplayItemClients(*paintInvalidationContainer, PaintInvalidationRectangle, dirtyRect, dirtyRect);
- }
-}
+ LayoutRect rect(dirtyRect);
+ PaintLayer::mapRectToPaintInvalidationBacking(this, &paintInvalidationContainer, rect);
+ Vector<LayoutRect> paintInvalidationRects;
+ invalidatePaintUsingContainer(paintInvalidationContainer, rect, PaintInvalidationRectangle, paintInvalidationRects);
+ paintInvalidationContainer.invalidateDisplayItemClientOnBacking(displayItemClient, PaintInvalidationRectangle, paintInvalidationRects);
-void LayoutObject::invalidatePaintRectangleNotInvalidatingDisplayItemClients(const LayoutRect& r) const
-{
- LayoutRect dirtyRect(r);
- invalidatePaintRectangleInternal(dirtyRect);
+ if (PaintLayer* enclosingLayer = this->enclosingLayer())
+ enclosingLayer->setNeedsRepaint();
}
void LayoutObject::invalidateTreeIfNeeded(PaintInvalidationState& paintInvalidationState)
@@ -1370,13 +1361,12 @@ inline void LayoutObject::invalidateSelectionIfNeeded(const LayoutBoxModelObject
setPreviousSelectionRectForPaintInvalidation(newSelectionRect);
- if (shouldInvalidateSelection())
- invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationSelection, oldSelectionRect, newSelectionRect);
-
- if (fullInvalidation)
- return;
+ Vector<LayoutRect> paintInvalidationRects;
+ if (!fullInvalidation)
+ fullyInvalidatePaint(paintInvalidationContainer, PaintInvalidationSelection, oldSelectionRect, newSelectionRect, paintInvalidationRects);
- fullyInvalidatePaint(paintInvalidationContainer, PaintInvalidationSelection, oldSelectionRect, newSelectionRect);
+ if (shouldInvalidateSelection())
+ invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationSelection, paintInvalidationRects);
}
PaintInvalidationReason LayoutObject::invalidatePaintIfNeeded(PaintInvalidationState& paintInvalidationState, const LayoutBoxModelObject& paintInvalidationContainer)
@@ -1429,19 +1419,18 @@ PaintInvalidationReason LayoutObject::invalidatePaintIfNeeded(PaintInvalidationS
// invalidation is issued. See crbug.com/508383 and crbug.com/515977.
// This is a workaround to force display items to update paint offset.
if (!RuntimeEnabledFeatures::slimmingPaintOffsetCachingEnabled() && paintInvalidationState.forcedSubtreeInvalidationWithinContainer())
- invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason, oldBounds, newBounds);
+ invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason, Vector<LayoutRect>());
return invalidationReason;
}
- invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason, oldBounds, newBounds);
-
- if (invalidationReason == PaintInvalidationIncremental) {
- incrementallyInvalidatePaint(paintInvalidationContainer, oldBounds, newBounds, newLocation);
- return invalidationReason;
- }
+ Vector<LayoutRect> paintInvalidationRects;
+ if (invalidationReason == PaintInvalidationIncremental)
+ incrementallyInvalidatePaint(paintInvalidationContainer, oldBounds, newBounds, newLocation, paintInvalidationRects);
+ else
+ fullyInvalidatePaint(paintInvalidationContainer, invalidationReason, oldBounds, newBounds, paintInvalidationRects);
- fullyInvalidatePaint(paintInvalidationContainer, invalidationReason, oldBounds, newBounds);
+ invalidateDisplayItemClients(paintInvalidationContainer, invalidationReason, paintInvalidationRects);
return invalidationReason;
}
@@ -1540,7 +1529,7 @@ void LayoutObject::adjustPreviousPaintInvalidationForScrollIfNeeded(const Double
m_previousPaintInvalidationRect.move(LayoutSize(scrollDelta));
}
-void LayoutObject::incrementallyInvalidatePaint(const LayoutBoxModelObject& paintInvalidationContainer, const LayoutRect& oldBounds, const LayoutRect& newBounds, const LayoutPoint& positionFromPaintInvalidationBacking)
+void LayoutObject::incrementallyInvalidatePaint(const LayoutBoxModelObject& paintInvalidationContainer, const LayoutRect& oldBounds, const LayoutRect& newBounds, const LayoutPoint& positionFromPaintInvalidationBacking, Vector<LayoutRect>& paintInvalidationRects)
{
ASSERT(oldBounds.location() == newBounds.location());
@@ -1548,35 +1537,35 @@ void LayoutObject::incrementallyInvalidatePaint(const LayoutBoxModelObject& pain
if (deltaRight > 0) {
LayoutRect invalidationRect(oldBounds.maxX(), newBounds.y(), deltaRight, newBounds.height());
adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
- invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental, paintInvalidationRects);
} else if (deltaRight < 0) {
LayoutRect invalidationRect(newBounds.maxX(), oldBounds.y(), -deltaRight, oldBounds.height());
adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
- invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental, paintInvalidationRects);
}
LayoutUnit deltaBottom = newBounds.maxY() - oldBounds.maxY();
if (deltaBottom > 0) {
LayoutRect invalidationRect(newBounds.x(), oldBounds.maxY(), newBounds.width(), deltaBottom);
adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
- invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental, paintInvalidationRects);
} else if (deltaBottom < 0) {
LayoutRect invalidationRect(oldBounds.x(), newBounds.maxY(), oldBounds.width(), -deltaBottom);
adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
- invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental, paintInvalidationRects);
}
}
-void LayoutObject::fullyInvalidatePaint(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason, const LayoutRect& oldBounds, const LayoutRect& newBounds)
+void LayoutObject::fullyInvalidatePaint(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason, const LayoutRect& oldBounds, const LayoutRect& newBounds, Vector<LayoutRect>& paintInvalidationRects)
{
// Otherwise do full paint invalidation.
LayoutRect invalidationRect = oldBounds;
adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
- invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, invalidationReason);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, invalidationReason, paintInvalidationRects);
if (newBounds != oldBounds) {
invalidationRect = newBounds;
adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
- invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, invalidationReason);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, invalidationReason, paintInvalidationRects);
}
}
@@ -3380,8 +3369,7 @@ void LayoutObject::invalidateDisplayItemClientForNonCompositingDescendantsOf(con
void operator()(LayoutObject& object) const override
{
// Only the objects need to be invalidated, not any paint rectangles.
- LayoutRect invalidationRect;
- object.invalidateDisplayItemClients(m_paintInvalidationContainer, PaintInvalidationFull, invalidationRect, invalidationRect);
+ object.invalidateDisplayItemClients(m_paintInvalidationContainer, PaintInvalidationFull, Vector<LayoutRect>());
}
private:
const LayoutBoxModelObject& m_paintInvalidationContainer;
@@ -3399,8 +3387,9 @@ void LayoutObject::invalidatePaintOfPreviousPaintInvalidationRect(const LayoutBo
LayoutRect invalidationRect = previousPaintInvalidationRect();
adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
- invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationLayer);
- invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationLayer, invalidationRect, invalidationRect);
+ Vector<LayoutRect> paintInvalidationRects;
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationLayer, paintInvalidationRects);
+ invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationLayer, paintInvalidationRects);
}
void LayoutObject::invalidatePaintIncludingNonCompositingDescendants()

Powered by Google App Engine
This is Rietveld 408576698