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