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