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