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 "wtf/MathExtras.h"
13 const uint64_t CompositingReasonNone = 0;
14 const uint64_t CompositingReasonAll = ~static_cast<uint64_t>(0);
16 // Intrinsic reasons that can be known right away by the layer
17 const uint64_t CompositingReason3DTransform = UINT64_C(1) << 0;
18 const uint64_t CompositingReasonVideo = UINT64_C(1) << 1;
19 const uint64_t CompositingReasonCanvas = UINT64_C(1) << 2;
20 const uint64_t CompositingReasonPlugin = UINT64_C(1) << 3;
21 const uint64_t CompositingReasonIFrame = UINT64_C(1) << 4;
22 const uint64_t CompositingReasonBackfaceVisibilityHidden = UINT64_C(1) << 5;
23 const uint64_t CompositingReasonActiveAnimation = UINT64_C(1) << 6;
24 const uint64_t CompositingReasonTransitionProperty = UINT64_C(1) << 7;
25 const uint64_t CompositingReasonFilters = UINT64_C(1) << 8;
26 const uint64_t CompositingReasonPositionFixed = UINT64_C(1) << 9;
27 const uint64_t CompositingReasonPositionSticky = UINT64_C(1) << 10;
28 const uint64_t CompositingReasonOverflowScrollingTouch = UINT64_C(1) << 11;
29 const uint64_t CompositingReasonOverflowScrollingParent = UINT64_C(1) << 12;
30 const uint64_t CompositingReasonOutOfFlowClipping = UINT64_C(1) << 13;
31 const uint64_t CompositingReasonVideoOverlay = UINT64_C(1) << 14;
32 const uint64_t CompositingReasonWillChangeCompositingHint = UINT64_C(1) << 15;
33 // Bit 16 is available.
35 // Overlap reasons that require knowing what's behind you in paint-order before knowing the answer
36 const uint64_t CompositingReasonAssumedOverlap = UINT64_C(1) << 17;
37 const uint64_t CompositingReasonOverlap = UINT64_C(1) << 18;
38 const uint64_t CompositingReasonNegativeZIndexChildren = UINT64_C(1) << 19;
39 const uint64_t CompositingReasonNoSquashingTargetFound = UINT64_C(1) << 20;
41 // Subtree reasons that require knowing what the status of your subtree is before knowing the answer
42 const uint64_t CompositingReasonTransformWithCompositedDescendants = UINT64_C(1) << 21;
43 const uint64_t CompositingReasonOpacityWithCompositedDescendants = UINT64_C(1) << 22;
44 const uint64_t CompositingReasonMaskWithCompositedDescendants = UINT64_C(1) << 23;
45 const uint64_t CompositingReasonReflectionWithCompositedDescendants = UINT64_C(1) << 24;
46 const uint64_t CompositingReasonFilterWithCompositedDescendants = UINT64_C(1) << 25;
47 const uint64_t CompositingReasonBlendingWithCompositedDescendants = UINT64_C(1) << 26;
48 const uint64_t CompositingReasonClipsCompositingDescendants = UINT64_C(1) << 27;
49 const uint64_t CompositingReasonPerspectiveWith3DDescendants = UINT64_C(1) << 28;
50 const uint64_t CompositingReasonPreserve3DWith3DDescendants = UINT64_C(1) << 29;
51 const uint64_t CompositingReasonReflectionOfCompositedParent = UINT64_C(1) << 30;
52 const uint64_t CompositingReasonIsolateCompositedDescendants = UINT64_C(1) << 31;
54 // The root layer is a special case that may be forced to be a layer, but also it needs to be
55 // a layer if anything else in the subtree is composited.
56 const uint64_t CompositingReasonRoot = UINT64_C(1) << 32;
58 // CompositedLayerMapping internal hierarchy reasons
59 const uint64_t CompositingReasonLayerForAncestorClip = UINT64_C(1) << 33;
60 const uint64_t CompositingReasonLayerForDescendantClip = UINT64_C(1) << 34;
61 const uint64_t CompositingReasonLayerForPerspective = UINT64_C(1) << 35;
62 const uint64_t CompositingReasonLayerForHorizontalScrollbar = UINT64_C(1) << 36;
63 const uint64_t CompositingReasonLayerForVerticalScrollbar = UINT64_C(1) << 37;
64 const uint64_t CompositingReasonLayerForScrollCorner = UINT64_C(1) << 38;
65 const uint64_t CompositingReasonLayerForScrollingContents = UINT64_C(1) << 39;
66 const uint64_t CompositingReasonLayerForScrollingContainer = UINT64_C(1) << 40;
67 const uint64_t CompositingReasonLayerForSquashingContents = UINT64_C(1) << 41;
68 const uint64_t CompositingReasonLayerForSquashingContainer = UINT64_C(1) << 42;
69 const uint64_t CompositingReasonLayerForForeground = UINT64_C(1) << 43;
70 const uint64_t CompositingReasonLayerForBackground = UINT64_C(1) << 44;
71 const uint64_t CompositingReasonLayerForMask = UINT64_C(1) << 45;
72 const uint64_t CompositingReasonLayerForClippingMask = UINT64_C(1) << 46;
74 // Various combinations of compositing reasons are defined here also, for more intutive and faster bitwise logic.
75 const uint64_t CompositingReasonComboAllDirectReasons =
76 CompositingReason3DTransform
77 | CompositingReasonVideo
78 | CompositingReasonCanvas
79 | CompositingReasonPlugin
80 | CompositingReasonIFrame
81 | CompositingReasonBackfaceVisibilityHidden
82 | CompositingReasonActiveAnimation
83 | CompositingReasonTransitionProperty
84 | CompositingReasonFilters
85 | CompositingReasonPositionFixed
86 | CompositingReasonPositionSticky
87 | CompositingReasonOverflowScrollingTouch
88 | CompositingReasonOverflowScrollingParent
89 | CompositingReasonOutOfFlowClipping
90 | CompositingReasonVideoOverlay
91 | CompositingReasonWillChangeCompositingHint;
93 const uint64_t CompositingReasonComboAllStyleDeterminedReasons =
94 CompositingReason3DTransform
95 | CompositingReasonBackfaceVisibilityHidden
96 | CompositingReasonActiveAnimation
97 | CompositingReasonTransitionProperty
98 | CompositingReasonFilters
99 | CompositingReasonWillChangeCompositingHint;
101 const uint64_t CompositingReasonComboReasonsThatRequireOwnBacking =
102 CompositingReasonComboAllDirectReasons
103 | CompositingReasonOverlap
104 | CompositingReasonAssumedOverlap
105 | CompositingReasonNegativeZIndexChildren
106 | CompositingReasonNoSquashingTargetFound
107 | CompositingReasonTransformWithCompositedDescendants
108 | CompositingReasonOpacityWithCompositedDescendants
109 | CompositingReasonMaskWithCompositedDescendants
110 | CompositingReasonFilterWithCompositedDescendants
111 | CompositingReasonBlendingWithCompositedDescendants
112 | CompositingReasonIsolateCompositedDescendants
113 | CompositingReasonPreserve3DWith3DDescendants; // preserve-3d has to create backing store to ensure that 3d-transformed elements intersect.
115 const uint64_t CompositingReasonComboSquashableReasons =
116 CompositingReasonOverlap
117 | CompositingReasonAssumedOverlap
118 | CompositingReasonOverflowScrollingParent;
120 typedef uint64_t CompositingReasons;
122 // Any reasons other than overlap or assumed overlap will require the layer to be separately compositing.
123 inline bool requiresCompositing(CompositingReasons reasons)
125 return reasons & ~CompositingReasonComboSquashableReasons;
128 // If the layer has overlap or assumed overlap, but no other reasons, then it should be squashed.
129 inline bool requiresSquashing(CompositingReasons reasons)
131 return !requiresCompositing(reasons) && (reasons & CompositingReasonComboSquashableReasons);
134 struct CompositingReasonStringMap {
135 CompositingReasons reason;
136 const char* shortName;
137 const char* description;
140 // FIXME: This static data shouldn't be in a header. When it's in the header
141 // it's copied into every compilation unit that includes the header.
142 static const CompositingReasonStringMap compositingReasonStringMap[] = {
143 { CompositingReasonNone,
146 { CompositingReason3DTransform,
148 "Has a 3d transform" },
149 { CompositingReasonVideo,
151 "Is an accelerated video" },
152 { CompositingReasonCanvas,
154 "Is an accelerated canvas" },
155 { CompositingReasonPlugin,
157 "Is an accelerated plugin" },
158 { CompositingReasonIFrame,
160 "Is an accelerated iFrame" },
161 { CompositingReasonBackfaceVisibilityHidden,
162 "backfaceVisibilityHidden",
163 "Has backface-visibility: hidden" },
164 { CompositingReasonActiveAnimation,
166 "Has an active accelerated animation or transition" },
167 { CompositingReasonTransitionProperty,
168 "transitionProperty",
169 "Has an acceleratable transition property (active or inactive)" },
170 { CompositingReasonFilters,
172 "Has an accelerated filter" },
173 { CompositingReasonPositionFixed,
175 "Is fixed position" },
176 { CompositingReasonPositionSticky,
178 "Is sticky position" },
179 { CompositingReasonOverflowScrollingTouch,
180 "overflowScrollingTouch",
181 "Is a scrollable overflow element" },
182 { CompositingReasonOverflowScrollingParent,
183 "overflowScrollingParent",
184 "Scroll parent is not an ancestor" },
185 { CompositingReasonOutOfFlowClipping,
187 "Has clipping ancestor" },
188 { CompositingReasonVideoOverlay,
190 "Is overlay controls for video" },
191 { CompositingReasonWillChangeCompositingHint,
193 "Has a will-change compositing hint" },
194 { 0, 0, 0 }, // Available.
195 { CompositingReasonAssumedOverlap,
197 "Might overlap other composited content" },
198 { CompositingReasonOverlap,
200 "Overlaps other composited content" },
201 { CompositingReasonNegativeZIndexChildren,
202 "negativeZIndexChildren",
203 "Parent with composited negative z-index content" },
204 { CompositingReasonNoSquashingTargetFound,
205 "noSquashingTargetFound",
206 "Cannot be squashed due to no compatible squashing owner found" },
207 { CompositingReasonTransformWithCompositedDescendants,
208 "transformWithCompositedDescendants",
209 "Has a transform that needs to be known by compositor because of composited descendants" },
210 { CompositingReasonOpacityWithCompositedDescendants,
211 "opacityWithCompositedDescendants",
212 "Has opacity that needs to be applied by compositor because of composited descendants" },
213 { CompositingReasonMaskWithCompositedDescendants,
214 "maskWithCompositedDescendants",
215 "Has a mask that needs to be known by compositor because of composited descendants" },
216 { CompositingReasonReflectionWithCompositedDescendants,
217 "reflectionWithCompositedDescendants",
218 "Has a reflection that needs to be known by compositor because of composited descendants" },
219 { CompositingReasonFilterWithCompositedDescendants,
220 "filterWithCompositedDescendants",
221 "Has a filter effect that needs to be known by compositor because of composited descendants" },
222 { CompositingReasonBlendingWithCompositedDescendants,
223 "blendingWithCompositedDescendants",
224 "Has a blenidng effect that needs to be known by compositor because of composited descendants" },
225 { CompositingReasonClipsCompositingDescendants,
226 "clipsCompositingDescendants",
227 "Has a clip that needs to be known by compositor because of composited descendants" },
228 { CompositingReasonPerspectiveWith3DDescendants,
229 "perspectiveWith3DDescendants",
230 "Has a perspective transform that needs to be known by compositor because of 3d descendants" },
231 { CompositingReasonPreserve3DWith3DDescendants,
232 "preserve3DWith3DDescendants",
233 "Has a preserves-3d property that needs to be known by compositor because of 3d descendants" },
234 { CompositingReasonReflectionOfCompositedParent,
235 "reflectionOfCompositedParent",
236 "Is a reflection of a composited layer" },
237 { CompositingReasonIsolateCompositedDescendants,
238 "isolateCompositedDescendants",
239 "Should isolate descendants to apply a blend effect" },
240 { CompositingReasonRoot,
242 "Is the root layer" },
243 { CompositingReasonLayerForAncestorClip,
244 "layerForAncestorClip",
245 "Secondary layer, applies a clip due to a sibling in the compositing tree" },
246 { CompositingReasonLayerForDescendantClip,
247 "layerForDescendantClip",
248 "Secondary layer, to clip descendants of the owning layer" },
249 { CompositingReasonLayerForPerspective,
250 "layerForPerspective",
251 "Secondary layer, to house the perspective transform for all descendants" },
252 { CompositingReasonLayerForHorizontalScrollbar,
253 "layerForHorizontalScrollbar",
254 "Secondary layer, the horizontal scrollbar layer" },
255 { CompositingReasonLayerForVerticalScrollbar,
256 "layerForVerticalScrollbar",
257 "Secondary layer, the vertical scrollbar layer" },
258 { CompositingReasonLayerForScrollCorner,
259 "layerForScrollCorner",
260 "Secondary layer, the scroll corner layer" },
261 { CompositingReasonLayerForScrollingContents,
262 "layerForScrollingContents",
263 "Secondary layer, to house contents that can be scrolled" },
264 { CompositingReasonLayerForScrollingContainer,
265 "layerForScrollingContainer",
266 "Secondary layer, used to position the scolling contents while scrolling" },
267 { CompositingReasonLayerForSquashingContents,
268 "layerForSquashingContents",
269 "Secondary layer, home for a group of squashable content" },
270 { CompositingReasonLayerForSquashingContainer,
271 "layerForSquashingContainer",
272 "Secondary layer, no-op layer to place the squashing layer correctly in the composited layer tree" },
273 { CompositingReasonLayerForForeground,
274 "layerForForeground",
275 "Secondary layer, to contain any normal flow and positive z-index contents on top of a negative z-index layer" },
276 { CompositingReasonLayerForBackground,
277 "layerForBackground",
278 "Secondary layer, to contain acceleratable background content" },
279 { CompositingReasonLayerForMask,
281 "Secondary layer, to contain the mask contents" },
282 { CompositingReasonLayerForClippingMask,
283 "layerForClippingMask",
284 "Secondary layer, for clipping mask" }
287 } // namespace WebCore
289 #endif // CompositingReasons_h