| Index: cc/trees/property_tree.cc
|
| diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
|
| index 7f384456ca9160f2f6e322fa3402f76bee979f44..d9b7081cac8638c2645ba578c94be31680a20ca7 100644
|
| --- a/cc/trees/property_tree.cc
|
| +++ b/cc/trees/property_tree.cc
|
| @@ -48,6 +48,7 @@ template class PropertyTree<OpacityNode>;
|
| TransformNodeData::TransformNodeData()
|
| : target_id(-1),
|
| content_target_id(-1),
|
| + source_node_id(-1),
|
| needs_local_transform_update(true),
|
| is_invertible(true),
|
| ancestors_are_invertible(true),
|
| @@ -76,8 +77,8 @@ void TransformNodeData::update_post_local_transform(
|
| post_local.MakeIdentity();
|
| post_local.Scale(post_local_scale_factor, post_local_scale_factor);
|
| post_local.Translate3d(
|
| - position.x() + parent_offset.x() + transform_origin.x(),
|
| - position.y() + parent_offset.y() + transform_origin.y(),
|
| + position.x() + source_offset.x() + transform_origin.x(),
|
| + position.y() + source_offset.y() + transform_origin.y(),
|
| transform_origin.z());
|
| }
|
|
|
| @@ -141,7 +142,8 @@ void TransformTree::UpdateTransforms(int id) {
|
| TransformNode* node = Node(id);
|
| TransformNode* parent_node = parent(node);
|
| TransformNode* target_node = Node(node->data.target_id);
|
| - if (node->data.needs_local_transform_update)
|
| + if (node->data.needs_local_transform_update ||
|
| + node->parent_id != node->data.source_node_id)
|
| UpdateLocalTransform(node);
|
| UpdateScreenSpaceTransform(node, parent_node, target_node);
|
| UpdateSublayerScale(node);
|
| @@ -249,8 +251,14 @@ bool TransformTree::CombineInversesBetween(int source_id,
|
|
|
| void TransformTree::UpdateLocalTransform(TransformNode* node) {
|
| gfx::Transform transform = node->data.post_local;
|
| - transform.Translate(-node->data.scroll_offset.x(),
|
| - -node->data.scroll_offset.y());
|
| + gfx::Vector2dF source_to_parent;
|
| + if (node->parent_id != node->data.source_node_id) {
|
| + gfx::Transform to_parent;
|
| + ComputeTransform(node->data.source_node_id, node->parent_id, &to_parent);
|
| + source_to_parent = to_parent.To2dTranslation();
|
| + }
|
| + transform.Translate(source_to_parent.x() - node->data.scroll_offset.x(),
|
| + source_to_parent.y() - node->data.scroll_offset.y());
|
| transform.PreconcatTransform(node->data.local);
|
| transform.PreconcatTransform(node->data.pre_local);
|
| node->data.set_to_parent(transform);
|
|
|