Index: cc/trees/property_tree_builder.cc |
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc |
index 269a71e9a56b77700385705b84bb774e92e9d494..064a0944c4162f5a7ac2e3e40795c09aec21b198 100644 |
--- a/cc/trees/property_tree_builder.cc |
+++ b/cc/trees/property_tree_builder.cc |
@@ -185,33 +185,29 @@ bool AddTransformNodeIfNeeded( |
LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); |
- gfx::Vector2dF parent_offset; |
+ int parent_index = 0; |
+ if (transform_parent) |
+ parent_index = transform_parent->transform_tree_index(); |
+ |
+ int source_index = parent_index; |
+ |
+ gfx::Vector2dF source_offset; |
if (transform_parent) { |
if (layer->scroll_parent()) { |
- gfx::Transform to_parent; |
LayerType* source = layer->parent(); |
- parent_offset += source->offset_to_transform_parent(); |
- data_from_ancestor.transform_tree->ComputeTransform( |
- source->transform_tree_index(), |
- transform_parent->transform_tree_index(), &to_parent); |
- parent_offset += to_parent.To2dTranslation(); |
+ source_offset += source->offset_to_transform_parent(); |
+ source_index = source->transform_tree_index(); |
} else if (!is_fixed) { |
- parent_offset = transform_parent->offset_to_transform_parent(); |
+ source_offset = transform_parent->offset_to_transform_parent(); |
} else { |
if (data_from_ancestor.transform_tree_parent != |
data_from_ancestor.transform_fixed_parent) { |
- gfx::Vector2dF fixed_offset = data_from_ancestor.transform_tree_parent |
- ->offset_to_transform_parent(); |
- gfx::Transform parent_to_parent; |
- data_from_ancestor.transform_tree->ComputeTransform( |
- data_from_ancestor.transform_tree_parent->transform_tree_index(), |
- data_from_ancestor.transform_fixed_parent->transform_tree_index(), |
- &parent_to_parent); |
- |
- fixed_offset += parent_to_parent.To2dTranslation(); |
- parent_offset += fixed_offset; |
+ source_offset = data_from_ancestor.transform_tree_parent |
+ ->offset_to_transform_parent(); |
+ source_index = |
+ data_from_ancestor.transform_tree_parent->transform_tree_index(); |
} |
- parent_offset += data_from_ancestor.scroll_compensation_adjustment; |
+ source_offset += data_from_ancestor.scroll_compensation_adjustment; |
} |
} |
@@ -226,17 +222,21 @@ bool AddTransformNodeIfNeeded( |
data_for_children->should_flatten |= layer->should_flatten_transform(); |
gfx::Vector2dF local_offset = layer->position().OffsetFromOrigin() + |
layer->transform().To2dTranslation(); |
- layer->set_offset_to_transform_parent(parent_offset + local_offset); |
+ gfx::Vector2dF source_to_parent; |
+ if (source_index != parent_index) { |
+ gfx::Transform to_parent; |
+ data_from_ancestor.transform_tree->ComputeTransform( |
+ source_index, parent_index, &to_parent); |
+ source_to_parent = to_parent.To2dTranslation(); |
+ } |
+ layer->set_offset_to_transform_parent(source_offset + source_to_parent + |
+ local_offset); |
layer->set_should_flatten_transform_from_property_tree( |
data_from_ancestor.should_flatten); |
- layer->set_transform_tree_index(transform_parent->transform_tree_index()); |
+ layer->set_transform_tree_index(parent_index); |
return false; |
} |
- int parent_index = 0; |
- if (transform_parent) |
- parent_index = transform_parent->transform_tree_index(); |
- |
data_for_children->transform_tree->Insert(TransformNode(), parent_index); |
TransformNode* node = data_for_children->transform_tree->back(); |
@@ -276,7 +276,8 @@ bool AddTransformNodeIfNeeded( |
post_local_scale_factor); |
} else { |
node->data.post_local_scale_factor = post_local_scale_factor; |
- node->data.parent_offset = parent_offset; |
+ node->data.source_offset = source_offset; |
+ node->data.source_node_id = source_index; |
node->data.update_post_local_transform(layer->position(), |
layer->transform_origin()); |
} |