MatrixTest.cpp revision d8730ea8b25d692c0656f8cf03f02aecfab2a17c
1#include "Test.h" 2#include "SkMatrix.h" 3 4static bool nearly_equal_scalar(SkScalar a, SkScalar b) { 5#ifdef SK_SCALAR_IS_FLOAT 6 const float tolerance = 0.000005f; 7#else 8 const int32_t tolerance = 3; 9#endif 10 11 return SkScalarAbs(a - b) <= tolerance; 12} 13 14static bool nearly_equal(const SkMatrix& a, const SkMatrix& b) { 15 for (int i = 0; i < 9; i++) { 16 if (!nearly_equal_scalar(a[i], b[i])) { 17 printf("not equal %g %g\n", a[i], b[i]); 18 return false; 19 } 20 } 21 return true; 22} 23 24static bool is_identity(const SkMatrix& m) { 25 SkMatrix identity; 26 identity.reset(); 27 return nearly_equal(m, identity); 28} 29 30void TestMatrix(skiatest::Reporter* reporter) { 31 SkMatrix mat, inverse, iden1, iden2; 32 33 mat.reset(); 34 mat.setTranslate(SK_Scalar1, SK_Scalar1); 35 mat.invert(&inverse); 36 iden1.setConcat(mat, inverse); 37 REPORTER_ASSERT(reporter, is_identity(iden1)); 38 39 mat.setScale(SkIntToScalar(2), SkIntToScalar(2)); 40 mat.invert(&inverse); 41 iden1.setConcat(mat, inverse); 42 REPORTER_ASSERT(reporter, is_identity(iden1)); 43 44 mat.setScale(SK_Scalar1/2, SK_Scalar1/2); 45 mat.invert(&inverse); 46 iden1.setConcat(mat, inverse); 47 REPORTER_ASSERT(reporter, is_identity(iden1)); 48 49 mat.setScale(SkIntToScalar(3), SkIntToScalar(5), SkIntToScalar(20), 0); 50 mat.postRotate(SkIntToScalar(25)); 51 REPORTER_ASSERT(reporter, mat.invert(NULL)); 52 mat.invert(&inverse); 53 iden1.setConcat(mat, inverse); 54 REPORTER_ASSERT(reporter, is_identity(iden1)); 55 iden2.setConcat(inverse, mat); 56 REPORTER_ASSERT(reporter, is_identity(iden2)); 57 58 // rectStaysRect test 59 { 60 static const struct { 61 SkScalar m00, m01, m10, m11; 62 bool mStaysRect; 63 } 64 gRectStaysRectSamples[] = { 65 { 0, 0, 0, 0, false }, 66 { 0, 0, 0, SK_Scalar1, false }, 67 { 0, 0, SK_Scalar1, 0, false }, 68 { 0, 0, SK_Scalar1, SK_Scalar1, false }, 69 { 0, SK_Scalar1, 0, 0, false }, 70 { 0, SK_Scalar1, 0, SK_Scalar1, false }, 71 { 0, SK_Scalar1, SK_Scalar1, 0, true }, 72 { 0, SK_Scalar1, SK_Scalar1, SK_Scalar1, false }, 73 { SK_Scalar1, 0, 0, 0, false }, 74 { SK_Scalar1, 0, 0, SK_Scalar1, true }, 75 { SK_Scalar1, 0, SK_Scalar1, 0, false }, 76 { SK_Scalar1, 0, SK_Scalar1, SK_Scalar1, false }, 77 { SK_Scalar1, SK_Scalar1, 0, 0, false }, 78 { SK_Scalar1, SK_Scalar1, 0, SK_Scalar1, false }, 79 { SK_Scalar1, SK_Scalar1, SK_Scalar1, 0, false }, 80 { SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, false } 81 }; 82 83 for (size_t i = 0; i < SK_ARRAY_COUNT(gRectStaysRectSamples); i++) { 84 SkMatrix m; 85 86 m.reset(); 87 m.set(SkMatrix::kMScaleX, gRectStaysRectSamples[i].m00); 88 m.set(SkMatrix::kMSkewX, gRectStaysRectSamples[i].m01); 89 m.set(SkMatrix::kMSkewY, gRectStaysRectSamples[i].m10); 90 m.set(SkMatrix::kMScaleY, gRectStaysRectSamples[i].m11); 91 REPORTER_ASSERT(reporter, 92 m.rectStaysRect() == gRectStaysRectSamples[i].mStaysRect); 93 } 94 } 95} 96 97#include "TestClassDef.h" 98DEFINE_TESTCLASS("Matrix", MatrixTestClass, TestMatrix) 99