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