MatrixTest.cpp revision 889bd8bd7f604acae0a6303365bc82c06da1e6f3
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "Test.h" 9889bd8bd7f604acae0a6303365bc82c06da1e6f3tomhudson@google.com#include "SkMath.h" 10ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#include "SkMatrix.h" 11383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com#include "SkRandom.h" 12ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 13ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comstatic bool nearly_equal_scalar(SkScalar a, SkScalar b) { 142047f00e4698f83499ab91911999a65c21a951c9epoger@google.com // Note that we get more compounded error for multiple operations when 152047f00e4698f83499ab91911999a65c21a951c9epoger@google.com // SK_SCALAR_IS_FIXED. 16ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#ifdef SK_SCALAR_IS_FLOAT 172047f00e4698f83499ab91911999a65c21a951c9epoger@google.com const SkScalar tolerance = SK_Scalar1 / 200000; 18ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#else 192047f00e4698f83499ab91911999a65c21a951c9epoger@google.com const SkScalar tolerance = SK_Scalar1 / 1024; 20ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com#endif 21ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 22ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com return SkScalarAbs(a - b) <= tolerance; 23ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com} 24ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 25ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comstatic bool nearly_equal(const SkMatrix& a, const SkMatrix& b) { 26ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com for (int i = 0; i < 9; i++) { 27ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com if (!nearly_equal_scalar(a[i], b[i])) { 28d41344553163085bfcfaf7d5882c6028934f8e3breed@android.com printf("not equal %g %g\n", (float)a[i], (float)b[i]); 29ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com return false; 30ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com } 31ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com } 32ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com return true; 33ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com} 34ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 35ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comstatic bool is_identity(const SkMatrix& m) { 36ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com SkMatrix identity; 3780e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com identity.reset(); 38ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com return nearly_equal(m, identity); 39ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com} 40ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 414b7577b042966657c776fd95c67f9363af57945freed@android.comstatic void test_flatten(skiatest::Reporter* reporter, const SkMatrix& m) { 424b7577b042966657c776fd95c67f9363af57945freed@android.com // add 100 in case we have a bug, I don't want to kill my stack in the test 434b7577b042966657c776fd95c67f9363af57945freed@android.com char buffer[SkMatrix::kMaxFlattenSize + 100]; 444b7577b042966657c776fd95c67f9363af57945freed@android.com uint32_t size1 = m.flatten(NULL); 454b7577b042966657c776fd95c67f9363af57945freed@android.com uint32_t size2 = m.flatten(buffer); 464b7577b042966657c776fd95c67f9363af57945freed@android.com REPORTER_ASSERT(reporter, size1 == size2); 474b7577b042966657c776fd95c67f9363af57945freed@android.com REPORTER_ASSERT(reporter, size1 <= SkMatrix::kMaxFlattenSize); 484b7577b042966657c776fd95c67f9363af57945freed@android.com 494b7577b042966657c776fd95c67f9363af57945freed@android.com SkMatrix m2; 504b7577b042966657c776fd95c67f9363af57945freed@android.com uint32_t size3 = m2.unflatten(buffer); 514b7577b042966657c776fd95c67f9363af57945freed@android.com REPORTER_ASSERT(reporter, size1 == size2); 524b7577b042966657c776fd95c67f9363af57945freed@android.com REPORTER_ASSERT(reporter, m == m2); 534b7577b042966657c776fd95c67f9363af57945freed@android.com 544b7577b042966657c776fd95c67f9363af57945freed@android.com char buffer2[SkMatrix::kMaxFlattenSize + 100]; 554b7577b042966657c776fd95c67f9363af57945freed@android.com size3 = m2.flatten(buffer2); 564b7577b042966657c776fd95c67f9363af57945freed@android.com REPORTER_ASSERT(reporter, size1 == size2); 574b7577b042966657c776fd95c67f9363af57945freed@android.com REPORTER_ASSERT(reporter, memcmp(buffer, buffer2, size1) == 0); 584b7577b042966657c776fd95c67f9363af57945freed@android.com} 594b7577b042966657c776fd95c67f9363af57945freed@android.com 60383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.comvoid test_matrix_max_stretch(skiatest::Reporter* reporter) { 61383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkMatrix identity; 62383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com identity.reset(); 63383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, SK_Scalar1 == identity.getMaxStretch()); 64383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 65383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkMatrix scale; 66383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com scale.setScale(SK_Scalar1 * 2, SK_Scalar1 * 4); 67383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, SK_Scalar1 * 4 == scale.getMaxStretch()); 68383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 69383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkMatrix rot90Scale; 70383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com rot90Scale.setRotate(90 * SK_Scalar1); 71383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com rot90Scale.postScale(SK_Scalar1 / 4, SK_Scalar1 / 2); 72383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, SK_Scalar1 / 2 == rot90Scale.getMaxStretch()); 73383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 74383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkMatrix rotate; 75383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com rotate.setRotate(128 * SK_Scalar1); 76383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, SkScalarAbs(SK_Scalar1 - rotate.getMaxStretch()) <= SK_ScalarNearlyZero); 77383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 78383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkMatrix translate; 79383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com translate.setTranslate(10 * SK_Scalar1, -5 * SK_Scalar1); 80383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, SK_Scalar1 == translate.getMaxStretch()); 81383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 82383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkMatrix perspX; 83383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com perspX.reset(); 84383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com perspX.setPerspX(SK_Scalar1 / 1000); 85383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMaxStretch()); 86383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 87383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkMatrix perspY; 88383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com perspY.reset(); 89383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com perspY.setPerspX(-SK_Scalar1 / 500); 90383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMaxStretch()); 91383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 92383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkMatrix baseMats[] = {scale, rot90Scale, rotate, 93383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com translate, perspX, perspY}; 94383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkMatrix mats[2*SK_ARRAY_COUNT(baseMats)]; 95383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com for (int i = 0; i < SK_ARRAY_COUNT(baseMats); ++i) { 96383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com mats[i] = baseMats[i]; 97383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com bool invertable = mats[i].invert(&mats[i + SK_ARRAY_COUNT(baseMats)]); 98383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, invertable); 99383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com } 100383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkRandom rand; 101383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com for (int m = 0; m < 1000; ++m) { 102383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkMatrix mat; 103383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com mat.reset(); 104383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com for (int i = 0; i < 4; ++i) { 105383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com int x = rand.nextU() % SK_ARRAY_COUNT(mats); 106383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com mat.postConcat(mats[x]); 107383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com } 108383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkScalar stretch = mat.getMaxStretch(); 109383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 110383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com if ((stretch < 0) != mat.hasPerspective()) { 111383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com stretch = mat.getMaxStretch(); 112383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com } 113383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 114383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, (stretch < 0) == mat.hasPerspective()); 115383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 116383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com if (mat.hasPerspective()) { 117383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com m -= 1; // try another non-persp matrix 118383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com continue; 119383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com } 120383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 121383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com // test a bunch of vectors. None should be scaled by more than stretch 122383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com // (modulo some error) and we should find a vector that is scaled by 123383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com // almost stretch. 124383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com static const SkScalar gStretchTol = (105 * SK_Scalar1) / 100; 125383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com static const SkScalar gMaxStretchTol = (97 * SK_Scalar1) / 100; 126383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkScalar max = 0; 127383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkVector vectors[1000]; 128383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com for (int i = 0; i < SK_ARRAY_COUNT(vectors); ++i) { 129383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com vectors[i].fX = rand.nextSScalar1(); 130383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com vectors[i].fY = rand.nextSScalar1(); 131383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com if (!vectors[i].normalize()) { 132383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com i -= 1; 133383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com continue; 134383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com } 135383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com } 136383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com mat.mapVectors(vectors, SK_ARRAY_COUNT(vectors)); 137383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com for (int i = 0; i < SK_ARRAY_COUNT(vectors); ++i) { 138383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com SkScalar d = vectors[i].length(); 139383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, SkScalarDiv(d, stretch) < gStretchTol); 140383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com if (max < d) { 141383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com max = d; 142383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com } 143383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com } 144383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com REPORTER_ASSERT(reporter, SkScalarDiv(max, stretch) >= gMaxStretchTol); 145383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com } 146383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com} 147383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 148ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.comvoid TestMatrix(skiatest::Reporter* reporter) { 149ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com SkMatrix mat, inverse, iden1, iden2; 150ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 151ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com mat.reset(); 152ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com mat.setTranslate(SK_Scalar1, SK_Scalar1); 153ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com mat.invert(&inverse); 154ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com iden1.setConcat(mat, inverse); 155ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com REPORTER_ASSERT(reporter, is_identity(iden1)); 156ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 157ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com mat.setScale(SkIntToScalar(2), SkIntToScalar(2)); 158ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com mat.invert(&inverse); 159ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com iden1.setConcat(mat, inverse); 160ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com REPORTER_ASSERT(reporter, is_identity(iden1)); 1614b7577b042966657c776fd95c67f9363af57945freed@android.com test_flatten(reporter, mat); 162ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 163ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com mat.setScale(SK_Scalar1/2, SK_Scalar1/2); 164ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com mat.invert(&inverse); 165ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com iden1.setConcat(mat, inverse); 166ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com REPORTER_ASSERT(reporter, is_identity(iden1)); 1674b7577b042966657c776fd95c67f9363af57945freed@android.com test_flatten(reporter, mat); 168ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 169ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com mat.setScale(SkIntToScalar(3), SkIntToScalar(5), SkIntToScalar(20), 0); 170ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com mat.postRotate(SkIntToScalar(25)); 171ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com REPORTER_ASSERT(reporter, mat.invert(NULL)); 172ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com mat.invert(&inverse); 173ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com iden1.setConcat(mat, inverse); 174ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com REPORTER_ASSERT(reporter, is_identity(iden1)); 175ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com iden2.setConcat(inverse, mat); 176ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com REPORTER_ASSERT(reporter, is_identity(iden2)); 1774b7577b042966657c776fd95c67f9363af57945freed@android.com test_flatten(reporter, mat); 1784b7577b042966657c776fd95c67f9363af57945freed@android.com test_flatten(reporter, iden2); 17980e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 180ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com // rectStaysRect test 181ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { 182ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com static const struct { 183ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com SkScalar m00, m01, m10, m11; 184ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com bool mStaysRect; 185ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com } 186ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com gRectStaysRectSamples[] = { 187ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { 0, 0, 0, 0, false }, 188ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { 0, 0, 0, SK_Scalar1, false }, 189ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { 0, 0, SK_Scalar1, 0, false }, 190ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { 0, 0, SK_Scalar1, SK_Scalar1, false }, 191ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { 0, SK_Scalar1, 0, 0, false }, 192ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { 0, SK_Scalar1, 0, SK_Scalar1, false }, 193ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { 0, SK_Scalar1, SK_Scalar1, 0, true }, 194ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { 0, SK_Scalar1, SK_Scalar1, SK_Scalar1, false }, 195ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { SK_Scalar1, 0, 0, 0, false }, 196ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { SK_Scalar1, 0, 0, SK_Scalar1, true }, 197ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { SK_Scalar1, 0, SK_Scalar1, 0, false }, 198ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { SK_Scalar1, 0, SK_Scalar1, SK_Scalar1, false }, 199ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { SK_Scalar1, SK_Scalar1, 0, 0, false }, 200ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { SK_Scalar1, SK_Scalar1, 0, SK_Scalar1, false }, 201ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { SK_Scalar1, SK_Scalar1, SK_Scalar1, 0, false }, 202ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com { SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, false } 203ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com }; 20480e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 205ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRectStaysRectSamples); i++) { 206ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com SkMatrix m; 20780e39a77b16f4396eed230efea1d0b2fc8cbfb00reed@android.com 208ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com m.reset(); 209ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com m.set(SkMatrix::kMScaleX, gRectStaysRectSamples[i].m00); 210ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com m.set(SkMatrix::kMSkewX, gRectStaysRectSamples[i].m01); 211ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com m.set(SkMatrix::kMSkewY, gRectStaysRectSamples[i].m10); 212ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com m.set(SkMatrix::kMScaleY, gRectStaysRectSamples[i].m11); 213ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com REPORTER_ASSERT(reporter, 214ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com m.rectStaysRect() == gRectStaysRectSamples[i].mStaysRect); 215ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com } 216ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com } 2171ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com 218ba7983e55ce15ddcd5534011935178760164fb9dbungeman@google.com mat.reset(); 2191ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com mat.set(SkMatrix::kMScaleX, SkIntToScalar(1)); 2201ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com mat.set(SkMatrix::kMSkewX, SkIntToScalar(2)); 2211ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com mat.set(SkMatrix::kMTransX, SkIntToScalar(3)); 2221ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com mat.set(SkMatrix::kMSkewY, SkIntToScalar(4)); 2231ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com mat.set(SkMatrix::kMScaleY, SkIntToScalar(5)); 2241ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com mat.set(SkMatrix::kMTransY, SkIntToScalar(6)); 2251ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com SkScalar affine[6]; 2261ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com REPORTER_ASSERT(reporter, mat.asAffine(affine)); 2271ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com 2281ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com #define affineEqual(e) affine[SkMatrix::kA##e] == mat.get(SkMatrix::kM##e) 2291ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com REPORTER_ASSERT(reporter, affineEqual(ScaleX)); 2301ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com REPORTER_ASSERT(reporter, affineEqual(SkewY)); 2311ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com REPORTER_ASSERT(reporter, affineEqual(SkewX)); 2321ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com REPORTER_ASSERT(reporter, affineEqual(ScaleY)); 2331ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com REPORTER_ASSERT(reporter, affineEqual(TransX)); 2341ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com REPORTER_ASSERT(reporter, affineEqual(TransY)); 2351ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com #undef affineEqual 2361ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com 2371ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com mat.set(SkMatrix::kMPersp1, SkIntToScalar(1)); 2381ddd7c39289b7dd18537fdac4b630e378cd78842bungeman@google.com REPORTER_ASSERT(reporter, !mat.asAffine(affine)); 239383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com 240383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com test_matrix_max_stretch(reporter); 241ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com} 242ed673310e2551e64d8196f7776d7d4c92085f8c2reed@android.com 243d8730ea8b25d692c0656f8cf03f02aecfab2a17creed@android.com#include "TestClassDef.h" 244d8730ea8b25d692c0656f8cf03f02aecfab2a17creed@android.comDEFINE_TESTCLASS("Matrix", MatrixTestClass, TestMatrix) 245