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