| 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 |