Index: ui/gfx/transform_unittest.cc |
diff --git a/ui/gfx/transform_unittest.cc b/ui/gfx/transform_unittest.cc |
index 8d71e7b4d3603c3e467d8a34e67ee8663a4187ad..78fd44bf538e0ba4e637a123dc321ad6ae80fbe5 100644 |
--- a/ui/gfx/transform_unittest.cc |
+++ b/ui/gfx/transform_unittest.cc |
@@ -141,6 +141,33 @@ void InitializeTestMatrix2(Transform* transform) { |
EXPECT_ROW4_EQ(33.0f, 37.0f, 41.0f, 45.0f, (*transform)); |
} |
+const SkMScalar kApproxZero = |
+ SkFloatToMScalar(std::numeric_limits<float>::epsilon()); |
+const SkMScalar kApproxOne = 1 - kApproxZero; |
+ |
+void InitializeApproxIdentityMatrix(Transform* transform) { |
+ SkMatrix44& matrix = transform->matrix(); |
+ matrix.set(0, 0, kApproxOne); |
+ matrix.set(0, 1, kApproxZero); |
+ matrix.set(0, 2, kApproxZero); |
+ matrix.set(0, 3, kApproxZero); |
+ |
+ matrix.set(1, 0, kApproxZero); |
+ matrix.set(1, 1, kApproxOne); |
+ matrix.set(1, 2, kApproxZero); |
+ matrix.set(1, 3, kApproxZero); |
+ |
+ matrix.set(2, 0, kApproxZero); |
+ matrix.set(2, 1, kApproxZero); |
+ matrix.set(2, 2, kApproxOne); |
+ matrix.set(2, 3, kApproxZero); |
+ |
+ matrix.set(3, 0, kApproxZero); |
+ matrix.set(3, 1, kApproxZero); |
+ matrix.set(3, 2, kApproxZero); |
+ matrix.set(3, 3, kApproxOne); |
+} |
+ |
#ifdef SK_MSCALAR_IS_DOUBLE |
#define ERROR_THRESHOLD 1e-14 |
#else |
@@ -2194,6 +2221,58 @@ TEST(XFormTest, verifyIsIdentityOrTranslation) { |
EXPECT_FALSE(A.IsIdentityOrTranslation()); |
} |
+TEST(XFormTest, verifyIsApproximatelyIdentityOrTranslation) { |
+ Transform A; |
+ SkMatrix44& matrix = A.matrix(); |
+ |
+ // Exact pure translation. |
+ A.MakeIdentity(); |
+ |
+ // Set translate values to values other than 0 or 1. |
+ matrix.set(0, 3, 3.4); |
+ matrix.set(1, 3, 4.4); |
+ matrix.set(2, 3, 5.6); |
+ |
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(0)); |
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(kApproxZero)); |
+ |
danakj
2013/10/17 17:43:18
1 blank line only
|
+ |
+ // Approximately pure translation. |
+ InitializeApproxIdentityMatrix(&A); |
+ |
+ // Some values must be exact. |
+ matrix.set(3, 0, 0); |
+ matrix.set(3, 1, 0); |
+ matrix.set(3, 2, 0); |
+ matrix.set(3, 3, 1); |
+ |
+ // Set translate values to values other than 0 or 1. |
+ matrix.set(0, 3, 3.4); |
+ matrix.set(1, 3, 4.4); |
+ matrix.set(2, 3, 5.6); |
+ |
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrTranslation(0)); |
+ EXPECT_TRUE(A.IsApproximatelyIdentityOrTranslation(kApproxZero)); |
+ |
danakj
2013/10/17 17:43:18
1 blank line only
|
+ |
+ // Not approximately pure translation. |
+ InitializeApproxIdentityMatrix(&A); |
+ |
+ // Some values must be exact. |
+ matrix.set(3, 0, 0); |
+ matrix.set(3, 1, 0); |
+ matrix.set(3, 2, 0); |
+ matrix.set(3, 3, 1); |
+ |
+ // Set some values (not translate values) to values other than 0 or 1. |
+ matrix.set(0, 1, 3.4); |
+ matrix.set(3, 2, 4.4); |
+ matrix.set(2, 0, 5.6); |
+ |
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrTranslation(0)); |
+ EXPECT_FALSE(A.IsApproximatelyIdentityOrTranslation(kApproxZero)); |
+} |
+ |
TEST(XFormTest, verifyIsScaleOrTranslation) { |
Transform A; |