1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/trees/property_tree.h"
7 #include "cc/test/geometry_test_utils.h"
8 #include "testing/gtest/include/gtest/gtest.h"
12 TEST(PropertyTreeTest
, ComputeTransformRoot
) {
14 TransformNode
& root
= *tree
.Node(0);
15 root
.data
.local
.Translate(2, 2);
16 root
.data
.target_id
= 0;
17 tree
.UpdateTransforms(0);
19 gfx::Transform expected
;
20 gfx::Transform transform
;
21 bool success
= tree
.ComputeTransform(0, 0, &transform
);
23 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
25 transform
.MakeIdentity();
26 expected
.Translate(2, 2);
27 success
= tree
.ComputeTransform(0, -1, &transform
);
29 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
31 transform
.MakeIdentity();
32 expected
.MakeIdentity();
33 expected
.Translate(-2, -2);
34 success
= tree
.ComputeTransform(-1, 0, &transform
);
36 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
39 TEST(PropertyTreeTest
, ComputeTransformChild
) {
41 TransformNode
& root
= *tree
.Node(0);
42 root
.data
.local
.Translate(2, 2);
43 root
.data
.target_id
= 0;
44 tree
.UpdateTransforms(0);
47 child
.data
.local
.Translate(3, 3);
48 child
.data
.target_id
= 0;
50 tree
.Insert(child
, 0);
51 tree
.UpdateTransforms(1);
53 gfx::Transform expected
;
54 gfx::Transform transform
;
56 expected
.Translate(3, 3);
57 bool success
= tree
.ComputeTransform(1, 0, &transform
);
59 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
61 transform
.MakeIdentity();
62 expected
.MakeIdentity();
63 expected
.Translate(-3, -3);
64 success
= tree
.ComputeTransform(0, 1, &transform
);
66 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
68 transform
.MakeIdentity();
69 expected
.MakeIdentity();
70 expected
.Translate(5, 5);
71 success
= tree
.ComputeTransform(1, -1, &transform
);
73 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
75 transform
.MakeIdentity();
76 expected
.MakeIdentity();
77 expected
.Translate(-5, -5);
78 success
= tree
.ComputeTransform(-1, 1, &transform
);
80 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
83 TEST(PropertyTreeTest
, ComputeTransformSibling
) {
85 TransformNode
& root
= *tree
.Node(0);
86 root
.data
.local
.Translate(2, 2);
87 root
.data
.target_id
= 0;
88 tree
.UpdateTransforms(0);
91 child
.data
.local
.Translate(3, 3);
92 child
.data
.target_id
= 0;
94 TransformNode sibling
;
95 sibling
.data
.local
.Translate(7, 7);
96 sibling
.data
.target_id
= 0;
98 tree
.Insert(child
, 0);
99 tree
.Insert(sibling
, 0);
101 tree
.UpdateTransforms(1);
102 tree
.UpdateTransforms(2);
104 gfx::Transform expected
;
105 gfx::Transform transform
;
107 expected
.Translate(4, 4);
108 bool success
= tree
.ComputeTransform(2, 1, &transform
);
109 EXPECT_TRUE(success
);
110 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
112 transform
.MakeIdentity();
113 expected
.MakeIdentity();
114 expected
.Translate(-4, -4);
115 success
= tree
.ComputeTransform(1, 2, &transform
);
116 EXPECT_TRUE(success
);
117 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
120 TEST(PropertyTreeTest
, ComputeTransformSiblingSingularAncestor
) {
121 // In this test, we have the following tree:
126 // Now singular has a singular transform, so we cannot use screen space
127 // transforms to compute change of basis transforms between |child| and
130 TransformNode
& root
= *tree
.Node(0);
131 root
.data
.local
.Translate(2, 2);
132 root
.data
.target_id
= 0;
133 tree
.UpdateTransforms(0);
135 TransformNode singular
;
136 singular
.data
.local
.matrix().set(2, 2, 0.0);
137 singular
.data
.target_id
= 0;
140 child
.data
.local
.Translate(3, 3);
141 child
.data
.target_id
= 0;
143 TransformNode sibling
;
144 sibling
.data
.local
.Translate(7, 7);
145 sibling
.data
.target_id
= 0;
147 tree
.Insert(singular
, 0);
148 tree
.Insert(child
, 1);
149 tree
.Insert(sibling
, 1);
151 tree
.UpdateTransforms(1);
152 tree
.UpdateTransforms(2);
153 tree
.UpdateTransforms(3);
155 gfx::Transform expected
;
156 gfx::Transform transform
;
158 expected
.Translate(4, 4);
159 bool success
= tree
.ComputeTransform(3, 2, &transform
);
160 EXPECT_TRUE(success
);
161 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
163 transform
.MakeIdentity();
164 expected
.MakeIdentity();
165 expected
.Translate(-4, -4);
166 success
= tree
.ComputeTransform(2, 3, &transform
);
167 EXPECT_TRUE(success
);
168 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
171 TEST(PropertyTreeTest
, MultiplicationOrder
) {
173 TransformNode
& root
= *tree
.Node(0);
174 root
.data
.local
.Translate(2, 2);
175 root
.data
.target_id
= 0;
176 tree
.UpdateTransforms(0);
179 child
.data
.local
.Scale(2, 2);
180 child
.data
.target_id
= 0;
182 tree
.Insert(child
, 0);
183 tree
.UpdateTransforms(1);
185 gfx::Transform expected
;
186 expected
.Translate(2, 2);
187 expected
.Scale(2, 2);
189 gfx::Transform transform
;
190 gfx::Transform inverse
;
192 bool success
= tree
.ComputeTransform(1, -1, &transform
);
193 EXPECT_TRUE(success
);
194 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);
196 success
= tree
.ComputeTransform(-1, 1, &inverse
);
197 EXPECT_TRUE(success
);
199 transform
= transform
* inverse
;
200 expected
.MakeIdentity();
201 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, transform
);