Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Unified Diff: Source/core/rendering/compositing/RenderLayerCompositor.cpp

Issue 264013002: Allow layers that need squashing to draw into the squashing layer in some cases. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Adjust. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/compositing/RenderLayerCompositor.cpp
diff --git a/Source/core/rendering/compositing/RenderLayerCompositor.cpp b/Source/core/rendering/compositing/RenderLayerCompositor.cpp
index 84c6c6c6203ac9acfd3c6a6364b398390d66431d..15611da21f7421beb4204105677b1b256e97deb9 100644
--- a/Source/core/rendering/compositing/RenderLayerCompositor.cpp
+++ b/Source/core/rendering/compositing/RenderLayerCompositor.cpp
@@ -606,7 +606,7 @@ bool RenderLayerCompositor::updateSquashingAssignment(RenderLayer* layer, Squash
LayoutPoint offsetFromTransformedAncestorForSquashedLayer = layer->computeOffsetFromTransformedAncestor();
// Compute the offset of this layer from the squashing owner. This computation is correct only because layers are allowed to squash only if they
- // share a transformed ancestor (see canSquashIntoCurrentSquashingOwner).
+ // share a transformed ancestor (see computeSquashingBehaviorWhenSquashingRequired).
LayoutSize offsetFromSquashingCLM(offsetFromTransformedAncestorForSquashedLayer.x() - squashingState.offsetFromTransformedAncestorForSquashingCLM.x(),
offsetFromTransformedAncestorForSquashedLayer.y() - squashingState.offsetFromTransformedAncestorForSquashingCLM.y());
@@ -676,7 +676,7 @@ bool RenderLayerCompositor::squashingWouldExceedSparsityTolerance(const RenderLa
return newBoundingRectArea > gSquashingSparsityTolerance * newSquashedArea;
}
-bool RenderLayerCompositor::canSquashIntoCurrentSquashingOwner(const RenderLayer* layer, const RenderLayerCompositor::SquashingState& squashingState)
+RenderLayerCompositor::NeedsSquashingBehavior RenderLayerCompositor::computeSquashingBehaviorWhenSquashingRequired(const RenderLayer* layer, const RenderLayerCompositor::SquashingState& squashingState)
{
// FIXME: this special case for video exists only to deal with corner cases
// where a RenderVideo does not report that it needs to be directly composited.
@@ -687,38 +687,44 @@ bool RenderLayerCompositor::canSquashIntoCurrentSquashingOwner(const RenderLayer
// compositing/video/video-controls-layer-creation.html
// virtual/softwarecompositing/video/video-controls-layer-creation.html
if (layer->renderer()->isVideo())
- return false;
+ return ShouldPaintIntoOwnLayer;
if (squashingWouldExceedSparsityTolerance(layer, squashingState))
- return false;
+ return ShouldPaintIntoOwnLayer;
// FIXME: this is not efficient, since it walks up the tree . We should store these values on the AncestorDependentPropertiesCache.
ASSERT(squashingState.hasMostRecentMapping);
const RenderLayer& squashingLayer = squashingState.mostRecentMapping->owningLayer();
- if (layer->renderer()->clippingContainer() != squashingLayer.renderer()->clippingContainer())
- return false;
-
// Composited descendants need to be clipped by a child contianment graphics layer, which would not be available if the layer is squashed.
if (clipsCompositingDescendants(layer))
- return false;
+ return ShouldPaintIntoOwnLayer;
if (layer->scrollsWithRespectTo(&squashingLayer))
- return false;
+ return ShouldPaintIntoOwnLayer;
const RenderLayer::AncestorDependentProperties& ancestorDependentProperties = layer->ancestorDependentProperties();
const RenderLayer::AncestorDependentProperties& squashingLayerAncestorDependentProperties = squashingLayer.ancestorDependentProperties();
if (ancestorDependentProperties.opacityAncestor != squashingLayerAncestorDependentProperties.opacityAncestor)
- return false;
+ return ShouldPaintIntoOwnLayer;
if (ancestorDependentProperties.transformAncestor != squashingLayerAncestorDependentProperties.transformAncestor)
- return false;
+ return ShouldPaintIntoOwnLayer;
if (ancestorDependentProperties.filterAncestor != squashingLayerAncestorDependentProperties.filterAncestor)
- return false;
+ return ShouldPaintIntoOwnLayer;
+
+ if (layer->renderer()->clippingContainer() != squashingLayer.renderer()->clippingContainer()) {
+ //layer->renderer()->showRenderObject();
+ const RenderLayer* parent = layer->renderer()->clippingContainer()->enclosingLayer()->containingGroupedLayer();
+ if (parent && squashingLayer.compositedLayerMapping().equals(parent->groupedMapping()))
+ return ShouldPaintIntoSameLayer;
+ printf("clipping: ShouldPaintIntoOwnLayer\n");
+ return ShouldPaintIntoOwnLayer;
+ }
- return true;
+ return ShouldSquash;
}
RenderLayerCompositor::CompositingStateTransitionType RenderLayerCompositor::computeCompositedLayerUpdate(RenderLayer* layer)
@@ -831,6 +837,7 @@ void RenderLayerCompositor::SquashingState::updateSquashingStateForNewMapping(Co
void RenderLayerCompositor::assignLayersToBackings(RenderLayer* updateRoot, bool& layersChanged)
{
SquashingState squashingState;
+ printf("RenderLayerCompositor::assignLayersToBackings()\n");
assignLayersToBackingsInternal(updateRoot, squashingState, layersChanged);
if (squashingState.hasMostRecentMapping)
squashingState.mostRecentMapping->finishAccumulatingSquashingLayers(squashingState.nextSquashedLayerIndex);
@@ -850,8 +857,20 @@ void RenderLayerCompositor::assignLayersToBackingsForReflectionLayer(RenderLayer
void RenderLayerCompositor::assignLayersToBackingsInternal(RenderLayer* layer, SquashingState& squashingState, bool& layersChanged)
{
- if (layerSquashingEnabled() && requiresSquashing(layer->compositingReasons()) && !canSquashIntoCurrentSquashingOwner(layer, squashingState))
- layer->setCompositingReasons(layer->compositingReasons() | CompositingReasonNoSquashingTargetFound);
+ if (layerSquashingEnabled() && requiresSquashing(layer->compositingReasons())) {
+ switch (computeSquashingBehaviorWhenSquashingRequired(layer, squashingState)) {
+ case ShouldPaintIntoOwnLayer: {
+ printf("assignLayersToBackingsInternal: ShouldPaintIntoOwnLayer\n");
+ layer->setCompositingReasons(layer->compositingReasons() | CompositingReasonNoSquashingTargetFound);
+ break;
+ }
+ case ShouldSquash:
+ break;
+ case ShouldPaintIntoSameLayer:
+ layer->setCompositingReasons(CompositingReasonNone);
+ break;
+ }
+ }
CompositingStateTransitionType compositedLayerUpdate = computeCompositedLayerUpdate(layer);

Powered by Google App Engine
This is Rietveld 408576698