1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CompositingReasons_h
6 #define CompositingReasons_h
8 #include "platform/PlatformExport.h"
9 #include "wtf/MathExtras.h"
14 const uint64_t CompositingReasonNone
= 0;
15 const uint64_t CompositingReasonAll
= ~static_cast<uint64_t>(0);
17 // Intrinsic reasons that can be known right away by the layer
18 const uint64_t CompositingReason3DTransform
= UINT64_C(1) << 0;
19 const uint64_t CompositingReasonVideo
= UINT64_C(1) << 1;
20 const uint64_t CompositingReasonCanvas
= UINT64_C(1) << 2;
21 const uint64_t CompositingReasonPlugin
= UINT64_C(1) << 3;
22 const uint64_t CompositingReasonIFrame
= UINT64_C(1) << 4;
23 const uint64_t CompositingReasonBackfaceVisibilityHidden
= UINT64_C(1) << 5;
24 const uint64_t CompositingReasonActiveAnimation
= UINT64_C(1) << 6;
25 const uint64_t CompositingReasonTransitionProperty
= UINT64_C(1) << 7;
26 const uint64_t CompositingReasonPositionFixed
= UINT64_C(1) << 8;
27 const uint64_t CompositingReasonOverflowScrollingTouch
= UINT64_C(1) << 9;
28 const uint64_t CompositingReasonOverflowScrollingParent
= UINT64_C(1) << 10;
29 const uint64_t CompositingReasonOutOfFlowClipping
= UINT64_C(1) << 11;
30 const uint64_t CompositingReasonVideoOverlay
= UINT64_C(1) << 12;
31 const uint64_t CompositingReasonWillChangeCompositingHint
= UINT64_C(1) << 13;
32 const uint64_t CompositingReasonBackdropFilter
= UINT64_C(1) << 14;
34 // Overlap reasons that require knowing what's behind you in paint-order before knowing the answer
35 const uint64_t CompositingReasonAssumedOverlap
= UINT64_C(1) << 15;
36 const uint64_t CompositingReasonOverlap
= UINT64_C(1) << 16;
37 const uint64_t CompositingReasonNegativeZIndexChildren
= UINT64_C(1) << 17;
38 const uint64_t CompositingReasonScrollsWithRespectToSquashingLayer
= UINT64_C(1) << 18;
39 const uint64_t CompositingReasonSquashingSparsityExceeded
= UINT64_C(1) << 19;
40 const uint64_t CompositingReasonSquashingClippingContainerMismatch
= UINT64_C(1) << 20;
41 const uint64_t CompositingReasonSquashingOpacityAncestorMismatch
= UINT64_C(1) << 21;
42 const uint64_t CompositingReasonSquashingTransformAncestorMismatch
= UINT64_C(1) << 22;
43 const uint64_t CompositingReasonSquashingFilterMismatch
= UINT64_C(1) << 23;
44 const uint64_t CompositingReasonSquashingWouldBreakPaintOrder
= UINT64_C(1) << 24;
45 const uint64_t CompositingReasonSquashingVideoIsDisallowed
= UINT64_C(1) << 25;
46 const uint64_t CompositingReasonSquashedLayerClipsCompositingDescendants
= UINT64_C(1) << 26;
47 const uint64_t CompositingReasonSquashingLayoutPartIsDisallowed
= UINT64_C(1) << 27;
48 const uint64_t CompositingReasonSquashingReflectionIsDisallowed
= UINT64_C(1) << 28;
49 const uint64_t CompositingReasonSquashingBlendingIsDisallowed
= UINT64_C(1) << 29;
50 const uint64_t CompositingReasonSquashingNearestFixedPositionMismatch
= UINT64_C(1) << 30;
51 const uint64_t CompositingReasonScrollChildWithCompositedDescendants
= UINT64_C(1) << 31;
53 // Subtree reasons that require knowing what the status of your subtree is before knowing the answer
54 const uint64_t CompositingReasonTransformWithCompositedDescendants
= UINT64_C(1) << 32;
55 const uint64_t CompositingReasonOpacityWithCompositedDescendants
= UINT64_C(1) << 33;
56 const uint64_t CompositingReasonMaskWithCompositedDescendants
= UINT64_C(1) << 34;
57 const uint64_t CompositingReasonReflectionWithCompositedDescendants
= UINT64_C(1) << 35;
58 const uint64_t CompositingReasonFilterWithCompositedDescendants
= UINT64_C(1) << 36;
59 const uint64_t CompositingReasonBlendingWithCompositedDescendants
= UINT64_C(1) << 37;
60 const uint64_t CompositingReasonClipsCompositingDescendants
= UINT64_C(1) << 38;
61 const uint64_t CompositingReasonPerspectiveWith3DDescendants
= UINT64_C(1) << 39;
62 const uint64_t CompositingReasonPreserve3DWith3DDescendants
= UINT64_C(1) << 40;
63 const uint64_t CompositingReasonReflectionOfCompositedParent
= UINT64_C(1) << 41;
64 const uint64_t CompositingReasonIsolateCompositedDescendants
= UINT64_C(1) << 42;
66 // The root layer is a special case that may be forced to be a layer, but also it needs to be
67 // a layer if anything else in the subtree is composited.
68 const uint64_t CompositingReasonRoot
= UINT64_C(1) << 43;
70 // CompositedLayerMapping internal hierarchy reasons
71 const uint64_t CompositingReasonLayerForAncestorClip
= UINT64_C(1) << 44;
72 const uint64_t CompositingReasonLayerForDescendantClip
= UINT64_C(1) << 45;
73 const uint64_t CompositingReasonLayerForPerspective
= UINT64_C(1) << 46;
74 const uint64_t CompositingReasonLayerForHorizontalScrollbar
= UINT64_C(1) << 47;
75 const uint64_t CompositingReasonLayerForVerticalScrollbar
= UINT64_C(1) << 48;
76 const uint64_t CompositingReasonLayerForOverflowControlsHost
= UINT64_C(1) << 49;
77 const uint64_t CompositingReasonLayerForScrollCorner
= UINT64_C(1) << 50;
78 const uint64_t CompositingReasonLayerForScrollingContents
= UINT64_C(1) << 51;
79 const uint64_t CompositingReasonLayerForScrollingContainer
= UINT64_C(1) << 52;
80 const uint64_t CompositingReasonLayerForSquashingContents
= UINT64_C(1) << 53;
81 const uint64_t CompositingReasonLayerForSquashingContainer
= UINT64_C(1) << 54;
82 const uint64_t CompositingReasonLayerForForeground
= UINT64_C(1) << 55;
83 const uint64_t CompositingReasonLayerForBackground
= UINT64_C(1) << 56;
84 const uint64_t CompositingReasonLayerForMask
= UINT64_C(1) << 57;
85 const uint64_t CompositingReasonLayerForClippingMask
= UINT64_C(1) << 58;
86 const uint64_t CompositingReasonLayerForScrollingBlockSelection
= UINT64_C(1) << 59;
88 // Composited elements with inline transforms trigger assumed overlap so that
89 // we can update their transforms quickly.
90 const uint64_t CompositingReasonInlineTransform
= UINT64_C(1) << 60;
92 const uint64_t CompositingReasonCompositorProxy
= UINT64_C(1) << 61;
94 // Various combinations of compositing reasons are defined here also, for more intutive and faster bitwise logic.
95 const uint64_t CompositingReasonComboAllDirectReasons
=
96 CompositingReason3DTransform
97 | CompositingReasonVideo
98 | CompositingReasonCanvas
99 | CompositingReasonPlugin
100 | CompositingReasonIFrame
101 | CompositingReasonBackfaceVisibilityHidden
102 | CompositingReasonActiveAnimation
103 | CompositingReasonTransitionProperty
104 | CompositingReasonPositionFixed
105 | CompositingReasonOverflowScrollingTouch
106 | CompositingReasonOverflowScrollingParent
107 | CompositingReasonOutOfFlowClipping
108 | CompositingReasonVideoOverlay
109 | CompositingReasonWillChangeCompositingHint
110 | CompositingReasonCompositorProxy
111 | CompositingReasonBackdropFilter
;
113 const uint64_t CompositingReasonComboAllDirectStyleDeterminedReasons
=
114 CompositingReason3DTransform
115 | CompositingReasonBackfaceVisibilityHidden
116 | CompositingReasonActiveAnimation
117 | CompositingReasonTransitionProperty
118 | CompositingReasonWillChangeCompositingHint
119 | CompositingReasonCompositorProxy
120 | CompositingReasonBackdropFilter
;
122 const uint64_t CompositingReasonComboCompositedDescendants
=
123 CompositingReasonTransformWithCompositedDescendants
124 | CompositingReasonIsolateCompositedDescendants
125 | CompositingReasonOpacityWithCompositedDescendants
126 | CompositingReasonMaskWithCompositedDescendants
127 | CompositingReasonFilterWithCompositedDescendants
128 | CompositingReasonBlendingWithCompositedDescendants
129 | CompositingReasonReflectionWithCompositedDescendants
130 | CompositingReasonClipsCompositingDescendants
;
132 const uint64_t CompositingReasonCombo3DDescendants
=
133 CompositingReasonPreserve3DWith3DDescendants
134 | CompositingReasonPerspectiveWith3DDescendants
;
136 const uint64_t CompositingReasonComboAllStyleDeterminedReasons
=
137 CompositingReasonComboAllDirectStyleDeterminedReasons
138 | CompositingReasonComboCompositedDescendants
139 | CompositingReasonCombo3DDescendants
140 | CompositingReasonInlineTransform
;
142 const uint64_t CompositingReasonComboReasonsThatRequireOwnBacking
=
143 CompositingReasonComboAllDirectReasons
144 | CompositingReasonOverlap
145 | CompositingReasonAssumedOverlap
146 | CompositingReasonNegativeZIndexChildren
147 | CompositingReasonScrollsWithRespectToSquashingLayer
148 | CompositingReasonSquashingSparsityExceeded
149 | CompositingReasonSquashingClippingContainerMismatch
150 | CompositingReasonSquashingOpacityAncestorMismatch
151 | CompositingReasonSquashingTransformAncestorMismatch
152 | CompositingReasonSquashingFilterMismatch
153 | CompositingReasonSquashingWouldBreakPaintOrder
154 | CompositingReasonSquashingVideoIsDisallowed
155 | CompositingReasonSquashedLayerClipsCompositingDescendants
156 | CompositingReasonSquashingLayoutPartIsDisallowed
157 | CompositingReasonSquashingReflectionIsDisallowed
158 | CompositingReasonSquashingBlendingIsDisallowed
159 | CompositingReasonTransformWithCompositedDescendants
160 | CompositingReasonOpacityWithCompositedDescendants
161 | CompositingReasonMaskWithCompositedDescendants
162 | CompositingReasonFilterWithCompositedDescendants
163 | CompositingReasonBlendingWithCompositedDescendants
164 | CompositingReasonIsolateCompositedDescendants
165 | CompositingReasonPreserve3DWith3DDescendants
// preserve-3d has to create backing store to ensure that 3d-transformed elements intersect.
166 | CompositingReasonSquashingNearestFixedPositionMismatch
167 | CompositingReasonScrollChildWithCompositedDescendants
168 | CompositingReasonBackdropFilter
;
170 const uint64_t CompositingReasonComboSquashableReasons
=
171 CompositingReasonOverlap
172 | CompositingReasonAssumedOverlap
173 | CompositingReasonOverflowScrollingParent
;
175 typedef uint64_t CompositingReasons
;
177 // Any reasons other than overlap or assumed overlap will require the layer to be separately compositing.
178 inline bool requiresCompositing(CompositingReasons reasons
)
180 return reasons
& ~CompositingReasonComboSquashableReasons
;
183 // If the layer has overlap or assumed overlap, but no other reasons, then it should be squashed.
184 inline bool requiresSquashing(CompositingReasons reasons
)
186 return !requiresCompositing(reasons
) && (reasons
& CompositingReasonComboSquashableReasons
);
189 struct CompositingReasonStringMap
{
190 CompositingReasons reason
;
191 const char* shortName
;
192 const char* description
;
195 PLATFORM_EXPORT
extern const CompositingReasonStringMap kCompositingReasonStringMap
[];
196 PLATFORM_EXPORT
extern size_t kNumberOfCompositingReasons
;
200 #endif // CompositingReasons_h