diff options
author | 2012-12-05 22:13:59 +0000 | |
---|---|---|
committer | 2012-12-05 22:13:59 +0000 | |
commit | 99b5c7f94ba5ef0c9cb464e34834cd5adea37a0e (patch) | |
tree | bc8fbe0af0020dcf1439280e331e6e2e3ef3cff9 /tests | |
parent | 128db207aec5d85a7eac7dc1be9d5c83cecc7198 (diff) |
optimize translate and scale
add map2() to optimize for mapping an array of 2D points into homogeneous 4-vector
Review URL: https://codereview.appspot.com/6874064
git-svn-id: http://skia.googlecode.com/svn/trunk@6685 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Matrix44Test.cpp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/tests/Matrix44Test.cpp b/tests/Matrix44Test.cpp index 1220f262e0..1458dfefad 100644 --- a/tests/Matrix44Test.cpp +++ b/tests/Matrix44Test.cpp @@ -72,6 +72,112 @@ static bool is_identity(const SkMatrix44& m) { return nearly_equal(m, identity); } +/////////////////////////////////////////////////////////////////////////////// +static bool bits_isonly(int value, int mask) { + return 0 == (value & ~mask); +} + +static void test_translate(skiatest::Reporter* reporter) { + SkMatrix44 mat, inverse; + + mat.setTranslate(0, 0, 0); + REPORTER_ASSERT(reporter, bits_isonly(mat.getType(), SkMatrix44::kIdentity_Mask)); + mat.setTranslate(1, 2, 3); + REPORTER_ASSERT(reporter, bits_isonly(mat.getType(), SkMatrix44::kTranslate_Mask)); + REPORTER_ASSERT(reporter, mat.invert(&inverse)); + REPORTER_ASSERT(reporter, bits_isonly(inverse.getType(), SkMatrix44::kTranslate_Mask)); + + SkMatrix44 a, b, c; + a.set3x3(1, 2, 3, 4, 5, 6, 7, 8, 9); + b.setTranslate(10, 11, 12); + + c.setConcat(a, b); + mat = a; + mat.preTranslate(10, 11, 12); + REPORTER_ASSERT(reporter, mat == c); + + c.setConcat(b, a); + mat = a; + mat.postTranslate(10, 11, 12); + REPORTER_ASSERT(reporter, mat == c); +} + +static void test_scale(skiatest::Reporter* reporter) { + SkMatrix44 mat, inverse; + + mat.setScale(1, 1, 1); + REPORTER_ASSERT(reporter, bits_isonly(mat.getType(), SkMatrix44::kIdentity_Mask)); + mat.setScale(1, 2, 3); + REPORTER_ASSERT(reporter, bits_isonly(mat.getType(), SkMatrix44::kScale_Mask)); + REPORTER_ASSERT(reporter, mat.invert(&inverse)); + REPORTER_ASSERT(reporter, bits_isonly(inverse.getType(), SkMatrix44::kScale_Mask)); + + SkMatrix44 a, b, c; + a.set3x3(1, 2, 3, 4, 5, 6, 7, 8, 9); + b.setScale(10, 11, 12); + + c.setConcat(a, b); + mat = a; + mat.preScale(10, 11, 12); + REPORTER_ASSERT(reporter, mat == c); + + c.setConcat(b, a); + mat = a; + mat.postScale(10, 11, 12); + REPORTER_ASSERT(reporter, mat == c); +} + +static void make_i(SkMatrix44* mat) { mat->setIdentity(); } +static void make_t(SkMatrix44* mat) { mat->setTranslate(1, 2, 3); } +static void make_s(SkMatrix44* mat) { mat->setScale(1, 2, 3); } +static void make_st(SkMatrix44* mat) { + mat->setScale(1, 2, 3); + mat->postTranslate(1, 2, 3); +} +static void make_a(SkMatrix44* mat) { + mat->setRotateDegreesAbout(1, 2, 3, 45); +} +static void make_p(SkMatrix44* mat) { + SkMScalar data[] = { + 1, 2, 3, 4, 5, 6, 7, 8, + 1, 2, 3, 4, 5, 6, 7, 8, + }; + mat->setRowMajor(data); +} + +typedef void (*Make44Proc)(SkMatrix44*); + +static const Make44Proc gMakeProcs[] = { + make_i, make_t, make_s, make_st, make_a, make_p +}; + +static void test_map2(skiatest::Reporter* reporter, const SkMatrix44& mat) { + SkMScalar src2[] = { 1, 2 }; + SkMScalar src4[] = { src2[0], src2[1], 0, 1 }; + SkMScalar dstA[4], dstB[4]; + + for (int i = 0; i < 4; ++i) { + dstA[i] = 123456789; + dstB[i] = 987654321; + } + + mat.map2(src2, 1, dstA); + mat.mapMScalars(src4, dstB); + + for (int i = 0; i < 4; ++i) { + REPORTER_ASSERT(reporter, dstA[i] == dstB[i]); + } +} + +static void test_map2(skiatest::Reporter* reporter) { + SkMatrix44 mat; + + for (size_t i = 0; i < SK_ARRAY_COUNT(gMakeProcs); ++i) { + gMakeProcs[i](&mat); + test_map2(reporter, mat); + } +} + static void test_gettype(skiatest::Reporter* reporter) { SkMatrix44 matrix; @@ -295,6 +401,9 @@ static void TestMatrix44(skiatest::Reporter* reporter) { test_transpose(reporter); test_get_set_double(reporter); test_set_row_col_major(reporter); + test_translate(reporter); + test_scale(reporter); + test_map2(reporter); } #include "TestClassDef.h" |