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

Unified Diff: cc/layer_tree_host_common.cc

Issue 11280263: Organize internal properties of cc/ layer types (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Complete patch Created 8 years 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: cc/layer_tree_host_common.cc
diff --git a/cc/layer_tree_host_common.cc b/cc/layer_tree_host_common.cc
index 5979d078cb9e0b3f2de21aeac67b77f2528bfbbc..b271a5d6e6146cb4ec9cf71d3a6c69701685531c 100644
--- a/cc/layer_tree_host_common.cc
+++ b/cc/layer_tree_host_common.cc
@@ -486,13 +486,18 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo
if (!isRootLayer(layer) && subtreeShouldBeSkipped(layer))
return;
+ // As this function proceeds, these are the properties for each layer that
+ // actually get computed. To avoid unnecessary copies (particularly for
+ // matrices), we do computations directly on these values when possible.
+ DrawProperties<LayerType>& layerDrawProperties = layer->drawProperties();
+
gfx::Rect clipRectForSubtree;
bool subtreeShouldBeClipped = false;
- float drawOpacity = layer->opacity();
+ float accumulatedDrawOpacity = layer->opacity();
bool drawOpacityIsAnimating = layer->opacityIsAnimating();
if (layer->parent()) {
- drawOpacity *= layer->parent()->drawOpacity();
+ accumulatedDrawOpacity *= layer->parent()->drawOpacity();
drawOpacityIsAnimating |= layer->parent()->drawOpacityIsAnimating();
}
@@ -528,16 +533,15 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo
// The drawTransform that gets computed below is effectively the layer's drawTransform, unless
// the layer itself creates a renderSurface. In that case, the renderSurface re-parents the transforms.
- gfx::Transform drawTransform = combinedTransform;
+ layerDrawProperties.drawTransform = combinedTransform;
// M[draw] = M[parent] * LT * S[layer2content]
- drawTransform.Scale(1.0 / layer->contentsScaleX(), 1.0 / layer->contentsScaleY());
+ layerDrawProperties.drawTransform.Scale(1.0 / layer->contentsScaleX(), 1.0 / layer->contentsScaleY());
// layerScreenSpaceTransform represents the transform between root layer's "screen space" and local content space.
- gfx::Transform layerScreenSpaceTransform = fullHierarchyMatrix;
+ layerDrawProperties.screenSpaceTransform = fullHierarchyMatrix;
if (!layer->preserves3D())
- MathUtil::flattenTransformTo2d(layerScreenSpaceTransform);
- layerScreenSpaceTransform.PreconcatTransform(drawTransform);
- layer->setScreenSpaceTransform(layerScreenSpaceTransform);
+ MathUtil::flattenTransformTo2d(layerDrawProperties.screenSpaceTransform);
+ layerDrawProperties.screenSpaceTransform.PreconcatTransform(layerDrawProperties.drawTransform);
gfx::RectF contentRect(gfx::PointF(), layer->contentBounds());
@@ -569,8 +573,8 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo
// The owning layer's transform was re-parented by the surface, so the layer's new drawTransform
// only needs to scale the layer to surface space.
gfx::Transform layerDrawTransform;
- layerDrawTransform.Scale(renderSurfaceSublayerScale.x() / layer->contentsScaleX(), renderSurfaceSublayerScale.y() / layer->contentsScaleY());
- layer->setDrawTransform(layerDrawTransform);
+ layerDrawProperties.drawTransform.MakeIdentity();
+ layerDrawProperties.drawTransform.Scale(renderSurfaceSublayerScale.x() / layer->contentsScaleX(), renderSurfaceSublayerScale.y() / layer->contentsScaleY());
// Inside the surface's subtree, we scale everything to the owning layer's scale.
// The sublayer matrix transforms centered layer rects into target
@@ -579,16 +583,15 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo
sublayerMatrix.Scale(renderSurfaceSublayerScale.x(), renderSurfaceSublayerScale.y());
// The opacity value is moved from the layer to its surface, so that the entire subtree properly inherits opacity.
- renderSurface->setDrawOpacity(drawOpacity);
+ renderSurface->setDrawOpacity(accumulatedDrawOpacity);
renderSurface->setDrawOpacityIsAnimating(drawOpacityIsAnimating);
- layer->setDrawOpacity(1);
- layer->setDrawOpacityIsAnimating(false);
+ layerDrawProperties.drawOpacity = 1;
+ layerDrawProperties.drawOpacityIsAnimating = false;
renderSurface->setTargetSurfaceTransformsAreAnimating(animatingTransformToTarget);
renderSurface->setScreenSpaceTransformsAreAnimating(animatingTransformToScreen);
- animatingTransformToTarget = false;
- layer->setDrawTransformIsAnimating(animatingTransformToTarget);
- layer->setScreenSpaceTransformIsAnimating(animatingTransformToScreen);
+ layerDrawProperties.drawTransformIsAnimating = false;
+ layerDrawProperties.screenSpaceTransformIsAnimating = animatingTransformToScreen;
// Update the aggregate hierarchy matrix to include the transform of the
// newly created RenderSurfaceImpl.
@@ -601,13 +604,15 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo
subtreeShouldBeClipped = false;
if (layer->maskLayer()) {
- layer->maskLayer()->setRenderTarget(layer);
- layer->maskLayer()->setVisibleContentRect(gfx::Rect(gfx::Point(), layer->contentBounds()));
+ DrawProperties<LayerType>& maskLayerDrawProperties = layer->maskLayer()->drawProperties();
+ maskLayerDrawProperties.renderTarget = layer;
+ maskLayerDrawProperties.visibleContentRect = gfx::Rect(gfx::Point(), layer->contentBounds());
}
if (layer->replicaLayer() && layer->replicaLayer()->maskLayer()) {
- layer->replicaLayer()->maskLayer()->setRenderTarget(layer);
- layer->replicaLayer()->maskLayer()->setVisibleContentRect(gfx::Rect(gfx::Point(), layer->contentBounds()));
+ DrawProperties<LayerType>& replicaMaskDrawProperties = layer->replicaLayer()->maskLayer()->drawProperties();
+ replicaMaskDrawProperties.renderTarget = layer;
+ replicaMaskDrawProperties.visibleContentRect = gfx::Rect(gfx::Point(), layer->contentBounds());
}
// FIXME: make this smarter for the SkImageFilter case (check for
@@ -628,14 +633,13 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo
} else {
DCHECK(layer->parent());
- layer->setDrawTransform(drawTransform);
- layer->setDrawTransformIsAnimating(animatingTransformToTarget);
- layer->setScreenSpaceTransformIsAnimating(animatingTransformToScreen);
+ // layerDrawProperties.drawTransform is computed above, before this if-else statement.
+ layerDrawProperties.drawTransformIsAnimating = animatingTransformToTarget;
+ layerDrawProperties.screenSpaceTransformIsAnimating = animatingTransformToScreen;
+ layerDrawProperties.drawOpacity = accumulatedDrawOpacity;
+ layerDrawProperties.drawOpacityIsAnimating = drawOpacityIsAnimating;
sublayerMatrix = combinedTransform;
- layer->setDrawOpacity(drawOpacity);
- layer->setDrawOpacityIsAnimating(drawOpacityIsAnimating);
-
layer->clearRenderSurface();
// Layers without renderSurfaces directly inherit the ancestor's clip status.
@@ -644,7 +648,7 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo
clipRectForSubtree = clipRectFromAncestor;
// Layers that are not their own renderTarget will render into the target of their nearest ancestor.
- layer->setRenderTarget(layer->parent()->renderTarget());
+ layerDrawProperties.renderTarget = layer->parent()->renderTarget();
}
gfx::Rect rectInTargetSpace = ToEnclosingRect(MathUtil::mapClippedRect(layer->drawTransform(), contentRect));
@@ -701,27 +705,25 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo
localDrawableContentRectOfSubtree.Intersect(clipRectForSubtree);
// Compute the layer's drawable content rect (the rect is in targetSurface space)
- gfx::Rect drawableContentRectOfLayer = rectInTargetSpace;
+ layerDrawProperties.drawableContentRect = rectInTargetSpace;
if (subtreeShouldBeClipped)
- drawableContentRectOfLayer.Intersect(clipRectForSubtree);
- layer->setDrawableContentRect(drawableContentRectOfLayer);
+ layerDrawProperties.drawableContentRect.Intersect(clipRectForSubtree);
// Tell the layer the rect that is clipped by. In theory we could use a
// tighter clipRect here (drawableContentRect), but that actually does not
// reduce how much would be drawn, and instead it would create unnecessary
// changes to scissor state affecting GPU performance.
- layer->setIsClipped(subtreeShouldBeClipped);
+ layerDrawProperties.isClipped = subtreeShouldBeClipped;
if (subtreeShouldBeClipped)
- layer->setClipRect(clipRectForSubtree);
+ layerDrawProperties.clipRect = clipRectForSubtree;
else {
// Initialize the clipRect to a safe value that will not clip the
// layer, just in case clipping is still accidentally used.
- layer->setClipRect(rectInTargetSpace);
+ layerDrawProperties.clipRect = rectInTargetSpace;
}
// Compute the layer's visible content rect (the rect is in content space)
- gfx::Rect visibleContentRectOfLayer = calculateVisibleContentRect(layer);
- layer->setVisibleContentRect(visibleContentRectOfLayer);
+ layerDrawProperties.visibleContentRect = calculateVisibleContentRect(layer);
// Compute the remaining properties for the render surface, if the layer has one.
if (isRootLayer(layer)) {

Powered by Google App Engine
This is Rietveld 408576698