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

Unified Diff: cc/trees/draw_property_utils.cc

Issue 2117853004: cc: Compute sublayer scale from effect tree (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: "comments" Created 4 years, 5 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
« no previous file with comments | « cc/proto/property_tree.proto ('k') | cc/trees/property_tree.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/draw_property_utils.cc
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index f2c7022a7a3cb7dffeadc44ea5fd84b3d47d33fa..877fee2e749ac8886246468b344f320ad2802641 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -53,10 +53,45 @@ static void ValidateRenderSurfaceForLayer(LayerImpl* layer) {
#endif
+static void AddSublayerScaleToTransform(const int effect_node_id,
+ const EffectTree& effect_tree,
+ gfx::Transform* transform) {
+ const EffectNode* effect_node = effect_tree.Node(effect_node_id);
+ const EffectNode* target_effect_node =
+ effect_node->data.has_render_surface
+ ? effect_node
+ : effect_tree.Node(effect_node->data.target_id);
+ transform->matrix().postScale(target_effect_node->data.sublayer_scale.x(),
+ target_effect_node->data.sublayer_scale.y(),
+ 1.f);
+}
+
+#if DCHECK_IS_ON()
+void VerifySublayerScalesMatch(const int effect_node_id,
+ const int target_transform_id,
+ const EffectTree& effect_tree,
+ const TransformTree& transform_tree) {
+ const TransformNode* target_transform_node =
+ transform_tree.Node(target_transform_id);
+ const EffectNode* effect_node = effect_tree.Node(effect_node_id);
+ const EffectNode* target_effect_node =
+ effect_node->data.has_render_surface
+ ? effect_node
+ : effect_tree.Node(effect_node->data.target_id);
+ DCHECK(target_transform_node->data.sublayer_scale ==
+ target_effect_node->data.sublayer_scale)
+ << " sublayer scale from transform tree: "
+ << target_transform_node->data.sublayer_scale.ToString()
+ << " sublayer scale from effect tree: "
+ << target_effect_node->data.sublayer_scale.ToString();
+}
+#endif
+
template <typename LayerType>
bool ComputeClipRectInTargetSpace(const LayerType* layer,
const ClipNode* clip_node,
const TransformTree& transform_tree,
+ const EffectTree& effect_tree,
int target_node_id,
gfx::RectF* clip_rect_in_target_space) {
DCHECK(layer->clip_tree_index() == clip_node->id);
@@ -67,8 +102,18 @@ bool ComputeClipRectInTargetSpace(const LayerType* layer,
// In this case, layer has a scroll parent. We need to keep the scale
// at the layer's target but remove the scale at the scroll parent's
// target.
- if (transform_tree.ComputeTransformWithDestinationSublayerScale(
- clip_node->data.target_id, target_node_id, &clip_to_target)) {
+ if (transform_tree.ComputeTransform(clip_node->data.target_id,
+ target_node_id, &clip_to_target)) {
+ // We don't have to apply sublayer scale when target is root.
+ if (target_node_id != 0) {
+ AddSublayerScaleToTransform(layer->effect_tree_index(), effect_tree,
+ &clip_to_target);
+#if DCHECK_IS_ON()
+ VerifySublayerScalesMatch(layer->effect_tree_index(), target_node_id,
+ effect_tree, transform_tree);
+#endif
+ }
+
const TransformNode* source_node =
transform_tree.Node(clip_node->data.target_id);
if (source_node->data.sublayer_scale.x() != 0.f &&
@@ -267,7 +312,7 @@ void CalculateClipRects(
// Compute the clip rect in target space and store it.
if (!ComputeClipRectInTargetSpace(layer, clip_node, transform_tree,
- target_node_id,
+ effect_tree, target_node_id,
&clip_rect_in_target_space))
continue;
}
@@ -284,16 +329,18 @@ void CalculateClipRects(
bool GetLayerClipRect(const scoped_refptr<Layer> layer,
const ClipNode* clip_node,
const TransformTree& transform_tree,
+ const EffectTree& effect_tree,
int target_node_id,
gfx::RectF* clip_rect_in_target_space) {
return ComputeClipRectInTargetSpace(layer.get(), clip_node, transform_tree,
- target_node_id,
+ effect_tree, target_node_id,
clip_rect_in_target_space);
}
bool GetLayerClipRect(const LayerImpl* layer,
const ClipNode* clip_node,
const TransformTree& transform_tree,
+ const EffectTree& effect_tree,
int target_node_id,
gfx::RectF* clip_rect_in_target_space) {
// This is equivalent of calling ComputeClipRectInTargetSpace.
@@ -403,7 +450,8 @@ void CalculateVisibleRects(
// the combined clip has even the clip parent's target's clip baked into
// it and as our target is different, we don't want to use it in our
// visible rect computation.
- if (!GetLayerClipRect(layer, clip_node, transform_tree, target_node_id,
+ if (!GetLayerClipRect(layer, clip_node, transform_tree, effect_tree,
+ target_node_id,
&combined_clip_rect_in_target_space)) {
layer->set_visible_layer_rect(gfx::Rect(layer_bounds));
continue;
@@ -917,17 +965,19 @@ static void VerifyDrawTransformsMatch(LayerImpl* layer,
const int source_id = layer->transform_tree_index();
int destination_id = FindTargetTransformTreeIndexFromEffectTree(
property_trees->effect_tree, layer->effect_tree_index());
- // TODO(jaydasika) : Remove this after sorting out how sublayer scale works
- // for these ids.
- if (destination_id == 0 || destination_id == 1)
- return;
gfx::Transform draw_transform;
property_trees->transform_tree.ComputeTransform(source_id, destination_id,
&draw_transform);
- TransformNode* target_node =
- property_trees->transform_tree.Node(destination_id);
- draw_transform.matrix().postScale(target_node->data.sublayer_scale.x(),
- target_node->data.sublayer_scale.y(), 1.f);
+ // We don't have to apply sublayer scale when target is root.
+ if (destination_id != 0) {
+ AddSublayerScaleToTransform(layer->effect_tree_index(),
+ property_trees->effect_tree, &draw_transform);
+#if DCHECK_IS_ON()
+ VerifySublayerScalesMatch(layer->effect_tree_index(), destination_id,
+ property_trees->effect_tree,
+ property_trees->transform_tree);
+#endif
+ }
if (layer->should_flatten_transform_from_property_tree())
draw_transform.FlattenTo2d();
draw_transform.Translate(layer->offset_to_transform_parent().x(),
@@ -1093,23 +1143,41 @@ gfx::Transform DrawTransform(const LayerImpl* layer,
return xform;
}
-static void SetSurfaceDrawTransform(const TransformTree& tree,
+static void SetSurfaceDrawTransform(const TransformTree& transform_tree,
+ const EffectTree& effect_tree,
RenderSurfaceImpl* render_surface) {
- const TransformNode* node = tree.Node(render_surface->TransformTreeIndex());
+ const TransformNode* transform_node =
+ transform_tree.Node(render_surface->TransformTreeIndex());
+ const EffectNode* effect_node =
+ effect_tree.Node(render_surface->EffectTreeIndex());
// The draw transform of root render surface is identity tranform.
- if (node->id == 1) {
+ if (transform_node->id == 1) {
render_surface->SetDrawTransform(gfx::Transform());
return;
}
gfx::Transform render_surface_transform;
- const TransformNode* target_node = tree.Node(tree.TargetId(node->id));
- tree.ComputeTransformWithDestinationSublayerScale(node->id, target_node->id,
- &render_surface_transform);
- if (node->data.sublayer_scale.x() != 0.0 &&
- node->data.sublayer_scale.y() != 0.0)
- render_surface_transform.Scale(1.0 / node->data.sublayer_scale.x(),
- 1.0 / node->data.sublayer_scale.y());
+ const TransformNode* target_transform_node =
+ transform_tree.Node(transform_tree.TargetId(transform_node->id));
+ transform_tree.ComputeTransform(transform_node->id, target_transform_node->id,
+ &render_surface_transform);
+ // We don't have to apply sublayer scale when target is root.
+ if (target_transform_node->id != 0) {
+ AddSublayerScaleToTransform(effect_node->data.target_id, effect_tree,
+ &render_surface_transform);
+#if DCHECK_IS_ON()
+ VerifySublayerScalesMatch(effect_node->data.target_id,
+ target_transform_node->id, effect_tree,
+ transform_tree);
+#endif
+ }
+
+ DCHECK(transform_node->data.sublayer_scale ==
+ effect_node->data.sublayer_scale);
+ if (effect_node->data.sublayer_scale.x() != 0.0 &&
+ effect_node->data.sublayer_scale.y() != 0.0)
+ render_surface_transform.Scale(1.0 / effect_node->data.sublayer_scale.x(),
+ 1.0 / effect_node->data.sublayer_scale.y());
render_surface->SetDrawTransform(render_surface_transform);
}
@@ -1303,7 +1371,8 @@ void ComputeSurfaceDrawProperties(const PropertyTrees* property_trees,
SetSurfaceIsClipped(clip_node, render_surface);
SetSurfaceDrawOpacity(property_trees->effect_tree, render_surface);
- SetSurfaceDrawTransform(property_trees->transform_tree, render_surface);
+ SetSurfaceDrawTransform(property_trees->transform_tree,
+ property_trees->effect_tree, render_surface);
render_surface->SetScreenSpaceTransform(
property_trees->transform_tree.ToScreenSpaceTransformWithoutSublayerScale(
render_surface->TransformTreeIndex()));
« no previous file with comments | « cc/proto/property_tree.proto ('k') | cc/trees/property_tree.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698