blob: 68e587bd49e9edfdc2567af25f40a4d04beb7d3b [file] [log] [blame]
reed@android.comed673312009-02-27 16:24:51 +00001#include "Test.h"
2#include "SkMatrix.h"
3
4static bool nearly_equal_scalar(SkScalar a, SkScalar b) {
5#ifdef SK_SCALAR_IS_FLOAT
6 const float tolerance = 0.000005f;
7#else
8 const int32_t tolerance = 3;
9#endif
10
11 return SkScalarAbs(a - b) <= tolerance;
12}
13
14static bool nearly_equal(const SkMatrix& a, const SkMatrix& b) {
15 for (int i = 0; i < 9; i++) {
16 if (!nearly_equal_scalar(a[i], b[i])) {
17 printf("not equal %g %g\n", a[i], b[i]);
18 return false;
19 }
20 }
21 return true;
22}
23
24static bool is_identity(const SkMatrix& m) {
25 SkMatrix identity;
reed@android.com80e39a72009-04-02 16:59:40 +000026 identity.reset();
reed@android.comed673312009-02-27 16:24:51 +000027 return nearly_equal(m, identity);
28}
29
30void TestMatrix(skiatest::Reporter* reporter) {
31 SkMatrix mat, inverse, iden1, iden2;
32
33 mat.reset();
34 mat.setTranslate(SK_Scalar1, SK_Scalar1);
35 mat.invert(&inverse);
36 iden1.setConcat(mat, inverse);
37 REPORTER_ASSERT(reporter, is_identity(iden1));
38
39 mat.setScale(SkIntToScalar(2), SkIntToScalar(2));
40 mat.invert(&inverse);
41 iden1.setConcat(mat, inverse);
42 REPORTER_ASSERT(reporter, is_identity(iden1));
43
44 mat.setScale(SK_Scalar1/2, SK_Scalar1/2);
45 mat.invert(&inverse);
46 iden1.setConcat(mat, inverse);
47 REPORTER_ASSERT(reporter, is_identity(iden1));
48
49 mat.setScale(SkIntToScalar(3), SkIntToScalar(5), SkIntToScalar(20), 0);
50 mat.postRotate(SkIntToScalar(25));
51 REPORTER_ASSERT(reporter, mat.invert(NULL));
52 mat.invert(&inverse);
53 iden1.setConcat(mat, inverse);
54 REPORTER_ASSERT(reporter, is_identity(iden1));
55 iden2.setConcat(inverse, mat);
56 REPORTER_ASSERT(reporter, is_identity(iden2));
reed@android.com80e39a72009-04-02 16:59:40 +000057
reed@android.comed673312009-02-27 16:24:51 +000058 // rectStaysRect test
59 {
60 static const struct {
61 SkScalar m00, m01, m10, m11;
62 bool mStaysRect;
63 }
64 gRectStaysRectSamples[] = {
65 { 0, 0, 0, 0, false },
66 { 0, 0, 0, SK_Scalar1, false },
67 { 0, 0, SK_Scalar1, 0, false },
68 { 0, 0, SK_Scalar1, SK_Scalar1, false },
69 { 0, SK_Scalar1, 0, 0, false },
70 { 0, SK_Scalar1, 0, SK_Scalar1, false },
71 { 0, SK_Scalar1, SK_Scalar1, 0, true },
72 { 0, SK_Scalar1, SK_Scalar1, SK_Scalar1, false },
73 { SK_Scalar1, 0, 0, 0, false },
74 { SK_Scalar1, 0, 0, SK_Scalar1, true },
75 { SK_Scalar1, 0, SK_Scalar1, 0, false },
76 { SK_Scalar1, 0, SK_Scalar1, SK_Scalar1, false },
77 { SK_Scalar1, SK_Scalar1, 0, 0, false },
78 { SK_Scalar1, SK_Scalar1, 0, SK_Scalar1, false },
79 { SK_Scalar1, SK_Scalar1, SK_Scalar1, 0, false },
80 { SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, false }
81 };
reed@android.com80e39a72009-04-02 16:59:40 +000082
reed@android.comed673312009-02-27 16:24:51 +000083 for (size_t i = 0; i < SK_ARRAY_COUNT(gRectStaysRectSamples); i++) {
84 SkMatrix m;
reed@android.com80e39a72009-04-02 16:59:40 +000085
reed@android.comed673312009-02-27 16:24:51 +000086 m.reset();
87 m.set(SkMatrix::kMScaleX, gRectStaysRectSamples[i].m00);
88 m.set(SkMatrix::kMSkewX, gRectStaysRectSamples[i].m01);
89 m.set(SkMatrix::kMSkewY, gRectStaysRectSamples[i].m10);
90 m.set(SkMatrix::kMScaleY, gRectStaysRectSamples[i].m11);
91 REPORTER_ASSERT(reporter,
92 m.rectStaysRect() == gRectStaysRectSamples[i].mStaysRect);
93 }
94 }
95}
96
reed@android.comd8730ea2009-02-27 22:06:06 +000097#include "TestClassDef.h"
98DEFINE_TESTCLASS("Matrix", MatrixTestClass, TestMatrix)