OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 15 matching lines...) Expand all Loading... |
26 #ifndef CompositedLayerMapping_h | 26 #ifndef CompositedLayerMapping_h |
27 #define CompositedLayerMapping_h | 27 #define CompositedLayerMapping_h |
28 | 28 |
29 #include "core/layout/compositing/GraphicsLayerUpdater.h" | 29 #include "core/layout/compositing/GraphicsLayerUpdater.h" |
30 #include "core/paint/PaintLayer.h" | 30 #include "core/paint/PaintLayer.h" |
31 #include "platform/geometry/FloatPoint.h" | 31 #include "platform/geometry/FloatPoint.h" |
32 #include "platform/geometry/FloatPoint3D.h" | 32 #include "platform/geometry/FloatPoint3D.h" |
33 #include "platform/graphics/GraphicsLayer.h" | 33 #include "platform/graphics/GraphicsLayer.h" |
34 #include "platform/graphics/GraphicsLayerClient.h" | 34 #include "platform/graphics/GraphicsLayerClient.h" |
35 #include "wtf/Allocator.h" | 35 #include "wtf/Allocator.h" |
36 #include <memory> | |
37 | 36 |
38 namespace blink { | 37 namespace blink { |
39 | 38 |
40 class PaintLayerCompositor; | 39 class PaintLayerCompositor; |
41 | 40 |
42 // A GraphicsLayerPaintInfo contains all the info needed to paint a partial subt
ree of Layers into a GraphicsLayer. | 41 // A GraphicsLayerPaintInfo contains all the info needed to paint a partial subt
ree of Layers into a GraphicsLayer. |
43 struct GraphicsLayerPaintInfo { | 42 struct GraphicsLayerPaintInfo { |
44 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); | 43 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); |
45 PaintLayer* paintLayer; | 44 PaintLayer* paintLayer; |
46 | 45 |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 void updateTransformGeometry(const IntPoint& snappedOffsetFromCompositedAnce
stor, const IntRect& relativeCompositingBounds); | 241 void updateTransformGeometry(const IntPoint& snappedOffsetFromCompositedAnce
stor, const IntRect& relativeCompositingBounds); |
243 void updateForegroundLayerGeometry(const FloatSize& relativeCompositingBound
sSize, const IntRect& clippingBox); | 242 void updateForegroundLayerGeometry(const FloatSize& relativeCompositingBound
sSize, const IntRect& clippingBox); |
244 void updateBackgroundLayerGeometry(const FloatSize& relativeCompositingBound
sSize); | 243 void updateBackgroundLayerGeometry(const FloatSize& relativeCompositingBound
sSize); |
245 void updateReflectionLayerGeometry(Vector<PaintLayer*>& layersNeedingPaintIn
validation); | 244 void updateReflectionLayerGeometry(Vector<PaintLayer*>& layersNeedingPaintIn
validation); |
246 void updateScrollingLayerGeometry(const IntRect& localCompositingBounds); | 245 void updateScrollingLayerGeometry(const IntRect& localCompositingBounds); |
247 void updateChildClippingMaskLayerGeometry(); | 246 void updateChildClippingMaskLayerGeometry(); |
248 | 247 |
249 void createPrimaryGraphicsLayer(); | 248 void createPrimaryGraphicsLayer(); |
250 void destroyGraphicsLayers(); | 249 void destroyGraphicsLayers(); |
251 | 250 |
252 std::unique_ptr<GraphicsLayer> createGraphicsLayer(CompositingReasons, Squas
hingDisallowedReasons = SquashingDisallowedReasonsNone); | 251 PassOwnPtr<GraphicsLayer> createGraphicsLayer(CompositingReasons, SquashingD
isallowedReasons = SquashingDisallowedReasonsNone); |
253 bool toggleScrollbarLayerIfNeeded(std::unique_ptr<GraphicsLayer>&, bool need
sLayer, CompositingReasons); | 252 bool toggleScrollbarLayerIfNeeded(OwnPtr<GraphicsLayer>&, bool needsLayer, C
ompositingReasons); |
254 | 253 |
255 LayoutBoxModelObject* layoutObject() const { return m_owningLayer.layoutObje
ct(); } | 254 LayoutBoxModelObject* layoutObject() const { return m_owningLayer.layoutObje
ct(); } |
256 PaintLayerCompositor* compositor() const { return m_owningLayer.compositor()
; } | 255 PaintLayerCompositor* compositor() const { return m_owningLayer.compositor()
; } |
257 | 256 |
258 void updateInternalHierarchy(); | 257 void updateInternalHierarchy(); |
259 void updatePaintingPhases(); | 258 void updatePaintingPhases(); |
260 bool updateClippingLayers(bool needsAncestorClip, bool needsDescendantClip); | 259 bool updateClippingLayers(bool needsAncestorClip, bool needsDescendantClip); |
261 bool updateChildTransformLayer(bool needsChildTransformLayer); | 260 bool updateChildTransformLayer(bool needsChildTransformLayer); |
262 bool updateOverflowControlsLayers(bool needsHorizontalScrollbarLayer, bool n
eedsVerticalScrollbarLayer, bool needsScrollCornerLayer, bool needsAncestorClip)
; | 261 bool updateOverflowControlsLayers(bool needsHorizontalScrollbarLayer, bool n
eedsVerticalScrollbarLayer, bool needsScrollCornerLayer, bool needsAncestorClip)
; |
263 bool updateForegroundLayer(bool needsForegroundLayer); | 262 bool updateForegroundLayer(bool needsForegroundLayer); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 // | + ... | 356 // | + ... |
358 // ... | 357 // ... |
359 // | | 358 // | |
360 // + B = m_ancestorClippingLayer [+] | 359 // + B = m_ancestorClippingLayer [+] |
361 // + m_graphicsLayer | 360 // + m_graphicsLayer |
362 // + ... | 361 // + ... |
363 // | 362 // |
364 // In this case B is clipped by another layer that doesn't happen to be its
ancestor: A. | 363 // In this case B is clipped by another layer that doesn't happen to be its
ancestor: A. |
365 // So we create an ancestor clipping layer for B, [+], which ensures that B
is clipped | 364 // So we create an ancestor clipping layer for B, [+], which ensures that B
is clipped |
366 // as if it had been A's descendant. | 365 // as if it had been A's descendant. |
367 std::unique_ptr<GraphicsLayer> m_ancestorClippingLayer; // Only used if we a
re clipped by an ancestor which is not a stacking context. | 366 OwnPtr<GraphicsLayer> m_ancestorClippingLayer; // Only used if we are clippe
d by an ancestor which is not a stacking context. |
368 std::unique_ptr<GraphicsLayer> m_graphicsLayer; | 367 OwnPtr<GraphicsLayer> m_graphicsLayer; |
369 std::unique_ptr<GraphicsLayer> m_childContainmentLayer; // Only used if we h
ave clipping on a stacking context with compositing children. | 368 OwnPtr<GraphicsLayer> m_childContainmentLayer; // Only used if we have clipp
ing on a stacking context with compositing children. |
370 std::unique_ptr<GraphicsLayer> m_childTransformLayer; // Only used if we hav
e perspective. | 369 OwnPtr<GraphicsLayer> m_childTransformLayer; // Only used if we have perspec
tive. |
371 std::unique_ptr<GraphicsLayer> m_scrollingLayer; // Only used if the layer i
s using composited scrolling. | 370 OwnPtr<GraphicsLayer> m_scrollingLayer; // Only used if the layer is using c
omposited scrolling. |
372 std::unique_ptr<GraphicsLayer> m_scrollingContentsLayer; // Only used if the
layer is using composited scrolling. | 371 OwnPtr<GraphicsLayer> m_scrollingContentsLayer; // Only used if the layer is
using composited scrolling. |
373 | 372 |
374 // This layer is also added to the hierarchy by the RLB, but in a different
way than | 373 // This layer is also added to the hierarchy by the RLB, but in a different
way than |
375 // the layers above. It's added to m_graphicsLayer as its mask layer (natura
lly) if | 374 // the layers above. It's added to m_graphicsLayer as its mask layer (natura
lly) if |
376 // we have a mask, and isn't part of the typical hierarchy (it has no childr
en). | 375 // we have a mask, and isn't part of the typical hierarchy (it has no childr
en). |
377 std::unique_ptr<GraphicsLayer> m_maskLayer; // Only used if we have a mask. | 376 OwnPtr<GraphicsLayer> m_maskLayer; // Only used if we have a mask. |
378 std::unique_ptr<GraphicsLayer> m_childClippingMaskLayer; // Only used if we
have to clip child layers or accelerated contents with border radius or clip-pat
h. | 377 OwnPtr<GraphicsLayer> m_childClippingMaskLayer; // Only used if we have to c
lip child layers or accelerated contents with border radius or clip-path. |
379 | 378 |
380 // There are two other (optional) layers whose painting is managed by the Co
mpositedLayerMapping, | 379 // There are two other (optional) layers whose painting is managed by the Co
mpositedLayerMapping, |
381 // but whose position in the hierarchy is maintained by the PaintLayerCompos
itor. These | 380 // but whose position in the hierarchy is maintained by the PaintLayerCompos
itor. These |
382 // are the foreground and background layers. The foreground layer exists if
we have composited | 381 // are the foreground and background layers. The foreground layer exists if
we have composited |
383 // descendants with negative z-order. We need the extra layer in this case b
ecause the layer | 382 // descendants with negative z-order. We need the extra layer in this case b
ecause the layer |
384 // needs to draw both below (for the background, say) and above (for the nor
mal flow content, say) | 383 // needs to draw both below (for the background, say) and above (for the nor
mal flow content, say) |
385 // the negative z-order descendants and this is impossible with a single lay
er. The RLC handles | 384 // the negative z-order descendants and this is impossible with a single lay
er. The RLC handles |
386 // inserting m_foregroundLayer in the correct position in our descendant lis
t for us (right after | 385 // inserting m_foregroundLayer in the correct position in our descendant lis
t for us (right after |
387 // the neg z-order dsecendants). | 386 // the neg z-order dsecendants). |
388 // | 387 // |
389 // The background layer is only created if this is the root layer and our ba
ckground is entirely | 388 // The background layer is only created if this is the root layer and our ba
ckground is entirely |
390 // fixed. In this case we want to put the background in a separate composite
d layer so that when | 389 // fixed. In this case we want to put the background in a separate composite
d layer so that when |
391 // we scroll, we don't have to re-raster the background into position. This
layer is also inserted | 390 // we scroll, we don't have to re-raster the background into position. This
layer is also inserted |
392 // into the tree by the RLC as it gets a special home. This layer becomes a
descendant of the | 391 // into the tree by the RLC as it gets a special home. This layer becomes a
descendant of the |
393 // frame clipping layer. That is: | 392 // frame clipping layer. That is: |
394 // ... | 393 // ... |
395 // + frame clipping layer | 394 // + frame clipping layer |
396 // + m_backgroundLayer | 395 // + m_backgroundLayer |
397 // + frame scrolling layer | 396 // + frame scrolling layer |
398 // + root content layer | 397 // + root content layer |
399 // | 398 // |
400 // With the hierarchy set up like this, the root content layer is able to sc
roll without affecting | 399 // With the hierarchy set up like this, the root content layer is able to sc
roll without affecting |
401 // the background layer (or paint invalidation). | 400 // the background layer (or paint invalidation). |
402 std::unique_ptr<GraphicsLayer> m_foregroundLayer; // Only used in cases wher
e we need to draw the foreground separately. | 401 OwnPtr<GraphicsLayer> m_foregroundLayer; // Only used in cases where we need
to draw the foreground separately. |
403 std::unique_ptr<GraphicsLayer> m_backgroundLayer; // Only used in cases wher
e we need to draw the background separately. | 402 OwnPtr<GraphicsLayer> m_backgroundLayer; // Only used in cases where we need
to draw the background separately. |
404 | 403 |
405 std::unique_ptr<GraphicsLayer> m_layerForHorizontalScrollbar; | 404 OwnPtr<GraphicsLayer> m_layerForHorizontalScrollbar; |
406 std::unique_ptr<GraphicsLayer> m_layerForVerticalScrollbar; | 405 OwnPtr<GraphicsLayer> m_layerForVerticalScrollbar; |
407 std::unique_ptr<GraphicsLayer> m_layerForScrollCorner; | 406 OwnPtr<GraphicsLayer> m_layerForScrollCorner; |
408 | 407 |
409 // This layer contains the scrollbar and scroll corner layers and clips them
to the border box | 408 // This layer contains the scrollbar and scroll corner layers and clips them
to the border box |
410 // bounds of our LayoutObject. It is usually added to m_graphicsLayer, but m
ay be reparented by | 409 // bounds of our LayoutObject. It is usually added to m_graphicsLayer, but m
ay be reparented by |
411 // GraphicsLayerTreeBuilder to ensure that scrollbars appear above scrolling
content. | 410 // GraphicsLayerTreeBuilder to ensure that scrollbars appear above scrolling
content. |
412 std::unique_ptr<GraphicsLayer> m_overflowControlsHostLayer; | 411 OwnPtr<GraphicsLayer> m_overflowControlsHostLayer; |
413 | 412 |
414 // The reparented overflow controls sometimes need to be clipped by a non-an
cestor. In just the same | 413 // The reparented overflow controls sometimes need to be clipped by a non-an
cestor. In just the same |
415 // way we need an ancestor clipping layer to clip this CLM's internal hierar
chy, we add another layer | 414 // way we need an ancestor clipping layer to clip this CLM's internal hierar
chy, we add another layer |
416 // to clip the overflow controls. We could combine this with m_overflowContr
olsHostLayer, but that | 415 // to clip the overflow controls. We could combine this with m_overflowContr
olsHostLayer, but that |
417 // would require manually intersecting their clips, and shifting the overflo
w controls to compensate | 416 // would require manually intersecting their clips, and shifting the overflo
w controls to compensate |
418 // for this clip's offset. By using a separate layer, the overflow controls
can remain ignorant of | 417 // for this clip's offset. By using a separate layer, the overflow controls
can remain ignorant of |
419 // ancestor clipping. | 418 // ancestor clipping. |
420 std::unique_ptr<GraphicsLayer> m_overflowControlsAncestorClippingLayer; | 419 OwnPtr<GraphicsLayer> m_overflowControlsAncestorClippingLayer; |
421 | 420 |
422 // A squashing CLM has two possible squashing-related structures. | 421 // A squashing CLM has two possible squashing-related structures. |
423 // | 422 // |
424 // If m_ancestorClippingLayer is present: | 423 // If m_ancestorClippingLayer is present: |
425 // | 424 // |
426 // m_ancestorClippingLayer | 425 // m_ancestorClippingLayer |
427 // + m_graphicsLayer | 426 // + m_graphicsLayer |
428 // + m_squashingLayer | 427 // + m_squashingLayer |
429 // | 428 // |
430 // If not: | 429 // If not: |
431 // | 430 // |
432 // m_squashingContainmentLayer | 431 // m_squashingContainmentLayer |
433 // + m_graphicsLayer | 432 // + m_graphicsLayer |
434 // + m_squashingLayer | 433 // + m_squashingLayer |
435 // | 434 // |
436 // Stacking children of a squashed layer receive graphics layers that are pa
rented to the compositd ancestor of the | 435 // Stacking children of a squashed layer receive graphics layers that are pa
rented to the compositd ancestor of the |
437 // squashed layer (i.e. nearest enclosing composited layer that is not squas
hed). | 436 // squashed layer (i.e. nearest enclosing composited layer that is not squas
hed). |
438 std::unique_ptr<GraphicsLayer> m_squashingContainmentLayer; // Only used if
any squashed layers exist and m_squashingContainmentLayer is not present, to con
tain the squashed layers as siblings to the rest of the GraphicsLayer tree chunk
. | 437 OwnPtr<GraphicsLayer> m_squashingContainmentLayer; // Only used if any squas
hed layers exist and m_squashingContainmentLayer is not present, to contain the
squashed layers as siblings to the rest of the GraphicsLayer tree chunk. |
439 std::unique_ptr<GraphicsLayer> m_squashingLayer; // Only used if any squashe
d layers exist, this is the backing that squashed layers paint into. | 438 OwnPtr<GraphicsLayer> m_squashingLayer; // Only used if any squashed layers
exist, this is the backing that squashed layers paint into. |
440 Vector<GraphicsLayerPaintInfo> m_squashedLayers; | 439 Vector<GraphicsLayerPaintInfo> m_squashedLayers; |
441 LayoutPoint m_squashingLayerOffsetFromTransformedAncestor; | 440 LayoutPoint m_squashingLayerOffsetFromTransformedAncestor; |
442 | 441 |
443 LayoutRect m_compositedBounds; | 442 LayoutRect m_compositedBounds; |
444 | 443 |
445 LayoutSize m_contentOffsetInCompositingLayer; | 444 LayoutSize m_contentOffsetInCompositingLayer; |
446 | 445 |
447 // We keep track of the scrolling contents offset, so that when it changes w
e can notify the ScrollingCoordinator, which | 446 // We keep track of the scrolling contents offset, so that when it changes w
e can notify the ScrollingCoordinator, which |
448 // passes on main-thread scrolling updates to the compositor. | 447 // passes on main-thread scrolling updates to the compositor. |
449 DoubleSize m_scrollingContentsOffset; | 448 DoubleSize m_scrollingContentsOffset; |
450 | 449 |
451 unsigned m_contentOffsetInCompositingLayerDirty : 1; | 450 unsigned m_contentOffsetInCompositingLayerDirty : 1; |
452 | 451 |
453 unsigned m_pendingUpdateScope : 2; | 452 unsigned m_pendingUpdateScope : 2; |
454 unsigned m_isMainFrameLayoutViewLayer : 1; | 453 unsigned m_isMainFrameLayoutViewLayer : 1; |
455 | 454 |
456 unsigned m_backgroundLayerPaintsFixedRootBackground : 1; | 455 unsigned m_backgroundLayerPaintsFixedRootBackground : 1; |
457 unsigned m_scrollingContentsAreEmpty : 1; | 456 unsigned m_scrollingContentsAreEmpty : 1; |
458 | 457 |
459 friend class CompositedLayerMappingTest; | 458 friend class CompositedLayerMappingTest; |
460 }; | 459 }; |
461 | 460 |
462 } // namespace blink | 461 } // namespace blink |
463 | 462 |
464 #endif // CompositedLayerMapping_h | 463 #endif // CompositedLayerMapping_h |
OLD | NEW |