• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 GraphicsLayer_h
27 #define GraphicsLayer_h
28 
29 #if USE(ACCELERATED_COMPOSITING)
30 
31 #include "Animation.h"
32 #include "Color.h"
33 #include "FloatPoint.h"
34 #include "FloatPoint3D.h"
35 #include "FloatSize.h"
36 #if ENABLE(3D_CANVAS)
37 #include "GraphicsContext3D.h"
38 #endif
39 #include "GraphicsLayerClient.h"
40 #include "IntRect.h"
41 #include "TransformationMatrix.h"
42 #include "TransformOperations.h"
43 #include <wtf/OwnPtr.h>
44 #include <wtf/PassOwnPtr.h>
45 
46 #if PLATFORM(MAC)
47 #ifdef __OBJC__
48 @class WebLayer;
49 @class CALayer;
50 typedef CALayer PlatformLayer;
51 typedef CALayer* NativeLayer;
52 #else
53 typedef void* PlatformLayer;
54 typedef void* NativeLayer;
55 #endif
56 #elif PLATFORM(WIN)
57 namespace WebCore {
58 class WKCACFLayer;
59 typedef WKCACFLayer PlatformLayer;
60 typedef void* NativeLayer;
61 }
62 #elif PLATFORM(QT)
63 class QGraphicsItem;
64 typedef QGraphicsItem PlatformLayer;
65 typedef QGraphicsItem* NativeLayer;
66 #else
67 typedef void* PlatformLayer;
68 typedef void* NativeLayer;
69 #endif
70 
71 namespace WebCore {
72 
73 class FloatPoint3D;
74 class GraphicsContext;
75 class Image;
76 class TextStream;
77 class TimingFunction;
78 
79 // Base class for animation values (also used for transitions). Here to
80 // represent values for properties being animated via the GraphicsLayer,
81 // without pulling in style-related data from outside of the platform directory.
82 class AnimationValue : public Noncopyable {
83 public:
84     AnimationValue(float keyTime, const TimingFunction* timingFunction = 0)
m_keyTime(keyTime)85         : m_keyTime(keyTime)
86         , m_timingFunction(0)
87     {
88         if (timingFunction)
89             m_timingFunction.set(new TimingFunction(*timingFunction));
90     }
91 
~AnimationValue()92     virtual ~AnimationValue() { }
93 
keyTime()94     float keyTime() const { return m_keyTime; }
timingFunction()95     const TimingFunction* timingFunction() const { return m_timingFunction.get(); }
96 
97 private:
98     float m_keyTime;
99     OwnPtr<TimingFunction> m_timingFunction;
100 };
101 
102 // Used to store one float value of an animation.
103 class FloatAnimationValue : public AnimationValue {
104 public:
105     FloatAnimationValue(float keyTime, float value, const TimingFunction* timingFunction = 0)
AnimationValue(keyTime,timingFunction)106         : AnimationValue(keyTime, timingFunction)
107         , m_value(value)
108     {
109     }
110 
value()111     float value() const { return m_value; }
112 
113 private:
114     float m_value;
115 };
116 
117 // Used to store one transform value in a keyframe list.
118 class TransformAnimationValue : public AnimationValue {
119 public:
120     TransformAnimationValue(float keyTime, const TransformOperations* value = 0, const TimingFunction* timingFunction = 0)
AnimationValue(keyTime,timingFunction)121         : AnimationValue(keyTime, timingFunction)
122     {
123         if (value)
124             m_value.set(new TransformOperations(*value));
125     }
126 
value()127     const TransformOperations* value() const { return m_value.get(); }
128 
129 private:
130     OwnPtr<TransformOperations> m_value;
131 };
132 
133 // Used to store a series of values in a keyframe list. Values will all be of the same type,
134 // which can be inferred from the property.
135 class KeyframeValueList : public Noncopyable {
136 public:
137 
KeyframeValueList(AnimatedPropertyID property)138     KeyframeValueList(AnimatedPropertyID property)
139         : m_property(property)
140     {
141     }
142 
~KeyframeValueList()143     ~KeyframeValueList()
144     {
145         deleteAllValues(m_values);
146     }
147 
property()148     AnimatedPropertyID property() const { return m_property; }
149 
size()150     size_t size() const { return m_values.size(); }
at(size_t i)151     const AnimationValue* at(size_t i) const { return m_values.at(i); }
152 
153     // Insert, sorted by keyTime. Takes ownership of the pointer.
154     void insert(const AnimationValue*);
155 
156 protected:
157     Vector<const AnimationValue*> m_values;
158     AnimatedPropertyID m_property;
159 };
160 
161 
162 
163 // GraphicsLayer is an abstraction for a rendering surface with backing store,
164 // which may have associated transformation and animations.
165 
166 class GraphicsLayer {
167 public:
168 
169     static PassOwnPtr<GraphicsLayer> create(GraphicsLayerClient*);
170 
171     virtual ~GraphicsLayer();
172 
client()173     GraphicsLayerClient* client() const { return m_client; }
174 
175     // Layer name. Only used to identify layers in debug output
name()176     const String& name() const { return m_name; }
setName(const String & name)177     virtual void setName(const String& name) { m_name = name; }
178 
179     // For hosting this GraphicsLayer in a native layer hierarchy.
nativeLayer()180     virtual NativeLayer nativeLayer() const { return 0; }
181 
parent()182     GraphicsLayer* parent() const { return m_parent; };
setParent(GraphicsLayer * layer)183     void setParent(GraphicsLayer* layer) { m_parent = layer; } // Internal use only.
184 
185     // Returns true if the layer has the given layer as an ancestor (excluding self).
186     bool hasAncestor(GraphicsLayer*) const;
187 
children()188     const Vector<GraphicsLayer*>& children() const { return m_children; }
189     // Returns true if the child list changed.
190     virtual bool setChildren(const Vector<GraphicsLayer*>&);
191 
192     // Add child layers. If the child is already parented, it will be removed from its old parent.
193     virtual void addChild(GraphicsLayer*);
194     virtual void addChildAtIndex(GraphicsLayer*, int index);
195     virtual void addChildAbove(GraphicsLayer* layer, GraphicsLayer* sibling);
196     virtual void addChildBelow(GraphicsLayer* layer, GraphicsLayer* sibling);
197     virtual bool replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild);
198 
199     void removeAllChildren();
200     virtual void removeFromParent();
201 
maskLayer()202     GraphicsLayer* maskLayer() const { return m_maskLayer; }
setMaskLayer(GraphicsLayer * layer)203     virtual void setMaskLayer(GraphicsLayer* layer) { m_maskLayer = layer; }
204 
205     // The given layer will replicate this layer and its children; the replica renders behind this layer.
206     virtual void setReplicatedByLayer(GraphicsLayer*);
207     // Whether this layer is being replicated by another layer.
isReplicated()208     bool isReplicated() const { return m_replicaLayer; }
209     // The layer that replicates this layer (if any).
replicaLayer()210     GraphicsLayer* replicaLayer() const { return m_replicaLayer; }
211 
replicatedLayerPosition()212     const FloatPoint& replicatedLayerPosition() const { return m_replicatedLayerPosition; }
setReplicatedLayerPosition(const FloatPoint & p)213     void setReplicatedLayerPosition(const FloatPoint& p) { m_replicatedLayerPosition = p; }
214 
215     // Offset is origin of the renderer minus origin of the graphics layer (so either zero or negative).
offsetFromRenderer()216     IntSize offsetFromRenderer() const { return m_offsetFromRenderer; }
setOffsetFromRenderer(const IntSize & offset)217     void setOffsetFromRenderer(const IntSize& offset) { m_offsetFromRenderer = offset; }
218 
219     // The position of the layer (the location of its top-left corner in its parent)
position()220     const FloatPoint& position() const { return m_position; }
setPosition(const FloatPoint & p)221     virtual void setPosition(const FloatPoint& p) { m_position = p; }
222 
223     // Anchor point: (0, 0) is top left, (1, 1) is bottom right. The anchor point
224     // affects the origin of the transforms.
anchorPoint()225     const FloatPoint3D& anchorPoint() const { return m_anchorPoint; }
setAnchorPoint(const FloatPoint3D & p)226     virtual void setAnchorPoint(const FloatPoint3D& p) { m_anchorPoint = p; }
227 
228     // The bounds of the layer
size()229     const FloatSize& size() const { return m_size; }
setSize(const FloatSize & size)230     virtual void setSize(const FloatSize& size) { m_size = size; }
231 
transform()232     const TransformationMatrix& transform() const { return m_transform; }
setTransform(const TransformationMatrix & t)233     virtual void setTransform(const TransformationMatrix& t) { m_transform = t; }
234 
childrenTransform()235     const TransformationMatrix& childrenTransform() const { return m_childrenTransform; }
setChildrenTransform(const TransformationMatrix & t)236     virtual void setChildrenTransform(const TransformationMatrix& t) { m_childrenTransform = t; }
237 
preserves3D()238     bool preserves3D() const { return m_preserves3D; }
setPreserves3D(bool b)239     virtual void setPreserves3D(bool b) { m_preserves3D = b; }
240 
masksToBounds()241     bool masksToBounds() const { return m_masksToBounds; }
setMasksToBounds(bool b)242     virtual void setMasksToBounds(bool b) { m_masksToBounds = b; }
243 
drawsContent()244     bool drawsContent() const { return m_drawsContent; }
setDrawsContent(bool b)245     virtual void setDrawsContent(bool b) { m_drawsContent = b; }
246 
247     // The color used to paint the layer backgrounds
backgroundColor()248     const Color& backgroundColor() const { return m_backgroundColor; }
249     virtual void setBackgroundColor(const Color&);
250     virtual void clearBackgroundColor();
backgroundColorSet()251     bool backgroundColorSet() const { return m_backgroundColorSet; }
252 
253     // opaque means that we know the layer contents have no alpha
contentsOpaque()254     bool contentsOpaque() const { return m_contentsOpaque; }
setContentsOpaque(bool b)255     virtual void setContentsOpaque(bool b) { m_contentsOpaque = b; }
256 
backfaceVisibility()257     bool backfaceVisibility() const { return m_backfaceVisibility; }
setBackfaceVisibility(bool b)258     virtual void setBackfaceVisibility(bool b) { m_backfaceVisibility = b; }
259 
opacity()260     float opacity() const { return m_opacity; }
setOpacity(float opacity)261     virtual void setOpacity(float opacity) { m_opacity = opacity; }
262 
263     // Some GraphicsLayers paint only the foreground or the background content
paintingPhase()264     GraphicsLayerPaintingPhase paintingPhase() const { return m_paintingPhase; }
setPaintingPhase(GraphicsLayerPaintingPhase phase)265     void setPaintingPhase(GraphicsLayerPaintingPhase phase) { m_paintingPhase = phase; }
266 
267     virtual void setNeedsDisplay() = 0;
268     // mark the given rect (in layer coords) as needing dispay. Never goes deep.
269     virtual void setNeedsDisplayInRect(const FloatRect&) = 0;
270 
271     // Set that the position/size of the contents (image or video).
contentsRect()272     IntRect contentsRect() const { return m_contentsRect; }
setContentsRect(const IntRect & r)273     virtual void setContentsRect(const IntRect& r) { m_contentsRect = r; }
274 
275     // Return true if the animation is handled by the compositing system. If this returns
276     // false, the animation will be run by AnimationController.
addAnimation(const KeyframeValueList &,const IntSize &,const Animation *,const String &,double)277     virtual bool addAnimation(const KeyframeValueList&, const IntSize& /*boxSize*/, const Animation*, const String& /*keyframesName*/, double /*timeOffset*/) { return false; }
removeAnimationsForProperty(AnimatedPropertyID)278     virtual void removeAnimationsForProperty(AnimatedPropertyID) { }
removeAnimationsForKeyframes(const String &)279     virtual void removeAnimationsForKeyframes(const String& /* keyframesName */) { }
pauseAnimation(const String &,double)280     virtual void pauseAnimation(const String& /* keyframesName */, double /*timeOffset*/) { }
281 
282     virtual void suspendAnimations(double time);
283     virtual void resumeAnimations();
284 
285     // Layer contents
setContentsToImage(Image *)286     virtual void setContentsToImage(Image*) { }
setContentsToMedia(PlatformLayer *)287     virtual void setContentsToMedia(PlatformLayer*) { } // video or plug-in
setContentsBackgroundColor(const Color &)288     virtual void setContentsBackgroundColor(const Color&) { }
289 
290 #if ENABLE(3D_CANVAS)
setContentsToGraphicsContext3D(const GraphicsContext3D *)291     virtual void setContentsToGraphicsContext3D(const GraphicsContext3D*) { }
setGraphicsContext3DNeedsDisplay()292     virtual void setGraphicsContext3DNeedsDisplay() { }
293 #endif
294     // Callback from the underlying graphics system to draw layer contents.
295     void paintGraphicsLayerContents(GraphicsContext&, const IntRect& clip);
296     // Callback from the underlying graphics system when the layer has been displayed
didDisplay(PlatformLayer *)297     virtual void didDisplay(PlatformLayer*) { }
298 
platformLayer()299     virtual PlatformLayer* platformLayer() const { return 0; }
300 
301     void dumpLayer(TextStream&, int indent = 0) const;
302 
repaintCount()303     int repaintCount() const { return m_repaintCount; }
incrementRepaintCount()304     int incrementRepaintCount() { return ++m_repaintCount; }
305 
306     // Report whether the underlying compositing system uses a top-down
307     // or a bottom-up coordinate system.
308     enum CompositingCoordinatesOrientation { CompositingCoordinatesTopDown, CompositingCoordinatesBottomUp };
309     static CompositingCoordinatesOrientation compositingCoordinatesOrientation();
310 
311     // Set the geometry orientation (top-down, or bottom-up) for this layer, which also controls sublayer geometry.
setGeometryOrientation(CompositingCoordinatesOrientation orientation)312     virtual void setGeometryOrientation(CompositingCoordinatesOrientation orientation) { m_geometryOrientation = orientation; }
geometryOrientation()313     CompositingCoordinatesOrientation geometryOrientation() const { return m_geometryOrientation; }
314 
315     // Flippedness of the contents of this layer. Does not affect sublayer geometry.
setContentsOrientation(CompositingCoordinatesOrientation orientation)316     virtual void setContentsOrientation(CompositingCoordinatesOrientation orientation) { m_contentsOrientation = orientation; }
contentsOrientation()317     CompositingCoordinatesOrientation contentsOrientation() const { return m_contentsOrientation; }
318 
showDebugBorders()319     bool showDebugBorders() { return m_client ? m_client->showDebugBorders() : false; }
showRepaintCounter()320     bool showRepaintCounter() { return m_client ? m_client->showRepaintCounter() : false; }
321 
322     void updateDebugIndicators();
323 
setDebugBackgroundColor(const Color &)324     virtual void setDebugBackgroundColor(const Color&) { }
setDebugBorder(const Color &,float)325     virtual void setDebugBorder(const Color&, float /*borderWidth*/) { }
326     // z-position is the z-equivalent of position(). It's only used for debugging purposes.
zPosition()327     virtual float zPosition() const { return m_zPosition; }
328     virtual void setZPosition(float);
329 
330     virtual void distributeOpacity(float);
331     virtual float accumulatedOpacity() const;
332 
333     // Some compositing systems may do internal batching to synchronize compositing updates
334     // with updates drawn into the window. This is a signal to flush any internal batched state.
syncCompositingState()335     virtual void syncCompositingState() { }
336 
337 protected:
338 
339     typedef Vector<TransformOperation::OperationType> TransformOperationList;
340     // Given a list of TransformAnimationValues, return an array of transform operations.
341     // On return, if hasBigRotation is true, functions contain rotations of >= 180 degrees
342     static void fetchTransformOperationList(const KeyframeValueList&, TransformOperationList&, bool& isValid, bool& hasBigRotation);
343 
setOpacityInternal(float)344     virtual void setOpacityInternal(float) { }
345 
346     // The layer being replicated.
replicatedLayer()347     GraphicsLayer* replicatedLayer() const { return m_replicatedLayer; }
setReplicatedLayer(GraphicsLayer * layer)348     virtual void setReplicatedLayer(GraphicsLayer* layer) { m_replicatedLayer = layer; }
349 
350     GraphicsLayer(GraphicsLayerClient*);
351 
352     void dumpProperties(TextStream&, int indent) const;
353 
354     GraphicsLayerClient* m_client;
355     String m_name;
356 
357     // Offset from the owning renderer
358     IntSize m_offsetFromRenderer;
359 
360     // Position is relative to the parent GraphicsLayer
361     FloatPoint m_position;
362     FloatPoint3D m_anchorPoint;
363     FloatSize m_size;
364     TransformationMatrix m_transform;
365     TransformationMatrix m_childrenTransform;
366 
367     Color m_backgroundColor;
368     float m_opacity;
369     float m_zPosition;
370 
371     bool m_backgroundColorSet : 1;
372     bool m_contentsOpaque : 1;
373     bool m_preserves3D: 1;
374     bool m_backfaceVisibility : 1;
375     bool m_usingTiledLayer : 1;
376     bool m_masksToBounds : 1;
377     bool m_drawsContent : 1;
378 
379     GraphicsLayerPaintingPhase m_paintingPhase;
380     CompositingCoordinatesOrientation m_geometryOrientation;    // affects geometry of layer positions
381     CompositingCoordinatesOrientation m_contentsOrientation;    // affects orientation of layer contents
382 
383     Vector<GraphicsLayer*> m_children;
384     GraphicsLayer* m_parent;
385 
386     GraphicsLayer* m_maskLayer; // Reference to mask layer. We don't own this.
387 
388     GraphicsLayer* m_replicaLayer; // A layer that replicates this layer. We only allow one, for now.
389                                    // The replica is not parented; this is the primary reference to it.
390     GraphicsLayer* m_replicatedLayer; // For a replica layer, a reference to the original layer.
391     FloatPoint m_replicatedLayerPosition; // For a replica layer, the position of the replica.
392 
393     IntRect m_contentsRect;
394 
395     int m_repaintCount;
396 };
397 
398 
399 } // namespace WebCore
400 
401 #endif // USE(ACCELERATED_COMPOSITING)
402 
403 #endif // GraphicsLayer_h
404 
405