| 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 19 matching lines...) Expand all Loading... |
| 30 #include "core/HTMLNames.h" | 30 #include "core/HTMLNames.h" |
| 31 #include "core/fetch/ImageResource.h" | 31 #include "core/fetch/ImageResource.h" |
| 32 #include "core/frame/FrameView.h" | 32 #include "core/frame/FrameView.h" |
| 33 #include "core/html/HTMLCanvasElement.h" | 33 #include "core/html/HTMLCanvasElement.h" |
| 34 #include "core/html/HTMLIFrameElement.h" | 34 #include "core/html/HTMLIFrameElement.h" |
| 35 #include "core/html/HTMLMediaElement.h" | 35 #include "core/html/HTMLMediaElement.h" |
| 36 #include "core/html/HTMLVideoElement.h" | 36 #include "core/html/HTMLVideoElement.h" |
| 37 #include "core/html/canvas/CanvasRenderingContext.h" | 37 #include "core/html/canvas/CanvasRenderingContext.h" |
| 38 #include "core/inspector/InspectorInstrumentation.h" | 38 #include "core/inspector/InspectorInstrumentation.h" |
| 39 #include "core/inspector/InspectorNodeIds.h" | 39 #include "core/inspector/InspectorNodeIds.h" |
| 40 #include "core/layout/compositing/RenderLayerCompositor.h" | 40 #include "core/layout/LayerStackingNodeIterator.h" |
| 41 #include "core/layout/compositing/LayerCompositor.h" |
| 41 #include "core/page/Chrome.h" | 42 #include "core/page/Chrome.h" |
| 42 #include "core/page/ChromeClient.h" | 43 #include "core/page/ChromeClient.h" |
| 43 #include "core/page/Page.h" | 44 #include "core/page/Page.h" |
| 44 #include "core/page/scrolling/ScrollingCoordinator.h" | 45 #include "core/page/scrolling/ScrollingCoordinator.h" |
| 45 #include "core/paint/LayerPainter.h" | 46 #include "core/paint/LayerPainter.h" |
| 46 #include "core/paint/ScrollableAreaPainter.h" | 47 #include "core/paint/ScrollableAreaPainter.h" |
| 47 #include "core/paint/TransformRecorder.h" | 48 #include "core/paint/TransformRecorder.h" |
| 48 #include "core/plugins/PluginView.h" | 49 #include "core/plugins/PluginView.h" |
| 49 #include "core/rendering/FilterEffectRenderer.h" | 50 #include "core/rendering/FilterEffectRenderer.h" |
| 50 #include "core/rendering/RenderEmbeddedObject.h" | 51 #include "core/rendering/RenderEmbeddedObject.h" |
| 51 #include "core/rendering/RenderImage.h" | 52 #include "core/rendering/RenderImage.h" |
| 52 #include "core/rendering/RenderLayerStackingNodeIterator.h" | |
| 53 #include "core/rendering/RenderPart.h" | 53 #include "core/rendering/RenderPart.h" |
| 54 #include "core/rendering/RenderVideo.h" | 54 #include "core/rendering/RenderVideo.h" |
| 55 #include "core/rendering/RenderView.h" | 55 #include "core/rendering/RenderView.h" |
| 56 #include "core/rendering/style/KeyframeList.h" | 56 #include "core/rendering/style/KeyframeList.h" |
| 57 #include "platform/LengthFunctions.h" | 57 #include "platform/LengthFunctions.h" |
| 58 #include "platform/RuntimeEnabledFeatures.h" | 58 #include "platform/RuntimeEnabledFeatures.h" |
| 59 #include "platform/fonts/FontCache.h" | 59 #include "platform/fonts/FontCache.h" |
| 60 #include "platform/geometry/TransformState.h" | 60 #include "platform/geometry/TransformState.h" |
| 61 #include "platform/graphics/GraphicsContext.h" | 61 #include "platform/graphics/GraphicsContext.h" |
| 62 #include "platform/graphics/paint/ClipDisplayItem.h" | 62 #include "platform/graphics/paint/ClipDisplayItem.h" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 } | 148 } |
| 149 | 149 |
| 150 static inline bool isAcceleratedContents(RenderObject* renderer) | 150 static inline bool isAcceleratedContents(RenderObject* renderer) |
| 151 { | 151 { |
| 152 return isAcceleratedCanvas(renderer) | 152 return isAcceleratedCanvas(renderer) |
| 153 || (renderer->isEmbeddedObject() && toRenderEmbeddedObject(renderer)->re
quiresAcceleratedCompositing()) | 153 || (renderer->isEmbeddedObject() && toRenderEmbeddedObject(renderer)->re
quiresAcceleratedCompositing()) |
| 154 || renderer->isVideo(); | 154 || renderer->isVideo(); |
| 155 } | 155 } |
| 156 | 156 |
| 157 // Get the scrolling coordinator in a way that works inside CompositedLayerMappi
ng's destructor. | 157 // Get the scrolling coordinator in a way that works inside CompositedLayerMappi
ng's destructor. |
| 158 static ScrollingCoordinator* scrollingCoordinatorFromLayer(RenderLayer& layer) | 158 static ScrollingCoordinator* scrollingCoordinatorFromLayer(Layer& layer) |
| 159 { | 159 { |
| 160 Page* page = layer.renderer()->frame()->page(); | 160 Page* page = layer.renderer()->frame()->page(); |
| 161 if (!page) | 161 if (!page) |
| 162 return 0; | 162 return 0; |
| 163 | 163 |
| 164 return page->scrollingCoordinator(); | 164 return page->scrollingCoordinator(); |
| 165 } | 165 } |
| 166 | 166 |
| 167 CompositedLayerMapping::CompositedLayerMapping(RenderLayer& layer) | 167 CompositedLayerMapping::CompositedLayerMapping(Layer& layer) |
| 168 : m_owningLayer(layer) | 168 : m_owningLayer(layer) |
| 169 , m_contentOffsetInCompositingLayerDirty(false) | 169 , m_contentOffsetInCompositingLayerDirty(false) |
| 170 , m_pendingUpdateScope(GraphicsLayerUpdateNone) | 170 , m_pendingUpdateScope(GraphicsLayerUpdateNone) |
| 171 , m_isMainFrameRenderViewLayer(false) | 171 , m_isMainFrameRenderViewLayer(false) |
| 172 , m_backgroundLayerPaintsFixedRootBackground(false) | 172 , m_backgroundLayerPaintsFixedRootBackground(false) |
| 173 , m_scrollingContentsAreEmpty(false) | 173 , m_scrollingContentsAreEmpty(false) |
| 174 { | 174 { |
| 175 if (layer.isRootLayer() && renderer()->frame()->isMainFrame()) | 175 if (layer.isRootLayer() && renderer()->frame()->isMainFrame()) |
| 176 m_isMainFrameRenderViewLayer = true; | 176 m_isMainFrameRenderViewLayer = true; |
| 177 | 177 |
| 178 createPrimaryGraphicsLayer(); | 178 createPrimaryGraphicsLayer(); |
| 179 } | 179 } |
| 180 | 180 |
| 181 CompositedLayerMapping::~CompositedLayerMapping() | 181 CompositedLayerMapping::~CompositedLayerMapping() |
| 182 { | 182 { |
| 183 // Hits in compositing/squashing/squash-onto-nephew.html. | 183 // Hits in compositing/squashing/squash-onto-nephew.html. |
| 184 DisableCompositingQueryAsserts disabler; | 184 DisableCompositingQueryAsserts disabler; |
| 185 | 185 |
| 186 // Do not leave the destroyed pointer dangling on any RenderLayers that pain
ted to this mapping's squashing layer. | 186 // Do not leave the destroyed pointer dangling on any Layers that painted to
this mapping's squashing layer. |
| 187 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { | 187 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { |
| 188 RenderLayer* oldSquashedLayer = m_squashedLayers[i].renderLayer; | 188 Layer* oldSquashedLayer = m_squashedLayers[i].renderLayer; |
| 189 if (oldSquashedLayer->groupedMapping() == this) { | 189 if (oldSquashedLayer->groupedMapping() == this) { |
| 190 oldSquashedLayer->setGroupedMapping(0, true); | 190 oldSquashedLayer->setGroupedMapping(0, true); |
| 191 oldSquashedLayer->setLostGroupedMapping(true); | 191 oldSquashedLayer->setLostGroupedMapping(true); |
| 192 } | 192 } |
| 193 } | 193 } |
| 194 | 194 |
| 195 updateClippingLayers(false, false); | 195 updateClippingLayers(false, false); |
| 196 updateOverflowControlsLayers(false, false, false, false); | 196 updateOverflowControlsLayers(false, false, false, false); |
| 197 updateChildTransformLayer(false); | 197 updateChildTransformLayer(false); |
| 198 updateForegroundLayer(false); | 198 updateForegroundLayer(false); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 m_backgroundLayer->setContentsOpaque(m_owningLayer.backgroundIsKnownToBe
OpaqueInRect(compositedBounds())); | 326 m_backgroundLayer->setContentsOpaque(m_owningLayer.backgroundIsKnownToBe
OpaqueInRect(compositedBounds())); |
| 327 } else { | 327 } else { |
| 328 // For non-root layers, background is always painted by the primary grap
hics layer. | 328 // For non-root layers, background is always painted by the primary grap
hics layer. |
| 329 m_graphicsLayer->setContentsOpaque(m_owningLayer.backgroundIsKnownToBeOp
aqueInRect(compositedBounds())); | 329 m_graphicsLayer->setContentsOpaque(m_owningLayer.backgroundIsKnownToBeOp
aqueInRect(compositedBounds())); |
| 330 } | 330 } |
| 331 } | 331 } |
| 332 | 332 |
| 333 void CompositedLayerMapping::updateCompositedBounds() | 333 void CompositedLayerMapping::updateCompositedBounds() |
| 334 { | 334 { |
| 335 ASSERT(m_owningLayer.compositor()->lifecycle().state() == DocumentLifecycle:
:InCompositingUpdate); | 335 ASSERT(m_owningLayer.compositor()->lifecycle().state() == DocumentLifecycle:
:InCompositingUpdate); |
| 336 // FIXME: if this is really needed for performance, it would be better to st
ore it on RenderLayer. | 336 // FIXME: if this is really needed for performance, it would be better to st
ore it on Layer. |
| 337 m_compositedBounds = m_owningLayer.boundingBoxForCompositing(); | 337 m_compositedBounds = m_owningLayer.boundingBoxForCompositing(); |
| 338 m_contentOffsetInCompositingLayerDirty = true; | 338 m_contentOffsetInCompositingLayerDirty = true; |
| 339 } | 339 } |
| 340 | 340 |
| 341 void CompositedLayerMapping::updateAfterPartResize() | 341 void CompositedLayerMapping::updateAfterPartResize() |
| 342 { | 342 { |
| 343 if (renderer()->isRenderPart()) { | 343 if (renderer()->isRenderPart()) { |
| 344 if (RenderLayerCompositor* innerCompositor = RenderLayerCompositor::fram
eContentsCompositor(toRenderPart(renderer()))) { | 344 if (LayerCompositor* innerCompositor = LayerCompositor::frameContentsCom
positor(toRenderPart(renderer()))) { |
| 345 innerCompositor->frameViewDidChangeSize(); | 345 innerCompositor->frameViewDidChangeSize(); |
| 346 // We can floor this point because our frameviews are always aligned
to pixel boundaries. | 346 // We can floor this point because our frameviews are always aligned
to pixel boundaries. |
| 347 ASSERT(m_compositedBounds.location() == flooredIntPoint(m_composited
Bounds.location())); | 347 ASSERT(m_compositedBounds.location() == flooredIntPoint(m_composited
Bounds.location())); |
| 348 innerCompositor->frameViewDidChangeLocation(flooredIntPoint(contents
Box().location())); | 348 innerCompositor->frameViewDidChangeLocation(flooredIntPoint(contents
Box().location())); |
| 349 } | 349 } |
| 350 } | 350 } |
| 351 } | 351 } |
| 352 | 352 |
| 353 void CompositedLayerMapping::updateCompositingReasons() | 353 void CompositedLayerMapping::updateCompositingReasons() |
| 354 { | 354 { |
| 355 // All other layers owned by this mapping will have the same compositing rea
son | 355 // All other layers owned by this mapping will have the same compositing rea
son |
| 356 // for their lifetime, so they are initialized only when created. | 356 // for their lifetime, so they are initialized only when created. |
| 357 m_graphicsLayer->setCompositingReasons(m_owningLayer.compositingReasons()); | 357 m_graphicsLayer->setCompositingReasons(m_owningLayer.compositingReasons()); |
| 358 } | 358 } |
| 359 | 359 |
| 360 bool CompositedLayerMapping::owningLayerClippedByLayerNotAboveCompositedAncestor
() | 360 bool CompositedLayerMapping::owningLayerClippedByLayerNotAboveCompositedAncestor
() |
| 361 { | 361 { |
| 362 if (!m_owningLayer.parent()) | 362 if (!m_owningLayer.parent()) |
| 363 return false; | 363 return false; |
| 364 | 364 |
| 365 const RenderLayer* compositingAncestor = m_owningLayer.enclosingLayerWithCom
positedLayerMapping(ExcludeSelf); | 365 const Layer* compositingAncestor = m_owningLayer.enclosingLayerWithComposite
dLayerMapping(ExcludeSelf); |
| 366 if (!compositingAncestor) | 366 if (!compositingAncestor) |
| 367 return false; | 367 return false; |
| 368 | 368 |
| 369 const RenderObject* clippingContainer = m_owningLayer.clippingContainer(); | 369 const RenderObject* clippingContainer = m_owningLayer.clippingContainer(); |
| 370 if (!clippingContainer) | 370 if (!clippingContainer) |
| 371 return false; | 371 return false; |
| 372 | 372 |
| 373 if (compositingAncestor->renderer()->isDescendantOf(clippingContainer)) | 373 if (compositingAncestor->renderer()->isDescendantOf(clippingContainer)) |
| 374 return false; | 374 return false; |
| 375 | 375 |
| 376 // We ignore overflow clip here; we want composited overflow content to | 376 // We ignore overflow clip here; we want composited overflow content to |
| 377 // behave as if it lives in an unclipped universe so it can prepaint, etc. | 377 // behave as if it lives in an unclipped universe so it can prepaint, etc. |
| 378 // This means that we need to check if we are actually clipped before | 378 // This means that we need to check if we are actually clipped before |
| 379 // setting up m_ancestorClippingLayer otherwise | 379 // setting up m_ancestorClippingLayer otherwise |
| 380 // updateAncestorClippingLayerGeometry will fail as the clip rect will be | 380 // updateAncestorClippingLayerGeometry will fail as the clip rect will be |
| 381 // infinite. | 381 // infinite. |
| 382 // FIXME: this should use cached clip rects, but this sometimes give | 382 // FIXME: this should use cached clip rects, but this sometimes give |
| 383 // inaccurate results (and trips the ASSERTS in RenderLayerClipper). | 383 // inaccurate results (and trips the ASSERTS in LayerClipper). |
| 384 ClipRectsContext clipRectsContext(compositingAncestor, UncachedClipRects, Ig
noreOverlayScrollbarSize); | 384 ClipRectsContext clipRectsContext(compositingAncestor, UncachedClipRects, Ig
noreOverlayScrollbarSize); |
| 385 clipRectsContext.setIgnoreOverflowClip(); | 385 clipRectsContext.setIgnoreOverflowClip(); |
| 386 IntRect parentClipRect = pixelSnappedIntRect(m_owningLayer.clipper().backgro
undClipRect(clipRectsContext).rect()); | 386 IntRect parentClipRect = pixelSnappedIntRect(m_owningLayer.clipper().backgro
undClipRect(clipRectsContext).rect()); |
| 387 return parentClipRect != LayoutRect::infiniteIntRect(); | 387 return parentClipRect != LayoutRect::infiniteIntRect(); |
| 388 } | 388 } |
| 389 | 389 |
| 390 bool CompositedLayerMapping::updateGraphicsLayerConfiguration() | 390 bool CompositedLayerMapping::updateGraphicsLayerConfiguration() |
| 391 { | 391 { |
| 392 ASSERT(m_owningLayer.compositor()->lifecycle().state() == DocumentLifecycle:
:InCompositingUpdate); | 392 ASSERT(m_owningLayer.compositor()->lifecycle().state() == DocumentLifecycle:
:InCompositingUpdate); |
| 393 | 393 |
| 394 // Note carefully: here we assume that the compositing state of all descenda
nts have been updated already, | 394 // Note carefully: here we assume that the compositing state of all descenda
nts have been updated already, |
| 395 // so it is legitimate to compute and cache the composited bounds for this l
ayer. | 395 // so it is legitimate to compute and cache the composited bounds for this l
ayer. |
| 396 updateCompositedBounds(); | 396 updateCompositedBounds(); |
| 397 | 397 |
| 398 if (RenderLayerReflectionInfo* reflection = m_owningLayer.reflectionInfo())
{ | 398 if (LayerReflectionInfo* reflection = m_owningLayer.reflectionInfo()) { |
| 399 if (reflection->reflectionLayer()->hasCompositedLayerMapping()) | 399 if (reflection->reflectionLayer()->hasCompositedLayerMapping()) |
| 400 reflection->reflectionLayer()->compositedLayerMapping()->updateCompo
sitedBounds(); | 400 reflection->reflectionLayer()->compositedLayerMapping()->updateCompo
sitedBounds(); |
| 401 } | 401 } |
| 402 | 402 |
| 403 RenderLayerCompositor* compositor = this->compositor(); | 403 LayerCompositor* compositor = this->compositor(); |
| 404 RenderObject* renderer = this->renderer(); | 404 RenderObject* renderer = this->renderer(); |
| 405 | 405 |
| 406 bool layerConfigChanged = false; | 406 bool layerConfigChanged = false; |
| 407 setBackgroundLayerPaintsFixedRootBackground(compositor->needsFixedRootBackgr
oundLayer(&m_owningLayer)); | 407 setBackgroundLayerPaintsFixedRootBackground(compositor->needsFixedRootBackgr
oundLayer(&m_owningLayer)); |
| 408 | 408 |
| 409 // The background layer is currently only used for fixed root backgrounds. | 409 // The background layer is currently only used for fixed root backgrounds. |
| 410 if (updateBackgroundLayer(m_backgroundLayerPaintsFixedRootBackground)) | 410 if (updateBackgroundLayer(m_backgroundLayerPaintsFixedRootBackground)) |
| 411 layerConfigChanged = true; | 411 layerConfigChanged = true; |
| 412 | 412 |
| 413 if (updateForegroundLayer(compositor->needsContentsCompositingLayer(&m_ownin
gLayer))) | 413 if (updateForegroundLayer(compositor->needsContentsCompositingLayer(&m_ownin
gLayer))) |
| 414 layerConfigChanged = true; | 414 layerConfigChanged = true; |
| 415 | 415 |
| 416 bool needsDescendantsClippingLayer = compositor->clipsCompositingDescendants
(&m_owningLayer); | 416 bool needsDescendantsClippingLayer = compositor->clipsCompositingDescendants
(&m_owningLayer); |
| 417 | 417 |
| 418 // Our scrolling layer will clip. | 418 // Our scrolling layer will clip. |
| 419 if (m_owningLayer.needsCompositedScrolling()) | 419 if (m_owningLayer.needsCompositedScrolling()) |
| 420 needsDescendantsClippingLayer = false; | 420 needsDescendantsClippingLayer = false; |
| 421 | 421 |
| 422 RenderLayer* scrollParent = compositor->preferCompositingToLCDTextEnabled()
? m_owningLayer.scrollParent() : 0; | 422 Layer* scrollParent = compositor->preferCompositingToLCDTextEnabled() ? m_ow
ningLayer.scrollParent() : 0; |
| 423 | 423 |
| 424 // This is required because compositing layers are parented | 424 // This is required because compositing layers are parented |
| 425 // according to the z-order hierarchy, yet clipping goes down the renderer h
ierarchy. | 425 // according to the z-order hierarchy, yet clipping goes down the renderer h
ierarchy. |
| 426 // Thus, a RenderLayer can be clipped by a RenderLayer that is an ancestor i
n the renderer hierarchy, | 426 // Thus, a Layer can be clipped by a Layer that is an ancestor in the render
er hierarchy, |
| 427 // but a sibling in the z-order hierarchy. Further, that sibling need not be
composited at all. | 427 // but a sibling in the z-order hierarchy. Further, that sibling need not be
composited at all. |
| 428 // In such scenarios, an ancestor clipping layer is necessary to apply the c
omposited clip for this layer. | 428 // In such scenarios, an ancestor clipping layer is necessary to apply the c
omposited clip for this layer. |
| 429 bool needsAncestorClip = owningLayerClippedByLayerNotAboveCompositedAncestor
(); | 429 bool needsAncestorClip = owningLayerClippedByLayerNotAboveCompositedAncestor
(); |
| 430 | 430 |
| 431 if (scrollParent) { | 431 if (scrollParent) { |
| 432 // If our containing block is our ancestor scrolling layer, then we'll a
lready be clipped | 432 // If our containing block is our ancestor scrolling layer, then we'll a
lready be clipped |
| 433 // to it via our scroll parent and we don't need an ancestor clipping la
yer. | 433 // to it via our scroll parent and we don't need an ancestor clipping la
yer. |
| 434 if (m_owningLayer.renderer()->containingBlock()->enclosingLayer() == m_o
wningLayer.ancestorScrollingLayer()) | 434 if (m_owningLayer.renderer()->containingBlock()->enclosingLayer() == m_o
wningLayer.ancestorScrollingLayer()) |
| 435 needsAncestorClip = false; | 435 needsAncestorClip = false; |
| 436 } | 436 } |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 524 } else if (renderer->isVideo()) { | 524 } else if (renderer->isVideo()) { |
| 525 HTMLMediaElement* mediaElement = toHTMLMediaElement(renderer->node()); | 525 HTMLMediaElement* mediaElement = toHTMLMediaElement(renderer->node()); |
| 526 m_graphicsLayer->setContentsToPlatformLayer(mediaElement->platformLayer(
)); | 526 m_graphicsLayer->setContentsToPlatformLayer(mediaElement->platformLayer(
)); |
| 527 } else if (isAcceleratedCanvas(renderer)) { | 527 } else if (isAcceleratedCanvas(renderer)) { |
| 528 HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer->node()); | 528 HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer->node()); |
| 529 if (CanvasRenderingContext* context = canvas->renderingContext()) | 529 if (CanvasRenderingContext* context = canvas->renderingContext()) |
| 530 m_graphicsLayer->setContentsToPlatformLayer(context->platformLayer()
); | 530 m_graphicsLayer->setContentsToPlatformLayer(context->platformLayer()
); |
| 531 layerConfigChanged = true; | 531 layerConfigChanged = true; |
| 532 } | 532 } |
| 533 if (renderer->isRenderPart()) | 533 if (renderer->isRenderPart()) |
| 534 layerConfigChanged = RenderLayerCompositor::parentFrameContentLayers(toR
enderPart(renderer)); | 534 layerConfigChanged = LayerCompositor::parentFrameContentLayers(toRenderP
art(renderer)); |
| 535 | 535 |
| 536 // Changes to either the internal hierarchy or the mask layer have an impact | 536 // Changes to either the internal hierarchy or the mask layer have an impact |
| 537 // on painting phases, so we need to update when either are updated. | 537 // on painting phases, so we need to update when either are updated. |
| 538 if (layerConfigChanged || maskLayerChanged) | 538 if (layerConfigChanged || maskLayerChanged) |
| 539 updatePaintingPhases(); | 539 updatePaintingPhases(); |
| 540 | 540 |
| 541 return layerConfigChanged; | 541 return layerConfigChanged; |
| 542 } | 542 } |
| 543 | 543 |
| 544 static IntRect clipBox(RenderBox* renderer) | 544 static IntRect clipBox(RenderBox* renderer) |
| 545 { | 545 { |
| 546 LayoutRect result = LayoutRect::infiniteIntRect(); | 546 LayoutRect result = LayoutRect::infiniteIntRect(); |
| 547 if (renderer->hasOverflowClip()) | 547 if (renderer->hasOverflowClip()) |
| 548 result = renderer->overflowClipRect(LayoutPoint()); | 548 result = renderer->overflowClipRect(LayoutPoint()); |
| 549 | 549 |
| 550 if (renderer->hasClip()) | 550 if (renderer->hasClip()) |
| 551 result.intersect(renderer->clipRect(LayoutPoint())); | 551 result.intersect(renderer->clipRect(LayoutPoint())); |
| 552 | 552 |
| 553 return pixelSnappedIntRect(result); | 553 return pixelSnappedIntRect(result); |
| 554 } | 554 } |
| 555 | 555 |
| 556 static LayoutPoint computeOffsetFromCompositedAncestor(const RenderLayer* layer,
const RenderLayer* compositedAncestor) | 556 static LayoutPoint computeOffsetFromCompositedAncestor(const Layer* layer, const
Layer* compositedAncestor) |
| 557 { | 557 { |
| 558 LayoutPoint offset = layer->visualOffsetFromAncestor(compositedAncestor); | 558 LayoutPoint offset = layer->visualOffsetFromAncestor(compositedAncestor); |
| 559 if (compositedAncestor) | 559 if (compositedAncestor) |
| 560 offset.move(compositedAncestor->compositedLayerMapping()->owningLayer().
subpixelAccumulation()); | 560 offset.move(compositedAncestor->compositedLayerMapping()->owningLayer().
subpixelAccumulation()); |
| 561 return offset; | 561 return offset; |
| 562 } | 562 } |
| 563 | 563 |
| 564 void CompositedLayerMapping::computeBoundsOfOwningLayer(const RenderLayer* compo
sitedAncestor, IntRect& localBounds, IntRect& compositingBoundsRelativeToComposi
tedAncestor, LayoutPoint& offsetFromCompositedAncestor, | 564 void CompositedLayerMapping::computeBoundsOfOwningLayer(const Layer* compositedA
ncestor, IntRect& localBounds, IntRect& compositingBoundsRelativeToCompositedAnc
estor, LayoutPoint& offsetFromCompositedAncestor, |
| 565 IntPoint& snappedOffsetFromCompositedAncestor) | 565 IntPoint& snappedOffsetFromCompositedAncestor) |
| 566 { | 566 { |
| 567 LayoutRect localRawCompositingBounds = compositedBounds(); | 567 LayoutRect localRawCompositingBounds = compositedBounds(); |
| 568 offsetFromCompositedAncestor = computeOffsetFromCompositedAncestor(&m_owning
Layer, compositedAncestor); | 568 offsetFromCompositedAncestor = computeOffsetFromCompositedAncestor(&m_owning
Layer, compositedAncestor); |
| 569 snappedOffsetFromCompositedAncestor = IntPoint(offsetFromCompositedAncestor.
x().round(), offsetFromCompositedAncestor.y().round()); | 569 snappedOffsetFromCompositedAncestor = IntPoint(offsetFromCompositedAncestor.
x().round(), offsetFromCompositedAncestor.y().round()); |
| 570 | 570 |
| 571 LayoutSize subpixelAccumulation = offsetFromCompositedAncestor - snappedOffs
etFromCompositedAncestor; | 571 LayoutSize subpixelAccumulation = offsetFromCompositedAncestor - snappedOffs
etFromCompositedAncestor; |
| 572 m_owningLayer.setSubpixelAccumulation(subpixelAccumulation); | 572 m_owningLayer.setSubpixelAccumulation(subpixelAccumulation); |
| 573 | 573 |
| 574 // Move the bounds by the subpixel accumulation so that it pixel-snaps relat
ive to absolute pixels instead of local coordinates. | 574 // Move the bounds by the subpixel accumulation so that it pixel-snaps relat
ive to absolute pixels instead of local coordinates. |
| 575 localRawCompositingBounds.move(subpixelAccumulation); | 575 localRawCompositingBounds.move(subpixelAccumulation); |
| 576 localBounds = pixelSnappedIntRect(localRawCompositingBounds); | 576 localBounds = pixelSnappedIntRect(localRawCompositingBounds); |
| 577 | 577 |
| 578 compositingBoundsRelativeToCompositedAncestor = localBounds; | 578 compositingBoundsRelativeToCompositedAncestor = localBounds; |
| 579 compositingBoundsRelativeToCompositedAncestor.moveBy(snappedOffsetFromCompos
itedAncestor); | 579 compositingBoundsRelativeToCompositedAncestor.moveBy(snappedOffsetFromCompos
itedAncestor); |
| 580 } | 580 } |
| 581 | 581 |
| 582 void CompositedLayerMapping::updateSquashingLayerGeometry(const LayoutPoint& off
setFromCompositedAncestor, const IntPoint& graphicsLayerParentLocation, const Re
nderLayer& referenceLayer, | 582 void CompositedLayerMapping::updateSquashingLayerGeometry(const LayoutPoint& off
setFromCompositedAncestor, const IntPoint& graphicsLayerParentLocation, const La
yer& referenceLayer, |
| 583 Vector<GraphicsLayerPaintInfo>& layers, GraphicsLayer* squashingLayer, Layou
tPoint* offsetFromTransformedAncestor, Vector<RenderLayer*>& layersNeedingPaintI
nvalidation) | 583 Vector<GraphicsLayerPaintInfo>& layers, GraphicsLayer* squashingLayer, Layou
tPoint* offsetFromTransformedAncestor, Vector<Layer*>& layersNeedingPaintInvalid
ation) |
| 584 { | 584 { |
| 585 if (!squashingLayer) | 585 if (!squashingLayer) |
| 586 return; | 586 return; |
| 587 | 587 |
| 588 LayoutPoint offsetFromReferenceLayerToParentGraphicsLayer(offsetFromComposit
edAncestor); | 588 LayoutPoint offsetFromReferenceLayerToParentGraphicsLayer(offsetFromComposit
edAncestor); |
| 589 offsetFromReferenceLayerToParentGraphicsLayer.moveBy(-graphicsLayerParentLoc
ation); | 589 offsetFromReferenceLayerToParentGraphicsLayer.moveBy(-graphicsLayerParentLoc
ation); |
| 590 | 590 |
| 591 // FIXME: Cache these offsets. | 591 // FIXME: Cache these offsets. |
| 592 LayoutPoint referenceOffsetFromTransformedAncestor = referenceLayer.computeO
ffsetFromTransformedAncestor(); | 592 LayoutPoint referenceOffsetFromTransformedAncestor = referenceLayer.computeO
ffsetFromTransformedAncestor(); |
| 593 | 593 |
| 594 LayoutRect totalSquashBounds; | 594 LayoutRect totalSquashBounds; |
| 595 for (size_t i = 0; i < layers.size(); ++i) { | 595 for (size_t i = 0; i < layers.size(); ++i) { |
| 596 LayoutRect squashedBounds = layers[i].renderLayer->boundingBoxForComposi
ting(); | 596 LayoutRect squashedBounds = layers[i].renderLayer->boundingBoxForComposi
ting(); |
| 597 | 597 |
| 598 // Store the local bounds of the RenderLayer subtree before applying the
offset. | 598 // Store the local bounds of the Layer subtree before applying the offse
t. |
| 599 layers[i].compositedBounds = squashedBounds; | 599 layers[i].compositedBounds = squashedBounds; |
| 600 | 600 |
| 601 LayoutPoint offsetFromTransformedAncestorForSquashedLayer = layers[i].re
nderLayer->computeOffsetFromTransformedAncestor(); | 601 LayoutPoint offsetFromTransformedAncestorForSquashedLayer = layers[i].re
nderLayer->computeOffsetFromTransformedAncestor(); |
| 602 LayoutSize offsetFromSquashingLayer = offsetFromTransformedAncestorForSq
uashedLayer - referenceOffsetFromTransformedAncestor; | 602 LayoutSize offsetFromSquashingLayer = offsetFromTransformedAncestorForSq
uashedLayer - referenceOffsetFromTransformedAncestor; |
| 603 | 603 |
| 604 squashedBounds.move(offsetFromSquashingLayer); | 604 squashedBounds.move(offsetFromSquashingLayer); |
| 605 totalSquashBounds.unite(squashedBounds); | 605 totalSquashBounds.unite(squashedBounds); |
| 606 } | 606 } |
| 607 | 607 |
| 608 // The totalSquashBounds is positioned with respect to referenceLayer of thi
s CompositedLayerMapping. | 608 // The totalSquashBounds is positioned with respect to referenceLayer of thi
s CompositedLayerMapping. |
| 609 // But the squashingLayer needs to be positioned with respect to the ancesto
r CompositedLayerMapping. | 609 // But the squashingLayer needs to be positioned with respect to the ancesto
r CompositedLayerMapping. |
| 610 // The conversion between referenceLayer and the ancestor CLM is already com
puted as | 610 // The conversion between referenceLayer and the ancestor CLM is already com
puted as |
| 611 // offsetFromReferenceLayerToParentGraphicsLayer. | 611 // offsetFromReferenceLayerToParentGraphicsLayer. |
| 612 totalSquashBounds.moveBy(offsetFromReferenceLayerToParentGraphicsLayer); | 612 totalSquashBounds.moveBy(offsetFromReferenceLayerToParentGraphicsLayer); |
| 613 const IntRect squashLayerBounds = enclosingIntRect(totalSquashBounds); | 613 const IntRect squashLayerBounds = enclosingIntRect(totalSquashBounds); |
| 614 const IntPoint squashLayerOrigin = squashLayerBounds.location(); | 614 const IntPoint squashLayerOrigin = squashLayerBounds.location(); |
| 615 const LayoutSize squashLayerOriginInOwningLayerSpace = squashLayerOrigin - o
ffsetFromReferenceLayerToParentGraphicsLayer; | 615 const LayoutSize squashLayerOriginInOwningLayerSpace = squashLayerOrigin - o
ffsetFromReferenceLayerToParentGraphicsLayer; |
| 616 | 616 |
| 617 // Now that the squashing bounds are known, we can convert the RenderLayer p
ainting offsets | 617 // Now that the squashing bounds are known, we can convert the Layer paintin
g offsets |
| 618 // from CLM owning layer space to the squashing layer space. | 618 // from CLM owning layer space to the squashing layer space. |
| 619 // | 619 // |
| 620 // The painting offset we want to compute for each squashed RenderLayer is e
ssentially the position of | 620 // The painting offset we want to compute for each squashed Layer is essenti
ally the position of |
| 621 // the squashed RenderLayer described w.r.t. referenceLayer's origin. | 621 // the squashed Layer described w.r.t. referenceLayer's origin. |
| 622 // So we just need to convert that point from referenceLayer space to the sq
uashing layer's | 622 // So we just need to convert that point from referenceLayer space to the sq
uashing layer's |
| 623 // space. This is simply done by subtracing squashLayerOriginInOwningLayerSp
ace, but then the offset | 623 // space. This is simply done by subtracing squashLayerOriginInOwningLayerSp
ace, but then the offset |
| 624 // overall needs to be negated because that's the direction that the paintin
g code expects the | 624 // overall needs to be negated because that's the direction that the paintin
g code expects the |
| 625 // offset to be. | 625 // offset to be. |
| 626 for (size_t i = 0; i < layers.size(); ++i) { | 626 for (size_t i = 0; i < layers.size(); ++i) { |
| 627 const LayoutPoint offsetFromTransformedAncestorForSquashedLayer = layers
[i].renderLayer->computeOffsetFromTransformedAncestor(); | 627 const LayoutPoint offsetFromTransformedAncestorForSquashedLayer = layers
[i].renderLayer->computeOffsetFromTransformedAncestor(); |
| 628 const LayoutSize offsetFromSquashLayerOrigin = (offsetFromTransformedAnc
estorForSquashedLayer - referenceOffsetFromTransformedAncestor) - squashLayerOri
ginInOwningLayerSpace; | 628 const LayoutSize offsetFromSquashLayerOrigin = (offsetFromTransformedAnc
estorForSquashedLayer - referenceOffsetFromTransformedAncestor) - squashLayerOri
ginInOwningLayerSpace; |
| 629 | 629 |
| 630 IntSize newOffsetFromRenderer = -IntSize(offsetFromSquashLayerOrigin.wid
th().round(), offsetFromSquashLayerOrigin.height().round()); | 630 IntSize newOffsetFromRenderer = -IntSize(offsetFromSquashLayerOrigin.wid
th().round(), offsetFromSquashLayerOrigin.height().round()); |
| 631 LayoutSize subpixelAccumulation = offsetFromSquashLayerOrigin + newOffse
tFromRenderer; | 631 LayoutSize subpixelAccumulation = offsetFromSquashLayerOrigin + newOffse
tFromRenderer; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 645 squashingLayer->setPosition(squashLayerBounds.location()); | 645 squashingLayer->setPosition(squashLayerBounds.location()); |
| 646 squashingLayer->setSize(squashLayerBounds.size()); | 646 squashingLayer->setSize(squashLayerBounds.size()); |
| 647 | 647 |
| 648 *offsetFromTransformedAncestor = referenceOffsetFromTransformedAncestor; | 648 *offsetFromTransformedAncestor = referenceOffsetFromTransformedAncestor; |
| 649 offsetFromTransformedAncestor->move(squashLayerOriginInOwningLayerSpace); | 649 offsetFromTransformedAncestor->move(squashLayerOriginInOwningLayerSpace); |
| 650 | 650 |
| 651 for (size_t i = 0; i < layers.size(); ++i) | 651 for (size_t i = 0; i < layers.size(); ++i) |
| 652 layers[i].localClipRectForSquashedLayer = localClipRectForSquashedLayer(
referenceLayer, layers[i], layers); | 652 layers[i].localClipRectForSquashedLayer = localClipRectForSquashedLayer(
referenceLayer, layers[i], layers); |
| 653 } | 653 } |
| 654 | 654 |
| 655 void CompositedLayerMapping::updateGraphicsLayerGeometry(const RenderLayer* comp
ositingContainer, const RenderLayer* compositingStackingContext, Vector<RenderLa
yer*>& layersNeedingPaintInvalidation) | 655 void CompositedLayerMapping::updateGraphicsLayerGeometry(const Layer* compositin
gContainer, const Layer* compositingStackingContext, Vector<Layer*>& layersNeedi
ngPaintInvalidation) |
| 656 { | 656 { |
| 657 ASSERT(m_owningLayer.compositor()->lifecycle().state() == DocumentLifecycle:
:InCompositingUpdate); | 657 ASSERT(m_owningLayer.compositor()->lifecycle().state() == DocumentLifecycle:
:InCompositingUpdate); |
| 658 | 658 |
| 659 // Set transform property, if it is not animating. We have to do this here b
ecause the transform | 659 // Set transform property, if it is not animating. We have to do this here b
ecause the transform |
| 660 // is affected by the layer dimensions. | 660 // is affected by the layer dimensions. |
| 661 if (!renderer()->style()->isRunningTransformAnimationOnCompositor()) | 661 if (!renderer()->style()->isRunningTransformAnimationOnCompositor()) |
| 662 updateTransform(renderer()->style()); | 662 updateTransform(renderer()->style()); |
| 663 | 663 |
| 664 // Set opacity, if it is not animating. | 664 // Set opacity, if it is not animating. |
| 665 if (!renderer()->style()->isRunningOpacityAnimationOnCompositor()) | 665 if (!renderer()->style()->isRunningOpacityAnimationOnCompositor()) |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 void CompositedLayerMapping::updateMainGraphicsLayerGeometry(const IntRect& rela
tiveCompositingBounds, const IntRect& localCompositingBounds, const IntPoint& gr
aphicsLayerParentLocation) | 737 void CompositedLayerMapping::updateMainGraphicsLayerGeometry(const IntRect& rela
tiveCompositingBounds, const IntRect& localCompositingBounds, const IntPoint& gr
aphicsLayerParentLocation) |
| 738 { | 738 { |
| 739 m_graphicsLayer->setPosition(FloatPoint(relativeCompositingBounds.location()
- graphicsLayerParentLocation)); | 739 m_graphicsLayer->setPosition(FloatPoint(relativeCompositingBounds.location()
- graphicsLayerParentLocation)); |
| 740 m_graphicsLayer->setOffsetFromRenderer(toIntSize(localCompositingBounds.loca
tion())); | 740 m_graphicsLayer->setOffsetFromRenderer(toIntSize(localCompositingBounds.loca
tion())); |
| 741 | 741 |
| 742 FloatSize oldSize = m_graphicsLayer->size(); | 742 FloatSize oldSize = m_graphicsLayer->size(); |
| 743 const IntSize& contentsSize = relativeCompositingBounds.size(); | 743 const IntSize& contentsSize = relativeCompositingBounds.size(); |
| 744 if (oldSize != contentsSize) | 744 if (oldSize != contentsSize) |
| 745 m_graphicsLayer->setSize(contentsSize); | 745 m_graphicsLayer->setSize(contentsSize); |
| 746 | 746 |
| 747 // m_graphicsLayer is the corresponding GraphicsLayer for this RenderLayer a
nd its non-compositing | 747 // m_graphicsLayer is the corresponding GraphicsLayer for this Layer and its
non-compositing |
| 748 // descendants. So, the visibility flag for m_graphicsLayer should be true i
f there are any | 748 // descendants. So, the visibility flag for m_graphicsLayer should be true i
f there are any |
| 749 // non-compositing visible layers. | 749 // non-compositing visible layers. |
| 750 bool contentsVisible = m_owningLayer.hasVisibleContent() || hasVisibleNonCom
positingDescendant(&m_owningLayer); | 750 bool contentsVisible = m_owningLayer.hasVisibleContent() || hasVisibleNonCom
positingDescendant(&m_owningLayer); |
| 751 if (RuntimeEnabledFeatures::overlayFullscreenVideoEnabled() && renderer()->i
sVideo()) { | 751 if (RuntimeEnabledFeatures::overlayFullscreenVideoEnabled() && renderer()->i
sVideo()) { |
| 752 HTMLVideoElement* videoElement = toHTMLVideoElement(renderer()->node()); | 752 HTMLVideoElement* videoElement = toHTMLVideoElement(renderer()->node()); |
| 753 if (videoElement->isFullscreen() && !HTMLMediaElement::isMediaStreamURL(
videoElement->sourceURL().string())) | 753 if (videoElement->isFullscreen() && !HTMLMediaElement::isMediaStreamURL(
videoElement->sourceURL().string())) |
| 754 contentsVisible = false; | 754 contentsVisible = false; |
| 755 } | 755 } |
| 756 m_graphicsLayer->setContentsVisible(contentsVisible); | 756 m_graphicsLayer->setContentsVisible(contentsVisible); |
| 757 | 757 |
| 758 m_graphicsLayer->setBackfaceVisibility(renderer()->style()->backfaceVisibili
ty() == BackfaceVisibilityVisible); | 758 m_graphicsLayer->setBackfaceVisibility(renderer()->style()->backfaceVisibili
ty() == BackfaceVisibilityVisible); |
| 759 } | 759 } |
| 760 | 760 |
| 761 void CompositedLayerMapping::computeGraphicsLayerParentLocation(const RenderLaye
r* compositingContainer, const IntRect& ancestorCompositingBounds, IntPoint& gra
phicsLayerParentLocation) | 761 void CompositedLayerMapping::computeGraphicsLayerParentLocation(const Layer* com
positingContainer, const IntRect& ancestorCompositingBounds, IntPoint& graphicsL
ayerParentLocation) |
| 762 { | 762 { |
| 763 if (compositingContainer && compositingContainer->compositedLayerMapping()->
hasClippingLayer()) { | 763 if (compositingContainer && compositingContainer->compositedLayerMapping()->
hasClippingLayer()) { |
| 764 // If the compositing ancestor has a layer to clip children, we parent i
n that, and therefore | 764 // If the compositing ancestor has a layer to clip children, we parent i
n that, and therefore |
| 765 // position relative to it. | 765 // position relative to it. |
| 766 IntRect clippingBox = clipBox(toRenderBox(compositingContainer->renderer
())); | 766 IntRect clippingBox = clipBox(toRenderBox(compositingContainer->renderer
())); |
| 767 graphicsLayerParentLocation = clippingBox.location() + roundedIntSize(co
mpositingContainer->subpixelAccumulation()); | 767 graphicsLayerParentLocation = clippingBox.location() + roundedIntSize(co
mpositingContainer->subpixelAccumulation()); |
| 768 } else if (compositingContainer && compositingContainer->compositedLayerMapp
ing()->childTransformLayer()) { | 768 } else if (compositingContainer && compositingContainer->compositedLayerMapp
ing()->childTransformLayer()) { |
| 769 // Similarly, if the compositing ancestor has a child transform layer, w
e parent in that, and therefore | 769 // Similarly, if the compositing ancestor has a child transform layer, w
e parent in that, and therefore |
| 770 // position relative to it. It's already taken into account the contents
offset, so we do not need to here. | 770 // position relative to it. It's already taken into account the contents
offset, so we do not need to here. |
| 771 graphicsLayerParentLocation = roundedIntPoint(compositingContainer->subp
ixelAccumulation()); | 771 graphicsLayerParentLocation = roundedIntPoint(compositingContainer->subp
ixelAccumulation()); |
| 772 } else if (compositingContainer) { | 772 } else if (compositingContainer) { |
| 773 graphicsLayerParentLocation = ancestorCompositingBounds.location(); | 773 graphicsLayerParentLocation = ancestorCompositingBounds.location(); |
| 774 } else { | 774 } else { |
| 775 graphicsLayerParentLocation = renderer()->view()->documentRect().locatio
n(); | 775 graphicsLayerParentLocation = renderer()->view()->documentRect().locatio
n(); |
| 776 } | 776 } |
| 777 | 777 |
| 778 if (compositingContainer && compositingContainer->needsCompositedScrolling()
) { | 778 if (compositingContainer && compositingContainer->needsCompositedScrolling()
) { |
| 779 RenderBox* renderBox = toRenderBox(compositingContainer->renderer()); | 779 RenderBox* renderBox = toRenderBox(compositingContainer->renderer()); |
| 780 IntSize scrollOffset = renderBox->scrolledContentOffset(); | 780 IntSize scrollOffset = renderBox->scrolledContentOffset(); |
| 781 IntPoint scrollOrigin(renderBox->borderLeft(), renderBox->borderTop()); | 781 IntPoint scrollOrigin(renderBox->borderLeft(), renderBox->borderTop()); |
| 782 graphicsLayerParentLocation = scrollOrigin - scrollOffset; | 782 graphicsLayerParentLocation = scrollOrigin - scrollOffset; |
| 783 } | 783 } |
| 784 } | 784 } |
| 785 | 785 |
| 786 void CompositedLayerMapping::updateAncestorClippingLayerGeometry(const RenderLay
er* compositingContainer, const IntPoint& snappedOffsetFromCompositedAncestor, I
ntPoint& graphicsLayerParentLocation) | 786 void CompositedLayerMapping::updateAncestorClippingLayerGeometry(const Layer* co
mpositingContainer, const IntPoint& snappedOffsetFromCompositedAncestor, IntPoin
t& graphicsLayerParentLocation) |
| 787 { | 787 { |
| 788 if (!compositingContainer || !m_ancestorClippingLayer) | 788 if (!compositingContainer || !m_ancestorClippingLayer) |
| 789 return; | 789 return; |
| 790 | 790 |
| 791 ClipRectsContext clipRectsContext(compositingContainer, PaintingClipRectsIgn
oringOverflowClip, IgnoreOverlayScrollbarSize); | 791 ClipRectsContext clipRectsContext(compositingContainer, PaintingClipRectsIgn
oringOverflowClip, IgnoreOverlayScrollbarSize); |
| 792 IntRect parentClipRect = pixelSnappedIntRect(m_owningLayer.clipper().backgro
undClipRect(clipRectsContext).rect()); | 792 IntRect parentClipRect = pixelSnappedIntRect(m_owningLayer.clipper().backgro
undClipRect(clipRectsContext).rect()); |
| 793 ASSERT(parentClipRect != LayoutRect::infiniteIntRect()); | 793 ASSERT(parentClipRect != LayoutRect::infiniteIntRect()); |
| 794 m_ancestorClippingLayer->setPosition(FloatPoint(parentClipRect.location() -
graphicsLayerParentLocation)); | 794 m_ancestorClippingLayer->setPosition(FloatPoint(parentClipRect.location() -
graphicsLayerParentLocation)); |
| 795 m_ancestorClippingLayer->setSize(parentClipRect.size()); | 795 m_ancestorClippingLayer->setSize(parentClipRect.size()); |
| 796 | 796 |
| 797 // backgroundRect is relative to compositingContainer, so subtract snappedOf
fsetFromCompositedAncestor.X/snappedOffsetFromCompositedAncestor.Y to get back t
o local coords. | 797 // backgroundRect is relative to compositingContainer, so subtract snappedOf
fsetFromCompositedAncestor.X/snappedOffsetFromCompositedAncestor.Y to get back t
o local coords. |
| 798 m_ancestorClippingLayer->setOffsetFromRenderer(parentClipRect.location() - s
nappedOffsetFromCompositedAncestor); | 798 m_ancestorClippingLayer->setOffsetFromRenderer(parentClipRect.location() - s
nappedOffsetFromCompositedAncestor); |
| 799 | 799 |
| 800 // The primary layer is then parented in, and positioned relative to this cl
ipping layer. | 800 // The primary layer is then parented in, and positioned relative to this cl
ipping layer. |
| 801 graphicsLayerParentLocation = parentClipRect.location(); | 801 graphicsLayerParentLocation = parentClipRect.location(); |
| 802 } | 802 } |
| 803 | 803 |
| 804 void CompositedLayerMapping::updateOverflowControlsHostLayerGeometry(const Rende
rLayer* compositingStackingContext) | 804 void CompositedLayerMapping::updateOverflowControlsHostLayerGeometry(const Layer
* compositingStackingContext) |
| 805 { | 805 { |
| 806 if (!m_overflowControlsHostLayer) | 806 if (!m_overflowControlsHostLayer) |
| 807 return; | 807 return; |
| 808 | 808 |
| 809 if (needsToReparentOverflowControls()) { | 809 if (needsToReparentOverflowControls()) { |
| 810 if (m_overflowControlsClippingLayer) { | 810 if (m_overflowControlsClippingLayer) { |
| 811 m_overflowControlsClippingLayer->setPosition(m_ancestorClippingLayer
->position()); | 811 m_overflowControlsClippingLayer->setPosition(m_ancestorClippingLayer
->position()); |
| 812 m_overflowControlsClippingLayer->setSize(m_ancestorClippingLayer->si
ze()); | 812 m_overflowControlsClippingLayer->setSize(m_ancestorClippingLayer->si
ze()); |
| 813 m_overflowControlsClippingLayer->setOffsetFromRenderer(m_ancestorCli
ppingLayer->offsetFromRenderer()); | 813 m_overflowControlsClippingLayer->setOffsetFromRenderer(m_ancestorCli
ppingLayer->offsetFromRenderer()); |
| 814 m_overflowControlsClippingLayer->setMasksToBounds(true); | 814 m_overflowControlsClippingLayer->setMasksToBounds(true); |
| 815 | 815 |
| 816 m_overflowControlsHostLayer->setPosition(IntPoint(-m_overflowControl
sClippingLayer->offsetFromRenderer())); | 816 m_overflowControlsHostLayer->setPosition(IntPoint(-m_overflowControl
sClippingLayer->offsetFromRenderer())); |
| 817 } else { | 817 } else { |
| 818 // The controls are in the same 2D space as the compositing containe
r, so we can map them into the space of the container. | 818 // The controls are in the same 2D space as the compositing containe
r, so we can map them into the space of the container. |
| 819 TransformState transformState(TransformState::ApplyTransformDirectio
n, FloatPoint()); | 819 TransformState transformState(TransformState::ApplyTransformDirectio
n, FloatPoint()); |
| 820 m_owningLayer.renderer()->mapLocalToContainer(compositingStackingCon
text->renderer(), transformState, ApplyContainerFlip); | 820 m_owningLayer.renderer()->mapLocalToContainer(compositingStackingCon
text->renderer(), transformState, ApplyContainerFlip); |
| 821 transformState.flatten(); | 821 transformState.flatten(); |
| 822 LayoutPoint offsetFromStackingContainer = LayoutPoint(transformState
.lastPlanarPoint()); | 822 LayoutPoint offsetFromStackingContainer = LayoutPoint(transformState
.lastPlanarPoint()); |
| 823 if (RenderLayerScrollableArea* scrollableArea = compositingStackingC
ontext->scrollableArea()) | 823 if (LayerScrollableArea* scrollableArea = compositingStackingContext
->scrollableArea()) |
| 824 offsetFromStackingContainer.move(LayoutSize(scrollableArea->adju
stedScrollOffset())); | 824 offsetFromStackingContainer.move(LayoutSize(scrollableArea->adju
stedScrollOffset())); |
| 825 m_overflowControlsHostLayer->setPosition(FloatPoint(offsetFromStacki
ngContainer)); | 825 m_overflowControlsHostLayer->setPosition(FloatPoint(offsetFromStacki
ngContainer)); |
| 826 } | 826 } |
| 827 } else { | 827 } else { |
| 828 m_overflowControlsHostLayer->setPosition(FloatPoint()); | 828 m_overflowControlsHostLayer->setPosition(FloatPoint()); |
| 829 } | 829 } |
| 830 } | 830 } |
| 831 | 831 |
| 832 void CompositedLayerMapping::updateChildContainmentLayerGeometry(const IntRect&
clippingBox, const IntRect& localCompositingBounds) | 832 void CompositedLayerMapping::updateChildContainmentLayerGeometry(const IntRect&
clippingBox, const IntRect& localCompositingBounds) |
| 833 { | 833 { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 887 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); | 887 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); |
| 888 } else { | 888 } else { |
| 889 FloatPoint3D compositedTransformOrigin( | 889 FloatPoint3D compositedTransformOrigin( |
| 890 relativeCompositingBounds.width() * 0.5f, | 890 relativeCompositingBounds.width() * 0.5f, |
| 891 relativeCompositingBounds.height() * 0.5f, | 891 relativeCompositingBounds.height() * 0.5f, |
| 892 0.f); | 892 0.f); |
| 893 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); | 893 m_graphicsLayer->setTransformOrigin(compositedTransformOrigin); |
| 894 } | 894 } |
| 895 } | 895 } |
| 896 | 896 |
| 897 void CompositedLayerMapping::updateReflectionLayerGeometry(Vector<RenderLayer*>&
layersNeedingPaintInvalidation) | 897 void CompositedLayerMapping::updateReflectionLayerGeometry(Vector<Layer*>& layer
sNeedingPaintInvalidation) |
| 898 { | 898 { |
| 899 if (!m_owningLayer.reflectionInfo() || !m_owningLayer.reflectionInfo()->refl
ectionLayer()->hasCompositedLayerMapping()) | 899 if (!m_owningLayer.reflectionInfo() || !m_owningLayer.reflectionInfo()->refl
ectionLayer()->hasCompositedLayerMapping()) |
| 900 return; | 900 return; |
| 901 | 901 |
| 902 CompositedLayerMapping* reflectionCompositedLayerMapping = m_owningLayer.ref
lectionInfo()->reflectionLayer()->compositedLayerMapping(); | 902 CompositedLayerMapping* reflectionCompositedLayerMapping = m_owningLayer.ref
lectionInfo()->reflectionLayer()->compositedLayerMapping(); |
| 903 reflectionCompositedLayerMapping->updateGraphicsLayerGeometry(&m_owningLayer
, &m_owningLayer, layersNeedingPaintInvalidation); | 903 reflectionCompositedLayerMapping->updateGraphicsLayerGeometry(&m_owningLayer
, &m_owningLayer, layersNeedingPaintInvalidation); |
| 904 } | 904 } |
| 905 | 905 |
| 906 void CompositedLayerMapping::updateScrollingLayerGeometry(const IntRect& localCo
mpositingBounds) | 906 void CompositedLayerMapping::updateScrollingLayerGeometry(const IntRect& localCo
mpositingBounds) |
| 907 { | 907 { |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1110 } | 1110 } |
| 1111 | 1111 |
| 1112 void CompositedLayerMapping::updateContentsRect() | 1112 void CompositedLayerMapping::updateContentsRect() |
| 1113 { | 1113 { |
| 1114 m_graphicsLayer->setContentsRect(pixelSnappedIntRect(contentsBox())); | 1114 m_graphicsLayer->setContentsRect(pixelSnappedIntRect(contentsBox())); |
| 1115 } | 1115 } |
| 1116 | 1116 |
| 1117 void CompositedLayerMapping::updateContentsOffsetInCompositingLayer(const IntPoi
nt& snappedOffsetFromCompositedAncestor, const IntPoint& graphicsLayerParentLoca
tion) | 1117 void CompositedLayerMapping::updateContentsOffsetInCompositingLayer(const IntPoi
nt& snappedOffsetFromCompositedAncestor, const IntPoint& graphicsLayerParentLoca
tion) |
| 1118 { | 1118 { |
| 1119 // m_graphicsLayer is positioned relative to our compositing ancestor | 1119 // m_graphicsLayer is positioned relative to our compositing ancestor |
| 1120 // RenderLayer, but it's not positioned at the origin of m_owningLayer, it's | 1120 // Layer, but it's not positioned at the origin of m_owningLayer, it's |
| 1121 // offset by m_contentBounds.location(). This is what | 1121 // offset by m_contentBounds.location(). This is what |
| 1122 // contentOffsetInCompositingLayer is meant to capture, roughly speaking | 1122 // contentOffsetInCompositingLayer is meant to capture, roughly speaking |
| 1123 // (ignoring rounding and subpixel accumulation). | 1123 // (ignoring rounding and subpixel accumulation). |
| 1124 // | 1124 // |
| 1125 // Our ancestor graphics layers in this CLM (m_graphicsLayer and potentially | 1125 // Our ancestor graphics layers in this CLM (m_graphicsLayer and potentially |
| 1126 // m_ancestorClippingLayer) have pixel snapped, so if we don't adjust this | 1126 // m_ancestorClippingLayer) have pixel snapped, so if we don't adjust this |
| 1127 // offset, we'll see accumulated rounding errors due to that snapping. | 1127 // offset, we'll see accumulated rounding errors due to that snapping. |
| 1128 // | 1128 // |
| 1129 // In order to ensure that we account for this rounding, we compute | 1129 // In order to ensure that we account for this rounding, we compute |
| 1130 // contentsOffsetInCompositingLayer in a somewhat roundabout way. | 1130 // contentsOffsetInCompositingLayer in a somewhat roundabout way. |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1432 int id = 0; | 1432 int id = 0; |
| 1433 | 1433 |
| 1434 // NB, it is illegal at this point to query an ancestor's compositing state.
Some compositing | 1434 // NB, it is illegal at this point to query an ancestor's compositing state.
Some compositing |
| 1435 // reasons depend on the compositing state of ancestors. So if we want a ren
dering context id | 1435 // reasons depend on the compositing state of ancestors. So if we want a ren
dering context id |
| 1436 // for the context root, we cannot ask for the id of its associated WebLayer
now; it may not have | 1436 // for the context root, we cannot ask for the id of its associated WebLayer
now; it may not have |
| 1437 // one yet. We could do a second past after doing the compositing updates to
get these ids, | 1437 // one yet. We could do a second past after doing the compositing updates to
get these ids, |
| 1438 // but this would actually be harmful. We do not want to attach any semantic
meaning to | 1438 // but this would actually be harmful. We do not want to attach any semantic
meaning to |
| 1439 // the context id other than the fact that they group a number of layers tog
ether for the | 1439 // the context id other than the fact that they group a number of layers tog
ether for the |
| 1440 // sake of 3d sorting. So instead we will ask the compositor to vend us an a
rbitrary, but | 1440 // sake of 3d sorting. So instead we will ask the compositor to vend us an a
rbitrary, but |
| 1441 // consistent id. | 1441 // consistent id. |
| 1442 if (RenderLayer* root = m_owningLayer.renderingContextRoot()) { | 1442 if (Layer* root = m_owningLayer.renderingContextRoot()) { |
| 1443 if (Node* node = root->renderer()->node()) | 1443 if (Node* node = root->renderer()->node()) |
| 1444 id = static_cast<int>(WTF::PtrHash<Node*>::hash(node)); | 1444 id = static_cast<int>(WTF::PtrHash<Node*>::hash(node)); |
| 1445 } | 1445 } |
| 1446 | 1446 |
| 1447 UpdateRenderingContextFunctor functor = { id }; | 1447 UpdateRenderingContextFunctor functor = { id }; |
| 1448 ApplyToGraphicsLayersMode mode = ApplyToAllGraphicsLayers & ~ApplyToSquashin
gLayer; | 1448 ApplyToGraphicsLayersMode mode = ApplyToAllGraphicsLayers & ~ApplyToSquashin
gLayer; |
| 1449 ApplyToGraphicsLayers<UpdateRenderingContextFunctor>(this, functor, mode); | 1449 ApplyToGraphicsLayers<UpdateRenderingContextFunctor>(this, functor, mode); |
| 1450 } | 1450 } |
| 1451 | 1451 |
| 1452 struct UpdateShouldFlattenTransformFunctor { | 1452 struct UpdateShouldFlattenTransformFunctor { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1594 m_scrollingContentsLayer = nullptr; | 1594 m_scrollingContentsLayer = nullptr; |
| 1595 m_scrollingBlockSelectionLayer = nullptr; | 1595 m_scrollingBlockSelectionLayer = nullptr; |
| 1596 layerChanged = true; | 1596 layerChanged = true; |
| 1597 if (scrollingCoordinator) | 1597 if (scrollingCoordinator) |
| 1598 scrollingCoordinator->scrollableAreaScrollLayerDidChange(m_owningLay
er.scrollableArea()); | 1598 scrollingCoordinator->scrollableAreaScrollLayerDidChange(m_owningLay
er.scrollableArea()); |
| 1599 } | 1599 } |
| 1600 | 1600 |
| 1601 return layerChanged; | 1601 return layerChanged; |
| 1602 } | 1602 } |
| 1603 | 1603 |
| 1604 static void updateScrollParentForGraphicsLayer(GraphicsLayer* layer, GraphicsLay
er* topmostLayer, RenderLayer* scrollParent, ScrollingCoordinator* scrollingCoor
dinator) | 1604 static void updateScrollParentForGraphicsLayer(GraphicsLayer* layer, GraphicsLay
er* topmostLayer, Layer* scrollParent, ScrollingCoordinator* scrollingCoordinato
r) |
| 1605 { | 1605 { |
| 1606 if (!layer) | 1606 if (!layer) |
| 1607 return; | 1607 return; |
| 1608 | 1608 |
| 1609 // Only the topmost layer has a scroll parent. All other layers have a null
scroll parent. | 1609 // Only the topmost layer has a scroll parent. All other layers have a null
scroll parent. |
| 1610 if (layer != topmostLayer) | 1610 if (layer != topmostLayer) |
| 1611 scrollParent = 0; | 1611 scrollParent = 0; |
| 1612 | 1612 |
| 1613 scrollingCoordinator->updateScrollParentForGraphicsLayer(layer, scrollParent
); | 1613 scrollingCoordinator->updateScrollParentForGraphicsLayer(layer, scrollParent
); |
| 1614 } | 1614 } |
| 1615 | 1615 |
| 1616 void CompositedLayerMapping::updateScrollParent(RenderLayer* scrollParent) | 1616 void CompositedLayerMapping::updateScrollParent(Layer* scrollParent) |
| 1617 { | 1617 { |
| 1618 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLay
er(m_owningLayer)) { | 1618 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLay
er(m_owningLayer)) { |
| 1619 GraphicsLayer* topmostLayer = childForSuperlayers(); | 1619 GraphicsLayer* topmostLayer = childForSuperlayers(); |
| 1620 updateScrollParentForGraphicsLayer(m_squashingContainmentLayer.get(), to
pmostLayer, scrollParent, scrollingCoordinator); | 1620 updateScrollParentForGraphicsLayer(m_squashingContainmentLayer.get(), to
pmostLayer, scrollParent, scrollingCoordinator); |
| 1621 updateScrollParentForGraphicsLayer(m_ancestorClippingLayer.get(), topmos
tLayer, scrollParent, scrollingCoordinator); | 1621 updateScrollParentForGraphicsLayer(m_ancestorClippingLayer.get(), topmos
tLayer, scrollParent, scrollingCoordinator); |
| 1622 updateScrollParentForGraphicsLayer(m_graphicsLayer.get(), topmostLayer,
scrollParent, scrollingCoordinator); | 1622 updateScrollParentForGraphicsLayer(m_graphicsLayer.get(), topmostLayer,
scrollParent, scrollingCoordinator); |
| 1623 } | 1623 } |
| 1624 } | 1624 } |
| 1625 | 1625 |
| 1626 void CompositedLayerMapping::updateClipParent() | 1626 void CompositedLayerMapping::updateClipParent() |
| 1627 { | 1627 { |
| 1628 if (owningLayerClippedByLayerNotAboveCompositedAncestor()) | 1628 if (owningLayerClippedByLayerNotAboveCompositedAncestor()) |
| 1629 return; | 1629 return; |
| 1630 | 1630 |
| 1631 RenderLayer* clipParent = m_owningLayer.clipParent(); | 1631 Layer* clipParent = m_owningLayer.clipParent(); |
| 1632 if (clipParent) | 1632 if (clipParent) |
| 1633 clipParent = clipParent->enclosingLayerWithCompositedLayerMapping(Includ
eSelf); | 1633 clipParent = clipParent->enclosingLayerWithCompositedLayerMapping(Includ
eSelf); |
| 1634 | 1634 |
| 1635 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLay
er(m_owningLayer)) | 1635 if (ScrollingCoordinator* scrollingCoordinator = scrollingCoordinatorFromLay
er(m_owningLayer)) |
| 1636 scrollingCoordinator->updateClipParentForGraphicsLayer(m_graphicsLayer.g
et(), clipParent); | 1636 scrollingCoordinator->updateClipParentForGraphicsLayer(m_graphicsLayer.g
et(), clipParent); |
| 1637 } | 1637 } |
| 1638 | 1638 |
| 1639 bool CompositedLayerMapping::updateSquashingLayers(bool needsSquashingLayers) | 1639 bool CompositedLayerMapping::updateSquashingLayers(bool needsSquashingLayers) |
| 1640 { | 1640 { |
| 1641 bool layersChanged = false; | 1641 bool layersChanged = false; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1695 phase |= GraphicsLayerPaintCompositedScroll; | 1695 phase |= GraphicsLayerPaintCompositedScroll; |
| 1696 } | 1696 } |
| 1697 | 1697 |
| 1698 return static_cast<GraphicsLayerPaintingPhase>(phase); | 1698 return static_cast<GraphicsLayerPaintingPhase>(phase); |
| 1699 } | 1699 } |
| 1700 | 1700 |
| 1701 float CompositedLayerMapping::compositingOpacity(float rendererOpacity) const | 1701 float CompositedLayerMapping::compositingOpacity(float rendererOpacity) const |
| 1702 { | 1702 { |
| 1703 float finalOpacity = rendererOpacity; | 1703 float finalOpacity = rendererOpacity; |
| 1704 | 1704 |
| 1705 for (RenderLayer* curr = m_owningLayer.parent(); curr; curr = curr->parent()
) { | 1705 for (Layer* curr = m_owningLayer.parent(); curr; curr = curr->parent()) { |
| 1706 // We only care about parents that are stacking contexts. | 1706 // We only care about parents that are stacking contexts. |
| 1707 // Recall that opacity creates stacking context. | 1707 // Recall that opacity creates stacking context. |
| 1708 if (!curr->stackingNode()->isStackingContext()) | 1708 if (!curr->stackingNode()->isStackingContext()) |
| 1709 continue; | 1709 continue; |
| 1710 | 1710 |
| 1711 // If we found a composited layer, regardless of whether it actually | 1711 // If we found a composited layer, regardless of whether it actually |
| 1712 // paints into it, we want to compute opacity relative to it. So we can | 1712 // paints into it, we want to compute opacity relative to it. So we can |
| 1713 // break here. | 1713 // break here. |
| 1714 // | 1714 // |
| 1715 // FIXME: with grouped backings, a composited descendant will have to | 1715 // FIXME: with grouped backings, a composited descendant will have to |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1749 return true; | 1749 return true; |
| 1750 | 1750 |
| 1751 return false; | 1751 return false; |
| 1752 } | 1752 } |
| 1753 | 1753 |
| 1754 static bool isCompositedPlugin(RenderObject* renderer) | 1754 static bool isCompositedPlugin(RenderObject* renderer) |
| 1755 { | 1755 { |
| 1756 return renderer->isEmbeddedObject() && toRenderEmbeddedObject(renderer)->req
uiresAcceleratedCompositing(); | 1756 return renderer->isEmbeddedObject() && toRenderEmbeddedObject(renderer)->req
uiresAcceleratedCompositing(); |
| 1757 } | 1757 } |
| 1758 | 1758 |
| 1759 bool CompositedLayerMapping::hasVisibleNonCompositingDescendant(RenderLayer* par
ent) | 1759 bool CompositedLayerMapping::hasVisibleNonCompositingDescendant(Layer* parent) |
| 1760 { | 1760 { |
| 1761 if (!parent->hasVisibleDescendant()) | 1761 if (!parent->hasVisibleDescendant()) |
| 1762 return false; | 1762 return false; |
| 1763 | 1763 |
| 1764 // FIXME: We shouldn't be called with a stale z-order lists. See bug 85512. | 1764 // FIXME: We shouldn't be called with a stale z-order lists. See bug 85512. |
| 1765 parent->stackingNode()->updateLayerListsIfNeeded(); | 1765 parent->stackingNode()->updateLayerListsIfNeeded(); |
| 1766 | 1766 |
| 1767 #if ENABLE(ASSERT) | 1767 #if ENABLE(ASSERT) |
| 1768 LayerListMutationDetector mutationChecker(parent->stackingNode()); | 1768 LayerListMutationDetector mutationChecker(parent->stackingNode()); |
| 1769 #endif | 1769 #endif |
| 1770 | 1770 |
| 1771 RenderLayerStackingNodeIterator normalFlowIterator(*parent->stackingNode(),
AllChildren); | 1771 LayerStackingNodeIterator normalFlowIterator(*parent->stackingNode(), AllChi
ldren); |
| 1772 while (RenderLayerStackingNode* curNode = normalFlowIterator.next()) { | 1772 while (LayerStackingNode* curNode = normalFlowIterator.next()) { |
| 1773 RenderLayer* curLayer = curNode->layer(); | 1773 Layer* curLayer = curNode->layer(); |
| 1774 if (curLayer->hasCompositedLayerMapping()) | 1774 if (curLayer->hasCompositedLayerMapping()) |
| 1775 continue; | 1775 continue; |
| 1776 if (curLayer->hasVisibleContent() || hasVisibleNonCompositingDescendant(
curLayer)) | 1776 if (curLayer->hasVisibleContent() || hasVisibleNonCompositingDescendant(
curLayer)) |
| 1777 return true; | 1777 return true; |
| 1778 } | 1778 } |
| 1779 | 1779 |
| 1780 return false; | 1780 return false; |
| 1781 } | 1781 } |
| 1782 | 1782 |
| 1783 bool CompositedLayerMapping::containsPaintedContent() const | 1783 bool CompositedLayerMapping::containsPaintedContent() const |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1918 return contentsBox; | 1918 return contentsBox; |
| 1919 } | 1919 } |
| 1920 | 1920 |
| 1921 bool CompositedLayerMapping::needsToReparentOverflowControls() const | 1921 bool CompositedLayerMapping::needsToReparentOverflowControls() const |
| 1922 { | 1922 { |
| 1923 return m_owningLayer.scrollableArea() | 1923 return m_owningLayer.scrollableArea() |
| 1924 && m_owningLayer.scrollableArea()->hasOverlayScrollbars() | 1924 && m_owningLayer.scrollableArea()->hasOverlayScrollbars() |
| 1925 && m_owningLayer.scrollableArea()->topmostScrollChild(); | 1925 && m_owningLayer.scrollableArea()->topmostScrollChild(); |
| 1926 } | 1926 } |
| 1927 | 1927 |
| 1928 GraphicsLayer* CompositedLayerMapping::detachLayerForOverflowControls(const Rend
erLayer& enclosingLayer) | 1928 GraphicsLayer* CompositedLayerMapping::detachLayerForOverflowControls(const Laye
r& enclosingLayer) |
| 1929 { | 1929 { |
| 1930 GraphicsLayer* host = m_overflowControlsClippingLayer.get(); | 1930 GraphicsLayer* host = m_overflowControlsClippingLayer.get(); |
| 1931 if (!host) | 1931 if (!host) |
| 1932 host = m_overflowControlsHostLayer.get(); | 1932 host = m_overflowControlsHostLayer.get(); |
| 1933 host->removeFromParent(); | 1933 host->removeFromParent(); |
| 1934 return host; | 1934 return host; |
| 1935 } | 1935 } |
| 1936 | 1936 |
| 1937 GraphicsLayer* CompositedLayerMapping::parentForSublayers() const | 1937 GraphicsLayer* CompositedLayerMapping::parentForSublayers() const |
| 1938 { | 1938 { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2039 return &layers[i]; | 2039 return &layers[i]; |
| 2040 } | 2040 } |
| 2041 return 0; | 2041 return 0; |
| 2042 } | 2042 } |
| 2043 | 2043 |
| 2044 const GraphicsLayerPaintInfo* CompositedLayerMapping::containingSquashedLayer(co
nst RenderObject* renderObject, unsigned maxSquashedLayerIndex) | 2044 const GraphicsLayerPaintInfo* CompositedLayerMapping::containingSquashedLayer(co
nst RenderObject* renderObject, unsigned maxSquashedLayerIndex) |
| 2045 { | 2045 { |
| 2046 return CompositedLayerMapping::containingSquashedLayer(renderObject, m_squas
hedLayers, maxSquashedLayerIndex); | 2046 return CompositedLayerMapping::containingSquashedLayer(renderObject, m_squas
hedLayers, maxSquashedLayerIndex); |
| 2047 } | 2047 } |
| 2048 | 2048 |
| 2049 IntRect CompositedLayerMapping::localClipRectForSquashedLayer(const RenderLayer&
referenceLayer, const GraphicsLayerPaintInfo& paintInfo, const Vector<GraphicsL
ayerPaintInfo>& layers) | 2049 IntRect CompositedLayerMapping::localClipRectForSquashedLayer(const Layer& refer
enceLayer, const GraphicsLayerPaintInfo& paintInfo, const Vector<GraphicsLayerPa
intInfo>& layers) |
| 2050 { | 2050 { |
| 2051 const RenderObject* clippingContainer = paintInfo.renderLayer->clippingConta
iner(); | 2051 const RenderObject* clippingContainer = paintInfo.renderLayer->clippingConta
iner(); |
| 2052 if (clippingContainer == referenceLayer.clippingContainer()) | 2052 if (clippingContainer == referenceLayer.clippingContainer()) |
| 2053 return LayoutRect::infiniteIntRect(); | 2053 return LayoutRect::infiniteIntRect(); |
| 2054 | 2054 |
| 2055 ASSERT(clippingContainer); | 2055 ASSERT(clippingContainer); |
| 2056 | 2056 |
| 2057 const GraphicsLayerPaintInfo* ancestorPaintInfo = containingSquashedLayer(cl
ippingContainer, layers, layers.size()); | 2057 const GraphicsLayerPaintInfo* ancestorPaintInfo = containingSquashedLayer(cl
ippingContainer, layers, layers.size()); |
| 2058 // Must be there, otherwise CompositingLayerAssigner::canSquashIntoCurrentSq
uashingOwner would have disallowed squashing. | 2058 // Must be there, otherwise CompositingLayerAssigner::canSquashIntoCurrentSq
uashingOwner would have disallowed squashing. |
| 2059 ASSERT(ancestorPaintInfo); | 2059 ASSERT(ancestorPaintInfo); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2101 if (paintInfo.renderLayer->compositingState() != PaintsIntoGroupedBacking) { | 2101 if (paintInfo.renderLayer->compositingState() != PaintsIntoGroupedBacking) { |
| 2102 // FIXME: GraphicsLayers need a way to split for RenderRegions. | 2102 // FIXME: GraphicsLayers need a way to split for RenderRegions. |
| 2103 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe
haviorNormal, paintInfo.renderLayer->subpixelAccumulation()); | 2103 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe
haviorNormal, paintInfo.renderLayer->subpixelAccumulation()); |
| 2104 LayerPainter(*paintInfo.renderLayer).paintLayerContents(context, paintin
gInfo, paintLayerFlags); | 2104 LayerPainter(*paintInfo.renderLayer).paintLayerContents(context, paintin
gInfo, paintLayerFlags); |
| 2105 | 2105 |
| 2106 if (paintInfo.renderLayer->containsDirtyOverlayScrollbars()) | 2106 if (paintInfo.renderLayer->containsDirtyOverlayScrollbars()) |
| 2107 LayerPainter(*paintInfo.renderLayer).paintLayerContents(context, pai
ntingInfo, paintLayerFlags | PaintLayerPaintingOverlayScrollbars); | 2107 LayerPainter(*paintInfo.renderLayer).paintLayerContents(context, pai
ntingInfo, paintLayerFlags | PaintLayerPaintingOverlayScrollbars); |
| 2108 } else { | 2108 } else { |
| 2109 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe
haviorNormal, paintInfo.renderLayer->subpixelAccumulation()); | 2109 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe
haviorNormal, paintInfo.renderLayer->subpixelAccumulation()); |
| 2110 | 2110 |
| 2111 // RenderLayer::paintLayer assumes that the caller clips to the passed r
ect. Squashed layers need to do this clipping in software, | 2111 // Layer::paintLayer assumes that the caller clips to the passed rect. S
quashed layers need to do this clipping in software, |
| 2112 // since there is no graphics layer to clip them precisely. Furthermore,
in some cases we squash layers that need clipping in software | 2112 // since there is no graphics layer to clip them precisely. Furthermore,
in some cases we squash layers that need clipping in software |
| 2113 // from clipping ancestors (see CompositedLayerMapping::localClipRectFor
SquashedLayer()). | 2113 // from clipping ancestors (see CompositedLayerMapping::localClipRectFor
SquashedLayer()). |
| 2114 // FIXME: Is it correct to clip to dirtyRect in slimming paint mode? | 2114 // FIXME: Is it correct to clip to dirtyRect in slimming paint mode? |
| 2115 // FIXME: Combine similar code here and LayerClipRecorder. | 2115 // FIXME: Combine similar code here and LayerClipRecorder. |
| 2116 dirtyRect.intersect(paintInfo.localClipRectForSquashedLayer); | 2116 dirtyRect.intersect(paintInfo.localClipRectForSquashedLayer); |
| 2117 { | 2117 { |
| 2118 OwnPtr<DisplayItem> clipDisplayItem = ClipDisplayItem::create(displa
yItemClient(), DisplayItem::ClipLayerOverflowControls, dirtyRect); | 2118 OwnPtr<DisplayItem> clipDisplayItem = ClipDisplayItem::create(displa
yItemClient(), DisplayItem::ClipLayerOverflowControls, dirtyRect); |
| 2119 if (context->displayItemList()) { | 2119 if (context->displayItemList()) { |
| 2120 ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled()); | 2120 ASSERT(RuntimeEnabledFeatures::slimmingPaintEnabled()); |
| 2121 context->displayItemList()->add(clipDisplayItem.release()); | 2121 context->displayItemList()->add(clipDisplayItem.release()); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2240 renderer()->node()->document().compositorPendingAnimations().notifyComposito
rAnimationStarted(monotonicTime, group); | 2240 renderer()->node()->document().compositorPendingAnimations().notifyComposito
rAnimationStarted(monotonicTime, group); |
| 2241 } | 2241 } |
| 2242 | 2242 |
| 2243 IntRect CompositedLayerMapping::pixelSnappedCompositedBounds() const | 2243 IntRect CompositedLayerMapping::pixelSnappedCompositedBounds() const |
| 2244 { | 2244 { |
| 2245 LayoutRect bounds = m_compositedBounds; | 2245 LayoutRect bounds = m_compositedBounds; |
| 2246 bounds.move(m_owningLayer.subpixelAccumulation()); | 2246 bounds.move(m_owningLayer.subpixelAccumulation()); |
| 2247 return pixelSnappedIntRect(bounds); | 2247 return pixelSnappedIntRect(bounds); |
| 2248 } | 2248 } |
| 2249 | 2249 |
| 2250 bool CompositedLayerMapping::updateSquashingLayerAssignment(RenderLayer* squashe
dLayer, const RenderLayer& owningLayer, size_t nextSquashedLayerIndex) | 2250 bool CompositedLayerMapping::updateSquashingLayerAssignment(Layer* squashedLayer
, const Layer& owningLayer, size_t nextSquashedLayerIndex) |
| 2251 { | 2251 { |
| 2252 GraphicsLayerPaintInfo paintInfo; | 2252 GraphicsLayerPaintInfo paintInfo; |
| 2253 paintInfo.renderLayer = squashedLayer; | 2253 paintInfo.renderLayer = squashedLayer; |
| 2254 // NOTE: composited bounds are updated elsewhere | 2254 // NOTE: composited bounds are updated elsewhere |
| 2255 // NOTE: offsetFromRenderer is updated elsewhere | 2255 // NOTE: offsetFromRenderer is updated elsewhere |
| 2256 | 2256 |
| 2257 // Change tracking on squashing layers: at the first sign of something chang
ed, just invalidate the layer. | 2257 // Change tracking on squashing layers: at the first sign of something chang
ed, just invalidate the layer. |
| 2258 // FIXME: Perhaps we can find a tighter more clever mechanism later. | 2258 // FIXME: Perhaps we can find a tighter more clever mechanism later. |
| 2259 bool updatedAssignment = false; | 2259 bool updatedAssignment = false; |
| 2260 if (nextSquashedLayerIndex < m_squashedLayers.size()) { | 2260 if (nextSquashedLayerIndex < m_squashedLayers.size()) { |
| 2261 if (paintInfo.renderLayer != m_squashedLayers[nextSquashedLayerIndex].re
nderLayer) { | 2261 if (paintInfo.renderLayer != m_squashedLayers[nextSquashedLayerIndex].re
nderLayer) { |
| 2262 compositor()->paintInvalidationOnCompositingChange(squashedLayer); | 2262 compositor()->paintInvalidationOnCompositingChange(squashedLayer); |
| 2263 updatedAssignment = true; | 2263 updatedAssignment = true; |
| 2264 m_squashedLayers[nextSquashedLayerIndex] = paintInfo; | 2264 m_squashedLayers[nextSquashedLayerIndex] = paintInfo; |
| 2265 } | 2265 } |
| 2266 } else { | 2266 } else { |
| 2267 compositor()->paintInvalidationOnCompositingChange(squashedLayer); | 2267 compositor()->paintInvalidationOnCompositingChange(squashedLayer); |
| 2268 m_squashedLayers.append(paintInfo); | 2268 m_squashedLayers.append(paintInfo); |
| 2269 updatedAssignment = true; | 2269 updatedAssignment = true; |
| 2270 } | 2270 } |
| 2271 squashedLayer->setGroupedMapping(this); | 2271 squashedLayer->setGroupedMapping(this); |
| 2272 return updatedAssignment; | 2272 return updatedAssignment; |
| 2273 } | 2273 } |
| 2274 | 2274 |
| 2275 void CompositedLayerMapping::removeRenderLayerFromSquashingGraphicsLayer(const R
enderLayer* layer) | 2275 void CompositedLayerMapping::removeLayerFromSquashingGraphicsLayer(const Layer*
layer) |
| 2276 { | 2276 { |
| 2277 size_t layerIndex = kNotFound; | 2277 size_t layerIndex = kNotFound; |
| 2278 | 2278 |
| 2279 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { | 2279 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { |
| 2280 if (m_squashedLayers[i].renderLayer == layer) { | 2280 if (m_squashedLayers[i].renderLayer == layer) { |
| 2281 layerIndex = i; | 2281 layerIndex = i; |
| 2282 break; | 2282 break; |
| 2283 } | 2283 } |
| 2284 } | 2284 } |
| 2285 | 2285 |
| 2286 if (layerIndex == kNotFound) | 2286 if (layerIndex == kNotFound) |
| 2287 return; | 2287 return; |
| 2288 | 2288 |
| 2289 m_squashedLayers.remove(layerIndex); | 2289 m_squashedLayers.remove(layerIndex); |
| 2290 } | 2290 } |
| 2291 | 2291 |
| 2292 void CompositedLayerMapping::finishAccumulatingSquashingLayers(size_t nextSquash
edLayerIndex) | 2292 void CompositedLayerMapping::finishAccumulatingSquashingLayers(size_t nextSquash
edLayerIndex) |
| 2293 { | 2293 { |
| 2294 // Any additional squashed RenderLayers in the array no longer exist, and re
moving invalidates the squashingLayer contents. | 2294 // Any additional squashed Layers in the array no longer exist, and removing
invalidates the squashingLayer contents. |
| 2295 if (nextSquashedLayerIndex < m_squashedLayers.size()) | 2295 if (nextSquashedLayerIndex < m_squashedLayers.size()) |
| 2296 m_squashedLayers.remove(nextSquashedLayerIndex, m_squashedLayers.size()
- nextSquashedLayerIndex); | 2296 m_squashedLayers.remove(nextSquashedLayerIndex, m_squashedLayers.size()
- nextSquashedLayerIndex); |
| 2297 } | 2297 } |
| 2298 | 2298 |
| 2299 String CompositedLayerMapping::debugName(const GraphicsLayer* graphicsLayer) | 2299 String CompositedLayerMapping::debugName(const GraphicsLayer* graphicsLayer) |
| 2300 { | 2300 { |
| 2301 String name; | 2301 String name; |
| 2302 if (graphicsLayer == m_graphicsLayer.get()) { | 2302 if (graphicsLayer == m_graphicsLayer.get()) { |
| 2303 name = m_owningLayer.debugName(); | 2303 name = m_owningLayer.debugName(); |
| 2304 } else if (graphicsLayer == m_squashingContainmentLayer.get()) { | 2304 } else if (graphicsLayer == m_squashingContainmentLayer.get()) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2336 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) { | 2336 } else if (graphicsLayer == m_scrollingBlockSelectionLayer.get()) { |
| 2337 name = "Scrolling Block Selection Layer"; | 2337 name = "Scrolling Block Selection Layer"; |
| 2338 } else { | 2338 } else { |
| 2339 ASSERT_NOT_REACHED(); | 2339 ASSERT_NOT_REACHED(); |
| 2340 } | 2340 } |
| 2341 | 2341 |
| 2342 return name; | 2342 return name; |
| 2343 } | 2343 } |
| 2344 | 2344 |
| 2345 } // namespace blink | 2345 } // namespace blink |
| OLD | NEW |