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