OLD | NEW |
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 #ifndef PaintInvalidator_h | 5 #ifndef PaintInvalidator_h |
6 #define PaintInvalidator_h | 6 #define PaintInvalidator_h |
7 | 7 |
8 #include "core/layout/LayoutObject.h" | 8 #include "core/layout/LayoutObject.h" |
9 #include "core/paint/PaintPropertyTreeBuilder.h" | 9 #include "core/paint/PaintPropertyTreeBuilder.h" |
10 #include "platform/geometry/LayoutRect.h" | 10 #include "platform/geometry/LayoutRect.h" |
11 #include "platform/wtf/Vector.h" | 11 #include "platform/wtf/Vector.h" |
12 | 12 |
13 namespace blink { | 13 namespace blink { |
14 | 14 |
15 struct PaintInvalidatorContext { | 15 struct PaintInvalidatorContext { |
16 USING_FAST_MALLOC(PaintInvalidatorContext); | 16 USING_FAST_MALLOC(PaintInvalidatorContext); |
17 | 17 |
18 public: | 18 public: |
19 PaintInvalidatorContext() : parent_context(nullptr) {} | 19 PaintInvalidatorContext() : parent_context(nullptr) {} |
20 | 20 |
21 PaintInvalidatorContext(const PaintInvalidatorContext& parent_context) | 21 PaintInvalidatorContext(const PaintInvalidatorContext& parent_context) |
22 : parent_context(&parent_context), | 22 : parent_context(&parent_context), |
23 forced_subtree_invalidation_flags( | 23 subtree_flags(parent_context.subtree_flags), |
24 parent_context.forced_subtree_invalidation_flags), | |
25 paint_invalidation_container( | 24 paint_invalidation_container( |
26 parent_context.paint_invalidation_container), | 25 parent_context.paint_invalidation_container), |
27 paint_invalidation_container_for_stacked_contents( | 26 paint_invalidation_container_for_stacked_contents( |
28 parent_context.paint_invalidation_container_for_stacked_contents), | 27 parent_context.paint_invalidation_container_for_stacked_contents), |
29 painting_layer(parent_context.painting_layer) {} | 28 painting_layer(parent_context.painting_layer) {} |
30 | 29 |
31 // This method is virtual temporarily to adapt PaintInvalidatorContext and the | 30 // This method is virtual temporarily to adapt PaintInvalidatorContext and the |
32 // legacy PaintInvalidationState for code shared by old code and new code. | 31 // legacy PaintInvalidationState for code shared by old code and new code. |
33 virtual void MapLocalRectToVisualRectInBacking(const LayoutObject&, | 32 virtual void MapLocalRectToVisualRectInBacking(const LayoutObject&, |
34 LayoutRect&) const; | 33 LayoutRect&) const; |
35 | 34 |
36 bool NeedsVisualRectUpdate(const LayoutObject& object) const { | 35 bool NeedsVisualRectUpdate(const LayoutObject& object) const { |
37 if (!RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled()) | 36 if (!RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled()) |
38 return true; | 37 return true; |
39 #if DCHECK_IS_ON() | 38 #if DCHECK_IS_ON() |
40 if (force_visual_rect_update_for_checking_) | 39 if (force_visual_rect_update_for_checking_) |
41 return true; | 40 return true; |
42 #endif | 41 #endif |
43 return object.NeedsPaintOffsetAndVisualRectUpdate() || | 42 return object.NeedsPaintOffsetAndVisualRectUpdate() || |
44 (forced_subtree_invalidation_flags & | 43 (subtree_flags & PaintInvalidatorContext::kSubtreeVisualRectUpdate); |
45 PaintInvalidatorContext::kForcedSubtreeVisualRectUpdate); | |
46 } | 44 } |
47 | 45 |
48 const PaintInvalidatorContext* parent_context; | 46 const PaintInvalidatorContext* parent_context; |
49 | 47 |
50 enum ForcedSubtreeInvalidationFlag { | 48 enum SubtreeFlag { |
51 kForcedSubtreeInvalidationChecking = 1 << 0, | 49 kSubtreeInvalidationChecking = 1 << 0, |
52 kForcedSubtreeVisualRectUpdate = 1 << 1, | 50 kSubtreeVisualRectUpdate = 1 << 1, |
53 kForcedSubtreeFullInvalidation = 1 << 2, | 51 kSubtreeFullInvalidation = 1 << 2, |
54 kForcedSubtreeFullInvalidationForStackedContents = 1 << 3, | 52 kSubtreeFullInvalidationForStackedContents = 1 << 3, |
55 kForcedSubtreeSVGResourceChange = 1 << 4, | 53 kSubtreeSVGResourceChange = 1 << 4, |
56 | 54 |
57 // TODO(crbug.com/637313): This is temporary before we support filters in | 55 // TODO(crbug.com/637313): This is temporary before we support filters in |
58 // paint property tree. | 56 // paint property tree. |
59 kForcedSubtreeSlowPathRect = 1 << 5, | 57 kSubtreeSlowPathRect = 1 << 5, |
60 | 58 |
61 // The paint invalidation tree walk invalidates paint caches, such as | 59 // When this flag is set, no paint or raster invalidation will be issued |
62 // DisplayItemClients and subsequence caches, and also the regions | 60 // for the subtree. |
63 // into which objects raster pixels. When this flag is set, raster region | |
64 // invalidations are not issued. | |
65 // | 61 // |
66 // Context: some objects in this paint walk, for example SVG resource | 62 // Context: some objects in this paint walk, for example SVG resource |
67 // container subtress, don't actually have any raster regions, because they | 63 // container subtrees, always paint onto temporary PaintControllers which |
68 // are used as "painting subroutines" for one or more other locations in | 64 // don't have cache, and don't actually have any raster regions, so they |
69 // SVG. | 65 // don't need any invalidation. They are used as "painting subroutines" |
70 kForcedSubtreeNoRasterInvalidation = 1 << 6, | 66 // for one or more other locations in SVG. |
| 67 kSubtreeNoInvalidation = 1 << 6, |
71 }; | 68 }; |
72 unsigned forced_subtree_invalidation_flags = 0; | 69 unsigned subtree_flags = 0; |
73 | 70 |
74 // The following fields can be null only before | 71 // The following fields can be null only before |
75 // PaintInvalidator::updateContext(). | 72 // PaintInvalidator::updateContext(). |
76 | 73 |
77 // The current paint invalidation container for normal flow objects. | 74 // The current paint invalidation container for normal flow objects. |
78 // It is the enclosing composited object. | 75 // It is the enclosing composited object. |
79 const LayoutBoxModelObject* paint_invalidation_container = nullptr; | 76 const LayoutBoxModelObject* paint_invalidation_container = nullptr; |
80 | 77 |
81 // The current paint invalidation container for stacked contents (stacking | 78 // The current paint invalidation container for stacked contents (stacking |
82 // contexts or positioned objects). It is the nearest ancestor composited | 79 // contexts or positioned objects). It is the nearest ancestor composited |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 PaintInvalidatorContext&); | 148 PaintInvalidatorContext&); |
152 ALWAYS_INLINE void UpdateVisualRect(const LayoutObject&, | 149 ALWAYS_INLINE void UpdateVisualRect(const LayoutObject&, |
153 PaintInvalidatorContext&); | 150 PaintInvalidatorContext&); |
154 | 151 |
155 Vector<const LayoutObject*> pending_delayed_paint_invalidations_; | 152 Vector<const LayoutObject*> pending_delayed_paint_invalidations_; |
156 }; | 153 }; |
157 | 154 |
158 } // namespace blink | 155 } // namespace blink |
159 | 156 |
160 #endif // PaintInvalidator_h | 157 #endif // PaintInvalidator_h |
OLD | NEW |