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