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 #include "core/platform/animation/CSSAnimationData.h" 30 #include "core/platform/graphics/Color.h" 31 #include "core/platform/graphics/FloatPoint.h" 32 #include "core/platform/graphics/FloatPoint3D.h" 33 #include "core/platform/graphics/FloatSize.h" 34 #include "core/platform/graphics/GraphicsLayerClient.h" 35 #include "core/platform/graphics/IntRect.h" 36 #include "core/platform/graphics/chromium/OpaqueRectTrackingContentLayerDelegate.h" 37 #include "core/platform/graphics/filters/FilterOperations.h" 38 #include "core/platform/graphics/transforms/TransformOperations.h" 39 #include "core/platform/graphics/transforms/TransformationMatrix.h" 40 41 #include "wtf/HashMap.h" 42 #include "wtf/OwnPtr.h" 43 #include "wtf/PassOwnPtr.h" 44 45 #include "public/platform/WebAnimationDelegate.h" 46 #include "public/platform/WebCompositingReasons.h" 47 #include "public/platform/WebContentLayer.h" 48 #include "public/platform/WebImageLayer.h" 49 #include "public/platform/WebLayerScrollClient.h" 50 #include "public/platform/WebSolidColorLayer.h" 51 52 namespace WebKit { 53 class GraphicsLayerFactoryChromium; 54 class WebLayer; 55 } 56 57 namespace WebCore { 58 59 class FloatRect; 60 class GraphicsContext; 61 class GraphicsLayerFactory; 62 class Image; 63 class ScrollableArea; 64 class TextStream; 65 class TimingFunction; 66 67 // Base class for animation values (also used for transitions). Here to 68 // represent values for properties being animated via the GraphicsLayer, 69 // without pulling in style-related data from outside of the platform directory. 70 // FIXME: Should be moved to its own header file. 71 class AnimationValue { 72 WTF_MAKE_FAST_ALLOCATED; 73 public: 74 explicit AnimationValue(float keyTime, PassRefPtr<TimingFunction> timingFunction = 0) 75 : m_keyTime(keyTime) 76 , m_timingFunction(timingFunction) 77 { 78 } 79 80 virtual ~AnimationValue() { } 81 82 float keyTime() const { return m_keyTime; } 83 const TimingFunction* timingFunction() const { return m_timingFunction.get(); } 84 virtual PassOwnPtr<AnimationValue> clone() const = 0; 85 86 private: 87 float m_keyTime; 88 RefPtr<TimingFunction> m_timingFunction; 89 }; 90 91 // Used to store one float value of an animation. 92 // FIXME: Should be moved to its own header file. 93 class FloatAnimationValue : public AnimationValue { 94 public: 95 FloatAnimationValue(float keyTime, float value, PassRefPtr<TimingFunction> timingFunction = 0) 96 : AnimationValue(keyTime, timingFunction) 97 , m_value(value) 98 { 99 } 100 virtual PassOwnPtr<AnimationValue> clone() const OVERRIDE { return adoptPtr(new FloatAnimationValue(*this)); } 101 102 float value() const { return m_value; } 103 104 private: 105 float m_value; 106 }; 107 108 // Used to store one transform value in a keyframe list. 109 // FIXME: Should be moved to its own header file. 110 class TransformAnimationValue : public AnimationValue { 111 public: 112 explicit TransformAnimationValue(float keyTime, const TransformOperations* value = 0, PassRefPtr<TimingFunction> timingFunction = 0) 113 : AnimationValue(keyTime, timingFunction) 114 { 115 if (value) 116 m_value = *value; 117 } 118 virtual PassOwnPtr<AnimationValue> clone() const OVERRIDE { return adoptPtr(new TransformAnimationValue(*this)); } 119 120 const TransformOperations* value() const { return &m_value; } 121 122 private: 123 TransformOperations m_value; 124 }; 125 126 // Used to store one filter value in a keyframe list. 127 // FIXME: Should be moved to its own header file. 128 class FilterAnimationValue : public AnimationValue { 129 public: 130 explicit FilterAnimationValue(float keyTime, const FilterOperations* value = 0, PassRefPtr<TimingFunction> timingFunction = 0) 131 : AnimationValue(keyTime, timingFunction) 132 { 133 if (value) 134 m_value = *value; 135 } 136 virtual PassOwnPtr<AnimationValue> clone() const OVERRIDE { return adoptPtr(new FilterAnimationValue(*this)); } 137 138 const FilterOperations* value() const { return &m_value; } 139 140 private: 141 FilterOperations m_value; 142 }; 143 144 // Used to store a series of values in a keyframe list. 145 // Values will all be of the same type, which can be inferred from the property. 146 // FIXME: Should be moved to its own header file. 147 class KeyframeValueList { 148 public: 149 explicit KeyframeValueList(AnimatedPropertyID property) 150 : m_property(property) 151 { 152 } 153 154 KeyframeValueList(const KeyframeValueList& other) 155 : m_property(other.property()) 156 { 157 for (size_t i = 0; i < other.m_values.size(); ++i) 158 m_values.append(other.m_values[i]->clone()); 159 } 160 161 KeyframeValueList& operator=(const KeyframeValueList& other) 162 { 163 KeyframeValueList copy(other); 164 swap(copy); 165 return *this; 166 } 167 168 void swap(KeyframeValueList& other) 169 { 170 std::swap(m_property, other.m_property); 171 m_values.swap(other.m_values); 172 } 173 174 AnimatedPropertyID property() const { return m_property; } 175 176 size_t size() const { return m_values.size(); } 177 const AnimationValue* at(size_t i) const { return m_values.at(i).get(); } 178 179 // Insert, sorted by keyTime. 180 void insert(PassOwnPtr<const AnimationValue>); 181 182 protected: 183 Vector<OwnPtr<const AnimationValue> > m_values; 184 AnimatedPropertyID m_property; 185 }; 186 187 // FIXME: find a better home for this declaration. 188 class LinkHighlightClient { 189 public: 190 virtual void invalidate() = 0; 191 virtual void clearCurrentGraphicsLayer() = 0; 192 virtual WebKit::WebLayer* layer() = 0; 193 194 protected: 195 virtual ~LinkHighlightClient() { } 196 }; 197 198 // GraphicsLayer is an abstraction for a rendering surface with backing store, 199 // which may have associated transformation and animations. 200 201 class GraphicsLayer : public GraphicsContextPainter, public WebKit::WebAnimationDelegate, public WebKit::WebLayerScrollClient { 202 WTF_MAKE_NONCOPYABLE(GraphicsLayer); WTF_MAKE_FAST_ALLOCATED; 203 public: 204 enum ContentsLayerPurpose { 205 NoContentsLayer = 0, 206 ContentsLayerForImage, 207 ContentsLayerForVideo, 208 ContentsLayerForCanvas, 209 }; 210 211 static PassOwnPtr<GraphicsLayer> create(GraphicsLayerFactory*, GraphicsLayerClient*); 212 213 virtual ~GraphicsLayer(); 214 215 GraphicsLayerClient* client() const { return m_client; } 216 217 // Layer name. Only used to identify layers in debug output 218 const String& name() const { return m_name; } 219 void setName(const String&); 220 221 void setCompositingReasons(WebKit::WebCompositingReasons); 222 223 GraphicsLayer* parent() const { return m_parent; }; 224 void setParent(GraphicsLayer*); // Internal use only. 225 226 // Returns true if the layer has the given layer as an ancestor (excluding self). 227 bool hasAncestor(GraphicsLayer*) const; 228 229 const Vector<GraphicsLayer*>& children() const { return m_children; } 230 // Returns true if the child list changed. 231 bool setChildren(const Vector<GraphicsLayer*>&); 232 233 // Add child layers. If the child is already parented, it will be removed from its old parent. 234 void addChild(GraphicsLayer*); 235 void addChildAtIndex(GraphicsLayer*, int index); 236 void addChildAbove(GraphicsLayer*, GraphicsLayer* sibling); 237 void addChildBelow(GraphicsLayer*, GraphicsLayer* sibling); 238 bool replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild); 239 240 void removeAllChildren(); 241 void removeFromParent(); 242 243 GraphicsLayer* maskLayer() const { return m_maskLayer; } 244 void setMaskLayer(GraphicsLayer*); 245 246 // The given layer will replicate this layer and its children; the replica renders behind this layer. 247 void setReplicatedByLayer(GraphicsLayer*); 248 // Whether this layer is being replicated by another layer. 249 bool isReplicated() const { return m_replicaLayer; } 250 // The layer that replicates this layer (if any). 251 GraphicsLayer* replicaLayer() const { return m_replicaLayer; } 252 253 const FloatPoint& replicatedLayerPosition() const { return m_replicatedLayerPosition; } 254 void setReplicatedLayerPosition(const FloatPoint& p) { m_replicatedLayerPosition = p; } 255 256 enum ShouldSetNeedsDisplay { 257 DontSetNeedsDisplay, 258 SetNeedsDisplay 259 }; 260 261 // Offset is origin of the renderer minus origin of the graphics layer (so either zero or negative). 262 IntSize offsetFromRenderer() const { return m_offsetFromRenderer; } 263 void setOffsetFromRenderer(const IntSize&, ShouldSetNeedsDisplay = SetNeedsDisplay); 264 265 // The position of the layer (the location of its top-left corner in its parent) 266 const FloatPoint& position() const { return m_position; } 267 void setPosition(const FloatPoint&); 268 269 // Anchor point: (0, 0) is top left, (1, 1) is bottom right. The anchor point 270 // affects the origin of the transforms. 271 const FloatPoint3D& anchorPoint() const { return m_anchorPoint; } 272 void setAnchorPoint(const FloatPoint3D&); 273 274 // The size of the layer. 275 const FloatSize& size() const { return m_size; } 276 void setSize(const FloatSize&); 277 278 // The boundOrigin affects the offset at which content is rendered, and sublayers are positioned. 279 const FloatPoint& boundsOrigin() const { return m_boundsOrigin; } 280 void setBoundsOrigin(const FloatPoint& origin) { m_boundsOrigin = origin; } 281 282 const TransformationMatrix& transform() const { return m_transform; } 283 void setTransform(const TransformationMatrix&); 284 285 const TransformationMatrix& childrenTransform() const { return m_childrenTransform; } 286 void setChildrenTransform(const TransformationMatrix&); 287 288 bool preserves3D() const { return m_preserves3D; } 289 void setPreserves3D(bool); 290 291 bool masksToBounds() const { return m_masksToBounds; } 292 void setMasksToBounds(bool); 293 294 bool drawsContent() const { return m_drawsContent; } 295 void setDrawsContent(bool); 296 297 bool contentsAreVisible() const { return m_contentsVisible; } 298 void setContentsVisible(bool); 299 300 // For special cases, e.g. drawing missing tiles on Android. 301 // The compositor should never paint this color in normal cases because the RenderLayer 302 // will paint background by itself. 303 const Color& backgroundColor() const { return m_backgroundColor; } 304 void setBackgroundColor(const Color&); 305 306 // opaque means that we know the layer contents have no alpha 307 bool contentsOpaque() const { return m_contentsOpaque; } 308 void setContentsOpaque(bool); 309 310 bool backfaceVisibility() const { return m_backfaceVisibility; } 311 void setBackfaceVisibility(bool visible); 312 313 float opacity() const { return m_opacity; } 314 void setOpacity(float); 315 316 const FilterOperations& filters() const { return m_filters; } 317 318 // Returns true if filter can be rendered by the compositor 319 bool setFilters(const FilterOperations&); 320 void setBackgroundFilters(const FilterOperations&); 321 322 // Some GraphicsLayers paint only the foreground or the background content 323 GraphicsLayerPaintingPhase paintingPhase() const { return m_paintingPhase; } 324 void setPaintingPhase(GraphicsLayerPaintingPhase phase) { m_paintingPhase = phase; } 325 326 void setNeedsDisplay(); 327 // mark the given rect (in layer coords) as needing dispay. Never goes deep. 328 void setNeedsDisplayInRect(const FloatRect&); 329 330 void setContentsNeedsDisplay(); 331 332 // Set that the position/size of the contents (image or video). 333 IntRect contentsRect() const { return m_contentsRect; } 334 void setContentsRect(const IntRect&); 335 336 // Transitions are identified by a special animation name that cannot clash with a keyframe identifier. 337 static String animationNameForTransition(AnimatedPropertyID); 338 339 // Return true if the animation is handled by the compositing system. If this returns 340 // false, the animation will be run by AnimationController. 341 // These methods handle both transitions and keyframe animations. 342 bool addAnimation(const KeyframeValueList&, const IntSize& /*boxSize*/, const CSSAnimationData*, const String& /*animationName*/, double /*timeOffset*/); 343 void pauseAnimation(const String& /*animationName*/, double /*timeOffset*/); 344 void removeAnimation(const String& /*animationName*/); 345 346 void suspendAnimations(double time); 347 void resumeAnimations(); 348 349 // Layer contents 350 void setContentsToImage(Image*); 351 bool shouldDirectlyCompositeImage(Image*) const { return true; } 352 void setContentsToMedia(WebKit::WebLayer*); // video or plug-in 353 // Pass an invalid color to remove the contents layer. 354 void setContentsToSolidColor(const Color&) { } 355 void setContentsToCanvas(WebKit::WebLayer*); 356 // FIXME: webkit.org/b/109658 357 // Should unify setContentsToMedia and setContentsToCanvas 358 void setContentsToPlatformLayer(WebKit::WebLayer* layer) { setContentsToMedia(layer); } 359 bool hasContentsLayer() const { return m_contentsLayer; } 360 361 // Callback from the underlying graphics system to draw layer contents. 362 void paintGraphicsLayerContents(GraphicsContext&, const IntRect& clip); 363 // Callback from the underlying graphics system when the layer has been displayed 364 void layerDidDisplay(WebKit::WebLayer*) { } 365 366 // For hosting this GraphicsLayer in a native layer hierarchy. 367 WebKit::WebLayer* platformLayer() const; 368 369 enum CompositingCoordinatesOrientation { CompositingCoordinatesTopDown, CompositingCoordinatesBottomUp }; 370 371 // Flippedness of the contents of this layer. Does not affect sublayer geometry. 372 void setContentsOrientation(CompositingCoordinatesOrientation orientation) { m_contentsOrientation = orientation; } 373 CompositingCoordinatesOrientation contentsOrientation() const { return m_contentsOrientation; } 374 375 void dumpLayer(TextStream&, int indent = 0, LayerTreeFlags = LayerTreeNormal) const; 376 377 void setShowRepaintCounter(bool show) { m_showRepaintCounter = show; } 378 bool isShowingRepaintCounter() const { return m_showRepaintCounter; } 379 380 // FIXME: this is really a paint count. 381 int repaintCount() const { return m_repaintCount; } 382 int incrementRepaintCount() { return ++m_repaintCount; } 383 384 // z-position is the z-equivalent of position(). It's only used for debugging purposes. 385 float zPosition() const { return m_zPosition; } 386 void setZPosition(float); 387 388 void distributeOpacity(float); 389 float accumulatedOpacity() const; 390 391 // If the exposed rect of this layer changes, returns true if this or descendant layers need a flush, 392 // for example to allocate new tiles. 393 bool visibleRectChangeRequiresFlush(const FloatRect& /* clipRect */) const { return false; } 394 395 // Return a string with a human readable form of the layer tree, If debug is true 396 // pointers for the layers and timing data will be included in the returned string. 397 String layerTreeAsText(LayerTreeFlags = LayerTreeNormal) const; 398 399 // Return an estimate of the backing store memory cost (in bytes). May be incorrect for tiled layers. 400 double backingStoreMemoryEstimate() const; 401 402 void resetTrackedRepaints(); 403 void addRepaintRect(const FloatRect&); 404 405 static bool supportsBackgroundColorContent() 406 { 407 return false; 408 } 409 410 void setLinkHighlight(LinkHighlightClient*); 411 // Exposed for tests 412 LinkHighlightClient* linkHighlight() { return m_linkHighlight; } 413 414 void setScrollableArea(ScrollableArea*, bool isMainFrame); 415 ScrollableArea* scrollableArea() const { return m_scrollableArea; } 416 417 WebKit::WebContentLayer* contentLayer() const { return m_layer.get(); } 418 419 // Exposed for tests. FIXME - name is too similar to contentLayer(), very error prone. 420 WebKit::WebLayer* contentsLayer() const { return m_contentsLayer; } 421 422 static void registerContentsLayer(WebKit::WebLayer*); 423 static void unregisterContentsLayer(WebKit::WebLayer*); 424 425 // GraphicsContextPainter implementation. 426 virtual void paint(GraphicsContext&, const IntRect& clip) OVERRIDE; 427 428 // WebAnimationDelegate implementation. 429 virtual void notifyAnimationStarted(double startTime) OVERRIDE; 430 virtual void notifyAnimationFinished(double finishTime) OVERRIDE; 431 432 // WebLayerScrollClient implementation. 433 virtual void didScroll() OVERRIDE; 434 435 protected: 436 // Adds a child without calling updateChildList(), so that adding children 437 // can be batched before updating. 438 void addChildInternal(GraphicsLayer*); 439 440 // This method is used by platform GraphicsLayer classes to clear the filters 441 // when compositing is not done in hardware. It is not virtual, so the caller 442 // needs to notifiy the change to the platform layer as needed. 443 void clearFilters() { m_filters.clear(); } 444 445 // Given a KeyframeValueList containing filterOperations, return true if the operations are valid. 446 static int validateFilterOperations(const KeyframeValueList&); 447 448 // Given a list of TransformAnimationValues, see if all the operations for each keyframe match. If so 449 // return the index of the KeyframeValueList entry that has that list of operations (it may not be 450 // the first entry because some keyframes might have an empty transform and those match any list). 451 // If the lists don't match return -1. On return, if hasBigRotation is true, functions contain 452 // rotations of >= 180 degrees 453 static int validateTransformOperations(const KeyframeValueList&, bool& hasBigRotation); 454 455 // The layer being replicated. 456 GraphicsLayer* replicatedLayer() const { return m_replicatedLayer; } 457 void setReplicatedLayer(GraphicsLayer* layer) { m_replicatedLayer = layer; } 458 459 // Any factory classes that want to create a GraphicsLayer need to be friends. 460 friend class WebKit::GraphicsLayerFactoryChromium; 461 explicit GraphicsLayer(GraphicsLayerClient*); 462 463 static void writeIndent(TextStream&, int indent); 464 465 void dumpProperties(TextStream&, int indent, LayerTreeFlags) const; 466 void dumpAdditionalProperties(TextStream&, int /*indent*/, LayerTreeFlags) const { } 467 468 // Helper functions used by settors to keep layer's the state consistent. 469 void updateNames(); 470 void updateChildList(); 471 void updateLayerIsDrawable(); 472 void updateContentsRect(); 473 474 void setContentsTo(ContentsLayerPurpose, WebKit::WebLayer*); 475 void setupContentsLayer(WebKit::WebLayer*); 476 void clearContentsLayerIfUnregistered(); 477 WebKit::WebLayer* contentsLayerIfRegistered(); 478 479 GraphicsLayerClient* m_client; 480 String m_name; 481 482 // Offset from the owning renderer 483 IntSize m_offsetFromRenderer; 484 485 // Position is relative to the parent GraphicsLayer 486 FloatPoint m_position; 487 FloatPoint3D m_anchorPoint; 488 FloatSize m_size; 489 FloatPoint m_boundsOrigin; 490 491 TransformationMatrix m_transform; 492 TransformationMatrix m_childrenTransform; 493 494 Color m_backgroundColor; 495 float m_opacity; 496 float m_zPosition; 497 498 FilterOperations m_filters; 499 500 bool m_contentsOpaque : 1; 501 bool m_preserves3D: 1; 502 bool m_backfaceVisibility : 1; 503 bool m_masksToBounds : 1; 504 bool m_drawsContent : 1; 505 bool m_contentsVisible : 1; 506 bool m_showRepaintCounter : 1; 507 508 GraphicsLayerPaintingPhase m_paintingPhase; 509 CompositingCoordinatesOrientation m_contentsOrientation; // affects orientation of layer contents 510 511 Vector<GraphicsLayer*> m_children; 512 GraphicsLayer* m_parent; 513 514 GraphicsLayer* m_maskLayer; // Reference to mask layer. We don't own this. 515 516 GraphicsLayer* m_replicaLayer; // A layer that replicates this layer. We only allow one, for now. 517 // The replica is not parented; this is the primary reference to it. 518 GraphicsLayer* m_replicatedLayer; // For a replica layer, a reference to the original layer. 519 FloatPoint m_replicatedLayerPosition; // For a replica layer, the position of the replica. 520 521 IntRect m_contentsRect; 522 523 int m_repaintCount; 524 525 String m_nameBase; 526 527 Color m_contentsSolidColor; 528 529 OwnPtr<WebKit::WebContentLayer> m_layer; 530 OwnPtr<WebKit::WebImageLayer> m_imageLayer; 531 OwnPtr<WebKit::WebSolidColorLayer> m_contentsSolidColorLayer; 532 WebKit::WebLayer* m_contentsLayer; 533 // We don't have ownership of m_contentsLayer, but we do want to know if a given layer is the 534 // same as our current layer in setContentsTo(). Since m_contentsLayer may be deleted at this point, 535 // we stash an ID away when we know m_contentsLayer is alive and use that for comparisons from that point 536 // on. 537 int m_contentsLayerId; 538 539 LinkHighlightClient* m_linkHighlight; 540 541 OwnPtr<OpaqueRectTrackingContentLayerDelegate> m_opaqueRectTrackingContentLayerDelegate; 542 543 ContentsLayerPurpose m_contentsLayerPurpose; 544 bool m_inSetChildren; 545 546 typedef HashMap<String, int> AnimationIdMap; 547 AnimationIdMap m_animationIdMap; 548 549 ScrollableArea* m_scrollableArea; 550 }; 551 552 553 } // namespace WebCore 554 555 #ifndef NDEBUG 556 // Outside the WebCore namespace for ease of invocation from gdb. 557 void showGraphicsLayerTree(const WebCore::GraphicsLayer* layer); 558 #endif 559 560 #endif // GraphicsLayer_h 561