Index: third_party/WebKit/Source/core/layout/LayoutBox.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
index 0f97f057cba0f058887e95779ee509f03ead0dce..7e2b702a73f1ba5aaa67065078c5f0207003e606 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
@@ -1481,10 +1481,30 @@ void LayoutBox::paintMask(const PaintInfo& paintInfo, const LayoutPoint& paintOf |
void LayoutBox::imageChanged(WrappedImagePtr image, const IntRect*) |
{ |
// TODO(chrishtr): support PaintInvalidationDelayedFull for animated border images. |
- if ((style()->borderImage().image() && style()->borderImage().image()->data() == image) |
- || (style()->maskBoxImage().image() && style()->maskBoxImage().image()->data() == image)) { |
+ if ((styleRef().borderImage().image() && styleRef().borderImage().image()->data() == image) |
+ || (styleRef().maskBoxImage().image() && styleRef().maskBoxImage().image()->data() == image)) { |
setShouldDoFullPaintInvalidation(); |
- return; |
+ } else { |
+ for (const FillLayer* layer = &styleRef().maskLayers(); layer; layer = layer->next()) { |
+ if (layer->image() && image == layer->image()->data()) { |
+ setShouldDoFullPaintInvalidation(); |
+ break; |
+ } |
+ } |
+ } |
+ |
+ if (!isDocumentElement() && !backgroundStolenForBeingBody()) { |
+ for (const FillLayer* layer = &styleRef().backgroundLayers(); layer; layer = layer->next()) { |
+ if (layer->image() && image == layer->image()->data()) { |
+ invalidateBackgroundObscurationStatus(); |
+ bool maybeAnimated = layer->image()->cachedImage() && layer->image()->cachedImage()->getImage() && layer->image()->cachedImage()->getImage()->maybeAnimated(); |
+ if (maybeAnimated) |
+ setMayNeedPaintInvalidationAnimatgedBackgroundImage(); |
+ else |
+ setShouldDoFullPaintInvalidation(); |
+ break; |
+ } |
+ } |
} |
ShapeValue* shapeOutsideValue = style()->shapeOutside(); |
@@ -1495,9 +1515,6 @@ void LayoutBox::imageChanged(WrappedImagePtr image, const IntRect*) |
markShapeOutsideDependentsForLayout(); |
} |
} |
- |
- if (!invalidatePaintOfLayerRectsForImage(image, style()->backgroundLayers(), true)) |
- invalidatePaintOfLayerRectsForImage(image, style()->maskLayers(), false); |
} |
ResourcePriority LayoutBox::computeResourcePriority() const |
@@ -1525,27 +1542,7 @@ ResourcePriority LayoutBox::computeResourcePriority() const |
return ResourcePriority(isVisible ? ResourcePriority::Visible : ResourcePriority::NotVisible, screenArea); |
} |
-bool LayoutBox::invalidatePaintOfLayerRectsForImage(WrappedImagePtr image, const FillLayer& layers, bool drawingBackground) |
-{ |
- if (drawingBackground && (isDocumentElement() || backgroundStolenForBeingBody())) |
- return false; |
- for (const FillLayer* curLayer = &layers; curLayer; curLayer = curLayer->next()) { |
- if (curLayer->image() && image == curLayer->image()->data()) { |
- bool maybeAnimated = curLayer->image()->cachedImage() && curLayer->image()->cachedImage()->getImage() && curLayer->image()->cachedImage()->getImage()->maybeAnimated(); |
- if (maybeAnimated && drawingBackground) |
- setShouldDoFullPaintInvalidation(PaintInvalidationDelayedFull); |
- else |
- setShouldDoFullPaintInvalidation(); |
- |
- if (drawingBackground) |
- invalidateBackgroundObscurationStatus(); |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-bool LayoutBox::intersectsVisibleViewport() |
+bool LayoutBox::intersectsVisibleViewport() const |
{ |
LayoutRect rect = visualOverflowRect(); |
LayoutView* layoutView = view(); |
@@ -1565,18 +1562,6 @@ PaintInvalidationReason LayoutBox::invalidatePaintIfNeeded(const PaintInvalidati |
layer.setNeedsPaintPhaseDescendantBlockBackgrounds(); |
} |
- PaintInvalidationReason fullInvalidationReason = fullPaintInvalidationReason(); |
- // If the current paint invalidation reason is PaintInvalidationDelayedFull, then this paint invalidation can delayed if the |
- // LayoutBox in question is not on-screen. The logic to decide whether this is appropriate exists at the site of the original |
- // paint invalidation that chose PaintInvalidationDelayedFull. |
- if (fullInvalidationReason == PaintInvalidationDelayedFull) { |
- if (!intersectsVisibleViewport()) |
- return PaintInvalidationDelayedFull; |
- |
- // Reset state back to regular full paint invalidation if the object is onscreen. |
- setShouldDoFullPaintInvalidation(PaintInvalidationFull); |
- } |
- |
PaintInvalidationReason reason = LayoutBoxModelObject::invalidatePaintIfNeeded(paintInvalidationState); |
if (PaintLayerScrollableArea* area = getScrollableArea()) |
@@ -3985,9 +3970,21 @@ PaintInvalidationReason LayoutBox::getPaintInvalidationReason(const PaintInvalid |
const LayoutRect& oldBounds, const LayoutPoint& oldLocation, const LayoutRect& newBounds, const LayoutPoint& newLocation) const |
{ |
PaintInvalidationReason invalidationReason = LayoutBoxModelObject::getPaintInvalidationReason(paintInvalidationState, oldBounds, oldLocation, newBounds, newLocation); |
- if (isFullPaintInvalidationReason(invalidationReason)) |
+ |
+ if (isFullPaintInvalidationReason(invalidationReason) && invalidationReason != PaintInvalidationDelayedFull) |
return invalidationReason; |
+ if (mayNeedPaintInvalidationAnimatedBackgroundImage() && !backgroundIsKnownToBeObscured()) |
+ invalidationReason = PaintInvalidationDelayedFull; |
+ |
+ // If the current paint invalidation reason is PaintInvalidationDelayedFull, then this paint invalidation can delayed if the |
+ // LayoutBox in question is not on-screen. The logic to decide whether this is appropriate exists at the site of the original |
+ // paint invalidation that chose PaintInvalidationDelayedFull. |
+ if (invalidationReason == PaintInvalidationDelayedFull) { |
+ // Do regular full paint invalidation if the object is onscreen. |
+ return intersectsVisibleViewport() ? PaintInvalidationFull : PaintInvalidationDelayedFull; |
+ } |
+ |
if (isLayoutView()) { |
const LayoutView* layoutView = toLayoutView(this); |
// In normal compositing mode, root background doesn't need to be invalidated for |