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;
33 // Overlap reasons that require knowing what's behind you in paint-order before knowing the answer
34 const uint64_t CompositingReasonAssumedOverlap = UINT64_C(1) << 14;
35 const uint64_t CompositingReasonOverlap = UINT64_C(1) << 15;
36 const uint64_t CompositingReasonNegativeZIndexChildren = UINT64_C(1) << 16;
37 const uint64_t CompositingReasonScrollsWithRespectToSquashingLayer = UINT64_C(1) << 17;
38 const uint64_t CompositingReasonSquashingSparsityExceeded = UINT64_C(1) << 18;
39 const uint64_t CompositingReasonSquashingClippingContainerMismatch = UINT64_C(1) << 19;
40 const uint64_t CompositingReasonSquashingOpacityAncestorMismatch = UINT64_C(1) << 20;
41 const uint64_t CompositingReasonSquashingTransformAncestorMismatch = UINT64_C(1) << 21;
42 const uint64_t CompositingReasonSquashingFilterAncestorMismatch = UINT64_C(1) << 22;
43 const uint64_t CompositingReasonSquashingWouldBreakPaintOrder = UINT64_C(1) << 23;
44 const uint64_t CompositingReasonSquashingVideoIsDisallowed = UINT64_C(1) << 24;
45 const uint64_t CompositingReasonSquashedLayerClipsCompositingDescendants = UINT64_C(1) << 25;
46 const uint64_t CompositingReasonSquashingRenderPartIsDisallowed = UINT64_C(1) << 26;
47 const uint64_t CompositingReasonSquashingReflectionIsDisallowed = UINT64_C(1) << 27;
49 // Subtree reasons that require knowing what the status of your subtree is before knowing the answer
50 const uint64_t CompositingReasonTransformWithCompositedDescendants = UINT64_C(1) << 28;
51 const uint64_t CompositingReasonOpacityWithCompositedDescendants = UINT64_C(1) << 29;
52 const uint64_t CompositingReasonMaskWithCompositedDescendants = UINT64_C(1) << 30;
53 const uint64_t CompositingReasonReflectionWithCompositedDescendants = UINT64_C(1) << 31;
54 const uint64_t CompositingReasonFilterWithCompositedDescendants = UINT64_C(1) << 32;
55 const uint64_t CompositingReasonBlendingWithCompositedDescendants = UINT64_C(1) << 33;
56 const uint64_t CompositingReasonClipsCompositingDescendants = UINT64_C(1) << 34;
57 const uint64_t CompositingReasonPerspectiveWith3DDescendants = UINT64_C(1) << 35;
58 const uint64_t CompositingReasonPreserve3DWith3DDescendants = UINT64_C(1) << 36;
59 const uint64_t CompositingReasonReflectionOfCompositedParent = UINT64_C(1) << 37;
60 const uint64_t CompositingReasonIsolateCompositedDescendants = UINT64_C(1) << 38;
62 // The root layer is a special case that may be forced to be a layer, but also it needs to be
63 // a layer if anything else in the subtree is composited.
64 const uint64_t CompositingReasonRoot = UINT64_C(1) << 39;
66 // CompositedLayerMapping internal hierarchy reasons
67 const uint64_t CompositingReasonLayerForAncestorClip = UINT64_C(1) << 40;
68 const uint64_t CompositingReasonLayerForDescendantClip = UINT64_C(1) << 41;
69 const uint64_t CompositingReasonLayerForPerspective = UINT64_C(1) << 42;
70 const uint64_t CompositingReasonLayerForHorizontalScrollbar = UINT64_C(1) << 43;
71 const uint64_t CompositingReasonLayerForVerticalScrollbar = UINT64_C(1) << 44;
72 const uint64_t CompositingReasonLayerForOverflowControlsHost = UINT64_C(1) << 45;
73 const uint64_t CompositingReasonLayerForScrollCorner = UINT64_C(1) << 46;
74 const uint64_t CompositingReasonLayerForScrollingContents = UINT64_C(1) << 47;
75 const uint64_t CompositingReasonLayerForScrollingContainer = UINT64_C(1) << 48;
76 const uint64_t CompositingReasonLayerForSquashingContents = UINT64_C(1) << 49;
77 const uint64_t CompositingReasonLayerForSquashingContainer = UINT64_C(1) << 50;
78 const uint64_t CompositingReasonLayerForForeground = UINT64_C(1) << 51;
79 const uint64_t CompositingReasonLayerForBackground = UINT64_C(1) << 52;
80 const uint64_t CompositingReasonLayerForMask = UINT64_C(1) << 53;
81 const uint64_t CompositingReasonLayerForClippingMask = UINT64_C(1) << 54;
82 const uint64_t CompositingReasonLayerForScrollingBlockSelection = UINT64_C(1) << 55;
84 // Composited elements with inline transforms trigger assumed overlap so that
85 // we can update their transforms quickly.
86 const uint64_t CompositingReasonInlineTransform = UINT64_C(1) << 56;
88 // Various combinations of compositing reasons are defined here also, for more intutive and faster bitwise logic.
89 const uint64_t CompositingReasonComboAllDirectReasons =
90 CompositingReason3DTransform
91 | CompositingReasonVideo
92 | CompositingReasonCanvas
93 | CompositingReasonPlugin
94 | CompositingReasonIFrame
95 | CompositingReasonBackfaceVisibilityHidden
96 | CompositingReasonActiveAnimation
97 | CompositingReasonTransitionProperty
98 | CompositingReasonPositionFixed
99 | CompositingReasonOverflowScrollingTouch
100 | CompositingReasonOverflowScrollingParent
101 | CompositingReasonOutOfFlowClipping
102 | CompositingReasonVideoOverlay
103 | CompositingReasonWillChangeCompositingHint;
105 const uint64_t CompositingReasonComboAllDirectStyleDeterminedReasons =
106 CompositingReason3DTransform
107 | CompositingReasonBackfaceVisibilityHidden
108 | CompositingReasonActiveAnimation
109 | CompositingReasonTransitionProperty
110 | CompositingReasonWillChangeCompositingHint;
112 const uint64_t CompositingReasonComboCompositedDescendants =
113 CompositingReasonTransformWithCompositedDescendants
114 | CompositingReasonIsolateCompositedDescendants
115 | CompositingReasonOpacityWithCompositedDescendants
116 | CompositingReasonMaskWithCompositedDescendants
117 | CompositingReasonFilterWithCompositedDescendants
118 | CompositingReasonBlendingWithCompositedDescendants
119 | CompositingReasonReflectionWithCompositedDescendants
120 | CompositingReasonClipsCompositingDescendants;
122 const uint64_t CompositingReasonCombo3DDescendants =
123 CompositingReasonPreserve3DWith3DDescendants
124 | CompositingReasonPerspectiveWith3DDescendants;
126 const uint64_t CompositingReasonComboAllStyleDeterminedReasons =
127 CompositingReasonComboAllDirectStyleDeterminedReasons
128 | CompositingReasonComboCompositedDescendants
129 | CompositingReasonCombo3DDescendants
130 | CompositingReasonInlineTransform;
132 const uint64_t CompositingReasonComboReasonsThatRequireOwnBacking =
133 CompositingReasonComboAllDirectReasons
134 | CompositingReasonOverlap
135 | CompositingReasonAssumedOverlap
136 | CompositingReasonNegativeZIndexChildren
137 | CompositingReasonScrollsWithRespectToSquashingLayer
138 | CompositingReasonSquashingSparsityExceeded
139 | CompositingReasonSquashingClippingContainerMismatch
140 | CompositingReasonSquashingOpacityAncestorMismatch
141 | CompositingReasonSquashingTransformAncestorMismatch
142 | CompositingReasonSquashingFilterAncestorMismatch
143 | CompositingReasonSquashingWouldBreakPaintOrder
144 | CompositingReasonSquashingVideoIsDisallowed
145 | CompositingReasonSquashedLayerClipsCompositingDescendants
146 | CompositingReasonSquashingRenderPartIsDisallowed
147 | CompositingReasonSquashingReflectionIsDisallowed
148 | CompositingReasonTransformWithCompositedDescendants
149 | CompositingReasonOpacityWithCompositedDescendants
150 | CompositingReasonMaskWithCompositedDescendants
151 | CompositingReasonFilterWithCompositedDescendants
152 | CompositingReasonBlendingWithCompositedDescendants
153 | CompositingReasonIsolateCompositedDescendants
154 | CompositingReasonPreserve3DWith3DDescendants; // preserve-3d has to create backing store to ensure that 3d-transformed elements intersect.
156 const uint64_t CompositingReasonComboSquashableReasons =
157 CompositingReasonOverlap
158 | CompositingReasonAssumedOverlap
159 | CompositingReasonOverflowScrollingParent;
161 typedef uint64_t CompositingReasons;
163 // Any reasons other than overlap or assumed overlap will require the layer to be separately compositing.
164 inline bool requiresCompositing(CompositingReasons reasons)
166 return reasons & ~CompositingReasonComboSquashableReasons;
169 // If the layer has overlap or assumed overlap, but no other reasons, then it should be squashed.
170 inline bool requiresSquashing(CompositingReasons reasons)
172 return !requiresCompositing(reasons) && (reasons & CompositingReasonComboSquashableReasons);
175 struct CompositingReasonStringMap {
176 CompositingReasons reason;
177 const char* shortName;
178 const char* description;
181 PLATFORM_EXPORT extern const CompositingReasonStringMap kCompositingReasonStringMap[];
182 PLATFORM_EXPORT extern size_t kNumberOfCompositingReasons;
186 #endif // CompositingReasons_h