1 /* 2 * Copyright (C) 2009 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef RenderLayerCompositor_h 27 #define RenderLayerCompositor_h 28 29 #include "core/rendering/RenderLayer.h" 30 #include "core/rendering/compositing/CompositingReasonFinder.h" 31 #include "platform/graphics/GraphicsLayerClient.h" 32 #include "wtf/HashMap.h" 33 34 namespace blink { 35 36 class DocumentLifecycle; 37 class GraphicsLayer; 38 class GraphicsLayerFactory; 39 class Page; 40 class RenderPart; 41 class ScrollingCoordinator; 42 43 enum CompositingUpdateType { 44 CompositingUpdateNone, 45 CompositingUpdateAfterGeometryChange, 46 CompositingUpdateAfterCompositingInputChange, 47 CompositingUpdateRebuildTree, 48 }; 49 50 enum CompositingStateTransitionType { 51 NoCompositingStateChange, 52 AllocateOwnCompositedLayerMapping, 53 RemoveOwnCompositedLayerMapping, 54 PutInSquashingLayer, 55 RemoveFromSquashingLayer 56 }; 57 58 // RenderLayerCompositor manages the hierarchy of 59 // composited RenderLayers. It determines which RenderLayers 60 // become compositing, and creates and maintains a hierarchy of 61 // GraphicsLayers based on the RenderLayer painting order. 62 // 63 // There is one RenderLayerCompositor per RenderView. 64 65 class RenderLayerCompositor FINAL : public GraphicsLayerClient { 66 WTF_MAKE_FAST_ALLOCATED; 67 public: 68 explicit RenderLayerCompositor(RenderView&); 69 virtual ~RenderLayerCompositor(); 70 71 void updateIfNeededRecursive(); 72 73 // Return true if this RenderView is in "compositing mode" (i.e. has one or more 74 // composited RenderLayers) 75 bool inCompositingMode() const; 76 // FIXME: Replace all callers with inCompositingMdoe and remove this function. 77 bool staleInCompositingMode() const; 78 // This will make a compositing layer at the root automatically, and hook up to 79 // the native view/window system. 80 void setCompositingModeEnabled(bool); 81 82 // Returns true if the accelerated compositing is enabled hasAcceleratedCompositing()83 bool hasAcceleratedCompositing() const { return m_hasAcceleratedCompositing; } 84 bool layerSquashingEnabled() const; 85 86 bool preferCompositingToLCDTextEnabled() const; 87 88 bool rootShouldAlwaysComposite() const; 89 90 // Copy the accelerated compositing related flags from Settings 91 void updateAcceleratedCompositingSettings(); 92 93 // Used to indicate that a compositing update will be needed for the next frame that gets drawn. 94 void setNeedsCompositingUpdate(CompositingUpdateType); 95 96 void didLayout(); 97 98 // Whether layer's compositedLayerMapping needs a GraphicsLayer to clip z-order children of the given RenderLayer. 99 bool clipsCompositingDescendants(const RenderLayer*) const; 100 101 // Whether the given layer needs an extra 'contents' layer. 102 bool needsContentsCompositingLayer(const RenderLayer*) const; 103 104 bool supportsFixedRootBackgroundCompositing() const; 105 bool needsFixedRootBackgroundLayer(const RenderLayer*) const; 106 GraphicsLayer* fixedRootBackgroundLayer() const; setNeedsUpdateFixedBackground()107 void setNeedsUpdateFixedBackground() { m_needsUpdateFixedBackground = true; } 108 109 // Issue paint invalidations of the appropriate layers when the given RenderLayer starts or stops being composited. 110 void paintInvalidationOnCompositingChange(RenderLayer*); 111 112 void fullyInvalidatePaint(); 113 114 RenderLayer* rootRenderLayer() const; 115 GraphicsLayer* rootGraphicsLayer() const; 116 GraphicsLayer* scrollLayer() const; 117 GraphicsLayer* containerLayer() const; 118 119 // We don't always have a root transform layer. This function lazily allocates one 120 // and returns it as required. 121 GraphicsLayer* ensureRootTransformLayer(); 122 123 enum RootLayerAttachment { 124 RootLayerUnattached, 125 RootLayerAttachedViaChromeClient, 126 RootLayerAttachedViaEnclosingFrame 127 }; 128 rootLayerAttachment()129 RootLayerAttachment rootLayerAttachment() const { return m_rootLayerAttachment; } 130 void updateRootLayerAttachment(); 131 void updateRootLayerPosition(); 132 133 void setIsInWindow(bool); 134 135 static RenderLayerCompositor* frameContentsCompositor(RenderPart*); 136 // Return true if the layers changed. 137 static bool parentFrameContentLayers(RenderPart*); 138 139 // Update the geometry of the layers used for clipping and scrolling in frames. 140 void frameViewDidChangeLocation(const IntPoint& contentsOffset); 141 void frameViewDidChangeSize(); 142 void frameViewDidScroll(); 143 void frameViewScrollbarsExistenceDidChange(); 144 void rootFixedBackgroundsChanged(); 145 146 bool scrollingLayerDidChange(RenderLayer*); 147 148 String layerTreeAsText(LayerTreeFlags); 149 layerForHorizontalScrollbar()150 GraphicsLayer* layerForHorizontalScrollbar() const { return m_layerForHorizontalScrollbar.get(); } layerForVerticalScrollbar()151 GraphicsLayer* layerForVerticalScrollbar() const { return m_layerForVerticalScrollbar.get(); } layerForScrollCorner()152 GraphicsLayer* layerForScrollCorner() const { return m_layerForScrollCorner.get(); } 153 154 void resetTrackedPaintInvalidationRects(); 155 void setTracksPaintInvalidations(bool); 156 157 virtual String debugName(const GraphicsLayer*) OVERRIDE; 158 DocumentLifecycle& lifecycle() const; 159 160 void updatePotentialCompositingReasonsFromStyle(RenderLayer*); 161 162 // Whether the layer could ever be composited. 163 bool canBeComposited(const RenderLayer*) const; 164 165 // FIXME: Move allocateOrClearCompositedLayerMapping to CompositingLayerAssigner once we've fixed 166 // the compositing chicken/egg issues. 167 bool allocateOrClearCompositedLayerMapping(RenderLayer*, CompositingStateTransitionType compositedLayerUpdate); 168 169 void updateDirectCompositingReasons(RenderLayer*); 170 171 void setOverlayLayer(GraphicsLayer*); 172 inOverlayFullscreenVideo()173 bool inOverlayFullscreenVideo() const { return m_inOverlayFullscreenVideo; } 174 175 private: 176 #if ENABLE(ASSERT) 177 void assertNoUnresolvedDirtyBits(); 178 #endif 179 180 // GraphicsLayerClient implementation notifyAnimationStarted(const GraphicsLayer *,double)181 virtual void notifyAnimationStarted(const GraphicsLayer*, double) OVERRIDE { } 182 virtual void paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase, const IntRect&) OVERRIDE; 183 184 virtual bool isTrackingPaintInvalidations() const OVERRIDE; 185 186 void updateWithoutAcceleratedCompositing(CompositingUpdateType); 187 void updateIfNeeded(); 188 189 void ensureRootLayer(); 190 void destroyRootLayer(); 191 192 void attachRootLayer(RootLayerAttachment); 193 void detachRootLayer(); 194 195 void updateOverflowControlsLayers(); 196 197 Page* page() const; 198 199 GraphicsLayerFactory* graphicsLayerFactory() const; 200 ScrollingCoordinator* scrollingCoordinator() const; 201 202 void enableCompositingModeIfNeeded(); 203 204 bool requiresHorizontalScrollbarLayer() const; 205 bool requiresVerticalScrollbarLayer() const; 206 bool requiresScrollCornerLayer() const; 207 208 void applyOverlayFullscreenVideoAdjustment(); 209 210 RenderView& m_renderView; 211 OwnPtr<GraphicsLayer> m_rootContentLayer; 212 OwnPtr<GraphicsLayer> m_rootTransformLayer; 213 214 CompositingReasonFinder m_compositingReasonFinder; 215 216 CompositingUpdateType m_pendingUpdateType; 217 218 bool m_hasAcceleratedCompositing; 219 bool m_compositing; 220 221 // The root layer doesn't composite if it's a non-scrollable frame. 222 // So, after a layout we set this dirty bit to know that we need 223 // to recompute whether the root layer should composite even if 224 // none of its descendants composite. 225 // FIXME: Get rid of all the callers of setCompositingModeEnabled 226 // except the one in updateIfNeeded, then rename this to 227 // m_compositingDirty. 228 bool m_rootShouldAlwaysCompositeDirty; 229 bool m_needsUpdateFixedBackground; 230 bool m_isTrackingPaintInvalidations; // Used for testing. 231 232 RootLayerAttachment m_rootLayerAttachment; 233 234 // Enclosing container layer, which clips for iframe content 235 OwnPtr<GraphicsLayer> m_containerLayer; 236 OwnPtr<GraphicsLayer> m_scrollLayer; 237 238 // Enclosing layer for overflow controls and the clipping layer 239 OwnPtr<GraphicsLayer> m_overflowControlsHostLayer; 240 241 // Layers for overflow controls 242 OwnPtr<GraphicsLayer> m_layerForHorizontalScrollbar; 243 OwnPtr<GraphicsLayer> m_layerForVerticalScrollbar; 244 OwnPtr<GraphicsLayer> m_layerForScrollCorner; 245 #if USE(RUBBER_BANDING) 246 OwnPtr<GraphicsLayer> m_layerForOverhangShadow; 247 #endif 248 249 bool m_inOverlayFullscreenVideo; 250 }; 251 252 } // namespace blink 253 254 #endif // RenderLayerCompositor_h 255