Index: ui/gfx/transform_util_unittest.cc |
diff --git a/ui/gfx/transform_util_unittest.cc b/ui/gfx/transform_util_unittest.cc |
index 94195c29bb92f90641e8eecdfb87ae3bcb966b27..41bfc40783a805caa8ce78fc0cd36b29c034b7b1 100644 |
--- a/ui/gfx/transform_util_unittest.cc |
+++ b/ui/gfx/transform_util_unittest.cc |
@@ -6,6 +6,8 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
#include "ui/gfx/point.h" |
+#include "ui/gfx/point3_f.h" |
+#include "ui/gfx/rect.h" |
namespace gfx { |
namespace { |
@@ -30,5 +32,149 @@ TEST(TransformUtilTest, GetScaleTransform) { |
} |
} |
+TEST(TransformUtilTest, SnapRotation) { |
+ Transform result(Transform::kSkipInitialization); |
+ Transform transform; |
+ transform.RotateAboutZAxis(89.99); |
+ |
+ Rect viewport(1920, 1200); |
+ bool snapped = SnapTransform(&result, transform, viewport); |
+ |
+ EXPECT_TRUE(snapped) << "Viewport should snap for this rotation."; |
+} |
+ |
+TEST(TransformUtilTest, SnapRotationDistantViewport) { |
+ const int kOffset = 5000; |
+ Transform result(Transform::kSkipInitialization); |
+ Transform transform; |
+ |
+ transform.RotateAboutZAxis(89.99); |
+ |
+ Rect viewport(kOffset, kOffset, 1920, 1200); |
+ bool snapped = SnapTransform(&result, transform, viewport); |
+ |
+ EXPECT_FALSE(snapped) << "Distant viewport shouldn't snap by more than 1px."; |
+} |
+ |
+TEST(TransformUtilTest, NoSnapRotation) { |
+ Transform result(Transform::kSkipInitialization); |
+ Transform transform; |
+ const int kOffset = 5000; |
+ |
+ transform.RotateAboutZAxis(89.9); |
+ |
+ Rect viewport(kOffset, kOffset, 1920, 1200); |
+ bool snapped = SnapTransform(&result, transform, viewport); |
+ |
+ EXPECT_FALSE(snapped) << "Viewport should not snap for this rotation."; |
+} |
+ |
+// Translations should always be snappable, the most we would move is 0.5 |
+// pixels towards either direction to the nearest value in each component. |
+TEST(TransformUtilTest, SnapTranslation) { |
+ Transform result(Transform::kSkipInitialization); |
+ Transform transform; |
+ |
+ transform.Translate3d( |
+ SkDoubleToMScalar(1.01), SkDoubleToMScalar(1.99), SkDoubleToMScalar(3.0)); |
+ |
+ Rect viewport(1920, 1200); |
+ bool snapped = SnapTransform(&result, transform, viewport); |
+ |
+ EXPECT_TRUE(snapped) << "Viewport should snap for this translation."; |
+} |
+ |
+TEST(TransformUtilTest, SnapTranslationDistantViewport) { |
+ Transform result(Transform::kSkipInitialization); |
+ Transform transform; |
+ const int kOffset = 5000; |
+ |
+ transform.Translate3d( |
+ SkDoubleToMScalar(1.01), SkDoubleToMScalar(1.99), SkDoubleToMScalar(3.0)); |
+ |
+ Rect viewport(kOffset, kOffset, 1920, 1200); |
+ bool snapped = SnapTransform(&result, transform, viewport); |
+ |
+ EXPECT_TRUE(snapped) |
+ << "Distant viewport should still snap by less than 1px."; |
+} |
+ |
+TEST(TransformUtilTest, SnapScale) { |
+ Transform result(Transform::kSkipInitialization); |
+ Transform transform; |
+ |
+ transform.Scale3d(SkDoubleToMScalar(5.0), |
+ SkDoubleToMScalar(2.00001), |
+ SkDoubleToMScalar(1.0)); |
+ Rect viewport(1920, 1200); |
+ bool snapped = SnapTransform(&result, transform, viewport); |
+ |
+ EXPECT_TRUE(snapped) << "Viewport should snap for this scaling."; |
+} |
+ |
+TEST(TransformUtilTest, NoSnapScale) { |
+ Transform result(Transform::kSkipInitialization); |
+ Transform transform; |
+ |
+ transform.Scale3d( |
+ SkDoubleToMScalar(5.0), SkDoubleToMScalar(2.1), SkDoubleToMScalar(1.0)); |
+ Rect viewport(1920, 1200); |
+ bool snapped = SnapTransform(&result, transform, viewport); |
+ |
+ EXPECT_FALSE(snapped) << "Viewport shouldn't snap for this scaling."; |
+} |
+ |
+TEST(TransformUtilTest, SnapCompositeTransform) { |
+ Transform result(Transform::kSkipInitialization); |
+ Transform transform; |
+ |
+ transform.Translate3d(SkDoubleToMScalar(30.5), SkDoubleToMScalar(20.0), |
+ SkDoubleToMScalar(10.1)); |
+ transform.RotateAboutZAxis(89.99); |
+ transform.Scale3d(SkDoubleToMScalar(1.0), |
+ SkDoubleToMScalar(3.00001), |
+ SkDoubleToMScalar(2.0)); |
+ |
+ Rect viewport(1920, 1200); |
+ bool snapped = SnapTransform(&result, transform, viewport); |
+ ASSERT_TRUE(snapped) << "Viewport should snap all components."; |
+ |
+ Point3F point; |
+ |
+ point = Point3F(viewport.origin()); |
+ result.TransformPoint(&point); |
+ EXPECT_EQ(Point3F(31.f, 20.f, 10.f), point) << "Transformed origin"; |
+ |
+ point = Point3F(viewport.top_right()); |
+ result.TransformPoint(&point); |
+ EXPECT_EQ(Point3F(31.f, 1940.f, 10.f), point) << "Transformed top-right"; |
+ |
+ point = Point3F(viewport.bottom_left()); |
+ result.TransformPoint(&point); |
+ EXPECT_EQ(Point3F(-3569.f, 20.f, 10.f), point) << "Transformed bottom-left"; |
+ |
+ point = Point3F(viewport.bottom_right()); |
+ result.TransformPoint(&point); |
+ EXPECT_EQ(Point3F(-3569.f, 1940.f, 10.f), point) |
+ << "Transformed bottom-right"; |
+} |
+ |
+TEST(TransformUtilTest, NoSnapSkewedCompositeTransform) { |
+ Transform result(Transform::kSkipInitialization); |
+ Transform transform; |
+ |
+ |
+ transform.RotateAboutZAxis(89.99); |
+ transform.Scale3d(SkDoubleToMScalar(1.0), |
+ SkDoubleToMScalar(3.00001), |
+ SkDoubleToMScalar(2.0)); |
+ transform.Translate3d(SkDoubleToMScalar(30.5), SkDoubleToMScalar(20.0), |
+ SkDoubleToMScalar(10.1)); |
+ transform.SkewX(20.0); |
+ Rect viewport(1920, 1200); |
+ bool snapped = SnapTransform(&result, transform, viewport); |
+ EXPECT_FALSE(snapped) << "Skewed viewport should not snap."; |
+} |
+ |
} // namespace |
} // namespace gfx |