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

Unified Diff: third_party/WebKit/Source/core/paint/PaintInvalidator.cpp

Issue 2732573003: Skip paint property update and visual rect update if no geometry change (Closed)
Patch Set: - Created 3 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/paint/PaintInvalidator.cpp
diff --git a/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
index 54bb8dc00a85b2f0d1823554bdbaef2251a1dafa..d36054ec52d98fa52668826212c5d0b95fbeee2c 100644
--- a/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp
@@ -342,17 +342,9 @@ void PaintInvalidator::updatePaintInvalidationContainer(
DCHECK(context.paintingLayer == object.paintingLayer());
}
-void PaintInvalidator::updateVisualRect(const LayoutObject& object,
- PaintInvalidatorContext& context) {
- Optional<ScopedUndoFrameViewContentClipAndScroll>
- undoFrameViewContentClipAndScroll;
-
- if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled() &&
- object.isLayoutView() && !object.isPaintInvalidationContainer()) {
- undoFrameViewContentClipAndScroll.emplace(*toLayoutView(object).frameView(),
- context);
- }
-
+void PaintInvalidator::updateVisualRectIfNeeded(
+ const LayoutObject& object,
+ PaintInvalidatorContext& context) {
// TODO(crbug.com/637313): Use GeometryMapper which now supports filter
// geometry effects, after skia optimizes filter's mapRect operation.
// TODO(crbug.com/648274): This is a workaround for multi-column contents.
@@ -365,6 +357,50 @@ void PaintInvalidator::updateVisualRect(const LayoutObject& object,
context.oldVisualRect = object.visualRect();
context.oldLocation = objectPaintInvalidator.locationInBacking();
+ if (!needsVisualRectUpdate(object, context)) {
+#if CHECK_VISUAL_RECT_UPDATE
+ updateVisualRect(object, context);
+ DCHECK(
+ (context.oldVisualRect.isEmpty() && context.newVisualRect.isEmpty()) ||
+ enclosingIntRect(context.oldVisualRect) ==
+ enclosingIntRect(context.newVisualRect))
+ << "Visual rect changed without needsPaintOffsetAndVisualRectUpdate:"
+ << " object=" << object.debugName()
+ << " old=" << context.oldVisualRect.toString()
+ << " new=" << context.newVisualRect.toString();
+ DCHECK(object.isText() || context.oldLocation == context.newLocation)
+ << "Location changed without needsPaintOffsetAndVisualRectUpdate:"
+ << " old=" << context.oldLocation.toString()
+ << " new=" << context.newLocation.toString();
+#endif
+ context.newVisualRect = context.oldVisualRect;
+ context.newLocation = context.oldLocation;
+ return;
+ }
+
+#if DCHECK_IS_ON()
+ DCHECK(context.treeBuilderContext.updatedForSelf);
+#endif
+ updateVisualRect(object, context);
+ object.getMutableForPainting().setVisualRect(context.newVisualRect);
+ objectPaintInvalidator.setLocationInBacking(context.newLocation);
+}
+
+void PaintInvalidator::updateVisualRect(const LayoutObject& object,
+ PaintInvalidatorContext& context) {
+ // The paint offset should already be updated through
+ // PaintPropertyTreeBuilder::updatePropertiesForSelf.
+ DCHECK(context.treeBuilderContext.current.paintOffset ==
+ object.paintOffset());
+
+ Optional<ScopedUndoFrameViewContentClipAndScroll>
+ undoFrameViewContentClipAndScroll;
+ if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled() &&
+ object.isLayoutView() && !object.isPaintInvalidationContainer()) {
+ undoFrameViewContentClipAndScroll.emplace(*toLayoutView(object).frameView(),
+ context);
+ }
+
IntSize adjustment = object.scrollAdjustmentForPaintInvalidation(
*context.paintInvalidationContainer);
context.newVisualRect = computeVisualRectInBacking(object, context);
@@ -384,9 +420,6 @@ void PaintInvalidator::updateVisualRect(const LayoutObject& object,
if (context.newVisualRect.isEmpty())
context.newVisualRect.setLocation(context.newLocation);
}
-
- object.getMutableForPainting().setVisualRect(context.newVisualRect);
- objectPaintInvalidator.setLocationInBacking(context.newLocation);
}
void PaintInvalidator::invalidatePaintIfNeeded(
@@ -415,11 +448,6 @@ void PaintInvalidator::invalidatePaintIfNeeded(
object.getMutableForPainting().ensureIsReadyForPaintInvalidation();
- // The paint offset should already be updated through
- // PaintPropertyTreeBuilder::updatePropertiesForSelf.
- DCHECK(context.treeBuilderContext.current.paintOffset ==
- object.paintOffset());
-
updatePaintingLayer(object, context);
if (object.document().printing() &&
@@ -427,36 +455,13 @@ void PaintInvalidator::invalidatePaintIfNeeded(
return; // Don't invalidate paints if we're printing.
updatePaintInvalidationContainer(object, context);
+ updateVisualRectIfNeeded(object, context);
- bool objectShouldCheckForPaintInvalidation =
- object
- .shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState();
- if (!context.forcedSubtreeInvalidationFlags &&
- !objectShouldCheckForPaintInvalidation) {
-#if CHECK_VISUAL_RECT_UPDATE
- updateVisualRect(object, context);
- DCHECK(
- (context.oldVisualRect.isEmpty() && context.newVisualRect.isEmpty()) ||
- enclosingIntRect(context.oldVisualRect) ==
- enclosingIntRect(context.newVisualRect))
- << "Visual rect changed without needing paint invalidation:"
- << " object=" << object.debugName()
- << " old=" << context.oldVisualRect.toString()
- << " new=" << context.newVisualRect.toString();
- DCHECK(object.isText() || context.oldLocation == context.newLocation)
- << "Location changed without needing paint invalidation:"
- << " old=" << context.oldLocation.toString()
- << " new=" << context.newLocation.toString();
-#endif
- return;
- }
-
- updateVisualRect(object, context);
-
- if (!objectShouldCheckForPaintInvalidation &&
- context.forcedSubtreeInvalidationFlags ==
- PaintInvalidatorContext::ForcedSubtreeInvalidationRectUpdate) {
- // We are done updating the visual rect. No other paint invalidation work to
+ if (!object
+ .shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState() &&
+ !(context.forcedSubtreeInvalidationFlags &
+ ~PaintInvalidatorContext::ForcedSubtreeVisualRectUpdate)) {
+ // We are done updating anything needed. No other paint invalidation work to
// do for this object.
return;
}
@@ -497,4 +502,12 @@ void PaintInvalidator::processPendingDelayedPaintInvalidations() {
PaintInvalidationDelayedFull);
}
+bool PaintInvalidator::needsVisualRectUpdate(
+ const LayoutObject& object,
+ const PaintInvalidatorContext& context) {
+ return object.needsPaintOffsetAndVisualRectUpdate() ||
+ (context.forcedSubtreeInvalidationFlags &
+ ~PaintInvalidatorContext::ForcedSubtreeSlowPathRect);
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698