Index: cc/trees/property_tree.cc |
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc |
index ef0a2f32663e24fba6e2f4f5903ba248f0220806..f1dd7cad45cf797129406ddc3732832eb40774de 100644 |
--- a/cc/trees/property_tree.cc |
+++ b/cc/trees/property_tree.cc |
@@ -773,9 +773,8 @@ void EffectTree::UpdateBackfaceVisibility(EffectNode* node, |
parent_transform_node->sorting_context_id == |
transform_node->sorting_context_id) { |
gfx::Transform surface_draw_transform; |
- transform_tree.ComputeTransform( |
- transform_node->id, transform_tree.TargetId(transform_node->id), |
- &surface_draw_transform); |
+ property_trees()->ComputeTransformToTarget( |
+ transform_node->id, node->target_id, &surface_draw_transform); |
node->hidden_by_backface_visibility = |
surface_draw_transform.IsBackFaceVisible(); |
} else { |
@@ -1876,4 +1875,33 @@ gfx::Transform PropertyTrees::ToScreenSpaceTransformWithoutSurfaceContentsScale( |
return screen_space_transform; |
} |
+bool PropertyTrees::ComputeTransformToTarget(int transform_id, |
+ int effect_id, |
+ gfx::Transform* transform) const { |
+ transform->MakeIdentity(); |
+ |
+ int destination_transform_id; |
+ if (effect_id == -1) { |
+ // This can happen when PaintArtifactCompositor builds property trees as |
+ // it doesn't set effect ids on clip nodes. We want to compute transform |
+ // to the root in this case. |
+ destination_transform_id = 0; |
+ } else { |
+ const EffectNode* effect_node = effect_tree.Node(effect_id); |
+ DCHECK(effect_node->has_render_surface || effect_node->id == 0); |
+ destination_transform_id = effect_node->transform_id; |
+ } |
+ |
+ if (transform_id == destination_transform_id) |
+ return true; |
+ |
+ if (transform_id > destination_transform_id) { |
+ return transform_tree.CombineTransformsBetween( |
+ transform_id, destination_transform_id, transform); |
+ } |
+ |
+ return transform_tree.CombineInversesBetween( |
+ transform_id, destination_transform_id, transform); |
+} |
+ |
} // namespace cc |