blob: 907f8a88526a049e5dc72c6d472f7acef906f577 [file] [log] [blame]
[email protected]665e2b72012-03-14 17:06:591// 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
3// found in the LICENSE file.
4
5#include "ui/gfx/transform_util.h"
6
avic89eb8d42015-12-23 08:08:187#include <stddef.h>
8
[email protected]665e2b72012-03-14 17:06:599#include "testing/gtest/include/gtest/gtest.h"
tfarina655f81d2014-12-23 02:38:5010#include "ui/gfx/geometry/point.h"
11#include "ui/gfx/geometry/point3_f.h"
tfarina3b0452d2014-12-31 15:20:0912#include "ui/gfx/geometry/rect.h"
[email protected]665e2b72012-03-14 17:06:5913
[email protected]db06cc12012-11-10 05:19:5214namespace gfx {
15namespace {
16
[email protected]665e2b72012-03-14 17:06:5917TEST(TransformUtilTest, GetScaleTransform) {
[email protected]db06cc12012-11-10 05:19:5218 const Point kAnchor(20, 40);
[email protected]665e2b72012-03-14 17:06:5919 const float kScale = 0.5f;
20
[email protected]db06cc12012-11-10 05:19:5221 Transform scale = GetScaleTransform(kAnchor, kScale);
[email protected]665e2b72012-03-14 17:06:5922
23 const int kOffset = 10;
24 for (int sign_x = -1; sign_x <= 1; ++sign_x) {
25 for (int sign_y = -1; sign_y <= 1; ++sign_y) {
[email protected]db06cc12012-11-10 05:19:5226 Point test(kAnchor.x() + sign_x * kOffset,
27 kAnchor.y() + sign_y * kOffset);
[email protected]26d7ece2013-09-12 20:59:4728 scale.TransformPoint(&test);
[email protected]665e2b72012-03-14 17:06:5929
[email protected]db06cc12012-11-10 05:19:5230 EXPECT_EQ(Point(kAnchor.x() + sign_x * kOffset * kScale,
31 kAnchor.y() + sign_y * kOffset * kScale),
[email protected]665e2b72012-03-14 17:06:5932 test);
33 }
34 }
35}
[email protected]db06cc12012-11-10 05:19:5236
[email protected]dd31d492013-10-24 22:33:2537TEST(TransformUtilTest, SnapRotation) {
38 Transform result(Transform::kSkipInitialization);
39 Transform transform;
40 transform.RotateAboutZAxis(89.99);
41
42 Rect viewport(1920, 1200);
43 bool snapped = SnapTransform(&result, transform, viewport);
44
45 EXPECT_TRUE(snapped) << "Viewport should snap for this rotation.";
46}
47
48TEST(TransformUtilTest, SnapRotationDistantViewport) {
49 const int kOffset = 5000;
50 Transform result(Transform::kSkipInitialization);
51 Transform transform;
52
53 transform.RotateAboutZAxis(89.99);
54
55 Rect viewport(kOffset, kOffset, 1920, 1200);
56 bool snapped = SnapTransform(&result, transform, viewport);
57
58 EXPECT_FALSE(snapped) << "Distant viewport shouldn't snap by more than 1px.";
59}
60
61TEST(TransformUtilTest, NoSnapRotation) {
62 Transform result(Transform::kSkipInitialization);
63 Transform transform;
64 const int kOffset = 5000;
65
66 transform.RotateAboutZAxis(89.9);
67
68 Rect viewport(kOffset, kOffset, 1920, 1200);
69 bool snapped = SnapTransform(&result, transform, viewport);
70
71 EXPECT_FALSE(snapped) << "Viewport should not snap for this rotation.";
72}
73
74// Translations should always be snappable, the most we would move is 0.5
75// pixels towards either direction to the nearest value in each component.
76TEST(TransformUtilTest, SnapTranslation) {
77 Transform result(Transform::kSkipInitialization);
78 Transform transform;
79
80 transform.Translate3d(
81 SkDoubleToMScalar(1.01), SkDoubleToMScalar(1.99), SkDoubleToMScalar(3.0));
82
83 Rect viewport(1920, 1200);
84 bool snapped = SnapTransform(&result, transform, viewport);
85
86 EXPECT_TRUE(snapped) << "Viewport should snap for this translation.";
87}
88
89TEST(TransformUtilTest, SnapTranslationDistantViewport) {
90 Transform result(Transform::kSkipInitialization);
91 Transform transform;
92 const int kOffset = 5000;
93
94 transform.Translate3d(
95 SkDoubleToMScalar(1.01), SkDoubleToMScalar(1.99), SkDoubleToMScalar(3.0));
96
97 Rect viewport(kOffset, kOffset, 1920, 1200);
98 bool snapped = SnapTransform(&result, transform, viewport);
99
100 EXPECT_TRUE(snapped)
101 << "Distant viewport should still snap by less than 1px.";
102}
103
104TEST(TransformUtilTest, SnapScale) {
105 Transform result(Transform::kSkipInitialization);
106 Transform transform;
107
108 transform.Scale3d(SkDoubleToMScalar(5.0),
109 SkDoubleToMScalar(2.00001),
110 SkDoubleToMScalar(1.0));
111 Rect viewport(1920, 1200);
112 bool snapped = SnapTransform(&result, transform, viewport);
113
114 EXPECT_TRUE(snapped) << "Viewport should snap for this scaling.";
115}
116
117TEST(TransformUtilTest, NoSnapScale) {
118 Transform result(Transform::kSkipInitialization);
119 Transform transform;
120
121 transform.Scale3d(
122 SkDoubleToMScalar(5.0), SkDoubleToMScalar(2.1), SkDoubleToMScalar(1.0));
123 Rect viewport(1920, 1200);
124 bool snapped = SnapTransform(&result, transform, viewport);
125
126 EXPECT_FALSE(snapped) << "Viewport shouldn't snap for this scaling.";
127}
128
129TEST(TransformUtilTest, SnapCompositeTransform) {
130 Transform result(Transform::kSkipInitialization);
131 Transform transform;
132
133 transform.Translate3d(SkDoubleToMScalar(30.5), SkDoubleToMScalar(20.0),
134 SkDoubleToMScalar(10.1));
135 transform.RotateAboutZAxis(89.99);
136 transform.Scale3d(SkDoubleToMScalar(1.0),
137 SkDoubleToMScalar(3.00001),
138 SkDoubleToMScalar(2.0));
139
140 Rect viewport(1920, 1200);
141 bool snapped = SnapTransform(&result, transform, viewport);
142 ASSERT_TRUE(snapped) << "Viewport should snap all components.";
143
144 Point3F point;
145
danakj1d478ea02015-10-21 17:53:41146 point = Point3F(PointF(viewport.origin()));
[email protected]dd31d492013-10-24 22:33:25147 result.TransformPoint(&point);
148 EXPECT_EQ(Point3F(31.f, 20.f, 10.f), point) << "Transformed origin";
149
danakj1d478ea02015-10-21 17:53:41150 point = Point3F(PointF(viewport.top_right()));
[email protected]dd31d492013-10-24 22:33:25151 result.TransformPoint(&point);
152 EXPECT_EQ(Point3F(31.f, 1940.f, 10.f), point) << "Transformed top-right";
153
danakj1d478ea02015-10-21 17:53:41154 point = Point3F(PointF(viewport.bottom_left()));
[email protected]dd31d492013-10-24 22:33:25155 result.TransformPoint(&point);
156 EXPECT_EQ(Point3F(-3569.f, 20.f, 10.f), point) << "Transformed bottom-left";
157
danakj1d478ea02015-10-21 17:53:41158 point = Point3F(PointF(viewport.bottom_right()));
[email protected]dd31d492013-10-24 22:33:25159 result.TransformPoint(&point);
160 EXPECT_EQ(Point3F(-3569.f, 1940.f, 10.f), point)
161 << "Transformed bottom-right";
162}
163
164TEST(TransformUtilTest, NoSnapSkewedCompositeTransform) {
165 Transform result(Transform::kSkipInitialization);
166 Transform transform;
167
168
169 transform.RotateAboutZAxis(89.99);
170 transform.Scale3d(SkDoubleToMScalar(1.0),
171 SkDoubleToMScalar(3.00001),
172 SkDoubleToMScalar(2.0));
173 transform.Translate3d(SkDoubleToMScalar(30.5), SkDoubleToMScalar(20.0),
174 SkDoubleToMScalar(10.1));
nainar8ca8ee62015-09-03 01:04:10175 transform.Skew(20.0, 0.0);
[email protected]dd31d492013-10-24 22:33:25176 Rect viewport(1920, 1200);
177 bool snapped = SnapTransform(&result, transform, viewport);
178 EXPECT_FALSE(snapped) << "Skewed viewport should not snap.";
179}
180
bruthig8a260732014-11-24 23:32:02181TEST(TransformUtilTest, TransformAboutPivot) {
182 Transform transform;
183 transform.Scale(3, 4);
184 transform = TransformAboutPivot(Point(7, 8), transform);
185
186 Point point;
187
188 point = Point(0, 0);
189 transform.TransformPoint(&point);
190 EXPECT_EQ(Point(-14, -24).ToString(), point.ToString());
191
192 point = Point(1, 1);
193 transform.TransformPoint(&point);
194 EXPECT_EQ(Point(-11, -20).ToString(), point.ToString());
195}
196
vmpstrb1442372015-07-08 19:29:08197TEST(TransformUtilTest, BlendOppositeQuaternions) {
198 DecomposedTransform first;
199 DecomposedTransform second;
200 second.quaternion[3] = -second.quaternion[3];
201
202 DecomposedTransform result;
203 BlendDecomposedTransforms(&result, first, second, 0.25);
204 for (size_t i = 0; i < 4; ++i) {
205 EXPECT_TRUE(std::isfinite(result.quaternion[i]));
206 EXPECT_FALSE(std::isnan(result.quaternion[i]));
207 }
208}
209
[email protected]db06cc12012-11-10 05:19:52210} // namespace
211} // namespace gfx