Index: cc/trees/property_tree.cc |
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc |
index 894b2d5da469a38121fc404424b943c810b494e4..519aae485fd04a869622ac69a83539059e1fb275 100644 |
--- a/cc/trees/property_tree.cc |
+++ b/cc/trees/property_tree.cc |
@@ -771,7 +771,7 @@ void TransformTree::ResetChangeTracking() { |
void TransformTree::UpdateTransforms(int id) { |
TransformNode* node = Node(id); |
TransformNode* parent_node = parent(node); |
- TransformNode* target_node = Node(node->data.target_id); |
+ TransformNode* target_node = Node(TargetId(id)); |
TransformNode* source_node = Node(node->data.source_node_id); |
if (node->data.needs_local_transform_update || |
NeedsSourceToParentUpdate(node)) |
@@ -815,7 +815,7 @@ bool TransformTree::CombineTransformsBetween(int source_id, |
// A's from_screen will not produce the correct result. |
if (!dest || (dest->data.ancestors_are_invertible && |
dest->data.node_and_ancestors_are_flat)) { |
- transform->ConcatTransform(current->data.to_screen); |
+ transform->ConcatTransform(ToScreen(current->id)); |
if (dest) |
transform->ConcatTransform(dest->data.from_screen); |
return true; |
@@ -840,15 +840,15 @@ bool TransformTree::CombineTransformsBetween(int source_id, |
!dest->data.ancestors_are_invertible); |
for (; current && current->id > dest_id; current = parent(current)) { |
if (destination_has_non_zero_sublayer_scale && |
- current->data.target_id == dest_id && |
- current->data.content_target_id == dest_id) |
+ TargetId(current->id) == dest_id && |
+ ContentTargetId(current->id) == dest_id) |
break; |
source_to_destination.push_back(current->id); |
} |
gfx::Transform combined_transform; |
if (current->id > dest_id) { |
- combined_transform = current->data.to_target; |
+ combined_transform = ToTarget(current->id); |
// The stored target space transform has sublayer scale baked in, but we |
// need the unscaled transform. |
combined_transform.matrix().postScale(1.0f / dest->data.sublayer_scale.x(), |
@@ -904,7 +904,7 @@ bool TransformTree::CombineInversesBetween(int source_id, |
current->data.node_and_ancestors_are_flat) { |
transform->PreconcatTransform(current->data.from_screen); |
if (dest) |
- transform->PreconcatTransform(dest->data.to_screen); |
+ transform->PreconcatTransform(ToScreen(dest->id)); |
return true; |
} |
@@ -959,23 +959,24 @@ void TransformTree::UpdateScreenSpaceTransform(TransformNode* node, |
TransformNode* parent_node, |
TransformNode* target_node) { |
if (!parent_node) { |
- node->data.to_screen = node->data.to_parent; |
+ SetToScreen(node->id, node->data.to_parent); |
node->data.ancestors_are_invertible = true; |
node->data.to_screen_is_potentially_animated = false; |
node->data.node_and_ancestors_are_flat = node->data.to_parent.IsFlat(); |
} else { |
- node->data.to_screen = parent_node->data.to_screen; |
+ gfx::Transform to_screen_space_transform = parent_node->data.to_screen; |
if (node->data.flattens_inherited_transform) |
- node->data.to_screen.FlattenTo2d(); |
- node->data.to_screen.PreconcatTransform(node->data.to_parent); |
+ to_screen_space_transform.FlattenTo2d(); |
+ to_screen_space_transform.PreconcatTransform(node->data.to_parent); |
node->data.ancestors_are_invertible = |
parent_node->data.ancestors_are_invertible; |
node->data.node_and_ancestors_are_flat = |
parent_node->data.node_and_ancestors_are_flat && |
node->data.to_parent.IsFlat(); |
+ SetToScreen(node->id, to_screen_space_transform); |
} |
- if (!node->data.to_screen.GetInverse(&node->data.from_screen)) |
+ if (!ToScreen(node->id).GetInverse(&node->data.from_screen)) |
node->data.ancestors_are_invertible = false; |
} |
@@ -991,25 +992,27 @@ void TransformTree::UpdateSublayerScale(TransformNode* node) { |
if (node->data.in_subtree_of_page_scale_layer) |
layer_scale_factor *= page_scale_factor_; |
node->data.sublayer_scale = MathUtil::ComputeTransform2dScaleComponents( |
- node->data.to_screen, layer_scale_factor); |
+ ToScreen(node->id), layer_scale_factor); |
} |
void TransformTree::UpdateTargetSpaceTransform(TransformNode* node, |
TransformNode* target_node) { |
+ gfx::Transform target_space_transform; |
if (node->data.needs_sublayer_scale) { |
- node->data.to_target.MakeIdentity(); |
- node->data.to_target.Scale(node->data.sublayer_scale.x(), |
- node->data.sublayer_scale.y()); |
+ target_space_transform.MakeIdentity(); |
+ target_space_transform.Scale(node->data.sublayer_scale.x(), |
+ node->data.sublayer_scale.y()); |
} else { |
// In order to include the root transform for the root surface, we walk up |
// to the root of the transform tree in ComputeTransform. |
int target_id = target_node->id; |
ComputeTransformWithDestinationSublayerScale(node->id, target_id, |
- &node->data.to_target); |
+ &target_space_transform); |
} |
- if (!node->data.to_target.GetInverse(&node->data.from_target)) |
+ if (!target_space_transform.GetInverse(&node->data.from_target)) |
node->data.ancestors_are_invertible = false; |
+ SetToTarget(node->id, target_space_transform); |
} |
void TransformTree::UpdateAnimationProperties(TransformNode* node, |
@@ -1041,7 +1044,7 @@ void TransformTree::UpdateAnimationProperties(TransformNode* node, |
// Computing maximum animated scale in the presence of non-scale/translation |
// transforms isn't supported. |
bool failed_for_non_scale_or_translation = |
- !node->data.to_target.IsScaleOrTranslation(); |
+ !ToTarget(node->id).IsScaleOrTranslation(); |
// We don't attempt to accumulate animation scale from multiple nodes with |
// scale animations, because of the risk of significant overestimation. For |
@@ -1092,7 +1095,7 @@ void TransformTree::UpdateAnimationProperties(TransformNode* node, |
gfx::Vector2dF ancestor_scales = |
parent_node ? MathUtil::ComputeTransform2dScaleComponents( |
- parent_node->data.to_target, 0.f) |
+ ToTarget(parent_node->id), 0.f) |
: gfx::Vector2dF(1.f, 1.f); |
float max_ancestor_scale = std::max(ancestor_scales.x(), ancestor_scales.y()); |
node->data.combined_maximum_animation_target_scale = |
@@ -1111,7 +1114,7 @@ void TransformTree::UndoSnapping(TransformNode* node) { |
void TransformTree::UpdateSnapping(TransformNode* node) { |
if (!node->data.scrolls || node->data.to_screen_is_potentially_animated || |
- !node->data.to_screen.IsScaleOrTranslation() || |
+ !ToScreen(node->id).IsScaleOrTranslation() || |
!node->data.ancestors_are_invertible) { |
return; |
} |
@@ -1122,7 +1125,7 @@ void TransformTree::UpdateSnapping(TransformNode* node) { |
// rounded, then what we're after is the scroll delta X, where ST * X = ST'. |
// I.e., we want a transform that will realize our scroll snap. It follows |
// that X = ST^-1 * ST'. We cache ST and ST^-1 to make this more efficient. |
- gfx::Transform rounded = node->data.to_screen; |
+ gfx::Transform rounded = ToScreen(node->id); |
rounded.RoundTranslationComponents(); |
gfx::Transform delta = node->data.from_screen; |
delta *= rounded; |
@@ -1134,11 +1137,13 @@ void TransformTree::UpdateSnapping(TransformNode* node) { |
// Now that we have our scroll delta, we must apply it to each of our |
// combined, to/from matrices. |
- node->data.to_screen = rounded; |
+ SetToScreen(node->id, rounded); |
node->data.to_parent.Translate(translation.x(), translation.y()); |
node->data.from_screen.matrix().postTranslate(-translation.x(), |
-translation.y(), 0); |
- node->data.to_target.Translate(translation.x(), translation.y()); |
+ gfx::Transform to_target = ToTarget(node->id); |
+ to_target.Translate(translation.x(), translation.y()); |
+ SetToTarget(node->id, to_target); |
node->data.from_target.matrix().postTranslate(-translation.x(), |
-translation.y(), 0); |
@@ -1241,6 +1246,38 @@ bool TransformTree::HasNodesAffectedByOuterViewportBoundsDelta() const { |
return !nodes_affected_by_outer_viewport_bounds_delta_.empty(); |
} |
+gfx::Transform TransformTree::ToTarget(int id) const { |
+ return Node(id)->data.to_target; |
+} |
+ |
+void TransformTree::SetToTarget(int id, const gfx::Transform& transform) { |
+ Node(id)->data.to_target = transform; |
+} |
+ |
+gfx::Transform TransformTree::ToScreen(int id) const { |
+ return Node(id)->data.to_screen; |
+} |
+ |
+void TransformTree::SetToScreen(int id, const gfx::Transform& transform) { |
+ Node(id)->data.to_screen = transform; |
+} |
+ |
+int TransformTree::TargetId(int id) const { |
+ return Node(id)->data.target_id; |
+} |
+ |
+void TransformTree::SetTargetId(int id, int target_id) { |
+ Node(id)->data.target_id = target_id; |
+} |
+ |
+int TransformTree::ContentTargetId(int id) const { |
+ return Node(id)->data.content_target_id; |
+} |
+ |
+void TransformTree::SetContentTargetId(int id, int content_target_id) { |
+ Node(id)->data.content_target_id = content_target_id; |
+} |
+ |
gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale( |
int id) const { |
DCHECK_GT(id, 0); |
@@ -1248,7 +1285,7 @@ gfx::Transform TransformTree::ToScreenSpaceTransformWithoutSublayerScale( |
return gfx::Transform(); |
} |
const TransformNode* node = Node(id); |
- gfx::Transform screen_space_transform = node->data.to_screen; |
+ gfx::Transform screen_space_transform = ToScreen(id); |
if (node->data.sublayer_scale.x() != 0.0 && |
node->data.sublayer_scale.y() != 0.0) |
screen_space_transform.Scale(1.0 / node->data.sublayer_scale.x(), |
@@ -1385,9 +1422,9 @@ void EffectTree::UpdateBackfaceVisibility(EffectNode* node, |
parent_transform_node->data.sorting_context_id == |
transform_node->data.sorting_context_id) { |
gfx::Transform surface_draw_transform; |
- transform_tree.ComputeTransform(transform_node->id, |
- transform_node->data.target_id, |
- &surface_draw_transform); |
+ transform_tree.ComputeTransform( |
+ transform_node->id, transform_tree.TargetId(transform_node->id), |
+ &surface_draw_transform); |
node->data.hidden_by_backface_visibility = |
surface_draw_transform.IsBackFaceVisible(); |
} else { |
@@ -1751,12 +1788,14 @@ void ScrollTree::set_currently_scrolling_node(int scroll_node_id) { |
gfx::Transform ScrollTree::ScreenSpaceTransform(int scroll_node_id) const { |
const ScrollNode* scroll_node = Node(scroll_node_id); |
+ const TransformTree& transform_tree = property_trees()->transform_tree; |
const TransformNode* transform_node = |
- property_trees()->transform_tree.Node(scroll_node->data.transform_id); |
+ transform_tree.Node(scroll_node->data.transform_id); |
gfx::Transform screen_space_transform( |
1, 0, 0, 1, scroll_node->data.offset_to_transform_parent.x(), |
scroll_node->data.offset_to_transform_parent.y()); |
- screen_space_transform.ConcatTransform(transform_node->data.to_screen); |
+ screen_space_transform.ConcatTransform( |
+ transform_tree.ToScreen(transform_node->id)); |
if (scroll_node->data.should_flatten) |
screen_space_transform.FlattenTo2d(); |
return screen_space_transform; |