Index: cc/trees/property_tree_unittest.cc |
diff --git a/cc/trees/property_tree_unittest.cc b/cc/trees/property_tree_unittest.cc |
index 8d15aa3e1f1358bcc3f8ea6d116c338cdd1e4a41..8eba77382654ea7f6b310e42d1582293ae3df863 100644 |
--- a/cc/trees/property_tree_unittest.cc |
+++ b/cc/trees/property_tree_unittest.cc |
@@ -212,4 +212,108 @@ TEST(PropertyTreeTest, ComputeTransformWithUninvertibleTransform) { |
EXPECT_FALSE(success); |
} |
+TEST(PropertyTreeTest, ComputeTransformWithSublayerScale) { |
+ TransformTree tree; |
+ TransformNode& root = *tree.Node(0); |
+ root.data.target_id = 0; |
+ tree.UpdateTransforms(0); |
+ |
+ TransformNode grand_parent; |
+ grand_parent.data.local.Scale(2.f, 2.f); |
+ grand_parent.data.target_id = 0; |
+ grand_parent.data.needs_sublayer_scale = true; |
+ int grand_parent_id = tree.Insert(grand_parent, 0); |
+ tree.UpdateTransforms(grand_parent_id); |
+ |
+ TransformNode parent; |
+ parent.data.local.Translate(15.f, 15.f); |
+ parent.data.target_id = grand_parent_id; |
+ int parent_id = tree.Insert(parent, grand_parent_id); |
+ tree.UpdateTransforms(parent_id); |
+ |
+ TransformNode child; |
+ child.data.local.Scale(3.f, 3.f); |
+ child.data.target_id = grand_parent_id; |
+ int child_id = tree.Insert(child, parent_id); |
+ tree.UpdateTransforms(child_id); |
+ |
+ TransformNode grand_child; |
+ grand_child.data.local.Scale(5.f, 5.f); |
+ grand_child.data.target_id = grand_parent_id; |
+ grand_child.data.needs_sublayer_scale = true; |
+ int grand_child_id = tree.Insert(grand_child, child_id); |
+ tree.UpdateTransforms(grand_child_id); |
+ |
+ EXPECT_EQ(gfx::Vector2dF(2.f, 2.f), |
+ tree.Node(grand_parent_id)->data.sublayer_scale); |
+ EXPECT_EQ(gfx::Vector2dF(30.f, 30.f), |
+ tree.Node(grand_child_id)->data.sublayer_scale); |
+ |
+ // Compute transform from grand_parent to grand_child. |
+ gfx::Transform expected_transform_without_sublayer_scale; |
+ expected_transform_without_sublayer_scale.Scale(1.f / 15.f, 1.f / 15.f); |
+ expected_transform_without_sublayer_scale.Translate(-15.f, -15.f); |
+ |
+ gfx::Transform expected_transform_with_dest_sublayer_scale; |
+ expected_transform_with_dest_sublayer_scale.Scale(30.f, 30.f); |
+ expected_transform_with_dest_sublayer_scale.Scale(1.f / 15.f, 1.f / 15.f); |
+ expected_transform_with_dest_sublayer_scale.Translate(-15.f, -15.f); |
+ |
+ gfx::Transform expected_transform_with_source_sublayer_scale; |
+ expected_transform_with_source_sublayer_scale.Scale(1.f / 15.f, 1.f / 15.f); |
+ expected_transform_with_source_sublayer_scale.Translate(-15.f, -15.f); |
+ expected_transform_with_source_sublayer_scale.Scale(0.5f, 0.5f); |
+ |
+ gfx::Transform transform; |
+ bool success = |
+ tree.ComputeTransform(grand_parent_id, grand_child_id, &transform); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform_without_sublayer_scale, |
+ transform); |
+ |
+ success = tree.ComputeTransformWithDestinationSublayerScale( |
+ grand_parent_id, grand_child_id, &transform); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform_with_dest_sublayer_scale, |
+ transform); |
+ |
+ success = tree.ComputeTransformWithSourceSublayerScale( |
+ grand_parent_id, grand_child_id, &transform); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform_with_source_sublayer_scale, |
+ transform); |
+ |
+ // Now compute transform from grand_child to grand_parent. |
+ expected_transform_without_sublayer_scale.MakeIdentity(); |
+ expected_transform_without_sublayer_scale.Translate(15.f, 15.f); |
+ expected_transform_without_sublayer_scale.Scale(15.f, 15.f); |
+ |
+ expected_transform_with_dest_sublayer_scale.MakeIdentity(); |
+ expected_transform_with_dest_sublayer_scale.Scale(2.f, 2.f); |
+ expected_transform_with_dest_sublayer_scale.Translate(15.f, 15.f); |
+ expected_transform_with_dest_sublayer_scale.Scale(15.f, 15.f); |
+ |
+ expected_transform_with_source_sublayer_scale.MakeIdentity(); |
+ expected_transform_with_source_sublayer_scale.Translate(15.f, 15.f); |
+ expected_transform_with_source_sublayer_scale.Scale(15.f, 15.f); |
+ expected_transform_with_source_sublayer_scale.Scale(1.f / 30.f, 1.f / 30.f); |
+ |
+ success = tree.ComputeTransform(grand_child_id, grand_parent_id, &transform); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform_without_sublayer_scale, |
+ transform); |
+ |
+ success = tree.ComputeTransformWithDestinationSublayerScale( |
+ grand_child_id, grand_parent_id, &transform); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform_with_dest_sublayer_scale, |
+ transform); |
+ |
+ success = tree.ComputeTransformWithSourceSublayerScale( |
+ grand_child_id, grand_parent_id, &transform); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRANSFORMATION_MATRIX_EQ(expected_transform_with_source_sublayer_scale, |
+ transform); |
+} |
+ |
} // namespace cc |