OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "ui/gfx/rect.h" | 9 #include "ui/gfx/rect.h" |
10 | 10 |
11 namespace { | 11 namespace { |
12 | 12 |
13 void CheckApproximatelyEqual(const ui::Transform& lhs, | 13 void CheckApproximatelyEqual(const gfx::Transform& lhs, |
14 const ui::Transform& rhs) { | 14 const gfx::Transform& rhs) { |
15 for (int i = 0; i < 4; ++i) { | 15 for (int i = 0; i < 4; ++i) { |
16 for (int j = 0; j < 4; ++j) { | 16 for (int j = 0; j < 4; ++j) { |
17 EXPECT_FLOAT_EQ(lhs.matrix().get(i, j), rhs.matrix().get(i, j)); | 17 EXPECT_FLOAT_EQ(lhs.matrix().get(i, j), rhs.matrix().get(i, j)); |
18 } | 18 } |
19 } | 19 } |
20 } | 20 } |
21 | 21 |
22 float NormalizeAngle(float angle) { | 22 float NormalizeAngle(float angle) { |
23 while (angle < 0.0f) { | 23 while (angle < 0.0f) { |
24 angle += 360.0f; | 24 angle += 360.0f; |
25 } | 25 } |
26 while (angle > 360.0f) { | 26 while (angle > 360.0f) { |
27 angle -= 360.0f; | 27 angle -= 360.0f; |
28 } | 28 } |
29 return angle; | 29 return angle; |
30 } | 30 } |
31 | 31 |
32 } // namespace | 32 } // namespace |
33 | 33 |
34 TEST(InterpolatedTransformTest, InterpolatedRotation) { | 34 TEST(InterpolatedTransformTest, InterpolatedRotation) { |
35 ui::InterpolatedRotation interpolated_rotation(0, 100); | 35 ui::InterpolatedRotation interpolated_rotation(0, 100); |
36 ui::InterpolatedRotation interpolated_rotation_diff_start_end( | 36 ui::InterpolatedRotation interpolated_rotation_diff_start_end( |
37 0, 100, 100, 200); | 37 0, 100, 100, 200); |
38 | 38 |
39 for (int i = 0; i <= 100; ++i) { | 39 for (int i = 0; i <= 100; ++i) { |
40 ui::Transform rotation; | 40 gfx::Transform rotation; |
41 rotation.SetRotate(i); | 41 rotation.SetRotate(i); |
42 ui::Transform interpolated = interpolated_rotation.Interpolate(i / 100.0f); | 42 gfx::Transform interpolated = interpolated_rotation.Interpolate(i / 100.0f); |
43 CheckApproximatelyEqual(rotation, interpolated); | 43 CheckApproximatelyEqual(rotation, interpolated); |
44 interpolated = interpolated_rotation_diff_start_end.Interpolate(i + 100); | 44 interpolated = interpolated_rotation_diff_start_end.Interpolate(i + 100); |
45 CheckApproximatelyEqual(rotation, interpolated); | 45 CheckApproximatelyEqual(rotation, interpolated); |
46 } | 46 } |
47 } | 47 } |
48 | 48 |
49 TEST(InterpolatedTransformTest, InterpolatedScale) { | 49 TEST(InterpolatedTransformTest, InterpolatedScale) { |
50 ui::InterpolatedScale interpolated_scale(gfx::Point3f(0, 0, 0), | 50 ui::InterpolatedScale interpolated_scale(gfx::Point3f(0, 0, 0), |
51 gfx::Point3f(100, 100, 100)); | 51 gfx::Point3f(100, 100, 100)); |
52 ui::InterpolatedScale interpolated_scale_diff_start_end( | 52 ui::InterpolatedScale interpolated_scale_diff_start_end( |
53 gfx::Point3f(0, 0, 0), gfx::Point3f(100, 100, 100), 100, 200); | 53 gfx::Point3f(0, 0, 0), gfx::Point3f(100, 100, 100), 100, 200); |
54 | 54 |
55 for (int i = 0; i <= 100; ++i) { | 55 for (int i = 0; i <= 100; ++i) { |
56 ui::Transform scale; | 56 gfx::Transform scale; |
57 scale.SetScale(i, i); | 57 scale.SetScale(i, i); |
58 ui::Transform interpolated = interpolated_scale.Interpolate(i / 100.0f); | 58 gfx::Transform interpolated = interpolated_scale.Interpolate(i / 100.0f); |
59 CheckApproximatelyEqual(scale, interpolated); | 59 CheckApproximatelyEqual(scale, interpolated); |
60 interpolated = interpolated_scale_diff_start_end.Interpolate(i + 100); | 60 interpolated = interpolated_scale_diff_start_end.Interpolate(i + 100); |
61 CheckApproximatelyEqual(scale, interpolated); | 61 CheckApproximatelyEqual(scale, interpolated); |
62 } | 62 } |
63 } | 63 } |
64 | 64 |
65 TEST(InterpolatedTransformTest, InterpolatedTranslate) { | 65 TEST(InterpolatedTransformTest, InterpolatedTranslate) { |
66 ui::InterpolatedTranslation interpolated_xform(gfx::Point(0, 0), | 66 ui::InterpolatedTranslation interpolated_xform(gfx::Point(0, 0), |
67 gfx::Point(100, 100)); | 67 gfx::Point(100, 100)); |
68 | 68 |
69 ui::InterpolatedTranslation interpolated_xform_diff_start_end( | 69 ui::InterpolatedTranslation interpolated_xform_diff_start_end( |
70 gfx::Point(0, 0), gfx::Point(100, 100), 100, 200); | 70 gfx::Point(0, 0), gfx::Point(100, 100), 100, 200); |
71 | 71 |
72 for (int i = 0; i <= 100; ++i) { | 72 for (int i = 0; i <= 100; ++i) { |
73 ui::Transform xform; | 73 gfx::Transform xform; |
74 xform.SetTranslate(i, i); | 74 xform.SetTranslate(i, i); |
75 ui::Transform interpolated = interpolated_xform.Interpolate(i / 100.0f); | 75 gfx::Transform interpolated = interpolated_xform.Interpolate(i / 100.0f); |
76 CheckApproximatelyEqual(xform, interpolated); | 76 CheckApproximatelyEqual(xform, interpolated); |
77 interpolated = interpolated_xform_diff_start_end.Interpolate(i + 100); | 77 interpolated = interpolated_xform_diff_start_end.Interpolate(i + 100); |
78 CheckApproximatelyEqual(xform, interpolated); | 78 CheckApproximatelyEqual(xform, interpolated); |
79 } | 79 } |
80 } | 80 } |
81 | 81 |
82 TEST(InterpolatedTransformTest, InterpolatedRotationAboutPivot) { | 82 TEST(InterpolatedTransformTest, InterpolatedRotationAboutPivot) { |
83 gfx::Point pivot(100, 100); | 83 gfx::Point pivot(100, 100); |
84 gfx::Point above_pivot(100, 200); | 84 gfx::Point above_pivot(100, 200); |
85 ui::InterpolatedRotation rot(0, 90); | 85 ui::InterpolatedRotation rot(0, 90); |
86 ui::InterpolatedTransformAboutPivot interpolated_xform( | 86 ui::InterpolatedTransformAboutPivot interpolated_xform( |
87 pivot, | 87 pivot, |
88 new ui::InterpolatedRotation(0, 90)); | 88 new ui::InterpolatedRotation(0, 90)); |
89 ui::Transform result = interpolated_xform.Interpolate(0.0f); | 89 gfx::Transform result = interpolated_xform.Interpolate(0.0f); |
90 CheckApproximatelyEqual(ui::Transform(), result); | 90 CheckApproximatelyEqual(gfx::Transform(), result); |
91 result = interpolated_xform.Interpolate(1.0f); | 91 result = interpolated_xform.Interpolate(1.0f); |
92 gfx::Point expected_result = pivot; | 92 gfx::Point expected_result = pivot; |
93 result.TransformPoint(pivot); | 93 result.TransformPoint(pivot); |
94 EXPECT_EQ(expected_result, pivot); | 94 EXPECT_EQ(expected_result, pivot); |
95 expected_result = gfx::Point(0, 100); | 95 expected_result = gfx::Point(0, 100); |
96 result.TransformPoint(above_pivot); | 96 result.TransformPoint(above_pivot); |
97 EXPECT_EQ(expected_result, above_pivot); | 97 EXPECT_EQ(expected_result, above_pivot); |
98 } | 98 } |
99 | 99 |
100 TEST(InterpolatedTransformTest, InterpolatedScaleAboutPivot) { | 100 TEST(InterpolatedTransformTest, InterpolatedScaleAboutPivot) { |
101 gfx::Point pivot(100, 100); | 101 gfx::Point pivot(100, 100); |
102 gfx::Point above_pivot(100, 200); | 102 gfx::Point above_pivot(100, 200); |
103 ui::InterpolatedTransformAboutPivot interpolated_xform( | 103 ui::InterpolatedTransformAboutPivot interpolated_xform( |
104 pivot, | 104 pivot, |
105 new ui::InterpolatedScale(gfx::Point3f(1, 1, 1), gfx::Point3f(2, 2, 2))); | 105 new ui::InterpolatedScale(gfx::Point3f(1, 1, 1), gfx::Point3f(2, 2, 2))); |
106 ui::Transform result = interpolated_xform.Interpolate(0.0f); | 106 gfx::Transform result = interpolated_xform.Interpolate(0.0f); |
107 CheckApproximatelyEqual(ui::Transform(), result); | 107 CheckApproximatelyEqual(gfx::Transform(), result); |
108 result = interpolated_xform.Interpolate(1.0f); | 108 result = interpolated_xform.Interpolate(1.0f); |
109 gfx::Point expected_result = pivot; | 109 gfx::Point expected_result = pivot; |
110 result.TransformPoint(pivot); | 110 result.TransformPoint(pivot); |
111 EXPECT_EQ(expected_result, pivot); | 111 EXPECT_EQ(expected_result, pivot); |
112 expected_result = gfx::Point(100, 300); | 112 expected_result = gfx::Point(100, 300); |
113 result.TransformPoint(above_pivot); | 113 result.TransformPoint(above_pivot); |
114 EXPECT_EQ(expected_result, above_pivot); | 114 EXPECT_EQ(expected_result, above_pivot); |
115 } | 115 } |
116 | 116 |
117 TEST(InterpolatedTransformTest, FactorTRS) { | 117 TEST(InterpolatedTransformTest, FactorTRS) { |
118 for (int degrees = 0; degrees < 360; ++degrees) { | 118 for (int degrees = 0; degrees < 360; ++degrees) { |
119 // build a transformation matrix. | 119 // build a transformation matrix. |
120 ui::Transform transform; | 120 gfx::Transform transform; |
121 transform.SetScale(degrees + 1, 2 * degrees + 1); | 121 transform.SetScale(degrees + 1, 2 * degrees + 1); |
122 transform.ConcatRotate(degrees); | 122 transform.ConcatRotate(degrees); |
123 transform.ConcatTranslate(degrees * 2, -degrees * 3); | 123 transform.ConcatTranslate(degrees * 2, -degrees * 3); |
124 | 124 |
125 // factor the matrix | 125 // factor the matrix |
126 gfx::Point translation; | 126 gfx::Point translation; |
127 float rotation; | 127 float rotation; |
128 gfx::Point3f scale; | 128 gfx::Point3f scale; |
129 bool success = ui::InterpolatedTransform::FactorTRS(transform, | 129 bool success = ui::InterpolatedTransform::FactorTRS(transform, |
130 &translation, | 130 &translation, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 new_pivot.y() - old_pivot.y()))); | 172 new_pivot.y() - old_pivot.y()))); |
173 | 173 |
174 float scale_factor = 0.9f; | 174 float scale_factor = 0.9f; |
175 scoped_ptr<ui::InterpolatedTransform> scale_down( | 175 scoped_ptr<ui::InterpolatedTransform> scale_down( |
176 new ui::InterpolatedScale(1.0f, scale_factor, 0.0f, 0.5f)); | 176 new ui::InterpolatedScale(1.0f, scale_factor, 0.0f, 0.5f)); |
177 | 177 |
178 scoped_ptr<ui::InterpolatedTransform> scale_up( | 178 scoped_ptr<ui::InterpolatedTransform> scale_up( |
179 new ui::InterpolatedScale(1.0f, 1.0f / scale_factor, 0.5f, 1.0f)); | 179 new ui::InterpolatedScale(1.0f, 1.0f / scale_factor, 0.5f, 1.0f)); |
180 | 180 |
181 scoped_ptr<ui::InterpolatedTransform> to_return( | 181 scoped_ptr<ui::InterpolatedTransform> to_return( |
182 new ui::InterpolatedConstantTransform(ui::Transform())); | 182 new ui::InterpolatedConstantTransform(gfx::Transform())); |
183 | 183 |
184 scale_up->SetChild(scale_down.release()); | 184 scale_up->SetChild(scale_down.release()); |
185 translation->SetChild(scale_up.release()); | 185 translation->SetChild(scale_up.release()); |
186 rotation->SetChild(translation.release()); | 186 rotation->SetChild(translation.release()); |
187 to_return->SetChild(rotation.release()); | 187 to_return->SetChild(rotation.release()); |
188 to_return->SetReversed(reversed); | 188 to_return->SetReversed(reversed); |
189 | 189 |
190 return to_return.release(); | 190 return to_return.release(); |
191 } | 191 } |
192 | 192 |
193 TEST(InterpolatedTransformTest, ScreenRotationEndsCleanly) { | 193 TEST(InterpolatedTransformTest, ScreenRotationEndsCleanly) { |
194 for (int i = 0; i < 2; ++i) { | 194 for (int i = 0; i < 2; ++i) { |
195 for (int degrees = -360; degrees <= 360; degrees += 90) { | 195 for (int degrees = -360; degrees <= 360; degrees += 90) { |
196 const bool reversed = i == 1; | 196 const bool reversed = i == 1; |
197 scoped_ptr<ui::InterpolatedTransform> screen_rotation( | 197 scoped_ptr<ui::InterpolatedTransform> screen_rotation( |
198 GetScreenRotation(degrees, reversed)); | 198 GetScreenRotation(degrees, reversed)); |
199 ui::Transform interpolated = screen_rotation->Interpolate(1.0f); | 199 gfx::Transform interpolated = screen_rotation->Interpolate(1.0f); |
200 SkMatrix44& m = interpolated.matrix(); | 200 SkMatrix44& m = interpolated.matrix(); |
201 // Upper-left 3x3 matrix should all be 0, 1 or -1. | 201 // Upper-left 3x3 matrix should all be 0, 1 or -1. |
202 for (int row = 0; row < 3; ++row) { | 202 for (int row = 0; row < 3; ++row) { |
203 for (int col = 0; col < 3; ++col) { | 203 for (int col = 0; col < 3; ++col) { |
204 float entry = m.get(row, col); | 204 float entry = m.get(row, col); |
205 EXPECT_TRUE(entry == 0 || entry == 1 || entry == -1); | 205 EXPECT_TRUE(entry == 0 || entry == 1 || entry == -1); |
206 } | 206 } |
207 } | 207 } |
208 } | 208 } |
209 } | 209 } |
(...skipping 30 matching lines...) Expand all Loading... |
240 scale->SetChild(translation.release()); | 240 scale->SetChild(translation.release()); |
241 rotation_about_pivot->SetChild(scale.release()); | 241 rotation_about_pivot->SetChild(scale.release()); |
242 | 242 |
243 rotation_about_pivot->SetReversed(true); | 243 rotation_about_pivot->SetReversed(true); |
244 | 244 |
245 return rotation_about_pivot.release(); | 245 return rotation_about_pivot.release(); |
246 } | 246 } |
247 | 247 |
248 TEST(InterpolatedTransformTest, MaximizeEndsCleanly) { | 248 TEST(InterpolatedTransformTest, MaximizeEndsCleanly) { |
249 scoped_ptr<ui::InterpolatedTransform> maximize(GetMaximize()); | 249 scoped_ptr<ui::InterpolatedTransform> maximize(GetMaximize()); |
250 ui::Transform interpolated = maximize->Interpolate(1.0f); | 250 gfx::Transform interpolated = maximize->Interpolate(1.0f); |
251 SkMatrix44& m = interpolated.matrix(); | 251 SkMatrix44& m = interpolated.matrix(); |
252 // Upper-left 3x3 matrix should all be 0, 1 or -1. | 252 // Upper-left 3x3 matrix should all be 0, 1 or -1. |
253 for (int row = 0; row < 3; ++row) { | 253 for (int row = 0; row < 3; ++row) { |
254 for (int col = 0; col < 3; ++col) { | 254 for (int col = 0; col < 3; ++col) { |
255 float entry = m.get(row, col); | 255 float entry = m.get(row, col); |
256 EXPECT_TRUE(entry == 0 || entry == 1 || entry == -1); | 256 EXPECT_TRUE(entry == 0 || entry == 1 || entry == -1); |
257 } | 257 } |
258 } | 258 } |
259 } | 259 } |
260 | 260 |
OLD | NEW |