• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 Apple Inc. All rights reserved.
3  * Copyright (C) 2013 Intel Corporation. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 #ifndef GraphicsLayer_h
28 #define GraphicsLayer_h
29 
30 #include "platform/PlatformExport.h"
31 #include "platform/geometry/FloatPoint.h"
32 #include "platform/geometry/FloatPoint3D.h"
33 #include "platform/geometry/FloatSize.h"
34 #include "platform/geometry/IntRect.h"
35 #include "platform/graphics/Color.h"
36 #include "platform/graphics/ContentLayerDelegate.h"
37 #include "platform/graphics/GraphicsLayerClient.h"
38 #include "platform/graphics/GraphicsLayerDebugInfo.h"
39 #include "platform/graphics/filters/FilterOperations.h"
40 #include "platform/transforms/TransformationMatrix.h"
41 #include "public/platform/WebCompositorAnimationDelegate.h"
42 #include "public/platform/WebContentLayer.h"
43 #include "public/platform/WebImageLayer.h"
44 #include "public/platform/WebInvalidationDebugAnnotations.h"
45 #include "public/platform/WebLayerClient.h"
46 #include "public/platform/WebLayerScrollClient.h"
47 #include "public/platform/WebNinePatchLayer.h"
48 #include "wtf/OwnPtr.h"
49 #include "wtf/PassOwnPtr.h"
50 #include "wtf/Vector.h"
51 
52 namespace blink {
53 
54 class FloatRect;
55 class GraphicsContext;
56 class GraphicsLayer;
57 class GraphicsLayerFactory;
58 class GraphicsLayerFactoryChromium;
59 class Image;
60 class JSONObject;
61 class ScrollableArea;
62 class WebCompositorAnimation;
63 class WebLayer;
64 
65 // FIXME: find a better home for this declaration.
66 class PLATFORM_EXPORT LinkHighlightClient {
67 public:
68     virtual void invalidate() = 0;
69     virtual void clearCurrentGraphicsLayer() = 0;
70     virtual WebLayer* layer() = 0;
71 
72 protected:
~LinkHighlightClient()73     virtual ~LinkHighlightClient() { }
74 };
75 
76 typedef Vector<GraphicsLayer*, 64> GraphicsLayerVector;
77 
78 // GraphicsLayer is an abstraction for a rendering surface with backing store,
79 // which may have associated transformation and animations.
80 
81 class PLATFORM_EXPORT GraphicsLayer : public GraphicsContextPainter, public WebCompositorAnimationDelegate, public WebLayerScrollClient, public WebLayerClient {
82     WTF_MAKE_NONCOPYABLE(GraphicsLayer); WTF_MAKE_FAST_ALLOCATED;
83 public:
84     static PassOwnPtr<GraphicsLayer> create(GraphicsLayerFactory*, GraphicsLayerClient*);
85 
86     virtual ~GraphicsLayer();
87 
client()88     GraphicsLayerClient* client() const { return m_client; }
89 
90     // WebLayerClient implementation.
91     virtual WebGraphicsLayerDebugInfo* takeDebugInfoFor(WebLayer*) OVERRIDE;
92 
93     GraphicsLayerDebugInfo& debugInfo();
94 
95     void setCompositingReasons(CompositingReasons);
compositingReasons()96     CompositingReasons compositingReasons() const { return m_debugInfo.compositingReasons(); }
97     void setOwnerNodeId(int);
98 
parent()99     GraphicsLayer* parent() const { return m_parent; };
100     void setParent(GraphicsLayer*); // Internal use only.
101 
children()102     const Vector<GraphicsLayer*>& children() const { return m_children; }
103     // Returns true if the child list changed.
104     bool setChildren(const GraphicsLayerVector&);
105 
106     // Add child layers. If the child is already parented, it will be removed from its old parent.
107     void addChild(GraphicsLayer*);
108     void addChildBelow(GraphicsLayer*, GraphicsLayer* sibling);
109 
110     void removeAllChildren();
111     void removeFromParent();
112 
maskLayer()113     GraphicsLayer* maskLayer() const { return m_maskLayer; }
114     void setMaskLayer(GraphicsLayer*);
115 
contentsClippingMaskLayer()116     GraphicsLayer* contentsClippingMaskLayer() const { return m_contentsClippingMaskLayer; }
117     void setContentsClippingMaskLayer(GraphicsLayer*);
118 
119     // The given layer will replicate this layer and its children; the replica renders behind this layer.
120     void setReplicatedByLayer(GraphicsLayer*);
121     // The layer that replicates this layer (if any).
replicaLayer()122     GraphicsLayer* replicaLayer() const { return m_replicaLayer; }
123     // The layer being replicated.
replicatedLayer()124     GraphicsLayer* replicatedLayer() const { return m_replicatedLayer; }
125 
126     enum ShouldSetNeedsDisplay {
127         DontSetNeedsDisplay,
128         SetNeedsDisplay
129     };
130 
131     // Offset is origin of the renderer minus origin of the graphics layer (so either zero or negative).
offsetFromRenderer()132     IntSize offsetFromRenderer() const { return m_offsetFromRenderer; }
133     void setOffsetFromRenderer(const IntSize&, ShouldSetNeedsDisplay = SetNeedsDisplay);
134 
135     // The position of the layer (the location of its top-left corner in its parent)
position()136     const FloatPoint& position() const { return m_position; }
137     void setPosition(const FloatPoint&);
138 
transformOrigin()139     const FloatPoint3D& transformOrigin() const { return m_transformOrigin; }
140     void setTransformOrigin(const FloatPoint3D&);
141 
142     // The size of the layer.
size()143     const FloatSize& size() const { return m_size; }
144     void setSize(const FloatSize&);
145 
transform()146     const TransformationMatrix& transform() const { return m_transform; }
147     void setTransform(const TransformationMatrix&);
148     void setShouldFlattenTransform(bool);
149     void setRenderingContext(int id);
150     void setMasksToBounds(bool);
151 
drawsContent()152     bool drawsContent() const { return m_drawsContent; }
153     void setDrawsContent(bool);
154 
contentsAreVisible()155     bool contentsAreVisible() const { return m_contentsVisible; }
156     void setContentsVisible(bool);
157 
158     void setScrollParent(WebLayer*);
159     void setClipParent(WebLayer*);
160 
161     // For special cases, e.g. drawing missing tiles on Android.
162     // The compositor should never paint this color in normal cases because the RenderLayer
163     // will paint background by itself.
164     void setBackgroundColor(const Color&);
165 
166     // opaque means that we know the layer contents have no alpha
contentsOpaque()167     bool contentsOpaque() const { return m_contentsOpaque; }
168     void setContentsOpaque(bool);
169 
backfaceVisibility()170     bool backfaceVisibility() const { return m_backfaceVisibility; }
171     void setBackfaceVisibility(bool visible);
172 
opacity()173     float opacity() const { return m_opacity; }
174     void setOpacity(float);
175 
176     void setBlendMode(WebBlendMode);
177     void setIsRootForIsolatedGroup(bool);
178 
179     void setFilters(const FilterOperations&);
180 
181     // Some GraphicsLayers paint only the foreground or the background content
182     void setPaintingPhase(GraphicsLayerPaintingPhase);
183 
184     void setNeedsDisplay();
185     // mark the given rect (in layer coords) as needing dispay. Never goes deep.
186     void setNeedsDisplayInRect(const FloatRect&, WebInvalidationDebugAnnotations);
187 
188     void setContentsNeedsDisplay();
189 
190     // Set that the position/size of the contents (image or video).
191     void setContentsRect(const IntRect&);
192 
193     // Return true if the animation is handled by the compositing system. If this returns
194     // false, the animation will be run by AnimationController.
195     // These methods handle both transitions and keyframe animations.
196     bool addAnimation(PassOwnPtr<WebCompositorAnimation>);
197     void pauseAnimation(int animationId, double /*timeOffset*/);
198     void removeAnimation(int animationId);
199 
200     // Layer contents
201     void setContentsToImage(Image*);
202     void setContentsToNinePatch(Image*, const IntRect& aperture);
setContentsToPlatformLayer(WebLayer * layer)203     void setContentsToPlatformLayer(WebLayer* layer) { setContentsTo(layer); }
hasContentsLayer()204     bool hasContentsLayer() const { return m_contentsLayer; }
205 
206     // For hosting this GraphicsLayer in a native layer hierarchy.
207     WebLayer* platformLayer() const;
208 
209     typedef HashMap<int, int> RenderingContextMap;
210     PassRefPtr<JSONObject> layerTreeAsJSON(LayerTreeFlags, RenderingContextMap&) const;
211 
paintCount()212     int paintCount() const { return m_paintCount; }
213 
214     // Return a string with a human readable form of the layer tree, If debug is true
215     // pointers for the layers and timing data will be included in the returned string.
216     String layerTreeAsText(LayerTreeFlags = LayerTreeNormal) const;
217 
218     void resetTrackedPaintInvalidations();
219     void addRepaintRect(const FloatRect&);
220 
221     void addLinkHighlight(LinkHighlightClient*);
222     void removeLinkHighlight(LinkHighlightClient*);
223     // Exposed for tests
numLinkHighlights()224     unsigned numLinkHighlights() { return m_linkHighlights.size(); }
linkHighlight(int i)225     LinkHighlightClient* linkHighlight(int i) { return m_linkHighlights[i]; }
226 
227     void setScrollableArea(ScrollableArea*, bool isMainFrame);
scrollableArea()228     ScrollableArea* scrollableArea() const { return m_scrollableArea; }
229 
contentLayer()230     WebContentLayer* contentLayer() const { return m_layer.get(); }
231 
232     static void registerContentsLayer(WebLayer*);
233     static void unregisterContentsLayer(WebLayer*);
234 
235     // GraphicsContextPainter implementation.
236     virtual void paint(GraphicsContext&, const IntRect& clip) OVERRIDE;
237 
238     // WebCompositorAnimationDelegate implementation.
239     virtual void notifyAnimationStarted(double monotonicTime, WebCompositorAnimation::TargetProperty) OVERRIDE;
240     virtual void notifyAnimationFinished(double monotonicTime, WebCompositorAnimation::TargetProperty) OVERRIDE;
241 
242     // WebLayerScrollClient implementation.
243     virtual void didScroll() OVERRIDE;
244 
245 protected:
246     String debugName(WebLayer*) const;
247 
248     explicit GraphicsLayer(GraphicsLayerClient*);
249     // GraphicsLayerFactoryChromium that wants to create a GraphicsLayer need to be friends.
250     friend class GraphicsLayerFactoryChromium;
251 
252     // Exposed for tests.
contentsLayer()253     virtual WebLayer* contentsLayer() const { return m_contentsLayer; }
254 
255 private:
256     // Callback from the underlying graphics system to draw layer contents.
257     void paintGraphicsLayerContents(GraphicsContext&, const IntRect& clip);
258 
259     // Adds a child without calling updateChildList(), so that adding children
260     // can be batched before updating.
261     void addChildInternal(GraphicsLayer*);
262 
263 #if ENABLE(ASSERT)
264     bool hasAncestor(GraphicsLayer*) const;
265 #endif
266 
setReplicatedLayer(GraphicsLayer * layer)267     void setReplicatedLayer(GraphicsLayer* layer) { m_replicatedLayer = layer; }
268 
incrementPaintCount()269     void incrementPaintCount() { ++m_paintCount; }
270 
271     // Helper functions used by settors to keep layer's the state consistent.
272     void updateChildList();
273     void updateLayerIsDrawable();
274     void updateContentsRect();
275 
276     void setContentsTo(WebLayer*);
277     void setupContentsLayer(WebLayer*);
278     void clearContentsLayerIfUnregistered();
279     WebLayer* contentsLayerIfRegistered();
280 
281     GraphicsLayerClient* m_client;
282 
283     // Offset from the owning renderer
284     IntSize m_offsetFromRenderer;
285 
286     // Position is relative to the parent GraphicsLayer
287     FloatPoint m_position;
288     FloatSize m_size;
289 
290     TransformationMatrix m_transform;
291     FloatPoint3D m_transformOrigin;
292 
293     Color m_backgroundColor;
294     float m_opacity;
295 
296     WebBlendMode m_blendMode;
297 
298     bool m_hasTransformOrigin : 1;
299     bool m_contentsOpaque : 1;
300     bool m_shouldFlattenTransform: 1;
301     bool m_backfaceVisibility : 1;
302     bool m_masksToBounds : 1;
303     bool m_drawsContent : 1;
304     bool m_contentsVisible : 1;
305     bool m_isRootForIsolatedGroup : 1;
306 
307     bool m_hasScrollParent : 1;
308     bool m_hasClipParent : 1;
309 
310     GraphicsLayerPaintingPhase m_paintingPhase;
311 
312     Vector<GraphicsLayer*> m_children;
313     GraphicsLayer* m_parent;
314 
315     GraphicsLayer* m_maskLayer; // Reference to mask layer. We don't own this.
316     GraphicsLayer* m_contentsClippingMaskLayer; // Reference to clipping mask layer. We don't own this.
317 
318     GraphicsLayer* m_replicaLayer; // A layer that replicates this layer. We only allow one, for now.
319                                    // The replica is not parented; this is the primary reference to it.
320     GraphicsLayer* m_replicatedLayer; // For a replica layer, a reference to the original layer.
321     FloatPoint m_replicatedLayerPosition; // For a replica layer, the position of the replica.
322 
323     IntRect m_contentsRect;
324 
325     int m_paintCount;
326 
327     OwnPtr<WebContentLayer> m_layer;
328     OwnPtr<WebImageLayer> m_imageLayer;
329     OwnPtr<WebNinePatchLayer> m_ninePatchLayer;
330     WebLayer* m_contentsLayer;
331     // We don't have ownership of m_contentsLayer, but we do want to know if a given layer is the
332     // same as our current layer in setContentsTo(). Since m_contentsLayer may be deleted at this point,
333     // we stash an ID away when we know m_contentsLayer is alive and use that for comparisons from that point
334     // on.
335     int m_contentsLayerId;
336 
337     Vector<LinkHighlightClient*> m_linkHighlights;
338 
339     OwnPtr<ContentLayerDelegate> m_contentLayerDelegate;
340 
341     ScrollableArea* m_scrollableArea;
342     GraphicsLayerDebugInfo m_debugInfo;
343     int m_3dRenderingContext;
344 };
345 
346 } // namespace blink
347 
348 #ifndef NDEBUG
349 // Outside the WebCore namespace for ease of invocation from gdb.
350 void PLATFORM_EXPORT showGraphicsLayerTree(const blink::GraphicsLayer*);
351 #endif
352 
353 #endif // GraphicsLayer_h
354