Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / platform / graphics / CompositingReasons.h
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 "wtf/MathExtras.h"
9 #include <stdint.h>
10
11 namespace WebCore {
12
13 const uint64_t CompositingReasonNone                                   = 0;
14 const uint64_t CompositingReasonAll                                    = ~static_cast<uint64_t>(0);
15
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.
34
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;
40
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;
53
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;
57
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;
73
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;
92
93 const uint64_t CompositingReasonComboAllStyleDeterminedReasons =
94     CompositingReason3DTransform
95     | CompositingReasonBackfaceVisibilityHidden
96     | CompositingReasonActiveAnimation
97     | CompositingReasonTransitionProperty
98     | CompositingReasonFilters
99     | CompositingReasonWillChangeCompositingHint;
100
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.
114
115 const uint64_t CompositingReasonComboSquashableReasons =
116     CompositingReasonOverlap
117     | CompositingReasonAssumedOverlap
118     | CompositingReasonOverflowScrollingParent;
119
120 typedef uint64_t CompositingReasons;
121
122 // Any reasons other than overlap or assumed overlap will require the layer to be separately compositing.
123 inline bool requiresCompositing(CompositingReasons reasons)
124 {
125     return reasons & ~CompositingReasonComboSquashableReasons;
126 }
127
128 // If the layer has overlap or assumed overlap, but no other reasons, then it should be squashed.
129 inline bool requiresSquashing(CompositingReasons reasons)
130 {
131     return !requiresCompositing(reasons) && (reasons & CompositingReasonComboSquashableReasons);
132 }
133
134 struct CompositingReasonStringMap {
135     CompositingReasons reason;
136     const char* shortName;
137     const char* description;
138 };
139
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,
144         "Unknown",
145         "No reason given" },
146     { CompositingReason3DTransform,
147         "transform3D",
148         "Has a 3d transform" },
149     { CompositingReasonVideo,
150         "video",
151         "Is an accelerated video" },
152     { CompositingReasonCanvas,
153         "canvas",
154         "Is an accelerated canvas" },
155     { CompositingReasonPlugin,
156         "plugin",
157         "Is an accelerated plugin" },
158     { CompositingReasonIFrame,
159         "iFrame",
160         "Is an accelerated iFrame" },
161     { CompositingReasonBackfaceVisibilityHidden,
162         "backfaceVisibilityHidden",
163         "Has backface-visibility: hidden" },
164     { CompositingReasonActiveAnimation,
165         "activeAnimation",
166         "Has an active accelerated animation or transition" },
167     { CompositingReasonTransitionProperty,
168         "transitionProperty",
169         "Has an acceleratable transition property (active or inactive)" },
170     { CompositingReasonFilters,
171         "filters",
172         "Has an accelerated filter" },
173     { CompositingReasonPositionFixed,
174         "positionFixed",
175         "Is fixed position" },
176     { CompositingReasonPositionSticky,
177         "positionSticky",
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,
186         "outOfFlowClipping",
187         "Has clipping ancestor" },
188     { CompositingReasonVideoOverlay,
189         "videoOverlay",
190         "Is overlay controls for video" },
191     { CompositingReasonWillChangeCompositingHint,
192         "willChange",
193         "Has a will-change compositing hint" },
194     { 0, 0, 0 }, // Available.
195     { CompositingReasonAssumedOverlap,
196         "assumedOverlap",
197         "Might overlap other composited content" },
198     { CompositingReasonOverlap,
199         "overlap",
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,
241         "root",
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,
280         "layerForMask",
281         "Secondary layer, to contain the mask contents" },
282     { CompositingReasonLayerForClippingMask,
283         "layerForClippingMask",
284         "Secondary layer, for clipping mask" }
285 };
286
287 } // namespace WebCore
288
289 #endif // CompositingReasons_h