125002a94c
git-svn-id: http://skia.googlecode.com/svn/trunk@1559 2bbb7eff-a529-9590-31e7-b0007b416f81
71 lines
2.1 KiB
C++
71 lines
2.1 KiB
C++
#include "Test.h"
|
|
#include "SkMatrix44.h"
|
|
|
|
static bool nearly_equal_scalar(SkScalar a, SkScalar b) {
|
|
// Note that we get more compounded error for multiple operations when
|
|
// SK_SCALAR_IS_FIXED.
|
|
#ifdef SK_SCALAR_IS_FLOAT
|
|
const SkScalar tolerance = SK_Scalar1 / 200000;
|
|
#else
|
|
const SkScalar tolerance = SK_Scalar1 / 1024;
|
|
#endif
|
|
|
|
return SkScalarAbs(a - b) <= tolerance;
|
|
}
|
|
|
|
static bool nearly_equal(const SkMatrix44& a, const SkMatrix44& b) {
|
|
for (int i = 0; i < 4; ++i) {
|
|
for (int j = 0; j < 4; ++j) {
|
|
if (!nearly_equal_scalar(a.get(i, j), b.get(i, j))) {
|
|
printf("not equal %g %g\n", (float)a.get(i, j), (float)b.get(i, j));
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static bool is_identity(const SkMatrix44& m) {
|
|
SkMatrix44 identity;
|
|
identity.reset();
|
|
return nearly_equal(m, identity);
|
|
}
|
|
|
|
|
|
void TestMatrix44(skiatest::Reporter* reporter) {
|
|
SkMatrix44 mat, inverse, iden1, iden2, rot;
|
|
|
|
mat.reset();
|
|
mat.setTranslate(SK_Scalar1, SK_Scalar1, SK_Scalar1);
|
|
mat.invert(&inverse);
|
|
iden1.setConcat(mat, inverse);
|
|
REPORTER_ASSERT(reporter, is_identity(iden1));
|
|
|
|
mat.setScale(SkIntToScalar(2), SkIntToScalar(2), SkIntToScalar(2));
|
|
mat.invert(&inverse);
|
|
iden1.setConcat(mat, inverse);
|
|
REPORTER_ASSERT(reporter, is_identity(iden1));
|
|
|
|
mat.setScale(SK_Scalar1/2, SK_Scalar1/2, SK_Scalar1/2);
|
|
mat.invert(&inverse);
|
|
iden1.setConcat(mat, inverse);
|
|
REPORTER_ASSERT(reporter, is_identity(iden1));
|
|
|
|
mat.setScale(SkIntToScalar(3), SkIntToScalar(5), SkIntToScalar(20));
|
|
rot.setRotateDegreesAbout(
|
|
SkIntToScalar(0),
|
|
SkIntToScalar(0),
|
|
SkIntToScalar(-1),
|
|
SkIntToScalar(90));
|
|
mat.postConcat(rot);
|
|
REPORTER_ASSERT(reporter, mat.invert(NULL));
|
|
mat.invert(&inverse);
|
|
iden1.setConcat(mat, inverse);
|
|
REPORTER_ASSERT(reporter, is_identity(iden1));
|
|
iden2.setConcat(inverse, mat);
|
|
REPORTER_ASSERT(reporter, is_identity(iden2));
|
|
}
|
|
|
|
#include "TestClassDef.h"
|
|
DEFINE_TESTCLASS("Matrix44", Matrix44TestClass, TestMatrix44)
|