Chromium Code Reviews| 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 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 168 , m_backgroundLayerPaintsFixedRootBackground(false) | 168 , m_backgroundLayerPaintsFixedRootBackground(false) |
| 169 { | 169 { |
| 170 if (layer->isRootLayer() && renderer()->frame()->isMainFrame()) | 170 if (layer->isRootLayer() && renderer()->frame()->isMainFrame()) |
| 171 m_isMainFrameRenderViewLayer = true; | 171 m_isMainFrameRenderViewLayer = true; |
| 172 | 172 |
| 173 createPrimaryGraphicsLayer(); | 173 createPrimaryGraphicsLayer(); |
| 174 } | 174 } |
| 175 | 175 |
| 176 CompositedLayerMapping::~CompositedLayerMapping() | 176 CompositedLayerMapping::~CompositedLayerMapping() |
| 177 { | 177 { |
| 178 // FIXME: this almost certainly needs to go somewhere more appropriate so it occurs | |
| 179 // when things change as well as things getting destroyed. | |
|
Ian Vollick
2013/12/02 21:17:05
I wonder if it can be driven from RLC::rebuildComp
shawnsingh
2013/12/05 17:55:24
This FIXME should be removed. I've convinced myse
| |
| 180 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { | |
| 181 if (m_squashedLayers[i].renderLayer->compositingState() == PaintsIntoGro upedBacking) | |
| 182 m_squashedLayers[i].renderLayer->setGroupedMapping(0); | |
| 183 } | |
| 184 | |
| 178 updateClippingLayers(false, false); | 185 updateClippingLayers(false, false); |
| 179 updateOverflowControlsLayers(false, false, false); | 186 updateOverflowControlsLayers(false, false, false); |
| 180 updateForegroundLayer(false); | 187 updateForegroundLayer(false); |
| 181 updateBackgroundLayer(false); | 188 updateBackgroundLayer(false); |
| 182 updateMaskLayer(false); | 189 updateMaskLayer(false); |
| 183 updateClippingMaskLayers(false); | 190 updateClippingMaskLayers(false); |
| 184 updateScrollingLayers(false); | 191 updateScrollingLayers(false); |
| 192 updateSquashingLayers(false); | |
| 185 destroyGraphicsLayers(); | 193 destroyGraphicsLayers(); |
| 186 } | 194 } |
| 187 | 195 |
| 188 PassOwnPtr<GraphicsLayer> CompositedLayerMapping::createGraphicsLayer(Compositin gReasons reasons) | 196 PassOwnPtr<GraphicsLayer> CompositedLayerMapping::createGraphicsLayer(Compositin gReasons reasons) |
| 189 { | 197 { |
| 190 GraphicsLayerFactory* graphicsLayerFactory = 0; | 198 GraphicsLayerFactory* graphicsLayerFactory = 0; |
| 191 if (Page* page = renderer()->frame()->page()) | 199 if (Page* page = renderer()->frame()->page()) |
| 192 graphicsLayerFactory = page->chrome().client().graphicsLayerFactory(); | 200 graphicsLayerFactory = page->chrome().client().graphicsLayerFactory(); |
| 193 | 201 |
| 194 OwnPtr<GraphicsLayer> graphicsLayer = GraphicsLayer::create(graphicsLayerFac tory, this); | 202 OwnPtr<GraphicsLayer> graphicsLayer = GraphicsLayer::create(graphicsLayerFac tory, this); |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 450 | 458 |
| 451 if (updateOverflowControlsLayers(requiresHorizontalScrollbarLayer(), require sVerticalScrollbarLayer(), requiresScrollCornerLayer())) | 459 if (updateOverflowControlsLayers(requiresHorizontalScrollbarLayer(), require sVerticalScrollbarLayer(), requiresScrollCornerLayer())) |
| 452 layerConfigChanged = true; | 460 layerConfigChanged = true; |
| 453 | 461 |
| 454 if (updateScrollingLayers(m_owningLayer->needsCompositedScrolling())) | 462 if (updateScrollingLayers(m_owningLayer->needsCompositedScrolling())) |
| 455 layerConfigChanged = true; | 463 layerConfigChanged = true; |
| 456 | 464 |
| 457 updateScrollParent(scrollParent); | 465 updateScrollParent(scrollParent); |
| 458 updateClipParent(m_owningLayer->clipParent()); | 466 updateClipParent(m_owningLayer->clipParent()); |
| 459 | 467 |
| 468 if (updateSquashingLayers(!m_squashedLayers.isEmpty())) | |
| 469 layerConfigChanged = true; | |
| 470 | |
| 460 if (layerConfigChanged) | 471 if (layerConfigChanged) |
| 461 updateInternalHierarchy(); | 472 updateInternalHierarchy(); |
| 462 | 473 |
| 463 if (updateMaskLayer(renderer->hasMask())) | 474 if (updateMaskLayer(renderer->hasMask())) |
| 464 m_graphicsLayer->setMaskLayer(m_maskLayer.get()); | 475 m_graphicsLayer->setMaskLayer(m_maskLayer.get()); |
| 465 | 476 |
| 466 bool hasChildClippingLayer = compositor->clipsCompositingDescendants(m_ownin gLayer) && (hasClippingLayer() || hasScrollingLayer()); | 477 bool hasChildClippingLayer = compositor->clipsCompositingDescendants(m_ownin gLayer) && (hasClippingLayer() || hasScrollingLayer()); |
| 467 bool needsChildClippingMask = (renderer->style()->clipPath() || renderer->st yle()->hasBorderRadius()) && (hasChildClippingLayer || isAcceleratedContents(ren derer)); | 478 bool needsChildClippingMask = (renderer->style()->clipPath() || renderer->st yle()->hasBorderRadius()) && (hasChildClippingLayer || isAcceleratedContents(ren derer)); |
| 468 if (updateClippingMaskLayers(needsChildClippingMask)) { | 479 if (updateClippingMaskLayers(needsChildClippingMask)) { |
| 469 if (hasClippingLayer()) | 480 if (hasClippingLayer()) |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 559 // FIXME: reflections should force transform-style to be flat in the style: https://bugs.webkit.org/show_bug.cgi?id=106959 | 570 // FIXME: reflections should force transform-style to be flat in the style: https://bugs.webkit.org/show_bug.cgi?id=106959 |
| 560 bool preserves3D = style->transformStyle3D() == TransformStyle3DPreserve3D & & !renderer()->hasReflection(); | 571 bool preserves3D = style->transformStyle3D() == TransformStyle3DPreserve3D & & !renderer()->hasReflection(); |
| 561 m_graphicsLayer->setPreserves3D(preserves3D); | 572 m_graphicsLayer->setPreserves3D(preserves3D); |
| 562 m_graphicsLayer->setBackfaceVisibility(style->backfaceVisibility() == Backfa ceVisibilityVisible); | 573 m_graphicsLayer->setBackfaceVisibility(style->backfaceVisibility() == Backfa ceVisibilityVisible); |
| 563 | 574 |
| 564 RenderLayer* compAncestor = m_owningLayer->ancestorCompositingLayer(); | 575 RenderLayer* compAncestor = m_owningLayer->ancestorCompositingLayer(); |
| 565 | 576 |
| 566 // We compute everything relative to the enclosing compositing layer. | 577 // We compute everything relative to the enclosing compositing layer. |
| 567 IntRect ancestorCompositingBounds; | 578 IntRect ancestorCompositingBounds; |
| 568 if (compAncestor) { | 579 if (compAncestor) { |
| 580 // FIXME: is it correct to fix the ASSERT by adding the squashing condit ion here, too? | |
|
Ian Vollick
2013/12/02 21:17:05
Yeah, I think so. It should be valid for compAnces
shawnsingh
2013/12/05 17:55:24
Actually I've convinced myself this FIXME is bogus
| |
| 569 ASSERT(compAncestor->hasCompositedLayerMapping()); | 581 ASSERT(compAncestor->hasCompositedLayerMapping()); |
| 570 ancestorCompositingBounds = pixelSnappedIntRect(compAncestor->composited LayerMapping()->compositedBounds()); | 582 ancestorCompositingBounds = pixelSnappedIntRect(compAncestor->composited LayerMapping()->compositedBounds()); |
| 571 } | 583 } |
| 572 | 584 |
| 573 IntRect localCompositingBounds = pixelSnappedIntRect(compositedBounds()); | 585 IntRect localCompositingBounds = pixelSnappedIntRect(compositedBounds()); |
| 574 | 586 |
| 575 IntRect relativeCompositingBounds(localCompositingBounds); | 587 IntRect relativeCompositingBounds(localCompositingBounds); |
| 576 IntPoint delta; | 588 IntPoint delta; |
| 577 m_owningLayer->convertToPixelSnappedLayerCoords(compAncestor, delta); | 589 m_owningLayer->convertToPixelSnappedLayerCoords(compAncestor, delta); |
| 578 relativeCompositingBounds.moveBy(delta); | 590 relativeCompositingBounds.moveBy(delta); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 773 m_scrollingContentsLayer->setOffsetFromRenderer(scrollingContentsOffset, GraphicsLayer::DontSetNeedsDisplay); | 785 m_scrollingContentsLayer->setOffsetFromRenderer(scrollingContentsOffset, GraphicsLayer::DontSetNeedsDisplay); |
| 774 | 786 |
| 775 if (m_foregroundLayer) { | 787 if (m_foregroundLayer) { |
| 776 if (m_foregroundLayer->size() != m_scrollingContentsLayer->size()) | 788 if (m_foregroundLayer->size() != m_scrollingContentsLayer->size()) |
| 777 m_foregroundLayer->setSize(m_scrollingContentsLayer->size()); | 789 m_foregroundLayer->setSize(m_scrollingContentsLayer->size()); |
| 778 m_foregroundLayer->setNeedsDisplay(); | 790 m_foregroundLayer->setNeedsDisplay(); |
| 779 m_foregroundLayer->setOffsetFromRenderer(m_scrollingContentsLayer->o ffsetFromRenderer()); | 791 m_foregroundLayer->setOffsetFromRenderer(m_scrollingContentsLayer->o ffsetFromRenderer()); |
| 780 } | 792 } |
| 781 } | 793 } |
| 782 | 794 |
| 795 if (m_squashingLayer) { | |
|
Ian Vollick
2013/12/02 21:17:05
IIUC, we ultimately want to postpone geometry comp
shawnsingh
2013/12/05 17:55:24
Can you please elaborate what geometry stuff is un
Ian Vollick
2013/12/06 21:11:30
I was incorrectly worried that calculateComposited
| |
| 796 ASSERT(compositor()->isLayerSquashingEnabled()); | |
| 797 | |
| 798 IntRect totalSquashBounds; | |
| 799 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { | |
| 800 IntRect squashedBounds = compositor()->calculateCompositedBounds(m_s quashedLayers[i].renderLayer, m_squashedLayers[i].renderLayer); | |
| 801 | |
| 802 // Store the composited bounds before applying the offset. | |
| 803 // FIXME: do we need to? is it better for some reason? | |
|
Ian Vollick
2013/12/02 21:17:05
We'll always be able to move it back, if necessary
| |
| 804 m_squashedLayers[i].compositedBounds = squashedBounds; | |
| 805 | |
| 806 squashedBounds.move(m_squashedLayers[i].offsetFromBackingRoot); | |
| 807 totalSquashBounds.unite(squashedBounds); | |
| 808 } | |
| 809 | |
| 810 IntPoint squashLayerPosition; | |
| 811 if (m_ancestorClippingLayer) { | |
|
Ian Vollick
2013/12/02 21:17:05
Ancestor transform layer's gonna have to be dealt
| |
| 812 squashLayerPosition = IntPoint(m_ancestorClippingLayer->position().x () + totalSquashBounds.location().x(), | |
| 813 m_ancestorClippingLayer->position().y() + totalSquashBounds.loca tion().y()); | |
| 814 } else { | |
| 815 squashLayerPosition = IntPoint(m_graphicsLayer->position().x() + tot alSquashBounds.location().x(), | |
| 816 m_graphicsLayer->position().y() + totalSquashBounds.location().y ()); | |
| 817 } | |
| 818 | |
| 819 m_squashingLayer->setPosition(squashLayerPosition); | |
| 820 m_squashingLayer->setSize(totalSquashBounds.size()); | |
|
Ian Vollick
2013/12/02 21:17:05
It occurs to me that perspective depends on layer
shawnsingh
2013/12/05 17:55:24
Yeah, I am planning to add a canBeSquashed() funct
| |
| 821 | |
| 822 // Now that the position of the squashing layer is known, update the off sets for each squashed RenderLayer. | |
| 823 // FIXME: find a cleaner way to compute renderer offsets, hopefully that supports transforms, too? | |
|
Ian Vollick
2013/12/02 21:17:05
I kinda think we should punt on squashing layers w
shawnsingh
2013/12/05 17:55:24
3d transforms would always be composited... ?
This
Ian Vollick
2013/12/06 21:11:30
(facepalm). Of course. Sorry, carry on..
| |
| 824 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { | |
| 825 m_squashedLayers[i].offsetFromRenderer = IntSize(-m_squashedLayers[i ].offsetFromBackingRoot.width() - m_graphicsLayer->position().x() + m_squashingL ayer->position().x(), | |
| 826 -m_squashedLayers[i].offsetFromBackingRoot.height() - m_graphics Layer->position().y() + m_squashingLayer->position().y()); | |
| 827 | |
| 828 // FIXME: find a better design to avoid this redundant value | |
| 829 m_squashedLayers[i].renderLayer->setOffsetFromSquashingLayerOrigin(m _squashedLayers[i].offsetFromRenderer); | |
| 830 } | |
| 831 } | |
| 832 | |
| 783 if (m_owningLayer->scrollableArea()) | 833 if (m_owningLayer->scrollableArea()) |
| 784 m_owningLayer->scrollableArea()->positionOverflowControls(); | 834 m_owningLayer->scrollableArea()->positionOverflowControls(); |
| 785 | 835 |
| 786 // We can't make this call in RenderLayerCompositor::allocateOrClearComposit edLayerMapping | 836 // We can't make this call in RenderLayerCompositor::allocateOrClearComposit edLayerMapping |
| 787 // since it depends on whether compAncestor draws content, which gets update d later. | 837 // since it depends on whether compAncestor draws content, which gets update d later. |
| 788 updateRequiresOwnBackingStoreForAncestorReasons(compAncestor); | 838 updateRequiresOwnBackingStoreForAncestorReasons(compAncestor); |
| 789 | 839 |
| 790 updateContentsRect(isSimpleContainer); | 840 updateContentsRect(isSimpleContainer); |
| 791 updateBackgroundColor(isSimpleContainer); | 841 updateBackgroundColor(isSimpleContainer); |
| 792 updateDrawsContent(isSimpleContainer); | 842 updateDrawsContent(isSimpleContainer); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 846 m_graphicsLayer->addChild(m_layerForHorizontalScrollbar.get()); | 896 m_graphicsLayer->addChild(m_layerForHorizontalScrollbar.get()); |
| 847 } | 897 } |
| 848 if (m_layerForVerticalScrollbar) { | 898 if (m_layerForVerticalScrollbar) { |
| 849 m_layerForVerticalScrollbar->removeFromParent(); | 899 m_layerForVerticalScrollbar->removeFromParent(); |
| 850 m_graphicsLayer->addChild(m_layerForVerticalScrollbar.get()); | 900 m_graphicsLayer->addChild(m_layerForVerticalScrollbar.get()); |
| 851 } | 901 } |
| 852 if (m_layerForScrollCorner) { | 902 if (m_layerForScrollCorner) { |
| 853 m_layerForScrollCorner->removeFromParent(); | 903 m_layerForScrollCorner->removeFromParent(); |
| 854 m_graphicsLayer->addChild(m_layerForScrollCorner.get()); | 904 m_graphicsLayer->addChild(m_layerForScrollCorner.get()); |
| 855 } | 905 } |
| 906 | |
| 907 // The squashing containment layer, if it exists, becomes a no-op parent. | |
| 908 if (m_squashingLayer) { | |
|
Ian Vollick
2013/12/02 21:17:05
Usually there's a bit here where we remove all chi
shawnsingh
2013/12/05 17:55:24
I think I just missed it. Added to new patch, tha
| |
| 909 ASSERT(compositor()->isLayerSquashingEnabled()); | |
| 910 ASSERT(m_squashingContainmentLayer); | |
| 911 | |
| 912 if (m_ancestorClippingLayer) | |
| 913 m_squashingContainmentLayer->addChild(m_ancestorClippingLayer.get()) ; | |
| 914 else | |
| 915 m_squashingContainmentLayer->addChild(m_graphicsLayer.get()); | |
| 916 | |
| 917 m_squashingContainmentLayer->addChild(m_squashingLayer.get()); | |
| 918 } | |
| 856 } | 919 } |
| 857 | 920 |
| 858 void CompositedLayerMapping::updateContentsRect(bool isSimpleContainer) | 921 void CompositedLayerMapping::updateContentsRect(bool isSimpleContainer) |
| 859 { | 922 { |
| 860 IntRect contentsRect; | 923 IntRect contentsRect; |
| 861 if (isSimpleContainer && renderer()->hasBackground()) | 924 if (isSimpleContainer && renderer()->hasBackground()) |
| 862 contentsRect = backgroundBox(); | 925 contentsRect = backgroundBox(); |
| 863 else | 926 else |
| 864 contentsRect = contentsBox(); | 927 contentsRect = contentsBox(); |
| 865 | 928 |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1172 m_graphicsLayer->setNeedsDisplay(); | 1235 m_graphicsLayer->setNeedsDisplay(); |
| 1173 if (renderer()->view()) | 1236 if (renderer()->view()) |
| 1174 compositor()->scrollingLayerDidChange(m_owningLayer); | 1237 compositor()->scrollingLayerDidChange(m_owningLayer); |
| 1175 } | 1238 } |
| 1176 | 1239 |
| 1177 return layerChanged; | 1240 return layerChanged; |
| 1178 } | 1241 } |
| 1179 | 1242 |
| 1180 void CompositedLayerMapping::updateScrollParent(RenderLayer* scrollParent) | 1243 void CompositedLayerMapping::updateScrollParent(RenderLayer* scrollParent) |
| 1181 { | 1244 { |
| 1245 // FIXME: Either the asserts or the code in his function are broken for squa shing. (I think it's the asserts?) | |
|
Ian Vollick
2013/12/02 21:17:05
It's broken. There are three layers that might be
shawnsingh
2013/12/05 17:55:24
Please let me know if new patch does it properly =
| |
| 1246 | |
| 1182 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLay er(m_owningLayer)) { | 1247 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLay er(m_owningLayer)) { |
| 1183 if (m_ancestorClippingLayer) { | 1248 if (m_ancestorClippingLayer) { |
| 1184 ASSERT(childForSuperlayers() == m_ancestorClippingLayer.get()); | 1249 ASSERT(childForSuperlayers() == m_ancestorClippingLayer.get()); |
| 1185 // If we have an ancestor clipping layer, it is the scroll child. Th e other layer that may have | 1250 // If we have an ancestor clipping layer, it is the scroll child. Th e other layer that may have |
| 1186 // been the scroll child is the graphics layer. We will ensure that we clear its association | 1251 // been the scroll child is the graphics layer. We will ensure that we clear its association |
| 1187 // with a scroll parent if it had one. | 1252 // with a scroll parent if it had one. |
| 1188 scrollingCoordinator->updateScrollParentForGraphicsLayer(m_ancestorC lippingLayer.get(), scrollParent); | 1253 scrollingCoordinator->updateScrollParentForGraphicsLayer(m_ancestorC lippingLayer.get(), scrollParent); |
| 1189 scrollingCoordinator->updateScrollParentForGraphicsLayer(m_graphicsL ayer.get(), 0); | 1254 scrollingCoordinator->updateScrollParentForGraphicsLayer(m_graphicsL ayer.get(), 0); |
| 1190 } else { | 1255 } else { |
| 1191 ASSERT(childForSuperlayers() == m_graphicsLayer.get()); | 1256 ASSERT(childForSuperlayers() == m_graphicsLayer.get()); |
| 1192 scrollingCoordinator->updateScrollParentForGraphicsLayer(m_graphicsL ayer.get(), scrollParent); | 1257 scrollingCoordinator->updateScrollParentForGraphicsLayer(m_graphicsL ayer.get(), scrollParent); |
| 1193 } | 1258 } |
| 1194 } | 1259 } |
| 1195 } | 1260 } |
| 1196 | 1261 |
| 1197 void CompositedLayerMapping::updateClipParent(RenderLayer* clipParent) | 1262 void CompositedLayerMapping::updateClipParent(RenderLayer* clipParent) |
| 1198 { | 1263 { |
| 1199 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLay er(m_owningLayer)) | 1264 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLay er(m_owningLayer)) |
| 1200 scrollingCoordinator->updateClipParentForGraphicsLayer(m_graphicsLayer.g et(), clipParent); | 1265 scrollingCoordinator->updateClipParentForGraphicsLayer(m_graphicsLayer.g et(), clipParent); |
| 1201 } | 1266 } |
| 1202 | 1267 |
| 1268 bool CompositedLayerMapping::updateSquashingLayers(bool needsSquashingLayers) | |
| 1269 { | |
| 1270 bool layersChanged = false; | |
| 1271 | |
| 1272 if (needsSquashingLayers) { | |
| 1273 ASSERT(compositor()->isLayerSquashingEnabled()); | |
| 1274 | |
| 1275 if (!m_squashingLayer) { | |
| 1276 m_squashingLayer = createGraphicsLayer(CompositingReasonOverlap); | |
| 1277 m_squashingLayer->setDrawsContent(true); | |
| 1278 m_squashingLayer->setNeedsDisplay(); | |
| 1279 layersChanged = true; | |
| 1280 } | |
| 1281 | |
| 1282 if (!m_squashingContainmentLayer) { | |
|
trchen
2013/12/02 22:56:55
This can merge with the if-block above, with ASSER
| |
| 1283 // FIXME: containment layer needs a new CompositingReason, Compositi ngReasonOverlap is not appropriate. | |
| 1284 m_squashingContainmentLayer = createGraphicsLayer(CompositingReasonO verlap); | |
| 1285 // FIXME: reflections should force transform-style to be flat in the style: https://bugs.webkit.org/show_bug.cgi?id=106959 | |
| 1286 bool preserves3D = renderer()->style()->transformStyle3D() == Transf ormStyle3DPreserve3D && !renderer()->hasReflection(); | |
|
Ian Vollick
2013/12/02 21:17:05
Can we write a CLM::preserves3D() helper fn? I fin
trchen
2013/12/02 22:56:55
Couldn't we setPreserves3D(true) always? Squashing
shawnsingh
2013/12/05 17:55:24
I would prefer to call it CLM::owningLayerPreserve
| |
| 1287 m_squashingContainmentLayer->setPreserves3D(preserves3D); | |
| 1288 layersChanged = true; | |
| 1289 } | |
| 1290 | |
| 1291 ASSERT(m_squashingLayer && m_squashingContainmentLayer); | |
| 1292 } else { | |
| 1293 if (m_squashingLayer) { | |
| 1294 m_squashingLayer->removeFromParent(); | |
|
trchen
2013/12/02 22:56:55
No need to explicitly removeFromParent. The destru
shawnsingh
2013/12/05 17:55:24
The style in the rest of this file does explicitly
| |
| 1295 m_squashingLayer = nullptr; | |
| 1296 layersChanged = true; | |
| 1297 // FIXME: do we need to invalidate something here? | |
| 1298 } | |
| 1299 | |
| 1300 if (m_squashingContainmentLayer) { | |
| 1301 m_squashingContainmentLayer->removeFromParent(); | |
|
trchen
2013/12/02 22:56:55
Ditto
| |
| 1302 m_squashingContainmentLayer = nullptr; | |
| 1303 layersChanged = true; | |
| 1304 } | |
| 1305 | |
| 1306 ASSERT(!m_squashingLayer && !m_squashingContainmentLayer); | |
| 1307 } | |
| 1308 | |
| 1309 return layersChanged; | |
| 1310 } | |
| 1311 | |
| 1203 GraphicsLayerPaintingPhase CompositedLayerMapping::paintingPhaseForPrimaryLayer( ) const | 1312 GraphicsLayerPaintingPhase CompositedLayerMapping::paintingPhaseForPrimaryLayer( ) const |
| 1204 { | 1313 { |
| 1205 unsigned phase = 0; | 1314 unsigned phase = 0; |
| 1206 if (!m_backgroundLayer) | 1315 if (!m_backgroundLayer) |
| 1207 phase |= GraphicsLayerPaintBackground; | 1316 phase |= GraphicsLayerPaintBackground; |
| 1208 if (!m_foregroundLayer) | 1317 if (!m_foregroundLayer) |
| 1209 phase |= GraphicsLayerPaintForeground; | 1318 phase |= GraphicsLayerPaintForeground; |
| 1210 if (!m_maskLayer) | 1319 if (!m_maskLayer) |
| 1211 phase |= GraphicsLayerPaintMask; | 1320 phase |= GraphicsLayerPaintMask; |
| 1212 | 1321 |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1534 GraphicsLayer* CompositedLayerMapping::parentForSublayers() const | 1643 GraphicsLayer* CompositedLayerMapping::parentForSublayers() const |
| 1535 { | 1644 { |
| 1536 if (m_scrollingContentsLayer) | 1645 if (m_scrollingContentsLayer) |
| 1537 return m_scrollingContentsLayer.get(); | 1646 return m_scrollingContentsLayer.get(); |
| 1538 | 1647 |
| 1539 return m_childContainmentLayer ? m_childContainmentLayer.get() : m_graphicsL ayer.get(); | 1648 return m_childContainmentLayer ? m_childContainmentLayer.get() : m_graphicsL ayer.get(); |
| 1540 } | 1649 } |
| 1541 | 1650 |
| 1542 GraphicsLayer* CompositedLayerMapping::childForSuperlayers() const | 1651 GraphicsLayer* CompositedLayerMapping::childForSuperlayers() const |
| 1543 { | 1652 { |
| 1653 if (m_squashingContainmentLayer) | |
| 1654 return m_squashingContainmentLayer.get(); | |
| 1655 | |
| 1544 if (m_ancestorClippingLayer) | 1656 if (m_ancestorClippingLayer) |
| 1545 return m_ancestorClippingLayer.get(); | 1657 return m_ancestorClippingLayer.get(); |
| 1546 | 1658 |
| 1547 return m_graphicsLayer.get(); | 1659 return m_graphicsLayer.get(); |
| 1548 } | 1660 } |
| 1549 | 1661 |
| 1550 bool CompositedLayerMapping::updateRequiresOwnBackingStoreForAncestorReasons(con st RenderLayer* compositingAncestorLayer) | 1662 bool CompositedLayerMapping::updateRequiresOwnBackingStoreForAncestorReasons(con st RenderLayer* compositingAncestorLayer) |
| 1551 { | 1663 { |
| 1552 bool previousRequiresOwnBackingStoreForAncestorReasons = m_requiresOwnBackin gStoreForAncestorReasons; | 1664 bool previousRequiresOwnBackingStoreForAncestorReasons = m_requiresOwnBackin gStoreForAncestorReasons; |
| 1553 bool previousPaintsIntoCompositedAncestor = paintsIntoCompositedAncestor(); | 1665 bool previousPaintsIntoCompositedAncestor = paintsIntoCompositedAncestor(); |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1701 | 1813 |
| 1702 // The dirtyRect is in the coords of the painting root. | 1814 // The dirtyRect is in the coords of the painting root. |
| 1703 IntRect dirtyRect = pixelSnappedIntRect(relativeClip); | 1815 IntRect dirtyRect = pixelSnappedIntRect(relativeClip); |
| 1704 if (!(paintInfo.paintingPhase & GraphicsLayerPaintOverflowContents)) | 1816 if (!(paintInfo.paintingPhase & GraphicsLayerPaintOverflowContents)) |
| 1705 dirtyRect.intersect(paintInfo.compositedBounds); | 1817 dirtyRect.intersect(paintInfo.compositedBounds); |
| 1706 | 1818 |
| 1707 #ifndef NDEBUG | 1819 #ifndef NDEBUG |
| 1708 paintInfo.renderLayer->renderer()->assertSubtreeIsLaidOut(); | 1820 paintInfo.renderLayer->renderer()->assertSubtreeIsLaidOut(); |
| 1709 #endif | 1821 #endif |
| 1710 | 1822 |
| 1711 // FIXME: GraphicsLayers need a way to split for RenderRegions. | 1823 if (paintInfo.renderLayer->compositingState() != PaintsIntoGroupedBacking) { |
| 1712 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBehavi orNormal, LayoutSize()); | 1824 // FIXME: GraphicsLayers need a way to split for RenderRegions. |
| 1713 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, paintFlags) ; | 1825 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe haviorNormal, LayoutSize()); |
| 1826 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, paintFl ags); | |
| 1714 | 1827 |
| 1715 ASSERT(!paintInfo.isBackgroundLayer || paintFlags & PaintLayerPaintingRootBa ckgroundOnly); | 1828 ASSERT(!paintInfo.isBackgroundLayer || paintFlags & PaintLayerPaintingRo otBackgroundOnly); |
| 1716 | 1829 |
| 1717 if (paintInfo.renderLayer->containsDirtyOverlayScrollbars()) | 1830 if (paintInfo.renderLayer->containsDirtyOverlayScrollbars()) |
| 1718 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, paintFl ags | PaintLayerPaintingOverlayScrollbars); | 1831 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, pai ntFlags | PaintLayerPaintingOverlayScrollbars); |
| 1832 } else { | |
| 1833 ASSERT(compositor()->isLayerSquashingEnabled()); | |
| 1834 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe haviorNormal, LayoutSize()); | |
| 1835 paintInfo.renderLayer->paintLayer(context, paintingInfo, paintFlags); | |
| 1836 } | |
| 1719 | 1837 |
| 1720 ASSERT(!paintInfo.renderLayer->m_usedTransparency); | 1838 ASSERT(!paintInfo.renderLayer->m_usedTransparency); |
| 1721 | 1839 |
| 1722 // Manually restore the context to its original state by applying the opposi te translation. | 1840 // Manually restore the context to its original state by applying the opposi te translation. |
| 1723 context->translate(offset); | 1841 context->translate(offset); |
| 1724 } | 1842 } |
| 1725 | 1843 |
| 1726 static void paintScrollbar(Scrollbar* scrollbar, GraphicsContext& context, const IntRect& clip) | 1844 static void paintScrollbar(Scrollbar* scrollbar, GraphicsContext& context, const IntRect& clip) |
| 1727 { | 1845 { |
| 1728 if (!scrollbar) | 1846 if (!scrollbar) |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 1754 || graphicsLayer == m_scrollingContentsLayer.get()) { | 1872 || graphicsLayer == m_scrollingContentsLayer.get()) { |
| 1755 | 1873 |
| 1756 GraphicsLayerPaintInfo paintInfo; | 1874 GraphicsLayerPaintInfo paintInfo; |
| 1757 paintInfo.renderLayer = m_owningLayer; | 1875 paintInfo.renderLayer = m_owningLayer; |
| 1758 paintInfo.compositedBounds = compositedBounds(); | 1876 paintInfo.compositedBounds = compositedBounds(); |
| 1759 paintInfo.offsetFromRenderer = graphicsLayer->offsetFromRenderer(); | 1877 paintInfo.offsetFromRenderer = graphicsLayer->offsetFromRenderer(); |
| 1760 paintInfo.paintingPhase = paintingPhase; | 1878 paintInfo.paintingPhase = paintingPhase; |
| 1761 paintInfo.isBackgroundLayer = (graphicsLayer == m_backgroundLayer); | 1879 paintInfo.isBackgroundLayer = (graphicsLayer == m_backgroundLayer); |
| 1762 | 1880 |
| 1763 // We have to use the same root as for hit testing, because both methods can compute and cache clipRects. | 1881 // We have to use the same root as for hit testing, because both methods can compute and cache clipRects. |
| 1764 doPaintTask(paintInfo, &context, clip); | 1882 doPaintTask(paintInfo, &context, clip); |
|
trchen
2013/12/02 22:56:55
Do we have to skip painting here if we're squashed
shawnsingh
2013/12/05 17:55:24
We will guarantee not to reach this code when the
| |
| 1883 } else if (graphicsLayer == m_squashingLayer.get()) { | |
| 1884 ASSERT(compositor()->isLayerSquashingEnabled()); | |
| 1885 for (size_t i = 0; i < m_squashedLayers.size(); ++i) | |
| 1886 doPaintTask(m_squashedLayers[i], &context, clip); | |
|
Ian Vollick
2013/12/02 21:17:05
Cool.
| |
| 1765 } else if (graphicsLayer == layerForHorizontalScrollbar()) { | 1887 } else if (graphicsLayer == layerForHorizontalScrollbar()) { |
| 1766 paintScrollbar(m_owningLayer->scrollableArea()->horizontalScrollbar(), c ontext, clip); | 1888 paintScrollbar(m_owningLayer->scrollableArea()->horizontalScrollbar(), c ontext, clip); |
| 1767 } else if (graphicsLayer == layerForVerticalScrollbar()) { | 1889 } else if (graphicsLayer == layerForVerticalScrollbar()) { |
| 1768 paintScrollbar(m_owningLayer->scrollableArea()->verticalScrollbar(), con text, clip); | 1890 paintScrollbar(m_owningLayer->scrollableArea()->verticalScrollbar(), con text, clip); |
| 1769 } else if (graphicsLayer == layerForScrollCorner()) { | 1891 } else if (graphicsLayer == layerForScrollCorner()) { |
| 1770 const IntRect& scrollCornerAndResizer = m_owningLayer->scrollableArea()- >scrollCornerAndResizerRect(); | 1892 const IntRect& scrollCornerAndResizer = m_owningLayer->scrollableArea()- >scrollCornerAndResizerRect(); |
| 1771 context.save(); | 1893 context.save(); |
| 1772 context.translate(-scrollCornerAndResizer.x(), -scrollCornerAndResizer.y ()); | 1894 context.translate(-scrollCornerAndResizer.x(), -scrollCornerAndResizer.y ()); |
| 1773 IntRect transformedClip = clip; | 1895 IntRect transformedClip = clip; |
| 1774 transformedClip.moveBy(scrollCornerAndResizer.location()); | 1896 transformedClip.moveBy(scrollCornerAndResizer.location()); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1950 IntRect CompositedLayerMapping::compositedBounds() const | 2072 IntRect CompositedLayerMapping::compositedBounds() const |
| 1951 { | 2073 { |
| 1952 return m_compositedBounds; | 2074 return m_compositedBounds; |
| 1953 } | 2075 } |
| 1954 | 2076 |
| 1955 void CompositedLayerMapping::setCompositedBounds(const IntRect& bounds) | 2077 void CompositedLayerMapping::setCompositedBounds(const IntRect& bounds) |
| 1956 { | 2078 { |
| 1957 m_compositedBounds = bounds; | 2079 m_compositedBounds = bounds; |
| 1958 } | 2080 } |
| 1959 | 2081 |
| 2082 void CompositedLayerMapping::addRenderLayerToSquashingGraphicsLayer(RenderLayer* layer, IntSize offsetFromTargetBacking, size_t nextSquashedLayerIndex) | |
| 2083 { | |
| 2084 ASSERT(compositor()->isLayerSquashingEnabled()); | |
| 2085 | |
| 2086 GraphicsLayerPaintInfo paintInfo; | |
| 2087 paintInfo.renderLayer = layer; | |
| 2088 // NOTE: composited bounds are updated elsewhere | |
| 2089 // NOTE: offsetFromRenderer is updated elsewhere | |
| 2090 paintInfo.offsetFromBackingRoot = offsetFromTargetBacking; | |
| 2091 paintInfo.paintingPhase = GraphicsLayerPaintAllWithOverflowClip; | |
| 2092 paintInfo.isBackgroundLayer = false; | |
| 2093 | |
| 2094 // Change tracking on squashing layers: at the first sign of something chang ed, just invalidate the layer. | |
| 2095 // FIXME: Perhaps we can find a tighter more clever mechanism later. | |
|
Ian Vollick
2013/12/02 21:17:05
Makes sense, but for now, this seems ok to me, too
| |
| 2096 if (nextSquashedLayerIndex < m_squashedLayers.size()) { | |
| 2097 if (m_squashedLayers[nextSquashedLayerIndex].renderLayer != layer) { | |
| 2098 m_squashedLayers[nextSquashedLayerIndex] = paintInfo; | |
| 2099 m_squashingLayer->setNeedsDisplay(); | |
|
trchen
2013/12/02 22:56:55
Why null checking is needed below but not here?
shawnsingh
2013/12/05 17:55:24
Thanks for catching this - null check is needed in
| |
| 2100 } | |
| 2101 } else { | |
| 2102 m_squashedLayers.append(paintInfo); | |
| 2103 if (m_squashingLayer) | |
| 2104 m_squashingLayer->setNeedsDisplay(); | |
| 2105 } | |
| 2106 layer->setGroupedMapping(this); | |
| 2107 } | |
| 2108 | |
| 2109 void CompositedLayerMapping::finishAccumulatingSquashingLayers(size_t nextSquash edLayerIndex) | |
| 2110 { | |
| 2111 ASSERT(compositor()->isLayerSquashingEnabled()); | |
| 2112 | |
| 2113 // Any additional squashed RenderLayers in the array no longer exist, and re moving invalidates the squashingLayer contents. | |
| 2114 if (nextSquashedLayerIndex < m_squashedLayers.size()) { | |
| 2115 m_squashedLayers.remove(nextSquashedLayerIndex, m_squashedLayers.size() - nextSquashedLayerIndex); | |
| 2116 if (m_squashingLayer) | |
| 2117 m_squashingLayer->setNeedsDisplay(); | |
| 2118 } | |
| 2119 } | |
| 2120 | |
| 1960 CompositingLayerType CompositedLayerMapping::compositingLayerType() const | 2121 CompositingLayerType CompositedLayerMapping::compositingLayerType() const |
| 1961 { | 2122 { |
| 1962 if (m_graphicsLayer->hasContentsLayer()) | 2123 if (m_graphicsLayer->hasContentsLayer()) |
| 1963 return MediaCompositingLayer; | 2124 return MediaCompositingLayer; |
| 1964 | 2125 |
| 1965 if (m_graphicsLayer->drawsContent()) | 2126 if (m_graphicsLayer->drawsContent()) |
| 1966 return NormalCompositingLayer; | 2127 return NormalCompositingLayer; |
| 1967 | 2128 |
| 1968 return ContainerCompositingLayer; | 2129 return ContainerCompositingLayer; |
| 1969 } | 2130 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2026 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { | 2187 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { |
| 2027 name = "Scrolling Contents Layer"; | 2188 name = "Scrolling Contents Layer"; |
| 2028 } else { | 2189 } else { |
| 2029 ASSERT_NOT_REACHED(); | 2190 ASSERT_NOT_REACHED(); |
| 2030 } | 2191 } |
| 2031 | 2192 |
| 2032 return name; | 2193 return name; |
| 2033 } | 2194 } |
| 2034 | 2195 |
| 2035 } // namespace WebCore | 2196 } // namespace WebCore |
| OLD | NEW |