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

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

Issue 1287413002: Fix paint invalidation rect tracking within composited scrolling layers. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 4 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
« Source/core/layout/LayoutObject.h ('K') | « Source/core/layout/LayoutObject.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/layout/LayoutObject.cpp
diff --git a/Source/core/layout/LayoutObject.cpp b/Source/core/layout/LayoutObject.cpp
index 22f34b4b5a918548b8158d669f200b8e1dcb3779..c317941f22a4a19dfa2727f60ed8536465bfffbe 100644
--- a/Source/core/layout/LayoutObject.cpp
+++ b/Source/core/layout/LayoutObject.cpp
@@ -1319,8 +1319,17 @@ PaintInvalidationReason LayoutObject::invalidatePaintIfNeeded(PaintInvalidationS
const LayoutRect oldBounds = previousPaintInvalidationRect();
const LayoutPoint oldLocation = previousPositionFromPaintInvalidationBacking();
- const LayoutRect newBounds = boundsRectForPaintInvalidation(&paintInvalidationContainer, &paintInvalidationState);
- const LayoutPoint newLocation = DeprecatedPaintLayer::positionFromPaintInvalidationBacking(this, &paintInvalidationContainer, &paintInvalidationState);
+ LayoutRect newBounds = boundsRectForPaintInvalidation(&paintInvalidationContainer, &paintInvalidationState);
+ LayoutPoint newLocation = DeprecatedPaintLayer::positionFromPaintInvalidationBacking(this, &paintInvalidationContainer, &paintInvalidationState);
+
+ // 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());
+ newLocation.move(inverseOffset);
+ newBounds.move(inverseOffset);
+ }
+
setPreviousPaintInvalidationRect(newBounds);
setPreviousPositionFromPaintInvalidationBacking(newLocation);
@@ -1422,29 +1431,52 @@ PaintInvalidationReason LayoutObject::paintInvalidationReason(const LayoutBoxMod
return PaintInvalidationIncremental;
}
+void LayoutObject::adjustInvalidationRectForCompositedScrolling(LayoutRect& rect, const LayoutBoxModelObject& paintInvalidationContainer)
+{
+ if (paintInvalidationContainer.usesCompositedScrolling() && &paintInvalidationContainer != this) {
+ LayoutSize offset(-toLayoutBox(&paintInvalidationContainer)->scrolledContentOffset());
+ rect.move(offset);
+ }
+}
+
void LayoutObject::incrementallyInvalidatePaint(const LayoutBoxModelObject& paintInvalidationContainer, const LayoutRect& oldBounds, const LayoutRect& newBounds, const LayoutPoint& positionFromPaintInvalidationBacking)
{
ASSERT(oldBounds.location() == newBounds.location());
LayoutUnit deltaRight = newBounds.maxX() - oldBounds.maxX();
- if (deltaRight > 0)
- invalidatePaintUsingContainer(paintInvalidationContainer, LayoutRect(oldBounds.maxX(), newBounds.y(), deltaRight, newBounds.height()), PaintInvalidationIncremental);
- else if (deltaRight < 0)
- invalidatePaintUsingContainer(paintInvalidationContainer, LayoutRect(newBounds.maxX(), oldBounds.y(), -deltaRight, oldBounds.height()), PaintInvalidationIncremental);
+ if (deltaRight > 0) {
+ LayoutRect invalidationRect(oldBounds.maxX(), newBounds.y(), deltaRight, newBounds.height());
+ adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
+ } else if (deltaRight < 0) {
+ LayoutRect invalidationRect(newBounds.maxX(), oldBounds.y(), -deltaRight, oldBounds.height());
+ adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
+ }
LayoutUnit deltaBottom = newBounds.maxY() - oldBounds.maxY();
- if (deltaBottom > 0)
- invalidatePaintUsingContainer(paintInvalidationContainer, LayoutRect(newBounds.x(), oldBounds.maxY(), newBounds.width(), deltaBottom), PaintInvalidationIncremental);
- else if (deltaBottom < 0)
- invalidatePaintUsingContainer(paintInvalidationContainer, LayoutRect(oldBounds.x(), newBounds.maxY(), oldBounds.width(), -deltaBottom), PaintInvalidationIncremental);
+ if (deltaBottom > 0) {
+ LayoutRect invalidationRect(newBounds.x(), oldBounds.maxY(), newBounds.width(), deltaBottom);
+ adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
+ } else if (deltaBottom < 0) {
+ LayoutRect invalidationRect(oldBounds.x(), newBounds.maxY(), oldBounds.width(), -deltaBottom);
+ adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, PaintInvalidationIncremental);
+ }
}
void LayoutObject::fullyInvalidatePaint(const LayoutBoxModelObject& paintInvalidationContainer, PaintInvalidationReason invalidationReason, const LayoutRect& oldBounds, const LayoutRect& newBounds)
{
// Otherwise do full paint invalidation.
- invalidatePaintUsingContainer(paintInvalidationContainer, oldBounds, invalidationReason);
- if (newBounds != oldBounds)
- invalidatePaintUsingContainer(paintInvalidationContainer, newBounds, invalidationReason);
+ LayoutRect invalidationRect = oldBounds;
+ adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, invalidationReason);
+ if (newBounds != oldBounds) {
+ invalidationRect = newBounds;
+ adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalidationContainer);
+ invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect, invalidationReason);
+ }
}
void LayoutObject::invalidatePaintForOverflow()
@@ -3287,7 +3319,9 @@ void LayoutObject::invalidatePaintIncludingNonCompositingDescendants()
explicit Functor(const LayoutBoxModelObject& paintInvalidationContainer) : m_paintInvalidationContainer(paintInvalidationContainer) { }
void operator()(LayoutObject& object) const override
{
- object.invalidatePaintUsingContainer(m_paintInvalidationContainer, object.previousPaintInvalidationRect(), PaintInvalidationLayer);
+ LayoutRect invalidationRect = object.previousPaintInvalidationRect();
+ object.adjustInvalidationRectForCompositedScrolling(invalidationRect, m_paintInvalidationContainer);
+ object.invalidatePaintUsingContainer(m_paintInvalidationContainer, invalidationRect, PaintInvalidationLayer);
if (RuntimeEnabledFeatures::slimmingPaintEnabled())
object.invalidateDisplayItemClients(m_paintInvalidationContainer);
}
« Source/core/layout/LayoutObject.h ('K') | « Source/core/layout/LayoutObject.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698