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