• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009, 2010, 2011 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 CompositedLayerMapping_h
27 #define CompositedLayerMapping_h
28 
29 #include "core/rendering/RenderLayer.h"
30 #include "platform/geometry/FloatPoint.h"
31 #include "platform/geometry/FloatPoint3D.h"
32 #include "platform/graphics/GraphicsLayer.h"
33 #include "platform/graphics/GraphicsLayerClient.h"
34 #include "platform/transforms/TransformationMatrix.h"
35 
36 namespace WebCore {
37 
38 class KeyframeList;
39 class RenderLayerCompositor;
40 class WebAnimationProvider;
41 
42 enum CompositingLayerType {
43     NormalCompositingLayer, // non-tiled layer with backing store
44     MediaCompositingLayer, // layer that contains an image, video, webGL or plugin
45     ContainerCompositingLayer // layer with no backing store
46 };
47 
48 
49 // A GraphicsLayerPaintInfo contains all the info needed to paint a partial subtree of RenderLayers into a GraphicsLayer.
50 struct GraphicsLayerPaintInfo {
51     RenderLayer* renderLayer;
52 
53     IntRect compositedBounds;
54 
55     // A temporary offset used for squashing layers, when the origin of the
56     // squashing layer is not yet known.
57     IntSize offsetFromBackingRoot;
58 
59     IntSize offsetFromRenderer;
60 
61     GraphicsLayerPaintingPhase paintingPhase;
62 
63     bool isBackgroundLayer;
64 };
65 
66 // CompositedLayerMapping keeps track of how RenderLayers of the render tree correspond to
67 // GraphicsLayers of the composited layer tree. Each instance of CompositedLayerMapping
68 // manages a small cluster of GraphicsLayers and the references to which RenderLayers
69 // and paint phases contribute to each GraphicsLayer.
70 //
71 // Currently (Oct. 2013) there is one CompositedLayerMapping for each RenderLayer,
72 // but this is likely to evolve soon.
73 class CompositedLayerMapping : public GraphicsLayerClient {
74     WTF_MAKE_NONCOPYABLE(CompositedLayerMapping); WTF_MAKE_FAST_ALLOCATED;
75 public:
76     explicit CompositedLayerMapping(RenderLayer*);
77     ~CompositedLayerMapping();
78 
owningLayer()79     RenderLayer* owningLayer() const { return m_owningLayer; }
80 
81     enum UpdateAfterLayoutFlag {
82         CompositingChildrenOnly = 1 << 0,
83         NeedsFullRepaint = 1 << 1,
84         IsUpdateRoot = 1 << 2
85     };
86     typedef unsigned UpdateAfterLayoutFlags;
87     void updateAfterLayout(UpdateAfterLayoutFlags);
88 
89     // Returns true if layer configuration changed.
90     bool updateGraphicsLayerConfiguration();
91     // Update graphics layer position and bounds.
92     void updateGraphicsLayerGeometry(); // make private
93     // Update whether layer needs blending.
94     void updateContentsOpaque();
95 
mainGraphicsLayer()96     GraphicsLayer* mainGraphicsLayer() const { return m_graphicsLayer.get(); }
97 
98     // Layer to clip children
hasClippingLayer()99     bool hasClippingLayer() const { return m_childContainmentLayer; }
clippingLayer()100     GraphicsLayer* clippingLayer() const { return m_childContainmentLayer.get(); }
101 
102     // Layer to get clipped by ancestor
hasAncestorClippingLayer()103     bool hasAncestorClippingLayer() const { return m_ancestorClippingLayer; }
ancestorClippingLayer()104     GraphicsLayer* ancestorClippingLayer() const { return m_ancestorClippingLayer.get(); }
105 
hasContentsLayer()106     bool hasContentsLayer() const { return m_foregroundLayer; }
foregroundLayer()107     GraphicsLayer* foregroundLayer() const { return m_foregroundLayer.get(); }
108 
backgroundLayer()109     GraphicsLayer* backgroundLayer() const { return m_backgroundLayer.get(); }
backgroundLayerPaintsFixedRootBackground()110     bool backgroundLayerPaintsFixedRootBackground() const { return m_backgroundLayerPaintsFixedRootBackground; }
111 
hasScrollingLayer()112     bool hasScrollingLayer() const { return m_scrollingLayer; }
scrollingLayer()113     GraphicsLayer* scrollingLayer() const { return m_scrollingLayer.get(); }
scrollingContentsLayer()114     GraphicsLayer* scrollingContentsLayer() const { return m_scrollingContentsLayer.get(); }
115 
hasMaskLayer()116     bool hasMaskLayer() const { return m_maskLayer; }
hasChildClippingMaskLayer()117     bool hasChildClippingMaskLayer() const { return m_childClippingMaskLayer; }
118 
119     GraphicsLayer* parentForSublayers() const;
120     GraphicsLayer* childForSuperlayers() const;
121 
squashingLayer()122     GraphicsLayer* squashingLayer() const { return m_squashingLayer.get(); }
123 
124     // Returns true for a composited layer that has no backing store of its own, so
125     // paints into some ancestor layer.
paintsIntoCompositedAncestor()126     bool paintsIntoCompositedAncestor() const { return !(m_requiresOwnBackingStoreForAncestorReasons || m_requiresOwnBackingStoreForIntrinsicReasons); }
127 
128     // Updates whether a backing store is needed based on the layer's compositing ancestor's
129     // properties; returns true if the need for a backing store for ancestor reasons changed.
130     bool updateRequiresOwnBackingStoreForAncestorReasons(const RenderLayer* compositingAncestor);
131 
132     // Updates whether a backing store is needed for intrinsic reasons (that is, based on the
133     // layer's own properties or compositing reasons); returns true if the intrinsic need for
134     // a backing store changed.
135     bool updateRequiresOwnBackingStoreForIntrinsicReasons();
136 
137     void setContentsNeedDisplay();
138     // r is in the coordinate space of the layer's render object
139     void setContentsNeedDisplayInRect(const IntRect&);
140 
141     // Notification from the renderer that its content changed.
142     void contentChanged(ContentChangeType);
143 
144     // Interface to start, finish, suspend and resume animations and transitions
145     bool startTransition(double, CSSPropertyID, const RenderStyle* fromStyle, const RenderStyle* toStyle);
146     void transitionPaused(double timeOffset, CSSPropertyID);
147     void transitionFinished(CSSPropertyID);
148 
149     bool startAnimation(double timeOffset, const CSSAnimationData*, const KeyframeList& keyframes);
150     void animationPaused(double timeOffset, const String& name);
151     void animationFinished(const String& name);
152 
153     IntRect compositedBounds() const;
154     void setCompositedBounds(const IntRect&);
155     void updateCompositedBounds();
156 
157     void updateAfterWidgetResize();
158     void positionOverflowControlsLayers(const IntSize& offsetFromRoot);
159     bool hasUnpositionedOverflowControlsLayers() const;
160 
161     void addRenderLayerToSquashingGraphicsLayer(RenderLayer*, IntSize offsetFromTargetBacking, size_t nextSquashedLayerIndex);
162     void finishAccumulatingSquashingLayers(size_t nextSquashedLayerIndex);
163 
164     // GraphicsLayerClient interface
165     virtual void notifyAnimationStarted(const GraphicsLayer*, double wallClockTime, double monotonicTime) OVERRIDE;
166 
167     virtual void paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase, const IntRect& clip) OVERRIDE;
168 
169     virtual void didCommitChangesForLayer(const GraphicsLayer*) const OVERRIDE;
170     virtual bool getCurrentTransform(const GraphicsLayer*, TransformationMatrix&) const OVERRIDE;
171 
172     virtual bool isTrackingRepaints() const OVERRIDE;
173 
174     PassOwnPtr<Vector<FloatRect> > collectTrackedRepaintRects() const;
175 
176 #ifndef NDEBUG
177     virtual void verifyNotPainting();
178 #endif
179 
180     IntRect contentsBox() const;
181     IntRect backgroundBox() const;
182 
183     // For informative purposes only.
184     CompositingLayerType compositingLayerType() const;
185 
layerForHorizontalScrollbar()186     GraphicsLayer* layerForHorizontalScrollbar() const { return m_layerForHorizontalScrollbar.get(); }
layerForVerticalScrollbar()187     GraphicsLayer* layerForVerticalScrollbar() const { return m_layerForVerticalScrollbar.get(); }
layerForScrollCorner()188     GraphicsLayer* layerForScrollCorner() const { return m_layerForScrollCorner.get(); }
189 
190     void updateFilters(const RenderStyle*);
canCompositeFilters()191     bool canCompositeFilters() const { return m_canCompositeFilters; }
192 
193     // Return an estimate of the backing store area (in pixels) allocated by this object's GraphicsLayers.
194     double backingStoreMemoryEstimate() const;
195 
196     void setBlendMode(blink::WebBlendMode);
197 
198     virtual String debugName(const GraphicsLayer*) OVERRIDE;
199 
200 private:
201     void createPrimaryGraphicsLayer();
202     void destroyGraphicsLayers();
203 
204     PassOwnPtr<GraphicsLayer> createGraphicsLayer(CompositingReasons);
205 
renderer()206     RenderLayerModelObject* renderer() const { return m_owningLayer->renderer(); }
compositor()207     RenderLayerCompositor* compositor() const { return m_owningLayer->compositor(); }
208 
209     void updateInternalHierarchy();
210     bool updateClippingLayers(bool needsAncestorClip, bool needsDescendantClip);
211     bool updateOverflowControlsLayers(bool needsHorizontalScrollbarLayer, bool needsVerticalScrollbarLayer, bool needsScrollCornerLayer);
212     bool updateForegroundLayer(bool needsForegroundLayer);
213     bool updateBackgroundLayer(bool needsBackgroundLayer);
214     bool updateMaskLayer(bool needsMaskLayer);
215     bool updateClippingMaskLayers(bool needsChildClippingMaskLayer);
requiresHorizontalScrollbarLayer()216     bool requiresHorizontalScrollbarLayer() const { return m_owningLayer->scrollableArea() && m_owningLayer->scrollableArea()->horizontalScrollbar(); }
requiresVerticalScrollbarLayer()217     bool requiresVerticalScrollbarLayer() const { return m_owningLayer->scrollableArea() && m_owningLayer->scrollableArea()->verticalScrollbar(); }
requiresScrollCornerLayer()218     bool requiresScrollCornerLayer() const { return m_owningLayer->scrollableArea() && !m_owningLayer->scrollableArea()->scrollCornerAndResizerRect().isEmpty(); }
219     bool updateScrollingLayers(bool scrollingLayers);
220     void updateScrollParent(RenderLayer*);
221     void updateClipParent(RenderLayer*);
222     bool updateSquashingLayers(bool needsSquashingLayers);
223     void updateDrawsContent(bool isSimpleContainer);
224     void registerScrollingLayers();
225 
226     void setBackgroundLayerPaintsFixedRootBackground(bool);
227 
228     GraphicsLayerPaintingPhase paintingPhaseForPrimaryLayer() const;
229 
230     IntSize contentOffsetInCompostingLayer() const;
231     // Result is transform origin in pixels.
232     FloatPoint3D computeTransformOrigin(const IntRect& borderBox) const;
233     // Result is perspective origin in pixels.
234     FloatPoint computePerspectiveOrigin(const IntRect& borderBox) const;
235 
236     void updateOpacity(const RenderStyle*);
237     void updateTransform(const RenderStyle*);
238     void updateLayerBlendMode(const RenderStyle*);
239     void updateIsRootForIsolatedGroup();
240     // Return the opacity value that this layer should use for compositing.
241     float compositingOpacity(float rendererOpacity) const;
242 
243     bool isMainFrameRenderViewLayer() const;
244 
245     bool paintsBoxDecorations() const;
246     bool paintsChildren() const;
247 
248     // Returns true if this compositing layer has no visible content.
249     bool isSimpleContainerCompositingLayer() const;
250     // Returns true if this layer has content that needs to be rendered by painting into the backing store.
251     bool containsPaintedContent(bool isSimpleContainer) const;
252     // Returns true if the RenderLayer just contains an image that we can composite directly.
253     bool isDirectlyCompositedImage() const;
254     void updateImageContents();
255 
256     Color rendererBackgroundColor() const;
257     void updateBackgroundColor(bool isSimpleContainer);
258     void updateContentsRect(bool isSimpleContainer);
259 
260     void updateCompositingReasons();
261 
262     bool hasVisibleNonCompositingDescendantLayers() const;
263 
264     bool shouldClipCompositedBounds() const;
265 
266     void paintsIntoCompositedAncestorChanged();
267 
268     void doPaintTask(GraphicsLayerPaintInfo&, GraphicsContext*, const IntRect& clip);
269 
270     RenderLayer* m_owningLayer;
271 
272     // The hierarchy of layers that is maintained by the CompositedLayerMapping looks like this:
273     //
274     //  + m_ancestorClippingLayer [OPTIONAL]
275     //     + m_graphicsLayer
276     //        + m_childContainmentLayer [OPTIONAL] <-OR-> m_scrollingLayer [OPTIONAL]
277     //                                                     + m_scrollingContentsLayer [OPTIONAL]
278     //
279     // We need an ancestor clipping layer if our clipping ancestor is not our ancestor in the
280     // clipping tree. Here's what that might look like.
281     //
282     // Let A = the clipping ancestor,
283     //     B = the clip descendant, and
284     //     SC = the stacking context that is the ancestor of A and B in the stacking tree.
285     //
286     // SC
287     //  + A = m_graphicsLayer
288     //  |  + m_childContainmentLayer
289     //  |     + ...
290     //  ...
291     //  |
292     //  + B = m_ancestorClippingLayer [+]
293     //     + m_graphicsLayer
294     //        + ...
295     //
296     // In this case B is clipped by another layer that doesn't happen to be its ancestor: A.
297     // So we create an ancestor clipping layer for B, [+], which ensures that B is clipped
298     // as if it had been A's descendant.
299     OwnPtr<GraphicsLayer> m_ancestorClippingLayer; // Only used if we are clipped by an ancestor which is not a stacking context.
300     OwnPtr<GraphicsLayer> m_graphicsLayer;
301     OwnPtr<GraphicsLayer> m_childContainmentLayer; // Only used if we have clipping on a stacking context with compositing children.
302     OwnPtr<GraphicsLayer> m_scrollingLayer; // Only used if the layer is using composited scrolling.
303     OwnPtr<GraphicsLayer> m_scrollingContentsLayer; // Only used if the layer is using composited scrolling.
304 
305     // This layer is also added to the hierarchy by the RLB, but in a different way than
306     // the layers above. It's added to m_graphicsLayer as its mask layer (naturally) if
307     // we have a mask, and isn't part of the typical hierarchy (it has no children).
308     OwnPtr<GraphicsLayer> m_maskLayer; // Only used if we have a mask.
309     OwnPtr<GraphicsLayer> m_childClippingMaskLayer; // Only used if we have to clip child layers or accelerated contents with border radius or clip-path.
310 
311     // There are two other (optional) layers whose painting is managed by the CompositedLayerMapping,
312     // but whose position in the hierarchy is maintained by the RenderLayerCompositor. These
313     // are the foreground and background layers. The foreground layer exists if we have composited
314     // descendants with negative z-order. We need the extra layer in this case because the layer
315     // needs to draw both below (for the background, say) and above (for the normal flow content, say)
316     // the negative z-order descendants and this is impossible with a single layer. The RLC handles
317     // inserting m_foregroundLayer in the correct position in our descendant list for us (right after
318     // the neg z-order dsecendants).
319     //
320     // The background layer is only created if this is the root layer and our background is entirely
321     // fixed. In this case we want to put the background in a separate composited layer so that when
322     // we scroll, we don't have to re-raster the background into position. This layer is also inserted
323     // into the tree by the RLC as it gets a special home. This layer becomes a descendant of the
324     // frame clipping layer. That is:
325     //   ...
326     //     + frame clipping layer
327     //       + m_backgroundLayer
328     //       + frame scrolling layer
329     //         + root content layer
330     //
331     // With the hierarchy set up like this, the root content layer is able to scroll without affecting
332     // the background layer (or repainting).
333     OwnPtr<GraphicsLayer> m_foregroundLayer; // Only used in cases where we need to draw the foreground separately.
334     OwnPtr<GraphicsLayer> m_backgroundLayer; // Only used in cases where we need to draw the background separately.
335 
336     OwnPtr<GraphicsLayer> m_layerForHorizontalScrollbar;
337     OwnPtr<GraphicsLayer> m_layerForVerticalScrollbar;
338     OwnPtr<GraphicsLayer> m_layerForScrollCorner;
339 
340     OwnPtr<WebAnimationProvider> m_animationProvider;
341 
342     OwnPtr<GraphicsLayer> m_squashingContainmentLayer; // Only used if any squashed layers exist, to contain the squashed layers as siblings to the rest of the GraphicsLayer tree chunk.
343     OwnPtr<GraphicsLayer> m_squashingLayer; // Only used if any squashed layers exist, this is the backing that squashed layers paint into.
344     Vector<GraphicsLayerPaintInfo> m_squashedLayers;
345 
346     IntRect m_compositedBounds;
347 
348     bool m_artificiallyInflatedBounds; // bounds had to be made non-zero to make transform-origin work
349     bool m_boundsConstrainedByClipping;
350     bool m_isMainFrameRenderViewLayer;
351     bool m_requiresOwnBackingStoreForIntrinsicReasons;
352     bool m_requiresOwnBackingStoreForAncestorReasons;
353     bool m_canCompositeFilters;
354     bool m_backgroundLayerPaintsFixedRootBackground;
355 };
356 
357 } // namespace WebCore
358 
359 #endif // CompositedLayerMapping_h
360