2 * Copyright (C) 2009 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 #ifndef RenderLayerCompositor_h
27 #define RenderLayerCompositor_h
29 #include "RenderLayer.h"
33 #define PROFILE_LAYER_REBUILD 0
37 // RenderLayerCompositor manages the hierarchy of
38 // composited RenderLayers. It determines which RenderLayers
39 // become compositing, and creates and maintains a hierarchy of
40 // GraphicsLayers based on the RenderLayer painting order.
42 // There is one RenderLayerCompositor per RenderView.
44 class RenderLayerCompositor
{
47 RenderLayerCompositor(RenderView
*);
48 ~RenderLayerCompositor();
50 // Return true if this RenderView is in "compositing mode" (i.e. has one or more
51 // composited RenderLayers)
52 bool inCompositingMode() const { return m_compositing
; }
53 // This will make a compositing layer at the root automatically, and hook up to
54 // the native view/window system.
55 void enableCompositingMode(bool enable
= true);
57 void setCompositingLayersNeedUpdate(bool needUpdate
= true);
58 bool compositingLayersNeedUpdate() const { return m_compositingLayersNeedUpdate
; }
60 void scheduleViewUpdate();
62 // Rebuild the tree of compositing layers
63 void updateCompositingLayers(RenderLayer
* updateRoot
= 0);
65 // Update the compositing state of the given layer. Returns true if that state changed.
66 enum CompositingChangeRepaint
{ CompositingChangeRepaintNow
, CompositingChangeWillRepaintLater
};
67 bool updateLayerCompositingState(RenderLayer
*, CompositingChangeRepaint
= CompositingChangeRepaintNow
);
69 // Whether layer's backing needs a graphics layer to do clipping by an ancestor (non-stacking-context parent with overflow).
70 bool clippedByAncestor(RenderLayer
*) const;
71 // Whether layer's backing needs a graphics layer to clip z-order children of the given layer.
72 bool clipsCompositingDescendants(const RenderLayer
*) const;
74 // Whether the given layer needs an extra 'contents' layer.
75 bool needsContentsCompositingLayer(const RenderLayer
*) const;
76 // Return the bounding box required for compositing layer and its childern, relative to ancestorLayer.
77 // If layerBoundingBox is not 0, on return it contains the bounding box of this layer only.
78 IntRect
calculateCompositedBounds(const RenderLayer
* layer
, const RenderLayer
* ancestorLayer
, IntRect
* layerBoundingBox
= 0);
80 // Repaint the appropriate layers when the given RenderLayer starts or stops being composited.
81 void repaintOnCompositingChange(RenderLayer
*);
83 // Notify us that a layer has been added or removed
84 void layerWasAdded(RenderLayer
* parent
, RenderLayer
* child
);
85 void layerWillBeRemoved(RenderLayer
* parent
, RenderLayer
* child
);
87 // Get the nearest ancestor layer that has overflow or clip, but is not a stacking context
88 RenderLayer
* enclosingNonStackingClippingLayer(const RenderLayer
* layer
) const;
90 // Repaint parts of all composited layers that intersect the given absolute rectangle.
91 void repaintCompositedLayersAbsoluteRect(const IntRect
&);
93 RenderLayer
* rootRenderLayer() const;
94 GraphicsLayer
* rootPlatformLayer() const;
96 void didMoveOnscreen();
97 void willMoveOffscreen();
99 void updateRootLayerPosition();
101 // Walk the tree looking for layers with 3d transforms. Useful in case you need
102 // to know if there is non-affine content, e.g. for drawing into an image.
103 bool has3DContent() const;
105 void setDocumentScale(float, RenderLayer
* = 0);
108 // Whether the given RL needs a compositing layer.
109 bool needsToBeComposited(const RenderLayer
*) const;
110 // Whether the layer has an intrinsic need for compositing layer.
111 bool requiresCompositingLayer(const RenderLayer
*) const;
113 // Repaint the given rect (which is layer's coords), and regions of child layers that intersect that rect.
114 void recursiveRepaintLayerRect(RenderLayer
* layer
, const IntRect
& rect
);
116 void computeCompositingRequirements(RenderLayer
*, struct CompositingState
&);
117 void rebuildCompositingLayerTree(RenderLayer
* layer
, struct CompositingState
&);
119 // Hook compositing layers together
120 void setCompositingParent(RenderLayer
* childLayer
, RenderLayer
* parentLayer
);
121 void removeCompositedChildren(RenderLayer
*);
123 void parentInRootLayer(RenderLayer
*);
125 bool layerHas3DContent(const RenderLayer
*) const;
127 void ensureRootPlatformLayer();
129 // Whether a running transition or animation enforces the need for a compositing layer.
130 static bool requiresCompositingForAnimation(RenderObject
*);
131 static bool requiresCompositingForTransform(RenderObject
*);
134 RenderView
* m_renderView
;
135 GraphicsLayer
* m_rootPlatformLayer
;
137 bool m_rootLayerAttached
;
138 bool m_compositingLayersNeedUpdate
;
139 #if PROFILE_LAYER_REBUILD
140 int m_rootLayerUpdateCount
;
145 } // namespace WebCore
147 #endif // RenderLayerCompositor_h