Index: third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp |
diff --git a/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp |
index f813347b85cce652662f1f1a2eaadc35f60fc2a0..59904bed5ccb7cb5d06908f4e97181cf876b5e1b 100644 |
--- a/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp |
+++ b/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp |
@@ -65,17 +65,16 @@ static LayoutRect computeBottomDelta(const LayoutPoint& location, |
} |
bool BoxPaintInvalidator::incrementallyInvalidatePaint() { |
- DCHECK(m_context.oldBounds.location() == m_context.newBounds.location()); |
- LayoutRect rightDelta = computeRightDelta(m_context.newBounds.location(), |
- m_context.oldBounds.size(), |
- m_context.newBounds.size(), 0); |
- LayoutRect bottomDelta = computeBottomDelta(m_context.newBounds.location(), |
- m_context.oldBounds.size(), |
- m_context.newBounds.size(), 0); |
+ const LayoutRect& oldRect = m_context.oldBounds.rect; |
+ const LayoutRect& newRect = m_context.newBounds.rect; |
+ DCHECK(oldRect.location() == newRect.location()); |
+ LayoutRect rightDelta = |
+ computeRightDelta(newRect.location(), oldRect.size(), newRect.size(), 0); |
+ LayoutRect bottomDelta = |
+ computeBottomDelta(newRect.location(), oldRect.size(), newRect.size(), 0); |
if (m_box.styleRef().hasBorder() || m_box.styleRef().hasBackground()) { |
- LayoutSize oldBorderBoxSize = |
- computePreviousBorderBoxSize(m_context.oldBounds.size()); |
+ LayoutSize oldBorderBoxSize = computePreviousBorderBoxSize(oldRect.size()); |
LayoutSize newBorderBoxSize = m_box.size(); |
DCHECK(m_context.oldLocation == m_context.newLocation); |
rightDelta.unite(computeRightDelta(m_context.newLocation, oldBorderBoxSize, |
@@ -99,8 +98,10 @@ void BoxPaintInvalidator::invalidatePaintRectClippedByOldAndNewBounds( |
return; |
ObjectPaintInvalidator objectPaintInvalidator(m_box); |
- LayoutRect rectClippedByOldBounds = intersection(rect, m_context.oldBounds); |
- LayoutRect rectClippedByNewBounds = intersection(rect, m_context.newBounds); |
+ LayoutRect rectClippedByOldBounds = |
+ intersection(rect, m_context.oldBounds.rect); |
+ LayoutRect rectClippedByNewBounds = |
+ intersection(rect, m_context.newBounds.rect); |
// Invalidate only once if the clipped rects equal. |
if (rectClippedByOldBounds == rectClippedByNewBounds) { |
objectPaintInvalidator.invalidatePaintUsingContainer( |
@@ -157,17 +158,27 @@ PaintInvalidationReason BoxPaintInvalidator::computePaintInvalidationReason() { |
return reason; |
} |
- // If the transform is not identity or translation, incremental invalidation |
- // is not applicable because the difference between oldBounds and newBounds |
- // doesn't cover all area needing invalidation. |
- // FIXME: Should also consider ancestor transforms since |
- // paintInvalidationContainer. crbug.com/426111. |
if (reason == PaintInvalidationIncremental && |
- m_context.oldBounds != m_context.newBounds && |
- m_context.paintInvalidationContainer != m_box && m_box.hasLayer() && |
- m_box.layer()->transform() && |
- !m_box.layer()->transform()->isIdentityOrTranslation()) |
- return PaintInvalidationBoundsChange; |
+ m_context.oldBounds.rect != m_context.newBounds.rect) { |
+ if (m_context.newBounds.coversExtraPixels || |
+ m_context.oldBounds.coversExtraPixels) { |
+ // Incremental invalidation is not applicable because the difference |
+ // between oldBounds and newBounds may not cover all changed pixels along |
+ // the edges. |
+ return PaintInvalidationBoundsChange; |
+ } |
+ |
+ // If the transform is not identity or translation, incremental invalidation |
+ // is not applicable because the difference between oldBounds and newBounds |
+ // doesn't cover all area needing invalidation. |
+ // TODO(crbug.com/426111): Should also consider ancestor transforms |
+ // since paintInvalidationContainer. Combine this logic into the above |
+ // boundsCoversExtraPixels logic. |
+ if (m_context.paintInvalidationContainer != m_box && m_box.hasLayer() && |
+ m_box.layer()->transform() && |
+ !m_box.layer()->transform()->isIdentityOrTranslation()) |
+ return PaintInvalidationBoundsChange; |
+ } |
const ComputedStyle& style = m_box.styleRef(); |
if (style.backgroundLayers().thisOrNextLayersUseContentBox() || |
@@ -180,7 +191,7 @@ PaintInvalidationReason BoxPaintInvalidator::computePaintInvalidationReason() { |
if (!style.hasBackground() && !style.hasBoxDecorations()) { |
if (reason == PaintInvalidationIncremental && |
- m_context.oldBounds != m_context.newBounds && |
+ m_context.oldBounds.rect != m_context.newBounds.rect && |
m_box.hasNonCompositedScrollbars()) |
return PaintInvalidationBorderBoxChange; |
return reason; |
@@ -193,7 +204,7 @@ PaintInvalidationReason BoxPaintInvalidator::computePaintInvalidationReason() { |
} |
LayoutSize oldBorderBoxSize = |
- computePreviousBorderBoxSize(m_context.oldBounds.size()); |
+ computePreviousBorderBoxSize(m_context.oldBounds.rect.size()); |
LayoutSize newBorderBoxSize = m_box.size(); |
if (oldBorderBoxSize == newBorderBoxSize) |
@@ -251,7 +262,7 @@ PaintInvalidationReason BoxPaintInvalidator::invalidatePaintIfNeeded() { |
} |
bool BoxPaintInvalidator::needsToSavePreviousBoxSizes() { |
- LayoutSize paintInvalidationSize = m_context.newBounds.size(); |
+ LayoutSize paintInvalidationSize = m_context.newBounds.rect.size(); |
// Don't save old box sizes if the paint rect is empty because we'll |
// full invalidate once the paint rect becomes non-empty. |
if (paintInvalidationSize.isEmpty()) |