OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "cc/trees/property_tree.h" | |
6 | |
7 #include "cc/test/geometry_test_utils.h" | |
8 #include "cc/trees/draw_property_utils.h" | |
9 #include "testing/gtest/include/gtest/gtest.h" | |
10 | |
11 namespace cc { | |
12 | |
13 TEST(PropertyTreeTest, ComputeTransformRoot) { | |
14 TransformTree tree; | |
15 TransformNode& root = *tree.Node(0); | |
16 root.data.local.Translate(2, 2); | |
17 root.data.target_id = 0; | |
18 tree.UpdateTransforms(0); | |
19 | |
20 gfx::Transform expected; | |
21 gfx::Transform transform; | |
22 bool success = tree.ComputeTransform(0, 0, &transform); | |
23 EXPECT_TRUE(success); | |
24 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
25 | |
26 transform.MakeIdentity(); | |
27 expected.Translate(2, 2); | |
28 success = tree.ComputeTransform(0, -1, &transform); | |
29 EXPECT_TRUE(success); | |
30 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
31 | |
32 transform.MakeIdentity(); | |
33 expected.MakeIdentity(); | |
34 expected.Translate(-2, -2); | |
35 success = tree.ComputeTransform(-1, 0, &transform); | |
36 EXPECT_TRUE(success); | |
37 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
38 } | |
39 | |
40 TEST(PropertyTreeTest, ComputeTransformChild) { | |
41 TransformTree tree; | |
42 TransformNode& root = *tree.Node(0); | |
43 root.data.local.Translate(2, 2); | |
44 root.data.target_id = 0; | |
45 tree.UpdateTransforms(0); | |
46 | |
47 TransformNode child; | |
48 child.data.local.Translate(3, 3); | |
49 child.data.target_id = 0; | |
50 | |
51 tree.Insert(child, 0); | |
52 tree.UpdateTransforms(1); | |
53 | |
54 gfx::Transform expected; | |
55 gfx::Transform transform; | |
56 | |
57 expected.Translate(3, 3); | |
58 bool success = tree.ComputeTransform(1, 0, &transform); | |
59 EXPECT_TRUE(success); | |
60 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
61 | |
62 transform.MakeIdentity(); | |
63 expected.MakeIdentity(); | |
64 expected.Translate(-3, -3); | |
65 success = tree.ComputeTransform(0, 1, &transform); | |
66 EXPECT_TRUE(success); | |
67 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
68 | |
69 transform.MakeIdentity(); | |
70 expected.MakeIdentity(); | |
71 expected.Translate(5, 5); | |
72 success = tree.ComputeTransform(1, -1, &transform); | |
73 EXPECT_TRUE(success); | |
74 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
75 | |
76 transform.MakeIdentity(); | |
77 expected.MakeIdentity(); | |
78 expected.Translate(-5, -5); | |
79 success = tree.ComputeTransform(-1, 1, &transform); | |
80 EXPECT_TRUE(success); | |
81 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
82 } | |
83 | |
84 TEST(PropertyTreeTest, ComputeTransformSibling) { | |
85 TransformTree tree; | |
86 TransformNode& root = *tree.Node(0); | |
87 root.data.local.Translate(2, 2); | |
88 root.data.target_id = 0; | |
89 tree.UpdateTransforms(0); | |
90 | |
91 TransformNode child; | |
92 child.data.local.Translate(3, 3); | |
93 child.data.target_id = 0; | |
94 | |
95 TransformNode sibling; | |
96 sibling.data.local.Translate(7, 7); | |
97 sibling.data.target_id = 0; | |
98 | |
99 tree.Insert(child, 0); | |
100 tree.Insert(sibling, 0); | |
101 | |
102 tree.UpdateTransforms(1); | |
103 tree.UpdateTransforms(2); | |
104 | |
105 gfx::Transform expected; | |
106 gfx::Transform transform; | |
107 | |
108 expected.Translate(4, 4); | |
109 bool success = tree.ComputeTransform(2, 1, &transform); | |
110 EXPECT_TRUE(success); | |
111 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
112 | |
113 transform.MakeIdentity(); | |
114 expected.MakeIdentity(); | |
115 expected.Translate(-4, -4); | |
116 success = tree.ComputeTransform(1, 2, &transform); | |
117 EXPECT_TRUE(success); | |
118 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
119 } | |
120 | |
121 TEST(PropertyTreeTest, ComputeTransformSiblingSingularAncestor) { | |
122 // In this test, we have the following tree: | |
123 // root | |
124 // + singular | |
125 // + child | |
126 // + sibling | |
127 // Now singular has a singular transform, so we cannot use screen space | |
128 // transforms to compute change of basis transforms between |child| and | |
129 // |sibling|. | |
130 TransformTree tree; | |
131 TransformNode& root = *tree.Node(0); | |
132 root.data.local.Translate(2, 2); | |
133 root.data.target_id = 0; | |
134 tree.UpdateTransforms(0); | |
135 | |
136 TransformNode singular; | |
137 singular.data.local.matrix().set(2, 2, 0.0); | |
138 singular.data.target_id = 0; | |
139 | |
140 TransformNode child; | |
141 child.data.local.Translate(3, 3); | |
142 child.data.target_id = 0; | |
143 | |
144 TransformNode sibling; | |
145 sibling.data.local.Translate(7, 7); | |
146 sibling.data.target_id = 0; | |
147 | |
148 tree.Insert(singular, 0); | |
149 tree.Insert(child, 1); | |
150 tree.Insert(sibling, 1); | |
151 | |
152 tree.UpdateTransforms(1); | |
153 tree.UpdateTransforms(2); | |
154 tree.UpdateTransforms(3); | |
155 | |
156 gfx::Transform expected; | |
157 gfx::Transform transform; | |
158 | |
159 expected.Translate(4, 4); | |
160 bool success = tree.ComputeTransform(3, 2, &transform); | |
161 EXPECT_TRUE(success); | |
162 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
163 | |
164 transform.MakeIdentity(); | |
165 expected.MakeIdentity(); | |
166 expected.Translate(-4, -4); | |
167 success = tree.ComputeTransform(2, 3, &transform); | |
168 EXPECT_TRUE(success); | |
169 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
170 } | |
171 | |
172 TEST(PropertyTreeTest, TransformsWithFlattening) { | |
173 TransformTree tree; | |
174 | |
175 int grand_parent = tree.Insert(TransformNode(), 0); | |
176 tree.Node(grand_parent)->data.content_target_id = grand_parent; | |
177 tree.Node(grand_parent)->data.target_id = grand_parent; | |
178 | |
179 gfx::Transform rotation_about_x; | |
180 rotation_about_x.RotateAboutXAxis(15); | |
181 | |
182 int parent = tree.Insert(TransformNode(), grand_parent); | |
183 tree.Node(parent)->data.needs_sublayer_scale = true; | |
184 tree.Node(parent)->data.target_id = grand_parent; | |
185 tree.Node(parent)->data.content_target_id = parent; | |
186 tree.Node(parent)->data.local = rotation_about_x; | |
187 | |
188 int child = tree.Insert(TransformNode(), parent); | |
189 tree.Node(child)->data.target_id = parent; | |
190 tree.Node(child)->data.content_target_id = parent; | |
191 tree.Node(child)->data.flattens_inherited_transform = true; | |
192 tree.Node(child)->data.local = rotation_about_x; | |
193 | |
194 int grand_child = tree.Insert(TransformNode(), child); | |
195 tree.Node(grand_child)->data.target_id = parent; | |
196 tree.Node(grand_child)->data.content_target_id = parent; | |
197 tree.Node(grand_child)->data.flattens_inherited_transform = true; | |
198 tree.Node(grand_child)->data.local = rotation_about_x; | |
199 | |
200 ComputeTransforms(&tree); | |
201 | |
202 gfx::Transform flattened_rotation_about_x = rotation_about_x; | |
203 flattened_rotation_about_x.FlattenTo2d(); | |
204 | |
205 EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_about_x, | |
206 tree.Node(child)->data.to_target); | |
207 | |
208 EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_x * rotation_about_x, | |
209 tree.Node(child)->data.to_screen); | |
210 | |
211 EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_x * rotation_about_x, | |
212 tree.Node(grand_child)->data.to_target); | |
213 | |
214 EXPECT_TRANSFORMATION_MATRIX_EQ(flattened_rotation_about_x * | |
215 flattened_rotation_about_x * | |
216 rotation_about_x, | |
217 tree.Node(grand_child)->data.to_screen); | |
218 | |
219 gfx::Transform grand_child_to_child; | |
220 bool success = | |
221 tree.ComputeTransform(grand_child, child, &grand_child_to_child); | |
222 EXPECT_TRUE(success); | |
223 EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_about_x, grand_child_to_child); | |
224 | |
225 // Remove flattening at grand_child, and recompute transforms. | |
226 tree.Node(grand_child)->data.flattens_inherited_transform = false; | |
227 ComputeTransforms(&tree); | |
228 | |
229 EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_about_x * rotation_about_x, | |
230 tree.Node(grand_child)->data.to_target); | |
231 | |
232 EXPECT_TRANSFORMATION_MATRIX_EQ( | |
233 flattened_rotation_about_x * rotation_about_x * rotation_about_x, | |
234 tree.Node(grand_child)->data.to_screen); | |
235 | |
236 success = tree.ComputeTransform(grand_child, child, &grand_child_to_child); | |
237 EXPECT_TRUE(success); | |
238 EXPECT_TRANSFORMATION_MATRIX_EQ(rotation_about_x, grand_child_to_child); | |
239 } | |
240 | |
241 TEST(PropertyTreeTest, MultiplicationOrder) { | |
242 TransformTree tree; | |
243 TransformNode& root = *tree.Node(0); | |
244 root.data.local.Translate(2, 2); | |
245 root.data.target_id = 0; | |
246 tree.UpdateTransforms(0); | |
247 | |
248 TransformNode child; | |
249 child.data.local.Scale(2, 2); | |
250 child.data.target_id = 0; | |
251 | |
252 tree.Insert(child, 0); | |
253 tree.UpdateTransforms(1); | |
254 | |
255 gfx::Transform expected; | |
256 expected.Translate(2, 2); | |
257 expected.Scale(2, 2); | |
258 | |
259 gfx::Transform transform; | |
260 gfx::Transform inverse; | |
261 | |
262 bool success = tree.ComputeTransform(1, -1, &transform); | |
263 EXPECT_TRUE(success); | |
264 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
265 | |
266 success = tree.ComputeTransform(-1, 1, &inverse); | |
267 EXPECT_TRUE(success); | |
268 | |
269 transform = transform * inverse; | |
270 expected.MakeIdentity(); | |
271 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, transform); | |
272 } | |
273 | |
274 } // namespace cc | |
OLD | NEW |