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 be29aed941931fae5913704241b01e6662f9e136..5cc93b1683506567ed99956bed6803f0b730b0dc 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintInvalidator.cpp |
@@ -68,8 +68,8 @@ LayoutRect PaintInvalidator::MapLocalRectToVisualRectInBacking( |
if (!is_svg_child) { |
if (object.IsBox()) { |
ToLayoutBox(object).FlipForWritingMode(rect); |
- } else if (!(context.forced_subtree_invalidation_flags & |
- PaintInvalidatorContext::kForcedSubtreeSlowPathRect)) { |
+ } else if (!(context.subtree_flags & |
+ PaintInvalidatorContext::kSubtreeSlowPathRect)) { |
// For SPv2 and the GeometryMapper path, we also need to convert the rect |
// for non-boxes into physical coordinates before applying paint offset. |
// (Otherwise we'll call mapToVisualrectInAncestorSpace() which requires |
@@ -92,20 +92,11 @@ LayoutRect PaintInvalidator::MapLocalRectToVisualRectInBacking( |
return LayoutRect(EnclosingIntRect(rect)); |
} |
- // If kForcedSubtreeNoRasterInvalidation is set, we map the rect to the |
- // temporary root paint property state instead of the paint invalidation |
- // backing. |
- bool map_to_backing = |
- !(context.forced_subtree_invalidation_flags & |
- PaintInvalidatorContext::kForcedSubtreeNoRasterInvalidation); |
- |
LayoutRect result; |
- if (context.forced_subtree_invalidation_flags & |
- PaintInvalidatorContext::kForcedSubtreeSlowPathRect) { |
+ if (context.subtree_flags & PaintInvalidatorContext::kSubtreeSlowPathRect) { |
result = SlowMapToVisualRectInAncestorSpace( |
object, *context.paint_invalidation_container, rect); |
} else if (object == context.paint_invalidation_container) { |
- DCHECK(map_to_backing); |
result = LayoutRect(rect); |
} else { |
// For non-root SVG, the input rect is in local SVG coordinates in which |
@@ -114,9 +105,7 @@ LayoutRect PaintInvalidator::MapLocalRectToVisualRectInBacking( |
rect.MoveBy(Point(object.PaintOffset())); |
auto container_contents_properties = |
- map_to_backing |
- ? context.paint_invalidation_container->ContentsProperties() |
- : PropertyTreeState::Root(); |
+ context.paint_invalidation_container->ContentsProperties(); |
if (context.tree_builder_context_->current.transform == |
container_contents_properties.Transform() && |
context.tree_builder_context_->current.clip == |
@@ -143,13 +132,10 @@ LayoutRect PaintInvalidator::MapLocalRectToVisualRectInBacking( |
} |
// Convert the result to the container's contents space. |
- if (map_to_backing) |
- result.MoveBy(-context.paint_invalidation_container->PaintOffset()); |
+ result.MoveBy(-context.paint_invalidation_container->PaintOffset()); |
} |
object.AdjustVisualRectForRasterEffects(result); |
- if (!map_to_backing) |
- return result; |
PaintLayer::MapRectInPaintInvalidationContainerToBacking( |
*context.paint_invalidation_container, result); |
@@ -341,11 +327,11 @@ void PaintInvalidator::UpdatePaintInvalidationContainer( |
// container on which the current object is painted. |
context.paint_invalidation_container = |
context.paint_invalidation_container_for_stacked_contents; |
- if (context.forced_subtree_invalidation_flags & |
- PaintInvalidatorContext:: |
- kForcedSubtreeFullInvalidationForStackedContents) |
- context.forced_subtree_invalidation_flags |= |
- PaintInvalidatorContext::kForcedSubtreeFullInvalidation; |
+ if (context.subtree_flags & |
+ PaintInvalidatorContext::kSubtreeFullInvalidationForStackedContents) { |
+ context.subtree_flags |= |
+ PaintInvalidatorContext::kSubtreeFullInvalidation; |
+ } |
} |
if (object == context.paint_invalidation_container) { |
@@ -354,15 +340,14 @@ void PaintInvalidator::UpdatePaintInvalidationContainer( |
// descending into a different invalidation container. (For instance if |
// our parents were moved, the entire container will just move.) |
if (object != context.paint_invalidation_container_for_stacked_contents) { |
- // However, we need to keep kForcedSubtreeVisualRectUpdate and |
- // kForcedSubtreeFullInvalidationForStackedContents flags if the current |
+ // However, we need to keep kSubtreeVisualRectUpdate and |
+ // kSubtreeFullInvalidationForStackedContents flags if the current |
// object isn't the paint invalidation container of stacked contents. |
- context.forced_subtree_invalidation_flags &= |
- (PaintInvalidatorContext::kForcedSubtreeVisualRectUpdate | |
- PaintInvalidatorContext:: |
- kForcedSubtreeFullInvalidationForStackedContents); |
+ context.subtree_flags &= |
+ (PaintInvalidatorContext::kSubtreeVisualRectUpdate | |
+ PaintInvalidatorContext::kSubtreeFullInvalidationForStackedContents); |
} else { |
- context.forced_subtree_invalidation_flags = 0; |
+ context.subtree_flags = 0; |
} |
} |
@@ -469,6 +454,12 @@ void PaintInvalidator::InvalidatePaint( |
"PaintInvalidator::invalidatePaintIfNeeded()", "object", |
object.DebugName().Ascii()); |
+ if (object.IsSVGHiddenContainer()) { |
+ context.subtree_flags |= PaintInvalidatorContext::kSubtreeNoInvalidation; |
+ } |
+ if (context.subtree_flags & PaintInvalidatorContext::kSubtreeNoInvalidation) |
+ return; |
+ |
object.GetMutableForPainting().EnsureIsReadyForPaintInvalidation(); |
UpdatePaintingLayer(object, context); |
@@ -481,62 +472,53 @@ void PaintInvalidator::InvalidatePaint( |
// geometry effects, after skia optimizes filter's mapRect operation. |
// TODO(crbug.com/648274): This is a workaround for multi-column contents. |
if (object.HasFilterInducingProperty() || object.IsLayoutFlowThread()) { |
- context.forced_subtree_invalidation_flags |= |
- PaintInvalidatorContext::kForcedSubtreeSlowPathRect; |
+ context.subtree_flags |= PaintInvalidatorContext::kSubtreeSlowPathRect; |
} |
UpdatePaintInvalidationContainer(object, context); |
UpdateVisualRectIfNeeded(object, tree_builder_context, context); |
if (!object.ShouldCheckForPaintInvalidation() && |
- !(context.forced_subtree_invalidation_flags & |
- ~PaintInvalidatorContext::kForcedSubtreeVisualRectUpdate)) { |
+ !(context.subtree_flags & |
+ ~PaintInvalidatorContext::kSubtreeVisualRectUpdate)) { |
// We are done updating anything needed. No other paint invalidation work to |
// do for this object. |
return; |
} |
- if (object.IsSVGHiddenContainer()) { |
- context.forced_subtree_invalidation_flags |= |
- PaintInvalidatorContext::kForcedSubtreeNoRasterInvalidation; |
- } |
- |
PaintInvalidationReason reason = object.InvalidatePaint(context); |
switch (reason) { |
case PaintInvalidationReason::kDelayedFull: |
pending_delayed_paint_invalidations_.push_back(&object); |
break; |
case PaintInvalidationReason::kSubtree: |
- context.forced_subtree_invalidation_flags |= |
- (PaintInvalidatorContext::kForcedSubtreeFullInvalidation | |
- PaintInvalidatorContext:: |
- kForcedSubtreeFullInvalidationForStackedContents); |
+ context.subtree_flags |= |
+ (PaintInvalidatorContext::kSubtreeFullInvalidation | |
+ PaintInvalidatorContext::kSubtreeFullInvalidationForStackedContents); |
break; |
case PaintInvalidationReason::kSVGResource: |
- context.forced_subtree_invalidation_flags |= |
- PaintInvalidatorContext::kForcedSubtreeSVGResourceChange; |
+ context.subtree_flags |= |
+ PaintInvalidatorContext::kSubtreeSVGResourceChange; |
break; |
default: |
break; |
} |
if (object.MayNeedPaintInvalidationSubtree()) { |
- context.forced_subtree_invalidation_flags |= |
- PaintInvalidatorContext::kForcedSubtreeInvalidationChecking; |
+ context.subtree_flags |= |
+ PaintInvalidatorContext::kSubtreeInvalidationChecking; |
} |
if (context.old_location != context.new_location && |
!context.painting_layer->SubtreeIsInvisible()) { |
- context.forced_subtree_invalidation_flags |= |
- PaintInvalidatorContext::kForcedSubtreeInvalidationChecking; |
+ context.subtree_flags |= |
+ PaintInvalidatorContext::kSubtreeInvalidationChecking; |
} |
- if (context.forced_subtree_invalidation_flags && |
- context.NeedsVisualRectUpdate(object)) { |
+ if (context.subtree_flags && context.NeedsVisualRectUpdate(object)) { |
// If any subtree flag is set, we also need to pass needsVisualRectUpdate |
// requirement to the subtree. |
- context.forced_subtree_invalidation_flags |= |
- PaintInvalidatorContext::kForcedSubtreeVisualRectUpdate; |
+ context.subtree_flags |= PaintInvalidatorContext::kSubtreeVisualRectUpdate; |
} |
} |