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/GraphicsLayerClient.h" 37 #include "platform/graphics/OpaqueRectTrackingContentLayerDelegate.h" 38 #include "platform/graphics/filters/FilterOperations.h" 39 #include "platform/transforms/TransformationMatrix.h" 40 #include "public/platform/WebAnimationDelegate.h" 41 #include "public/platform/WebCompositingReasons.h" 42 #include "public/platform/WebContentLayer.h" 43 #include "public/platform/WebImageLayer.h" 44 #include "public/platform/WebLayerClient.h" 45 #include "public/platform/WebLayerScrollClient.h" 46 #include "public/platform/WebNinePatchLayer.h" 47 #include "public/platform/WebSolidColorLayer.h" 48 #include "wtf/OwnPtr.h" 49 #include "wtf/PassOwnPtr.h" 50 #include "wtf/Vector.h" 51 52 namespace blink { 53 class GraphicsLayerFactoryChromium; 54 class WebAnimation; 55 class WebGraphicsLayerDebugInfo; 56 class WebLayer; 57 } 58 59 namespace WebCore { 60 61 class FloatRect; 62 class GraphicsContext; 63 class GraphicsLayerFactory; 64 class Image; 65 class ScrollableArea; 66 class TextStream; 67 68 // FIXME: find a better home for this declaration. 69 class PLATFORM_EXPORT LinkHighlightClient { 70 public: 71 virtual void invalidate() = 0; 72 virtual void clearCurrentGraphicsLayer() = 0; 73 virtual blink::WebLayer* layer() = 0; 74 75 protected: ~LinkHighlightClient()76 virtual ~LinkHighlightClient() { } 77 }; 78 79 // GraphicsLayer is an abstraction for a rendering surface with backing store, 80 // which may have associated transformation and animations. 81 82 class PLATFORM_EXPORT GraphicsLayer : public GraphicsContextPainter, public blink::WebAnimationDelegate, public blink::WebLayerScrollClient, public blink::WebLayerClient { 83 WTF_MAKE_NONCOPYABLE(GraphicsLayer); WTF_MAKE_FAST_ALLOCATED; 84 public: 85 static PassOwnPtr<GraphicsLayer> create(GraphicsLayerFactory*, GraphicsLayerClient*); 86 87 virtual ~GraphicsLayer(); 88 client()89 GraphicsLayerClient* client() const { return m_client; } 90 91 // blink::WebLayerClient implementation. 92 virtual blink::WebString debugName(blink::WebLayer*) OVERRIDE; 93 virtual blink::WebGraphicsLayerDebugInfo* takeDebugInfo() OVERRIDE; 94 95 void setCompositingReasons(blink::WebCompositingReasons); compositingReasons()96 blink::WebCompositingReasons compositingReasons() const { return m_compositingReasons; } 97 parent()98 GraphicsLayer* parent() const { return m_parent; }; 99 void setParent(GraphicsLayer*); // Internal use only. 100 101 // Returns true if the layer has the given layer as an ancestor (excluding self). 102 bool hasAncestor(GraphicsLayer*) const; 103 children()104 const Vector<GraphicsLayer*>& children() const { return m_children; } 105 // Returns true if the child list changed. 106 bool setChildren(const Vector<GraphicsLayer*>&); 107 108 // Add child layers. If the child is already parented, it will be removed from its old parent. 109 void addChild(GraphicsLayer*); 110 void addChildAtIndex(GraphicsLayer*, int index); 111 void addChildAbove(GraphicsLayer*, GraphicsLayer* sibling); 112 void addChildBelow(GraphicsLayer*, GraphicsLayer* sibling); 113 bool replaceChild(GraphicsLayer* oldChild, GraphicsLayer* newChild); 114 115 void removeAllChildren(); 116 void removeFromParent(); 117 maskLayer()118 GraphicsLayer* maskLayer() const { return m_maskLayer; } 119 void setMaskLayer(GraphicsLayer*); 120 contentsClippingMaskLayer()121 GraphicsLayer* contentsClippingMaskLayer() const { return m_contentsClippingMaskLayer; } 122 void setContentsClippingMaskLayer(GraphicsLayer*); 123 124 // The given layer will replicate this layer and its children; the replica renders behind this layer. 125 void setReplicatedByLayer(GraphicsLayer*); 126 // Whether this layer is being replicated by another layer. isReplicated()127 bool isReplicated() const { return m_replicaLayer; } 128 // The layer that replicates this layer (if any). replicaLayer()129 GraphicsLayer* replicaLayer() const { return m_replicaLayer; } 130 // The layer being replicated. replicatedLayer()131 GraphicsLayer* replicatedLayer() const { return m_replicatedLayer; } 132 replicatedLayerPosition()133 const FloatPoint& replicatedLayerPosition() const { return m_replicatedLayerPosition; } setReplicatedLayerPosition(const FloatPoint & p)134 void setReplicatedLayerPosition(const FloatPoint& p) { m_replicatedLayerPosition = p; } 135 136 enum ShouldSetNeedsDisplay { 137 DontSetNeedsDisplay, 138 SetNeedsDisplay 139 }; 140 141 // Offset is origin of the renderer minus origin of the graphics layer (so either zero or negative). offsetFromRenderer()142 IntSize offsetFromRenderer() const { return m_offsetFromRenderer; } 143 void setOffsetFromRenderer(const IntSize&, ShouldSetNeedsDisplay = SetNeedsDisplay); 144 145 // The position of the layer (the location of its top-left corner in its parent) position()146 const FloatPoint& position() const { return m_position; } 147 void setPosition(const FloatPoint&); 148 149 // Anchor point: (0, 0) is top left, (1, 1) is bottom right. The anchor point 150 // affects the origin of the transforms. anchorPoint()151 const FloatPoint3D& anchorPoint() const { return m_anchorPoint; } 152 void setAnchorPoint(const FloatPoint3D&); 153 154 // The size of the layer. size()155 const FloatSize& size() const { return m_size; } 156 void setSize(const FloatSize&); 157 158 // The boundOrigin affects the offset at which content is rendered, and sublayers are positioned. boundsOrigin()159 const FloatPoint& boundsOrigin() const { return m_boundsOrigin; } setBoundsOrigin(const FloatPoint & origin)160 void setBoundsOrigin(const FloatPoint& origin) { m_boundsOrigin = origin; } 161 transform()162 const TransformationMatrix& transform() const { return m_transform; } 163 void setTransform(const TransformationMatrix&); 164 childrenTransform()165 const TransformationMatrix& childrenTransform() const { return m_childrenTransform; } 166 void setChildrenTransform(const TransformationMatrix&); 167 preserves3D()168 bool preserves3D() const { return m_preserves3D; } 169 void setPreserves3D(bool); 170 masksToBounds()171 bool masksToBounds() const { return m_masksToBounds; } 172 void setMasksToBounds(bool); 173 drawsContent()174 bool drawsContent() const { return m_drawsContent; } 175 void setDrawsContent(bool); 176 contentsAreVisible()177 bool contentsAreVisible() const { return m_contentsVisible; } 178 void setContentsVisible(bool); 179 180 void setScrollParent(blink::WebLayer*); 181 void setClipParent(blink::WebLayer*); 182 183 void setDebugInfo(blink::WebGraphicsLayerDebugInfo*); 184 185 // For special cases, e.g. drawing missing tiles on Android. 186 // The compositor should never paint this color in normal cases because the RenderLayer 187 // will paint background by itself. backgroundColor()188 const Color& backgroundColor() const { return m_backgroundColor; } 189 void setBackgroundColor(const Color&); 190 191 // opaque means that we know the layer contents have no alpha contentsOpaque()192 bool contentsOpaque() const { return m_contentsOpaque; } 193 void setContentsOpaque(bool); 194 backfaceVisibility()195 bool backfaceVisibility() const { return m_backfaceVisibility; } 196 void setBackfaceVisibility(bool visible); 197 opacity()198 float opacity() const { return m_opacity; } 199 void setOpacity(float); 200 blendMode()201 blink::WebBlendMode blendMode() const { return m_blendMode; } 202 void setBlendMode(blink::WebBlendMode); 203 isRootForIsolatedGroup()204 bool isRootForIsolatedGroup() const { return m_isRootForIsolatedGroup; } 205 void setIsRootForIsolatedGroup(bool); 206 filters()207 const FilterOperations& filters() const { return m_filters; } 208 209 // Returns true if filter can be rendered by the compositor 210 bool setFilters(const FilterOperations&); 211 void setBackgroundFilters(const FilterOperations&); 212 213 // Some GraphicsLayers paint only the foreground or the background content paintingPhase()214 GraphicsLayerPaintingPhase paintingPhase() const { return m_paintingPhase; } setPaintingPhase(GraphicsLayerPaintingPhase phase)215 void setPaintingPhase(GraphicsLayerPaintingPhase phase) { m_paintingPhase = phase; } 216 217 void setNeedsDisplay(); 218 // mark the given rect (in layer coords) as needing dispay. Never goes deep. 219 void setNeedsDisplayInRect(const FloatRect&); 220 221 void setContentsNeedsDisplay(); 222 223 // Set that the position/size of the contents (image or video). contentsRect()224 IntRect contentsRect() const { return m_contentsRect; } 225 void setContentsRect(const IntRect&); 226 227 // Return true if the animation is handled by the compositing system. If this returns 228 // false, the animation will be run by AnimationController. 229 // These methods handle both transitions and keyframe animations. 230 bool addAnimation(PassOwnPtr<blink::WebAnimation>); 231 void pauseAnimation(int animationId, double /*timeOffset*/); 232 void removeAnimation(int animationId); 233 234 // Layer contents 235 void setContentsToImage(Image*); 236 void setContentsToNinePatch(Image*, const IntRect& aperture); 237 // Pass an invalid color to remove the contents layer. 238 void setContentsToSolidColor(const Color&); setContentsToPlatformLayer(blink::WebLayer * layer)239 void setContentsToPlatformLayer(blink::WebLayer* layer) { setContentsTo(layer); } hasContentsLayer()240 bool hasContentsLayer() const { return m_contentsLayer; } 241 242 // Callback from the underlying graphics system to draw layer contents. 243 void paintGraphicsLayerContents(GraphicsContext&, const IntRect& clip); 244 245 // For hosting this GraphicsLayer in a native layer hierarchy. 246 blink::WebLayer* platformLayer() const; 247 248 enum CompositingCoordinatesOrientation { CompositingCoordinatesTopDown, CompositingCoordinatesBottomUp }; 249 250 // Flippedness of the contents of this layer. Does not affect sublayer geometry. setContentsOrientation(CompositingCoordinatesOrientation orientation)251 void setContentsOrientation(CompositingCoordinatesOrientation orientation) { m_contentsOrientation = orientation; } contentsOrientation()252 CompositingCoordinatesOrientation contentsOrientation() const { return m_contentsOrientation; } 253 254 void dumpLayer(TextStream&, int indent, LayerTreeFlags) const; 255 paintCount()256 int paintCount() const { return m_paintCount; } 257 258 // z-position is the z-equivalent of position(). It's only used for debugging purposes. zPosition()259 float zPosition() const { return m_zPosition; } 260 void setZPosition(float); 261 262 void distributeOpacity(float); 263 float accumulatedOpacity() const; 264 265 // If the exposed rect of this layer changes, returns true if this or descendant layers need a flush, 266 // for example to allocate new tiles. visibleRectChangeRequiresFlush(const FloatRect &)267 bool visibleRectChangeRequiresFlush(const FloatRect& /* clipRect */) const { return false; } 268 269 // Return a string with a human readable form of the layer tree, If debug is true 270 // pointers for the layers and timing data will be included in the returned string. 271 String layerTreeAsText(LayerTreeFlags = LayerTreeNormal) const; 272 273 // Return an estimate of the backing store memory cost (in bytes). May be incorrect for tiled layers. 274 double backingStoreMemoryEstimate() const; 275 276 void resetTrackedRepaints(); 277 void addRepaintRect(const FloatRect&); 278 279 void collectTrackedRepaintRects(Vector<FloatRect>&) const; 280 281 void addLinkHighlight(LinkHighlightClient*); 282 void removeLinkHighlight(LinkHighlightClient*); 283 // Exposed for tests numLinkHighlights()284 unsigned numLinkHighlights() { return m_linkHighlights.size(); } linkHighlight(int i)285 LinkHighlightClient* linkHighlight(int i) { return m_linkHighlights[i]; } 286 287 void setScrollableArea(ScrollableArea*, bool isMainFrame); scrollableArea()288 ScrollableArea* scrollableArea() const { return m_scrollableArea; } 289 contentLayer()290 blink::WebContentLayer* contentLayer() const { return m_layer.get(); } 291 292 static void registerContentsLayer(blink::WebLayer*); 293 static void unregisterContentsLayer(blink::WebLayer*); 294 295 // GraphicsContextPainter implementation. 296 virtual void paint(GraphicsContext&, const IntRect& clip) OVERRIDE; 297 298 // WebAnimationDelegate implementation. 299 virtual void notifyAnimationStarted(double wallClockTime, double monotonicTime, blink::WebAnimation::TargetProperty) OVERRIDE; 300 virtual void notifyAnimationFinished(double wallClockTime, double monotonicTime, blink::WebAnimation::TargetProperty) OVERRIDE; 301 302 // WebLayerScrollClient implementation. 303 virtual void didScroll() OVERRIDE; 304 305 protected: 306 explicit GraphicsLayer(GraphicsLayerClient*); 307 // GraphicsLayerFactoryChromium that wants to create a GraphicsLayer need to be friends. 308 friend class blink::GraphicsLayerFactoryChromium; 309 310 // Exposed for tests. contentsLayer()311 virtual blink::WebLayer* contentsLayer() const { return m_contentsLayer; } 312 313 private: 314 // Adds a child without calling updateChildList(), so that adding children 315 // can be batched before updating. 316 void addChildInternal(GraphicsLayer*); 317 318 // This method is used by platform GraphicsLayer classes to clear the filters 319 // when compositing is not done in hardware. It is not virtual, so the caller 320 // needs to notifiy the change to the platform layer as needed. clearFilters()321 void clearFilters() { m_filters.clear(); } 322 setReplicatedLayer(GraphicsLayer * layer)323 void setReplicatedLayer(GraphicsLayer* layer) { m_replicatedLayer = layer; } 324 incrementPaintCount()325 int incrementPaintCount() { return ++m_paintCount; } 326 327 void dumpProperties(TextStream&, int indent, LayerTreeFlags) const; 328 329 // Helper functions used by settors to keep layer's the state consistent. 330 void updateChildList(); 331 void updateLayerIsDrawable(); 332 void updateContentsRect(); 333 334 void setContentsTo(blink::WebLayer*); 335 void setupContentsLayer(blink::WebLayer*); 336 void clearContentsLayerIfUnregistered(); 337 blink::WebLayer* contentsLayerIfRegistered(); 338 339 GraphicsLayerClient* m_client; 340 341 // Offset from the owning renderer 342 IntSize m_offsetFromRenderer; 343 344 // Position is relative to the parent GraphicsLayer 345 FloatPoint m_position; 346 FloatPoint3D m_anchorPoint; 347 FloatSize m_size; 348 FloatPoint m_boundsOrigin; 349 350 TransformationMatrix m_transform; 351 TransformationMatrix m_childrenTransform; 352 353 Color m_backgroundColor; 354 float m_opacity; 355 float m_zPosition; 356 357 blink::WebBlendMode m_blendMode; 358 359 FilterOperations m_filters; 360 361 bool m_contentsOpaque : 1; 362 bool m_preserves3D: 1; 363 bool m_backfaceVisibility : 1; 364 bool m_masksToBounds : 1; 365 bool m_drawsContent : 1; 366 bool m_contentsVisible : 1; 367 bool m_isRootForIsolatedGroup : 1; 368 369 bool m_hasScrollParent : 1; 370 bool m_hasClipParent : 1; 371 372 GraphicsLayerPaintingPhase m_paintingPhase; 373 CompositingCoordinatesOrientation m_contentsOrientation; // affects orientation of layer contents 374 375 Vector<GraphicsLayer*> m_children; 376 GraphicsLayer* m_parent; 377 378 GraphicsLayer* m_maskLayer; // Reference to mask layer. We don't own this. 379 GraphicsLayer* m_contentsClippingMaskLayer; // Reference to clipping mask layer. We don't own this. 380 381 GraphicsLayer* m_replicaLayer; // A layer that replicates this layer. We only allow one, for now. 382 // The replica is not parented; this is the primary reference to it. 383 GraphicsLayer* m_replicatedLayer; // For a replica layer, a reference to the original layer. 384 FloatPoint m_replicatedLayerPosition; // For a replica layer, the position of the replica. 385 386 IntRect m_contentsRect; 387 388 int m_paintCount; 389 390 OwnPtr<blink::WebContentLayer> m_layer; 391 OwnPtr<blink::WebImageLayer> m_imageLayer; 392 OwnPtr<blink::WebNinePatchLayer> m_ninePatchLayer; 393 Color m_contentsSolidColor; 394 OwnPtr<blink::WebSolidColorLayer> m_solidColorLayer; 395 blink::WebLayer* m_contentsLayer; 396 // We don't have ownership of m_contentsLayer, but we do want to know if a given layer is the 397 // same as our current layer in setContentsTo(). Since m_contentsLayer may be deleted at this point, 398 // we stash an ID away when we know m_contentsLayer is alive and use that for comparisons from that point 399 // on. 400 int m_contentsLayerId; 401 402 Vector<LinkHighlightClient*> m_linkHighlights; 403 404 OwnPtr<OpaqueRectTrackingContentLayerDelegate> m_opaqueRectTrackingContentLayerDelegate; 405 406 ScrollableArea* m_scrollableArea; 407 blink::WebCompositingReasons m_compositingReasons; 408 blink::WebGraphicsLayerDebugInfo* m_debugInfo; 409 }; 410 411 412 } // namespace WebCore 413 414 #ifndef NDEBUG 415 // Outside the WebCore namespace for ease of invocation from gdb. 416 void showGraphicsLayerTree(const WebCore::GraphicsLayer* layer); 417 #endif 418 419 #endif // GraphicsLayer_h 420