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

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

Issue 2829673002: Don't update descendant visual rects on border radius change (Closed)
Patch Set: Created 3 years, 8 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/PrePaintTreeWalk.cpp
diff --git a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
index aa17e9b4e655fb2ee0e15a8afb322410c96ab9d2..a66c093bc1c40fc68278c24baa6c1899cb9cf658 100644
--- a/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
+++ b/third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp
@@ -128,17 +128,20 @@ static void UpdateAuxiliaryObjectProperties(const LayoutObject& object,
context.ancestor_overflow_paint_layer = paint_layer;
}
-void PrePaintTreeWalk::ComputeClipRectForContext(
+LayoutRect PrePaintTreeWalk::ComputeClipRectForContext(
const PaintPropertyTreeBuilderContext::ContainingBlockContext& context,
const EffectPaintPropertyNode* effect,
const PropertyTreeState& ancestor_state,
- const LayoutPoint& ancestor_paint_offset,
- FloatClipRect& clip_rect) {
+ const LayoutPoint& ancestor_paint_offset) {
PropertyTreeState local_state(context.transform, context.clip, effect);
- clip_rect =
+ const auto& clip_rect =
GeometryMapper::SourceToDestinationClipRect(local_state, ancestor_state);
- clip_rect.MoveBy(-FloatPoint(ancestor_paint_offset));
+ // HasRadius() is ignored because it doesn't affect descendants' visual rects.
+ LayoutRect result(clip_rect.Rect());
+ if (!clip_rect.IsInfinite())
+ result.MoveBy(-ancestor_paint_offset);
+ return result;
}
void PrePaintTreeWalk::InvalidatePaintLayerOptimizationsIfNeeded(
@@ -159,7 +162,7 @@ void PrePaintTreeWalk::InvalidatePaintLayerOptimizationsIfNeeded(
PropertyTreeState ancestor_state = *ancestor.LocalBorderBoxProperties();
#ifdef CHECK_CLIP_RECTS
- ShouldRespectOverflowClipType respectOverflowClip = RespectOverflowClip;
+ auto respect_overflow_clip = kRespectOverflowClip;
#endif
if (context.ancestor_transformed_or_root_paint_layer->GetCompositingState() ==
kPaintsIntoOwnBacking) {
@@ -167,55 +170,61 @@ void PrePaintTreeWalk::InvalidatePaintLayerOptimizationsIfNeeded(
if (ancestor_properties && ancestor_properties->OverflowClip()) {
ancestor_state.SetClip(ancestor_properties->OverflowClip());
#ifdef CHECK_CLIP_RECTS
- respectOverflowClip = IgnoreOverflowClip;
+ respect_overflow_clip = kIgnoreOverflowClip;
#endif
}
}
#ifdef CHECK_CLIP_RECTS
- ClipRects& oldClipRects =
- paintLayer.clipper(PaintLayer::DoNotUseGeometryMapper)
- .paintingClipRects(&ancestorTransformedOrRootPaintLayer,
- respectOverflowClip, LayoutSize());
+ const auto& old_clip_rects =
+ paint_layer.Clipper(PaintLayer::kDoNotUseGeometryMapper)
+ .PaintingClipRects(context.ancestor_transformed_or_root_paint_layer,
+ respect_overflow_clip, LayoutSize());
#endif
- RefPtr<ClipRects> clip_rects = ClipRects::Create();
const LayoutPoint& ancestor_paint_offset =
context.ancestor_transformed_or_root_paint_layer->GetLayoutObject()
.PaintOffset();
- FloatClipRect clip_rect;
- const EffectPaintPropertyNode* effect =
- context.tree_builder_context->current_effect;
- ComputeClipRectForContext(context.tree_builder_context->current, effect,
- ancestor_state, ancestor_paint_offset, clip_rect);
- clip_rects->SetOverflowClipRect(clip_rect);
+ const auto* effect = context.tree_builder_context->current_effect;
+ auto overflow_clip_rect =
+ ComputeClipRectForContext(context.tree_builder_context->current, effect,
+ ancestor_state, ancestor_paint_offset);
#ifdef CHECK_CLIP_RECTS
- CHECK(clipRects->overflowClipRect() == oldClipRects.overflowClipRect())
- << "rect= " << clipRects->overflowClipRect().toString();
+ CHECK(overflow_clip_rect == old_clip_rects.OverflowClipRect().Rect())
+ << " new=" << overflow_clip_rect.ToString()
+ << " old=" << old_clip_rects.OverflowClipRect().Rect().ToString();
#endif
- ComputeClipRectForContext(context.tree_builder_context->fixed_position,
- effect, ancestor_state, ancestor_paint_offset,
- clip_rect);
- clip_rects->SetFixedClipRect(clip_rect);
+ auto fixed_clip_rect =
+ ComputeClipRectForContext(context.tree_builder_context->fixed_position,
+ effect, ancestor_state, ancestor_paint_offset);
#ifdef CHECK_CLIP_RECTS
- CHECK(clipRects->fixedClipRect() == oldClipRects.fixedClipRect())
- << " fixed=" << clipRects->fixedClipRect().toString();
+ CHECK(fixed_clip_rect == old_clip_rects.FixedClipRect().Rect())
+ << " new=" << fixed_clip_rect.ToString()
+ << " old=" << old_clip_rects.FixedClipRect().Rect().ToString();
#endif
- ComputeClipRectForContext(context.tree_builder_context->absolute_position,
- effect, ancestor_state, ancestor_paint_offset,
- clip_rect);
- clip_rects->SetPosClipRect(clip_rect);
+ auto pos_clip_rect =
+ ComputeClipRectForContext(context.tree_builder_context->absolute_position,
+ effect, ancestor_state, ancestor_paint_offset);
#ifdef CHECK_CLIP_RECTS
- CHECK(clipRects->posClipRect() == oldClipRects.posClipRect())
- << " abs=" << clipRects->posClipRect().toString();
+ CHECK(pos_clip_rect == old_clip_rects.PosClipRect().Rect())
+ << " new=" << pos_clip_rect.ToString()
+ << " old=" << old_clip_rects.PosClipRect().Rect().ToString();
#endif
- ClipRects* previous_clip_rects = paint_layer.PreviousPaintingClipRects();
+ const auto* previous_clip_rects = paint_layer.PreviousPaintingClipRects();
+ if (!previous_clip_rects ||
+ overflow_clip_rect != previous_clip_rects->OverflowClipRect().Rect() ||
+ fixed_clip_rect != previous_clip_rects->FixedClipRect().Rect() ||
+ pos_clip_rect != previous_clip_rects->PosClipRect().Rect()) {
+ RefPtr<ClipRects> clip_rects = ClipRects::Create();
+ clip_rects->SetOverflowClipRect(overflow_clip_rect);
+ clip_rects->SetFixedClipRect(fixed_clip_rect);
+ clip_rects->SetPosClipRect(pos_clip_rect);
+ paint_layer.SetPreviousPaintingClipRects(*clip_rects);
- if (!previous_clip_rects || *clip_rects != *previous_clip_rects) {
paint_layer.SetNeedsRepaint();
paint_layer.SetPreviousPaintPhaseDescendantOutlinesEmpty(false);
paint_layer.SetPreviousPaintPhaseFloatEmpty(false);
@@ -225,8 +234,6 @@ void PrePaintTreeWalk::InvalidatePaintLayerOptimizationsIfNeeded(
context.paint_invalidator_context.forced_subtree_invalidation_flags |=
PaintInvalidatorContext::kForcedSubtreeVisualRectUpdate;
}
-
- paint_layer.SetPreviousPaintingClipRects(*clip_rects);
}
bool PrePaintTreeWalk::NeedsTreeBuilderContextUpdate(
« no previous file with comments | « third_party/WebKit/Source/core/paint/PrePaintTreeWalk.h ('k') | third_party/WebKit/Source/core/paint/PrePaintTreeWalkTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698