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