• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "Test.h"
2 #include "SkMatrix44.h"
3 
nearly_equal_scalar(SkScalar a,SkScalar b)4 static bool nearly_equal_scalar(SkScalar a, SkScalar b) {
5     // Note that we get more compounded error for multiple operations when
6     // SK_SCALAR_IS_FIXED.
7 #ifdef SK_SCALAR_IS_FLOAT
8     const SkScalar tolerance = SK_Scalar1 / 200000;
9 #else
10     const SkScalar tolerance = SK_Scalar1 / 1024;
11 #endif
12 
13     return SkScalarAbs(a - b) <= tolerance;
14 }
15 
nearly_equal(const SkMatrix44 & a,const SkMatrix44 & b)16 static bool nearly_equal(const SkMatrix44& a, const SkMatrix44& b) {
17     for (int i = 0; i < 4; ++i) {
18         for (int j = 0; j < 4; ++j) {
19             if (!nearly_equal_scalar(a.get(i, j), b.get(i, j))) {
20                 printf("not equal %g %g\n", (float)a.get(i, j), (float)b.get(i, j));
21                 return false;
22             }
23         }
24     }
25     return true;
26 }
27 
is_identity(const SkMatrix44 & m)28 static bool is_identity(const SkMatrix44& m) {
29     SkMatrix44 identity;
30     identity.reset();
31     return nearly_equal(m, identity);
32 }
33 
34 
TestMatrix44(skiatest::Reporter * reporter)35 void TestMatrix44(skiatest::Reporter* reporter) {
36     SkMatrix44 mat, inverse, iden1, iden2, rot;
37 
38     mat.reset();
39     mat.setTranslate(SK_Scalar1, SK_Scalar1, SK_Scalar1);
40     mat.invert(&inverse);
41     iden1.setConcat(mat, inverse);
42     REPORTER_ASSERT(reporter, is_identity(iden1));
43 
44     mat.setScale(SkIntToScalar(2), SkIntToScalar(2), SkIntToScalar(2));
45     mat.invert(&inverse);
46     iden1.setConcat(mat, inverse);
47     REPORTER_ASSERT(reporter, is_identity(iden1));
48 
49     mat.setScale(SK_Scalar1/2, SK_Scalar1/2, SK_Scalar1/2);
50     mat.invert(&inverse);
51     iden1.setConcat(mat, inverse);
52     REPORTER_ASSERT(reporter, is_identity(iden1));
53 
54     mat.setScale(SkIntToScalar(3), SkIntToScalar(5), SkIntToScalar(20));
55     rot.setRotateDegreesAbout(
56         SkIntToScalar(0),
57         SkIntToScalar(0),
58         SkIntToScalar(-1),
59         SkIntToScalar(90));
60     mat.postConcat(rot);
61     REPORTER_ASSERT(reporter, mat.invert(NULL));
62     mat.invert(&inverse);
63     iden1.setConcat(mat, inverse);
64     REPORTER_ASSERT(reporter, is_identity(iden1));
65     iden2.setConcat(inverse, mat);
66     REPORTER_ASSERT(reporter, is_identity(iden2));
67 }
68 
69 #include "TestClassDef.h"
70 DEFINE_TESTCLASS("Matrix44", Matrix44TestClass, TestMatrix44)
71