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

Side by Side Diff: third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp

Issue 2872423002: Tweak PaintInvalidationReasons (Closed)
Patch Set: Rebaseline-cl Created 3 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/paint/BoxPaintInvalidator.h" 5 #include "core/paint/BoxPaintInvalidator.h"
6 6
7 #include "core/frame/Settings.h" 7 #include "core/frame/Settings.h"
8 #include "core/layout/LayoutView.h" 8 #include "core/layout/LayoutView.h"
9 #include "core/layout/compositing/CompositedLayerMapping.h" 9 #include "core/layout/compositing/CompositedLayerMapping.h"
10 #include "core/paint/ObjectPaintInvalidator.h" 10 #include "core/paint/ObjectPaintInvalidator.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 return LayoutRect(); 49 return LayoutRect();
50 } 50 }
51 51
52 bool BoxPaintInvalidator::IncrementallyInvalidatePaint( 52 bool BoxPaintInvalidator::IncrementallyInvalidatePaint(
53 PaintInvalidationReason reason, 53 PaintInvalidationReason reason,
54 const LayoutRect& old_rect, 54 const LayoutRect& old_rect,
55 const LayoutRect& new_rect) { 55 const LayoutRect& new_rect) {
56 DCHECK(old_rect.Location() == new_rect.Location()); 56 DCHECK(old_rect.Location() == new_rect.Location());
57 LayoutRect right_delta = ComputeRightDelta( 57 LayoutRect right_delta = ComputeRightDelta(
58 new_rect.Location(), old_rect.Size(), new_rect.Size(), 58 new_rect.Location(), old_rect.Size(), new_rect.Size(),
59 reason == kPaintInvalidationIncremental ? box_.BorderRight() 59 reason == PaintInvalidationReason::kIncremental ? box_.BorderRight()
60 : LayoutUnit()); 60 : LayoutUnit());
61 LayoutRect bottom_delta = ComputeBottomDelta( 61 LayoutRect bottom_delta = ComputeBottomDelta(
62 new_rect.Location(), old_rect.Size(), new_rect.Size(), 62 new_rect.Location(), old_rect.Size(), new_rect.Size(),
63 reason == kPaintInvalidationIncremental ? box_.BorderBottom() 63 reason == PaintInvalidationReason::kIncremental ? box_.BorderBottom()
64 : LayoutUnit()); 64 : LayoutUnit());
65 65
66 if (right_delta.IsEmpty() && bottom_delta.IsEmpty()) 66 if (right_delta.IsEmpty() && bottom_delta.IsEmpty())
67 return false; 67 return false;
68 68
69 ObjectPaintInvalidatorWithContext object_paint_invalidator(box_, context_); 69 ObjectPaintInvalidatorWithContext object_paint_invalidator(box_, context_);
70 object_paint_invalidator.InvalidatePaintRectangleWithContext(right_delta, 70 object_paint_invalidator.InvalidatePaintRectangleWithContext(right_delta,
71 reason); 71 reason);
72 object_paint_invalidator.InvalidatePaintRectangleWithContext(bottom_delta, 72 object_paint_invalidator.InvalidatePaintRectangleWithContext(bottom_delta,
73 reason); 73 reason);
74 return true; 74 return true;
75 } 75 }
76 76
77 PaintInvalidationReason BoxPaintInvalidator::ComputePaintInvalidationReason() { 77 PaintInvalidationReason BoxPaintInvalidator::ComputePaintInvalidationReason() {
78 PaintInvalidationReason reason = 78 PaintInvalidationReason reason =
79 ObjectPaintInvalidatorWithContext(box_, context_) 79 ObjectPaintInvalidatorWithContext(box_, context_)
80 .ComputePaintInvalidationReason(); 80 .ComputePaintInvalidationReason();
81 81
82 if (reason != kPaintInvalidationIncremental) 82 if (reason != PaintInvalidationReason::kIncremental)
83 return reason; 83 return reason;
84 84
85 if (box_.IsLayoutView()) { 85 if (box_.IsLayoutView()) {
86 const LayoutView& layout_view = ToLayoutView(box_); 86 const LayoutView& layout_view = ToLayoutView(box_);
87 // In normal compositing mode, root background doesn't need to be 87 // In normal compositing mode, root background doesn't need to be
88 // invalidated for box changes, because the background always covers the 88 // invalidated for box changes, because the background always covers the
89 // whole document rect and clipping is done by 89 // whole document rect and clipping is done by
90 // compositor()->m_containerLayer. Also the scrollbars are always 90 // compositor()->m_containerLayer. Also the scrollbars are always
91 // composited. There are no other box decoration on the LayoutView thus we 91 // composited. There are no other box decoration on the LayoutView thus we
92 // can safely exit here. 92 // can safely exit here.
93 if (layout_view.UsesCompositing() && 93 if (layout_view.UsesCompositing() &&
94 !RuntimeEnabledFeatures::rootLayerScrollingEnabled()) 94 !RuntimeEnabledFeatures::rootLayerScrollingEnabled())
95 return reason; 95 return reason;
96 } 96 }
97 97
98 const ComputedStyle& style = box_.StyleRef(); 98 const ComputedStyle& style = box_.StyleRef();
99 99
100 if ((style.BackgroundLayers().ThisOrNextLayersUseContentBox() || 100 if ((style.BackgroundLayers().ThisOrNextLayersUseContentBox() ||
101 style.MaskLayers().ThisOrNextLayersUseContentBox()) && 101 style.MaskLayers().ThisOrNextLayersUseContentBox()) &&
102 box_.PreviousContentBoxSize() != box_.ContentBoxRect().Size()) 102 box_.PreviousContentBoxSize() != box_.ContentBoxRect().Size())
103 return kPaintInvalidationContentBoxChange; 103 return PaintInvalidationReason::kGeometry;
104 104
105 LayoutSize old_border_box_size = box_.PreviousSize(); 105 LayoutSize old_border_box_size = box_.PreviousSize();
106 LayoutSize new_border_box_size = box_.Size(); 106 LayoutSize new_border_box_size = box_.Size();
107 bool border_box_changed = old_border_box_size != new_border_box_size; 107 bool border_box_changed = old_border_box_size != new_border_box_size;
108 if (!border_box_changed && context_.old_visual_rect == box_.VisualRect()) 108 if (!border_box_changed && context_.old_visual_rect == box_.VisualRect())
109 return kPaintInvalidationNone; 109 return PaintInvalidationReason::kNone;
110 110
111 // If either border box changed or bounds changed, and old or new border box 111 // If either border box changed or bounds changed, and old or new border box
112 // doesn't equal old or new bounds, incremental invalidation is not 112 // doesn't equal old or new bounds, incremental invalidation is not
113 // applicable. This captures the following cases: 113 // applicable. This captures the following cases:
114 // - pixel snapping of paint invalidation bounds, 114 // - pixel snapping of paint invalidation bounds,
115 // - scale, rotate, skew etc. transforms, 115 // - scale, rotate, skew etc. transforms,
116 // - visual overflows. 116 // - visual overflows.
117 if (context_.old_visual_rect != 117 if (context_.old_visual_rect !=
118 LayoutRect(context_.old_location, old_border_box_size) || 118 LayoutRect(context_.old_location, old_border_box_size) ||
119 box_.VisualRect() != 119 box_.VisualRect() !=
120 LayoutRect(context_.new_location, new_border_box_size)) { 120 LayoutRect(context_.new_location, new_border_box_size)) {
121 return border_box_changed ? kPaintInvalidationBorderBoxChange 121 return PaintInvalidationReason::kGeometry;
122 : kPaintInvalidationBoundsChange;
123 } 122 }
124 123
125 DCHECK(border_box_changed); 124 DCHECK(border_box_changed);
126 125
127 if (style.HasVisualOverflowingEffect() || style.HasAppearance() || 126 if (style.HasVisualOverflowingEffect() || style.HasAppearance() ||
128 style.HasFilterInducingProperty() || style.HasMask()) 127 style.HasFilterInducingProperty() || style.HasMask())
129 return kPaintInvalidationBorderBoxChange; 128 return PaintInvalidationReason::kGeometry;
130 129
131 if (style.HasBorderRadius()) 130 if (style.HasBorderRadius())
132 return kPaintInvalidationBorderBoxChange; 131 return PaintInvalidationReason::kGeometry;
133 132
134 if (old_border_box_size.Width() != new_border_box_size.Width() && 133 if (old_border_box_size.Width() != new_border_box_size.Width() &&
135 box_.MustInvalidateBackgroundOrBorderPaintOnWidthChange()) 134 box_.MustInvalidateBackgroundOrBorderPaintOnWidthChange())
136 return kPaintInvalidationBorderBoxChange; 135 return PaintInvalidationReason::kGeometry;
137 if (old_border_box_size.Height() != new_border_box_size.Height() && 136 if (old_border_box_size.Height() != new_border_box_size.Height() &&
138 box_.MustInvalidateBackgroundOrBorderPaintOnHeightChange()) 137 box_.MustInvalidateBackgroundOrBorderPaintOnHeightChange())
139 return kPaintInvalidationBorderBoxChange; 138 return PaintInvalidationReason::kGeometry;
140 139
141 // Needs to repaint frame boundaries. 140 // Needs to repaint frame boundaries.
142 if (box_.IsFrameSet()) 141 if (box_.IsFrameSet())
143 return kPaintInvalidationBorderBoxChange; 142 return PaintInvalidationReason::kGeometry;
144 143
145 // Needs to repaint column rules. 144 // Needs to repaint column rules.
146 if (box_.IsLayoutMultiColumnSet()) 145 if (box_.IsLayoutMultiColumnSet())
147 return kPaintInvalidationBorderBoxChange; 146 return PaintInvalidationReason::kGeometry;
148 147
149 return kPaintInvalidationIncremental; 148 return PaintInvalidationReason::kIncremental;
150 } 149 }
151 150
152 bool BoxPaintInvalidator::BackgroundGeometryDependsOnLayoutOverflowRect() { 151 bool BoxPaintInvalidator::BackgroundGeometryDependsOnLayoutOverflowRect() {
153 return !box_.IsDocumentElement() && !box_.BackgroundStolenForBeingBody() && 152 return !box_.IsDocumentElement() && !box_.BackgroundStolenForBeingBody() &&
154 box_.StyleRef() 153 box_.StyleRef()
155 .BackgroundLayers() 154 .BackgroundLayers()
156 .ThisOrNextLayersHaveLocalAttachment(); 155 .ThisOrNextLayersHaveLocalAttachment();
157 } 156 }
158 157
159 // Background positioning in layout overflow rect doesn't mean it will 158 // Background positioning in layout overflow rect doesn't mean it will
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 // Check change of layout overflow for full or incremental invalidation. 211 // Check change of layout overflow for full or incremental invalidation.
213 if (new_layout_overflow == old_layout_overflow) 212 if (new_layout_overflow == old_layout_overflow)
214 return; 213 return;
215 bool should_fully_invalidate = 214 bool should_fully_invalidate =
216 ShouldFullyInvalidateBackgroundOnLayoutOverflowChange( 215 ShouldFullyInvalidateBackgroundOnLayoutOverflowChange(
217 old_layout_overflow, new_layout_overflow); 216 old_layout_overflow, new_layout_overflow);
218 if (!paints_onto_scrolling_contents_layer) { 217 if (!paints_onto_scrolling_contents_layer) {
219 if (should_fully_invalidate) { 218 if (should_fully_invalidate) {
220 box_.GetMutableForPainting() 219 box_.GetMutableForPainting()
221 .SetShouldDoFullPaintInvalidationWithoutGeometryChange( 220 .SetShouldDoFullPaintInvalidationWithoutGeometryChange(
222 kPaintInvalidationLayoutOverflowBoxChange); 221 PaintInvalidationReason::kBackground);
223 } 222 }
224 return; 223 return;
225 } 224 }
226 should_fully_invalidate_on_scrolling_contents_layer = 225 should_fully_invalidate_on_scrolling_contents_layer =
227 should_fully_invalidate; 226 should_fully_invalidate;
228 } 227 }
229 228
230 if (should_fully_invalidate_on_scrolling_contents_layer) { 229 if (should_fully_invalidate_on_scrolling_contents_layer) {
231 ObjectPaintInvalidatorWithContext(box_, context_) 230 ObjectPaintInvalidatorWithContext(box_, context_)
232 .FullyInvalidatePaint( 231 .FullyInvalidatePaint(
233 kPaintInvalidationBackgroundOnScrollingContentsLayer, 232 PaintInvalidationReason::kBackgroundOnScrollingContentsLayer,
234 old_layout_overflow, new_layout_overflow); 233 old_layout_overflow, new_layout_overflow);
235 } else { 234 } else {
236 IncrementallyInvalidatePaint( 235 IncrementallyInvalidatePaint(
237 kPaintInvalidationBackgroundOnScrollingContentsLayer, 236 PaintInvalidationReason::kBackgroundOnScrollingContentsLayer,
238 old_layout_overflow, new_layout_overflow); 237 old_layout_overflow, new_layout_overflow);
239 } 238 }
240 239
241 context_.painting_layer->SetNeedsRepaint(); 240 context_.painting_layer->SetNeedsRepaint();
242 // Currently we use CompositedLayerMapping as the DisplayItemClient to paint 241 // Currently we use CompositedLayerMapping as the DisplayItemClient to paint
243 // background on the scrolling contents layer. 242 // background on the scrolling contents layer.
244 ObjectPaintInvalidator(box_).InvalidateDisplayItemClient( 243 ObjectPaintInvalidator(box_).InvalidateDisplayItemClient(
245 *box_.Layer()->GetCompositedLayerMapping()->ScrollingContentsLayer(), 244 *box_.Layer()->GetCompositedLayerMapping()->ScrollingContentsLayer(),
246 kPaintInvalidationBackgroundOnScrollingContentsLayer); 245 PaintInvalidationReason::kBackgroundOnScrollingContentsLayer);
247 } 246 }
248 247
249 PaintInvalidationReason BoxPaintInvalidator::InvalidatePaint() { 248 PaintInvalidationReason BoxPaintInvalidator::InvalidatePaint() {
250 InvalidateScrollingContentsBackgroundIfNeeded(); 249 InvalidateScrollingContentsBackgroundIfNeeded();
251 250
252 PaintInvalidationReason reason = ComputePaintInvalidationReason(); 251 PaintInvalidationReason reason = ComputePaintInvalidationReason();
253 if (reason == kPaintInvalidationIncremental) { 252 if (reason == PaintInvalidationReason::kIncremental) {
254 bool invalidated; 253 bool invalidated;
255 if (box_.IsLayoutView() && 254 if (box_.IsLayoutView() &&
256 !RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { 255 !RuntimeEnabledFeatures::rootLayerScrollingEnabled()) {
257 invalidated = IncrementallyInvalidatePaint( 256 invalidated = IncrementallyInvalidatePaint(
258 reason, context_.old_visual_rect, box_.VisualRect()); 257 reason, context_.old_visual_rect, box_.VisualRect());
259 } else { 258 } else {
260 invalidated = IncrementallyInvalidatePaint( 259 invalidated = IncrementallyInvalidatePaint(
261 reason, LayoutRect(context_.old_location, box_.PreviousSize()), 260 reason, LayoutRect(context_.old_location, box_.PreviousSize()),
262 LayoutRect(context_.new_location, box_.Size())); 261 LayoutRect(context_.new_location, box_.Size()));
263 } 262 }
264 if (invalidated) { 263 if (invalidated) {
265 context_.painting_layer->SetNeedsRepaint(); 264 context_.painting_layer->SetNeedsRepaint();
266 box_.InvalidateDisplayItemClients(reason); 265 box_.InvalidateDisplayItemClients(reason);
267 } else { 266 } else {
268 reason = kPaintInvalidationNone; 267 reason = PaintInvalidationReason::kNone;
269 } 268 }
270 269
271 // Though we have done incremental invalidation, we still need to call 270 // Though we have done incremental invalidation, we still need to call
272 // ObjectPaintInvalidator with PaintInvalidationNone to do any other 271 // ObjectPaintInvalidator with PaintInvalidationNone to do any other
273 // required operations. 272 // required operations.
274 reason = std::max( 273 reason = std::max(reason, ObjectPaintInvalidatorWithContext(box_, context_)
275 reason, ObjectPaintInvalidatorWithContext(box_, context_) 274 .InvalidatePaintWithComputedReason(
276 .InvalidatePaintWithComputedReason(kPaintInvalidationNone)); 275 PaintInvalidationReason::kNone));
277 } else { 276 } else {
278 reason = ObjectPaintInvalidatorWithContext(box_, context_) 277 reason = ObjectPaintInvalidatorWithContext(box_, context_)
279 .InvalidatePaintWithComputedReason(reason); 278 .InvalidatePaintWithComputedReason(reason);
280 } 279 }
281 280
282 if (PaintLayerScrollableArea* area = box_.GetScrollableArea()) 281 if (PaintLayerScrollableArea* area = box_.GetScrollableArea())
283 area->InvalidatePaintOfScrollControlsIfNeeded(context_); 282 area->InvalidatePaintOfScrollControlsIfNeeded(context_);
284 283
285 // This is for the next invalidatePaintIfNeeded so must be at the end. 284 // This is for the next invalidatePaintIfNeeded so must be at the end.
286 SavePreviousBoxGeometriesIfNeeded(); 285 SavePreviousBoxGeometriesIfNeeded();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 if (NeedsToSavePreviousContentBoxSizeOrLayoutOverflowRect()) { 319 if (NeedsToSavePreviousContentBoxSizeOrLayoutOverflowRect()) {
321 box_.GetMutableForPainting() 320 box_.GetMutableForPainting()
322 .SavePreviousContentBoxSizeAndLayoutOverflowRect(); 321 .SavePreviousContentBoxSizeAndLayoutOverflowRect();
323 } else { 322 } else {
324 box_.GetMutableForPainting() 323 box_.GetMutableForPainting()
325 .ClearPreviousContentBoxSizeAndLayoutOverflowRect(); 324 .ClearPreviousContentBoxSizeAndLayoutOverflowRect();
326 } 325 }
327 } 326 }
328 327
329 } // namespace blink 328 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698