Expand testing of SkMatrix::decomposeScale
Bug: skia:7211
Change-Id: If03ad1d364b33e174d91010ca250cd6c2d2f67c2
Reviewed-on: https://skia-review.googlesource.com/140185
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/tests/MatrixTest.cpp b/tests/MatrixTest.cpp
index 03661dc..fccbf6d 100644
--- a/tests/MatrixTest.cpp
+++ b/tests/MatrixTest.cpp
@@ -20,7 +20,7 @@
static bool nearly_equal(const SkMatrix& a, const SkMatrix& b) {
for (int i = 0; i < 9; i++) {
if (!nearly_equal_scalar(a[i], b[i])) {
- SkDebugf("not equal %g %g\n", (float)a[i], (float)b[i]);
+ SkDebugf("matrices not equal [%d] %g %g\n", i, (float)a[i], (float)b[i]);
return false;
}
}
@@ -804,18 +804,56 @@
}
-static bool check_decompScale(const SkMatrix& matrix) {
+static bool check_decompScale(const SkMatrix& original) {
SkSize scale;
SkMatrix remaining;
- if (!matrix.decomposeScale(&scale, &remaining)) {
+ if (!original.decomposeScale(&scale, &remaining)) {
return false;
}
if (scale.width() <= 0 || scale.height() <= 0) {
return false;
}
- remaining.preScale(scale.width(), scale.height());
- return nearly_equal(matrix, remaining);
+
+ // First ensure that the decomposition reconstitutes back to the original
+ {
+ SkMatrix reconstituted = remaining;
+
+ // This should be 'preScale' but, due to skbug.com/7211, it is reversed!
+ reconstituted.postScale(scale.width(), scale.height());
+ if (!nearly_equal(original, reconstituted)) {
+ return false;
+ }
+ }
+
+ // Then push some points through both paths and make sure they are the same.
+ static const int kNumPoints = 5;
+ const SkPoint testPts[kNumPoints] = {
+ { 0.0f, 0.0f },
+ { 1.0f, 1.0f },
+ { 1.0f, 0.5f },
+ { -1.0f, -0.5f },
+ { -1.0f, 2.0f }
+ };
+
+ SkPoint v1[kNumPoints];
+ original.mapPoints(v1, testPts, kNumPoints);
+
+ SkPoint v2[kNumPoints];
+ SkMatrix scaleMat = SkMatrix::MakeScale(scale.width(), scale.height());
+
+ // Note, we intend the decomposition to be applied in the order scale and then remainder but,
+ // due to skbug.com/7211, the order is reversed!
+ remaining.mapPoints(v2, testPts, kNumPoints);
+ scaleMat.mapPoints(v2, kNumPoints);
+
+ for (int i = 0; i < kNumPoints; ++i) {
+ if (!SkPointPriv::EqualsWithinTolerance(v1[i], v2[i], 0.00001f)) {
+ return false;
+ }
+ }
+
+ return true;
}
static void test_decompScale(skiatest::Reporter* reporter) {
@@ -830,6 +868,14 @@
m.setScale(1, 0);
REPORTER_ASSERT(reporter, !check_decompScale(m));
+
+ m.setRotate(35, 0, 0);
+ m.preScale(2, 3);
+ REPORTER_ASSERT(reporter, check_decompScale(m));
+
+ m.setRotate(35, 0, 0);
+ m.postScale(2, 3);
+ REPORTER_ASSERT(reporter, check_decompScale(m));
}
DEF_TEST(Matrix, reporter) {