| Index: cc/trees/property_tree_unittest.cc
|
| diff --git a/cc/trees/property_tree_unittest.cc b/cc/trees/property_tree_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e6de9673ba98faf912a48db32868bd926a4b96db
|
| --- /dev/null
|
| +++ b/cc/trees/property_tree_unittest.cc
|
| @@ -0,0 +1,207 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "cc/trees/property_tree.h"
|
| +
|
| +#include "cc/test/geometry_test_utils.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace cc {
|
| +
|
| +TEST(PropertyTreeTest, ComputeTransformRoot) {
|
| + TransformTree tree;
|
| + TransformNode& root = *tree.Node(0);
|
| + root.data.to_parent.Translate(2, 2);
|
| + root.data.from_parent.Translate(-2, -2);
|
| + tree.UpdateScreenSpaceTransform(0);
|
| +
|
| + gfx::Transform expected;
|
| + gfx::Transform transform;
|
| + bool success = tree.ComputeTransform(0, 0, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +
|
| + transform.MakeIdentity();
|
| + expected.Translate(2, 2);
|
| + success = tree.ComputeTransform(0, -1, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +
|
| + transform.MakeIdentity();
|
| + expected.MakeIdentity();
|
| + expected.Translate(-2, -2);
|
| + success = tree.ComputeTransform(-1, 0, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +}
|
| +
|
| +TEST(PropertyTreeTest, ComputeTransformChild) {
|
| + TransformTree tree;
|
| + TransformNode& root = *tree.Node(0);
|
| + root.data.to_parent.Translate(2, 2);
|
| + root.data.from_parent.Translate(-2, -2);
|
| + tree.UpdateScreenSpaceTransform(0);
|
| +
|
| + TransformNode child;
|
| + child.data.to_parent.Translate(3, 3);
|
| + child.data.from_parent.Translate(-3, -3);
|
| +
|
| + tree.Insert(child, 0);
|
| + tree.UpdateScreenSpaceTransform(1);
|
| +
|
| + gfx::Transform expected;
|
| + gfx::Transform transform;
|
| +
|
| + expected.Translate(3, 3);
|
| + bool success = tree.ComputeTransform(1, 0, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +
|
| + transform.MakeIdentity();
|
| + expected.MakeIdentity();
|
| + expected.Translate(-3, -3);
|
| + success = tree.ComputeTransform(0, 1, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +
|
| + transform.MakeIdentity();
|
| + expected.MakeIdentity();
|
| + expected.Translate(5, 5);
|
| + success = tree.ComputeTransform(1, -1, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +
|
| + transform.MakeIdentity();
|
| + expected.MakeIdentity();
|
| + expected.Translate(-5, -5);
|
| + success = tree.ComputeTransform(-1, 1, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +}
|
| +
|
| +TEST(PropertyTreeTest, ComputeTransformSibling) {
|
| + TransformTree tree;
|
| + TransformNode& root = *tree.Node(0);
|
| + root.data.to_parent.Translate(2, 2);
|
| + root.data.from_parent.Translate(-2, -2);
|
| + tree.UpdateScreenSpaceTransform(0);
|
| +
|
| + TransformNode child;
|
| + child.data.to_parent.Translate(3, 3);
|
| + child.data.from_parent.Translate(-3, -3);
|
| +
|
| + TransformNode sibling;
|
| + sibling.data.to_parent.Translate(7, 7);
|
| + sibling.data.from_parent.Translate(-7, -7);
|
| +
|
| + tree.Insert(child, 0);
|
| + tree.Insert(sibling, 0);
|
| +
|
| + tree.UpdateScreenSpaceTransform(1);
|
| + tree.UpdateScreenSpaceTransform(2);
|
| +
|
| + gfx::Transform expected;
|
| + gfx::Transform transform;
|
| +
|
| + expected.Translate(4, 4);
|
| + bool success = tree.ComputeTransform(2, 1, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +
|
| + transform.MakeIdentity();
|
| + expected.MakeIdentity();
|
| + expected.Translate(-4, -4);
|
| + success = tree.ComputeTransform(1, 2, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +}
|
| +
|
| +TEST(PropertyTreeTest, ComputeTransformSiblingSingularAncestor) {
|
| + // In this test, we have the following tree:
|
| + // root
|
| + // + singular
|
| + // + child
|
| + // + sibling
|
| + // Now singular has a singular transform, so we cannot use screen space
|
| + // transforms to compute change of basis transforms between |child| and
|
| + // |sibling|.
|
| + TransformTree tree;
|
| + TransformNode& root = *tree.Node(0);
|
| + root.data.to_parent.Translate(2, 2);
|
| + root.data.from_parent.Translate(-2, -2);
|
| + tree.UpdateScreenSpaceTransform(0);
|
| +
|
| + TransformNode singular;
|
| + singular.data.to_parent.matrix().set(2, 2, 0.0);
|
| + singular.data.is_invertible = false;
|
| + singular.data.ancestors_are_invertible = false;
|
| +
|
| + TransformNode child;
|
| + child.data.to_parent.Translate(3, 3);
|
| + child.data.from_parent.Translate(-3, -3);
|
| + child.data.ancestors_are_invertible = false;
|
| +
|
| + TransformNode sibling;
|
| + sibling.data.to_parent.Translate(7, 7);
|
| + sibling.data.from_parent.Translate(-7, -7);
|
| + sibling.data.ancestors_are_invertible = false;
|
| +
|
| + tree.Insert(singular, 0);
|
| + tree.Insert(child, 1);
|
| + tree.Insert(sibling, 1);
|
| +
|
| + tree.UpdateScreenSpaceTransform(1);
|
| + tree.UpdateScreenSpaceTransform(2);
|
| + tree.UpdateScreenSpaceTransform(3);
|
| +
|
| + gfx::Transform expected;
|
| + gfx::Transform transform;
|
| +
|
| + expected.Translate(4, 4);
|
| + bool success = tree.ComputeTransform(3, 2, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +
|
| + transform.MakeIdentity();
|
| + expected.MakeIdentity();
|
| + expected.Translate(-4, -4);
|
| + success = tree.ComputeTransform(2, 3, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +}
|
| +
|
| +TEST(PropertyTreeTest, MultiplicationOrder) {
|
| + TransformTree tree;
|
| + TransformNode& root = *tree.Node(0);
|
| + root.data.to_parent.Translate(2, 2);
|
| + root.data.from_parent.Translate(-2, -2);
|
| + tree.UpdateScreenSpaceTransform(0);
|
| +
|
| + TransformNode child;
|
| + child.data.to_parent.Scale(2, 2);
|
| + child.data.from_parent.Scale(0.5, 0.5);
|
| +
|
| + tree.Insert(child, 0);
|
| + tree.UpdateScreenSpaceTransform(1);
|
| +
|
| + gfx::Transform expected;
|
| + expected.Translate(2, 2);
|
| + expected.Scale(2, 2);
|
| +
|
| + gfx::Transform transform;
|
| + gfx::Transform inverse;
|
| +
|
| + bool success = tree.ComputeTransform(1, -1, &transform);
|
| + EXPECT_TRUE(success);
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +
|
| + success = tree.ComputeTransform(-1, 1, &inverse);
|
| + EXPECT_TRUE(success);
|
| +
|
| + transform = transform * inverse;
|
| + expected.MakeIdentity();
|
| + EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform);
|
| +}
|
| +
|
| +} // namespace cc
|
|
|