| OLD | NEW |
| (Empty) |
| 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 "core/platform/graphics/GraphicsLayerClient.h" | |
| 31 #include "core/platform/graphics/OpaqueRectTrackingContentLayerDelegate.h" | |
| 32 #include "core/platform/graphics/filters/FilterOperations.h" | |
| 33 #include "platform/geometry/FloatPoint.h" | |
| 34 #include "platform/geometry/FloatPoint3D.h" | |
| 35 #include "platform/geometry/FloatSize.h" | |
| 36 #include "platform/geometry/IntRect.h" | |
| 37 #include "platform/graphics/Color.h" | |
| 38 #include "platform/transforms/TransformationMatrix.h" | |
| 39 #include "wtf/OwnPtr.h" | |
| 40 #include "wtf/PassOwnPtr.h" | |
| 41 #include "wtf/Vector.h" | |
| 42 | |
| 43 #include "public/platform/WebAnimationDelegate.h" | |
| 44 #include "public/platform/WebCompositingReasons.h" | |
| 45 #include "public/platform/WebContentLayer.h" | |
| 46 #include "public/platform/WebImageLayer.h" | |
| 47 #include "public/platform/WebLayerClient.h" | |
| 48 #include "public/platform/WebLayerScrollClient.h" | |
| 49 #include "public/platform/WebNinePatchLayer.h" | |
| 50 #include "public/platform/WebSolidColorLayer.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 LinkHighlightClient { | |
| 70 public: | |
| 71 virtual void invalidate() = 0; | |
| 72 virtual void clearCurrentGraphicsLayer() = 0; | |
| 73 virtual blink::WebLayer* layer() = 0; | |
| 74 | |
| 75 protected: | |
| 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 GraphicsLayer : public GraphicsContextPainter, public blink::WebAnimationD
elegate, public blink::WebLayerScrollClient, public blink::WebLayerClient { | |
| 83 WTF_MAKE_NONCOPYABLE(GraphicsLayer); WTF_MAKE_FAST_ALLOCATED; | |
| 84 public: | |
| 85 static PassOwnPtr<GraphicsLayer> create(GraphicsLayerFactory*, GraphicsLayer
Client*); | |
| 86 | |
| 87 virtual ~GraphicsLayer(); | |
| 88 | |
| 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); | |
| 96 blink::WebCompositingReasons compositingReasons() const { return m_compositi
ngReasons; } | |
| 97 | |
| 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 s
elf). | |
| 102 bool hasAncestor(GraphicsLayer*) const; | |
| 103 | |
| 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 fr
om 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 | |
| 118 GraphicsLayer* maskLayer() const { return m_maskLayer; } | |
| 119 void setMaskLayer(GraphicsLayer*); | |
| 120 | |
| 121 GraphicsLayer* contentsClippingMaskLayer() const { return m_contentsClipping
MaskLayer; } | |
| 122 void setContentsClippingMaskLayer(GraphicsLayer*); | |
| 123 | |
| 124 // The given layer will replicate this layer and its children; the replica r
enders behind this layer. | |
| 125 void setReplicatedByLayer(GraphicsLayer*); | |
| 126 // Whether this layer is being replicated by another layer. | |
| 127 bool isReplicated() const { return m_replicaLayer; } | |
| 128 // The layer that replicates this layer (if any). | |
| 129 GraphicsLayer* replicaLayer() const { return m_replicaLayer; } | |
| 130 // The layer being replicated. | |
| 131 GraphicsLayer* replicatedLayer() const { return m_replicatedLayer; } | |
| 132 | |
| 133 const FloatPoint& replicatedLayerPosition() const { return m_replicatedLayer
Position; } | |
| 134 void setReplicatedLayerPosition(const FloatPoint& p) { m_replicatedLayerPosi
tion = 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 e
ither zero or negative). | |
| 142 IntSize offsetFromRenderer() const { return m_offsetFromRenderer; } | |
| 143 void setOffsetFromRenderer(const IntSize&, ShouldSetNeedsDisplay = SetNeedsD
isplay); | |
| 144 | |
| 145 // The position of the layer (the location of its top-left corner in its par
ent) | |
| 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 poin
t | |
| 150 // affects the origin of the transforms. | |
| 151 const FloatPoint3D& anchorPoint() const { return m_anchorPoint; } | |
| 152 void setAnchorPoint(const FloatPoint3D&); | |
| 153 | |
| 154 // The size of the layer. | |
| 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 subl
ayers are positioned. | |
| 159 const FloatPoint& boundsOrigin() const { return m_boundsOrigin; } | |
| 160 void setBoundsOrigin(const FloatPoint& origin) { m_boundsOrigin = origin; } | |
| 161 | |
| 162 const TransformationMatrix& transform() const { return m_transform; } | |
| 163 void setTransform(const TransformationMatrix&); | |
| 164 | |
| 165 const TransformationMatrix& childrenTransform() const { return m_childrenTra
nsform; } | |
| 166 void setChildrenTransform(const TransformationMatrix&); | |
| 167 | |
| 168 bool preserves3D() const { return m_preserves3D; } | |
| 169 void setPreserves3D(bool); | |
| 170 | |
| 171 bool masksToBounds() const { return m_masksToBounds; } | |
| 172 void setMasksToBounds(bool); | |
| 173 | |
| 174 bool drawsContent() const { return m_drawsContent; } | |
| 175 void setDrawsContent(bool); | |
| 176 | |
| 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. | |
| 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 | |
| 192 bool contentsOpaque() const { return m_contentsOpaque; } | |
| 193 void setContentsOpaque(bool); | |
| 194 | |
| 195 bool backfaceVisibility() const { return m_backfaceVisibility; } | |
| 196 void setBackfaceVisibility(bool visible); | |
| 197 | |
| 198 float opacity() const { return m_opacity; } | |
| 199 void setOpacity(float); | |
| 200 | |
| 201 blink::WebBlendMode blendMode() const { return m_blendMode; } | |
| 202 void setBlendMode(blink::WebBlendMode); | |
| 203 | |
| 204 bool isRootForIsolatedGroup() const { return m_isRootForIsolatedGroup; } | |
| 205 void setIsRootForIsolatedGroup(bool); | |
| 206 | |
| 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 | |
| 214 GraphicsLayerPaintingPhase paintingPhase() const { return m_paintingPhase; } | |
| 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). | |
| 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 thi
s 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&); | |
| 239 void setContentsToPlatformLayer(blink::WebLayer* layer) { setContentsTo(laye
r); } | |
| 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, Comp
ositingCoordinatesBottomUp }; | |
| 249 | |
| 250 // Flippedness of the contents of this layer. Does not affect sublayer geome
try. | |
| 251 void setContentsOrientation(CompositingCoordinatesOrientation orientation) {
m_contentsOrientation = orientation; } | |
| 252 CompositingCoordinatesOrientation contentsOrientation() const { return m_con
tentsOrientation; } | |
| 253 | |
| 254 void dumpLayer(TextStream&, int indent, LayerTreeFlags) const; | |
| 255 | |
| 256 int paintCount() const { return m_paintCount; } | |
| 257 | |
| 258 // z-position is the z-equivalent of position(). It's only used for debuggin
g purposes. | |
| 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 descen
dant layers need a flush, | |
| 266 // for example to allocate new tiles. | |
| 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 in
correct 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 | |
| 284 unsigned numLinkHighlights() { return m_linkHighlights.size(); } | |
| 285 LinkHighlightClient* linkHighlight(int i) { return m_linkHighlights[i]; } | |
| 286 | |
| 287 void setScrollableArea(ScrollableArea*, bool isMainFrame); | |
| 288 ScrollableArea* scrollableArea() const { return m_scrollableArea; } | |
| 289 | |
| 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 startTime) OVERRIDE; | |
| 300 virtual void notifyAnimationFinished(double finishTime) 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. | |
| 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 filter
s | |
| 319 // when compositing is not done in hardware. It is not virtual, so the calle
r | |
| 320 // needs to notifiy the change to the platform layer as needed. | |
| 321 void clearFilters() { m_filters.clear(); } | |
| 322 | |
| 323 void setReplicatedLayer(GraphicsLayer* layer) { m_replicatedLayer = layer; } | |
| 324 | |
| 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 orientat
ion 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 la
yer. We don't own this. | |
| 380 | |
| 381 GraphicsLayer* m_replicaLayer; // A layer that replicates this layer. We onl
y allow one, for now. | |
| 382 // The replica is not parented; this is the p
rimary 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 o
f 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 g
iven layer is the | |
| 397 // same as our current layer in setContentsTo(). Since m_contentsLayer may b
e deleted at this point, | |
| 398 // we stash an ID away when we know m_contentsLayer is alive and use that fo
r comparisons from that point | |
| 399 // on. | |
| 400 int m_contentsLayerId; | |
| 401 | |
| 402 Vector<LinkHighlightClient*> m_linkHighlights; | |
| 403 | |
| 404 OwnPtr<OpaqueRectTrackingContentLayerDelegate> m_opaqueRectTrackingContentLa
yerDelegate; | |
| 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 | |
| OLD | NEW |