Index: tests/MatrixTest.cpp |
diff --git a/tests/MatrixTest.cpp b/tests/MatrixTest.cpp |
index e9886941eb4e3b45f561e3eae06a9fe5645bad5d..9f4babfed91b0cd117ab37700111ca2060e21408 100644 |
--- a/tests/MatrixTest.cpp |
+++ b/tests/MatrixTest.cpp |
@@ -130,36 +130,43 @@ static void test_flatten(skiatest::Reporter* reporter, const SkMatrix& m) { |
REPORTER_ASSERT(reporter, memcmp(buffer, buffer2, size1) == 0); |
} |
-static void test_matrix_max_stretch(skiatest::Reporter* reporter) { |
+static void test_matrix_min_max_stretch(skiatest::Reporter* reporter) { |
SkMatrix identity; |
identity.reset(); |
+ REPORTER_ASSERT(reporter, SK_Scalar1 == identity.getMinStretch()); |
REPORTER_ASSERT(reporter, SK_Scalar1 == identity.getMaxStretch()); |
SkMatrix scale; |
scale.setScale(SK_Scalar1 * 2, SK_Scalar1 * 4); |
+ REPORTER_ASSERT(reporter, SK_Scalar1 * 2 == scale.getMinStretch()); |
REPORTER_ASSERT(reporter, SK_Scalar1 * 4 == scale.getMaxStretch()); |
SkMatrix rot90Scale; |
rot90Scale.setRotate(90 * SK_Scalar1); |
rot90Scale.postScale(SK_Scalar1 / 4, SK_Scalar1 / 2); |
+ REPORTER_ASSERT(reporter, SK_Scalar1 / 4 == rot90Scale.getMinStretch()); |
REPORTER_ASSERT(reporter, SK_Scalar1 / 2 == rot90Scale.getMaxStretch()); |
SkMatrix rotate; |
rotate.setRotate(128 * SK_Scalar1); |
- REPORTER_ASSERT(reporter, SkScalarAbs(SK_Scalar1 - rotate.getMaxStretch()) <= SK_ScalarNearlyZero); |
+ REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SK_Scalar1, rotate.getMinStretch() ,SK_ScalarNearlyZero)); |
+ REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SK_Scalar1, rotate.getMaxStretch(), SK_ScalarNearlyZero)); |
SkMatrix translate; |
translate.setTranslate(10 * SK_Scalar1, -5 * SK_Scalar1); |
+ REPORTER_ASSERT(reporter, SK_Scalar1 == translate.getMinStretch()); |
REPORTER_ASSERT(reporter, SK_Scalar1 == translate.getMaxStretch()); |
SkMatrix perspX; |
perspX.reset(); |
perspX.setPerspX(SkScalarToPersp(SK_Scalar1 / 1000)); |
+ REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMinStretch()); |
REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMaxStretch()); |
SkMatrix perspY; |
perspY.reset(); |
- perspY.setPerspX(SkScalarToPersp(-SK_Scalar1 / 500)); |
+ perspY.setPerspY(SkScalarToPersp(-SK_Scalar1 / 500)); |
+ REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMinStretch()); |
REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMaxStretch()); |
SkMatrix baseMats[] = {scale, rot90Scale, rotate, |
@@ -178,25 +185,22 @@ static void test_matrix_max_stretch(skiatest::Reporter* reporter) { |
int x = rand.nextU() % SK_ARRAY_COUNT(mats); |
mat.postConcat(mats[x]); |
} |
- SkScalar stretch = mat.getMaxStretch(); |
- if ((stretch < 0) != mat.hasPerspective()) { |
- stretch = mat.getMaxStretch(); |
- } |
- |
- REPORTER_ASSERT(reporter, (stretch < 0) == mat.hasPerspective()); |
+ SkScalar minStretch = mat.getMinStretch(); |
+ SkScalar maxStretch = mat.getMaxStretch(); |
+ REPORTER_ASSERT(reporter, (minStretch < 0) == (maxStretch < 0)); |
+ REPORTER_ASSERT(reporter, (maxStretch < 0) == mat.hasPerspective()); |
if (mat.hasPerspective()) { |
m -= 1; // try another non-persp matrix |
continue; |
} |
- // test a bunch of vectors. None should be scaled by more than stretch |
- // (modulo some error) and we should find a vector that is scaled by |
- // almost stretch. |
- static const SkScalar gStretchTol = (105 * SK_Scalar1) / 100; |
- static const SkScalar gMaxStretchTol = (97 * SK_Scalar1) / 100; |
- SkScalar max = 0; |
+ // test a bunch of vectors. All should be scaled by between minStretch and maxStretch |
+ // (modulo some error) and we should find a vector that is scaled by almost each. |
+ static const SkScalar gVectorStretchTol = (105 * SK_Scalar1) / 100; |
+ static const SkScalar gClosestStretchTol = (97 * SK_Scalar1) / 100; |
+ SkScalar max = 0, min = SK_ScalarMax; |
SkVector vectors[1000]; |
for (size_t i = 0; i < SK_ARRAY_COUNT(vectors); ++i) { |
vectors[i].fX = rand.nextSScalar1(); |
@@ -209,12 +213,17 @@ static void test_matrix_max_stretch(skiatest::Reporter* reporter) { |
mat.mapVectors(vectors, SK_ARRAY_COUNT(vectors)); |
for (size_t i = 0; i < SK_ARRAY_COUNT(vectors); ++i) { |
SkScalar d = vectors[i].length(); |
- REPORTER_ASSERT(reporter, SkScalarDiv(d, stretch) < gStretchTol); |
+ REPORTER_ASSERT(reporter, SkScalarDiv(d, maxStretch) < gVectorStretchTol); |
+ REPORTER_ASSERT(reporter, SkScalarDiv(minStretch, d) < gVectorStretchTol); |
if (max < d) { |
max = d; |
} |
+ if (min > d) { |
+ min = d; |
+ } |
} |
- REPORTER_ASSERT(reporter, SkScalarDiv(max, stretch) >= gMaxStretchTol); |
+ REPORTER_ASSERT(reporter, SkScalarDiv(max, maxStretch) >= gClosestStretchTol); |
+ REPORTER_ASSERT(reporter, SkScalarDiv(minStretch, min) >= gClosestStretchTol); |
} |
} |
@@ -797,7 +806,7 @@ static void TestMatrix(skiatest::Reporter* reporter) { |
REPORTER_ASSERT(reporter, !are_equal(reporter, mat, mat2)); |
#endif |
- test_matrix_max_stretch(reporter); |
+ test_matrix_min_max_stretch(reporter); |
test_matrix_is_similarity(reporter); |
test_matrix_recttorect(reporter); |
test_matrix_decomposition(reporter); |