OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2006-2008 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 "ui/gfx/interpolated_transform.h" | |
6 | |
7 #include "base/basictypes.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | |
9 | |
10 namespace { | |
11 | |
12 const static float EPSILON = 1e-6f; | |
13 | |
14 bool ApproximatelyEqual(float lhs, float rhs) { | |
Paweł Hajdan Jr.
2011/07/18 23:14:18
Did you possibly just want http://code.google.com/
| |
15 if (lhs == 0) | |
16 return fabs(rhs) < EPSILON; | |
17 if (rhs == 0) | |
18 return fabs(lhs) < EPSILON; | |
19 return fabs(lhs - rhs) / std::max(fabs(rhs), fabs(lhs)) < EPSILON; | |
20 } | |
21 | |
22 bool ApproximatelyEqual(const ui::Transform& lhs, const ui::Transform& rhs) { | |
23 for (int i = 0; i < 9; ++i) { | |
24 if (!ApproximatelyEqual(lhs.matrix()[i], rhs.matrix()[i])) | |
25 return false; | |
26 } | |
27 return true; | |
28 } | |
29 | |
30 } // namespace | |
31 | |
32 TEST(InterpolatedTransformTest, InterpolatedRotation) { | |
33 ui::InterpolatedRotation interpolated_rotation(0, 100); | |
34 ui::InterpolatedRotation interpolated_rotation_diff_start_end( | |
35 0, 100, 100, 200); | |
36 | |
37 for (int i = 0; i <= 100; ++i) { | |
38 ui::Transform rotation; | |
39 rotation.SetRotate(i); | |
40 ui::Transform interpolated = interpolated_rotation.Interpolate(i / 100.0f); | |
41 EXPECT_TRUE(ApproximatelyEqual(rotation, interpolated)); | |
42 interpolated = interpolated_rotation_diff_start_end.Interpolate(i + 100); | |
43 EXPECT_TRUE(ApproximatelyEqual(rotation, interpolated)); | |
44 } | |
45 } | |
46 | |
47 TEST(InterpolatedTransformTest, InterpolatedScale) { | |
48 ui::InterpolatedScale interpolated_scale(0, 100); | |
49 ui::InterpolatedScale interpolated_scale_diff_start_end( | |
50 0, 100, 100, 200); | |
51 | |
52 for (int i = 0; i <= 100; ++i) { | |
53 ui::Transform scale; | |
54 scale.SetScale(i, i); | |
55 ui::Transform interpolated = interpolated_scale.Interpolate(i / 100.0f); | |
56 EXPECT_TRUE(ApproximatelyEqual(scale, interpolated)); | |
57 interpolated = interpolated_scale_diff_start_end.Interpolate(i + 100); | |
58 EXPECT_TRUE(ApproximatelyEqual(scale, interpolated)); | |
59 } | |
60 } | |
61 | |
62 TEST(InterpolatedTransformTest, InterpolatedTranslate) { | |
63 ui::InterpolatedTranslation interpolated_xform(gfx::Point(0, 0), | |
64 gfx::Point(100, 100)); | |
65 | |
66 ui::InterpolatedTranslation interpolated_xform_diff_start_end( | |
67 gfx::Point(0, 0), gfx::Point(100, 100), 100, 200); | |
68 | |
69 for (int i = 0; i <= 100; ++i) { | |
70 ui::Transform xform; | |
71 xform.SetTranslate(i, i); | |
72 ui::Transform interpolated = interpolated_xform.Interpolate(i / 100.0f); | |
73 EXPECT_TRUE(ApproximatelyEqual(xform, interpolated)); | |
74 interpolated = interpolated_xform_diff_start_end.Interpolate(i + 100); | |
75 EXPECT_TRUE(ApproximatelyEqual(xform, interpolated)); | |
76 } | |
77 } | |
78 | |
79 TEST(InterpolatedTransformTest, InterpolatedRotationAboutPivot) { | |
80 gfx::Point pivot(100, 100); | |
81 gfx::Point above_pivot(100, 200); | |
82 ui::InterpolatedRotation rot(0, 90); | |
83 ui::InterpolatedTransformAboutPivot interpolated_xform( | |
84 pivot, | |
85 new ui::InterpolatedRotation(0, 90)); | |
86 ui::Transform result = interpolated_xform.Interpolate(0.0f); | |
87 EXPECT_TRUE(ApproximatelyEqual(ui::Transform(), result)); | |
88 result = interpolated_xform.Interpolate(1.0f); | |
89 gfx::Point expected_result = pivot; | |
90 EXPECT_TRUE(result.TransformPoint(&pivot)); | |
91 EXPECT_EQ(expected_result, pivot); | |
92 expected_result = gfx::Point(0, 100); | |
93 EXPECT_TRUE(result.TransformPoint(&above_pivot)); | |
94 EXPECT_EQ(expected_result, above_pivot); | |
95 } | |
96 | |
97 TEST(InterpolatedTransformTest, InterpolatedScaleAboutPivot) { | |
98 gfx::Point pivot(100, 100); | |
99 gfx::Point above_pivot(100, 200); | |
100 ui::InterpolatedTransformAboutPivot interpolated_xform( | |
101 pivot, | |
102 new ui::InterpolatedScale(1, 2)); | |
103 ui::Transform result = interpolated_xform.Interpolate(0.0f); | |
104 EXPECT_TRUE(ApproximatelyEqual(ui::Transform(), result)); | |
105 result = interpolated_xform.Interpolate(1.0f); | |
106 gfx::Point expected_result = pivot; | |
107 EXPECT_TRUE(result.TransformPoint(&pivot)); | |
108 EXPECT_EQ(expected_result, pivot); | |
109 expected_result = gfx::Point(100, 300); | |
110 EXPECT_TRUE(result.TransformPoint(&above_pivot)); | |
111 EXPECT_EQ(expected_result, above_pivot); | |
112 } | |
OLD | NEW |