OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/interpolated_transform.h" | 5 #include "ui/gfx/interpolated_transform.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace { | 10 namespace { |
11 | 11 |
12 void CheckApproximatelyEqual(const ui::Transform& lhs, | 12 void CheckApproximatelyEqual(const ui::Transform& lhs, |
13 const ui::Transform& rhs) { | 13 const ui::Transform& rhs) { |
14 for (int i = 0; i < 4; ++i) { | 14 for (int i = 0; i < 4; ++i) { |
15 for (int j = 0; j < 4; ++j) { | 15 for (int j = 0; j < 4; ++j) { |
16 EXPECT_FLOAT_EQ(lhs.matrix().get(i, j), rhs.matrix().get(i, j)); | 16 EXPECT_FLOAT_EQ(lhs.matrix().get(i, j), rhs.matrix().get(i, j)); |
17 } | 17 } |
18 } | 18 } |
19 } | 19 } |
20 | 20 |
| 21 float NormalizeAngle(float angle) { |
| 22 while (angle < 0.0f) { |
| 23 angle += 360.0f; |
| 24 } |
| 25 while (angle > 360.0f) { |
| 26 angle -= 360.0f; |
| 27 } |
| 28 return angle; |
| 29 } |
| 30 |
21 } // namespace | 31 } // namespace |
22 | 32 |
23 TEST(InterpolatedTransformTest, InterpolatedRotation) { | 33 TEST(InterpolatedTransformTest, InterpolatedRotation) { |
24 ui::InterpolatedRotation interpolated_rotation(0, 100); | 34 ui::InterpolatedRotation interpolated_rotation(0, 100); |
25 ui::InterpolatedRotation interpolated_rotation_diff_start_end( | 35 ui::InterpolatedRotation interpolated_rotation_diff_start_end( |
26 0, 100, 100, 200); | 36 0, 100, 100, 200); |
27 | 37 |
28 for (int i = 0; i <= 100; ++i) { | 38 for (int i = 0; i <= 100; ++i) { |
29 ui::Transform rotation; | 39 ui::Transform rotation; |
30 rotation.SetRotate(i); | 40 rotation.SetRotate(i); |
31 ui::Transform interpolated = interpolated_rotation.Interpolate(i / 100.0f); | 41 ui::Transform interpolated = interpolated_rotation.Interpolate(i / 100.0f); |
32 CheckApproximatelyEqual(rotation, interpolated); | 42 CheckApproximatelyEqual(rotation, interpolated); |
33 interpolated = interpolated_rotation_diff_start_end.Interpolate(i + 100); | 43 interpolated = interpolated_rotation_diff_start_end.Interpolate(i + 100); |
34 CheckApproximatelyEqual(rotation, interpolated); | 44 CheckApproximatelyEqual(rotation, interpolated); |
35 } | 45 } |
36 } | 46 } |
37 | 47 |
38 TEST(InterpolatedTransformTest, InterpolatedScale) { | 48 TEST(InterpolatedTransformTest, InterpolatedScale) { |
39 ui::InterpolatedScale interpolated_scale(0, 100); | 49 ui::InterpolatedScale interpolated_scale(gfx::Point3f(0, 0, 0), |
| 50 gfx::Point3f(100, 100, 100)); |
40 ui::InterpolatedScale interpolated_scale_diff_start_end( | 51 ui::InterpolatedScale interpolated_scale_diff_start_end( |
41 0, 100, 100, 200); | 52 gfx::Point3f(0, 0, 0), gfx::Point3f(100, 100, 100), 100, 200); |
42 | 53 |
43 for (int i = 0; i <= 100; ++i) { | 54 for (int i = 0; i <= 100; ++i) { |
44 ui::Transform scale; | 55 ui::Transform scale; |
45 scale.SetScale(i, i); | 56 scale.SetScale(i, i); |
46 ui::Transform interpolated = interpolated_scale.Interpolate(i / 100.0f); | 57 ui::Transform interpolated = interpolated_scale.Interpolate(i / 100.0f); |
47 CheckApproximatelyEqual(scale, interpolated); | 58 CheckApproximatelyEqual(scale, interpolated); |
48 interpolated = interpolated_scale_diff_start_end.Interpolate(i + 100); | 59 interpolated = interpolated_scale_diff_start_end.Interpolate(i + 100); |
49 CheckApproximatelyEqual(scale, interpolated); | 60 CheckApproximatelyEqual(scale, interpolated); |
50 } | 61 } |
51 } | 62 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 expected_result = gfx::Point(0, 100); | 94 expected_result = gfx::Point(0, 100); |
84 result.TransformPoint(above_pivot); | 95 result.TransformPoint(above_pivot); |
85 EXPECT_EQ(expected_result, above_pivot); | 96 EXPECT_EQ(expected_result, above_pivot); |
86 } | 97 } |
87 | 98 |
88 TEST(InterpolatedTransformTest, InterpolatedScaleAboutPivot) { | 99 TEST(InterpolatedTransformTest, InterpolatedScaleAboutPivot) { |
89 gfx::Point pivot(100, 100); | 100 gfx::Point pivot(100, 100); |
90 gfx::Point above_pivot(100, 200); | 101 gfx::Point above_pivot(100, 200); |
91 ui::InterpolatedTransformAboutPivot interpolated_xform( | 102 ui::InterpolatedTransformAboutPivot interpolated_xform( |
92 pivot, | 103 pivot, |
93 new ui::InterpolatedScale(1, 2)); | 104 new ui::InterpolatedScale(gfx::Point3f(1, 1, 1), gfx::Point3f(2, 2, 2))); |
94 ui::Transform result = interpolated_xform.Interpolate(0.0f); | 105 ui::Transform result = interpolated_xform.Interpolate(0.0f); |
95 CheckApproximatelyEqual(ui::Transform(), result); | 106 CheckApproximatelyEqual(ui::Transform(), result); |
96 result = interpolated_xform.Interpolate(1.0f); | 107 result = interpolated_xform.Interpolate(1.0f); |
97 gfx::Point expected_result = pivot; | 108 gfx::Point expected_result = pivot; |
98 result.TransformPoint(pivot); | 109 result.TransformPoint(pivot); |
99 EXPECT_EQ(expected_result, pivot); | 110 EXPECT_EQ(expected_result, pivot); |
100 expected_result = gfx::Point(100, 300); | 111 expected_result = gfx::Point(100, 300); |
101 result.TransformPoint(above_pivot); | 112 result.TransformPoint(above_pivot); |
102 EXPECT_EQ(expected_result, above_pivot); | 113 EXPECT_EQ(expected_result, above_pivot); |
103 } | 114 } |
| 115 |
| 116 TEST(InterpolatedTransformTest, FactorTRS) { |
| 117 for (int degrees = 0; degrees < 360; ++degrees) { |
| 118 // build a transformation matrix. |
| 119 ui::Transform transform; |
| 120 transform.SetScale(degrees + 1, 2 * degrees + 1); |
| 121 transform.ConcatRotate(degrees); |
| 122 transform.ConcatTranslate(degrees * 2, -degrees * 3); |
| 123 |
| 124 // factor the matrix |
| 125 gfx::Point translation; |
| 126 float rotation; |
| 127 gfx::Point3f scale; |
| 128 bool success = ui::InterpolatedTransform::FactorTRS(transform, |
| 129 &translation, |
| 130 &rotation, |
| 131 &scale); |
| 132 EXPECT_TRUE(success); |
| 133 EXPECT_FLOAT_EQ(translation.x(), degrees * 2); |
| 134 EXPECT_FLOAT_EQ(translation.y(), -degrees * 3); |
| 135 EXPECT_FLOAT_EQ(NormalizeAngle(rotation), degrees); |
| 136 EXPECT_FLOAT_EQ(scale.x(), degrees + 1); |
| 137 EXPECT_FLOAT_EQ(scale.y(), 2 * degrees + 1); |
| 138 } |
| 139 } |
OLD | NEW |