aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar vollick@chromium.org <vollick@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-11-14 21:33:55 +0000
committerGravatar vollick@chromium.org <vollick@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-11-14 21:33:55 +0000
commit9b21c25e742d6a8b69bee8b049e79877f93b5936 (patch)
tree2bf4ad739aa9646c60bba74ff6e880b5d60add42
parent57cff8dbdfb32b3fea426519a4fdc05f13be69d9 (diff)
Add SkMatrix44::setTranspose
It turned out that adding getDouble(...) and setDouble(...) made this change easier, so I've included that in this cl as well. Review URL: https://codereview.appspot.com/6845048 git-svn-id: http://skia.googlecode.com/svn/trunk@6424 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--include/utils/SkMatrix44.h10
-rw-r--r--src/utils/SkMatrix44.cpp11
-rw-r--r--tests/Matrix44Test.cpp31
3 files changed, 52 insertions, 0 deletions
diff --git a/include/utils/SkMatrix44.h b/include/utils/SkMatrix44.h
index 97faf783f4..a046a079df 100644
--- a/include/utils/SkMatrix44.h
+++ b/include/utils/SkMatrix44.h
@@ -119,6 +119,13 @@ public:
SkMScalar get(int row, int col) const;
void set(int row, int col, const SkMScalar& value);
+ double getDouble(int row, int col) const {
+ return SkMScalarToDouble(this->get(row, col));
+ }
+ void setDouble(int row, int col, double value) {
+ this->set(row, col, SkDoubleToMScalar(value));
+ }
+
void asColMajorf(float[]) const;
void asColMajord(double[]) const;
void asRowMajorf(float[]) const;
@@ -183,6 +190,9 @@ public:
*/
bool invert(SkMatrix44* inverse) const;
+ /** Transpose this matrix in place. */
+ void transpose();
+
/** Apply the matrix to the src vector, returning the new vector in dst.
It is legal for src and dst to point to the same memory.
*/
diff --git a/src/utils/SkMatrix44.cpp b/src/utils/SkMatrix44.cpp
index abef0b33bb..0e7ad167c2 100644
--- a/src/utils/SkMatrix44.cpp
+++ b/src/utils/SkMatrix44.cpp
@@ -323,6 +323,17 @@ bool SkMatrix44::invert(SkMatrix44* inverse) const {
///////////////////////////////////////////////////////////////////////////////
+void SkMatrix44::transpose() {
+ SkTSwap(fMat[0][1], fMat[1][0]);
+ SkTSwap(fMat[0][2], fMat[2][0]);
+ SkTSwap(fMat[0][3], fMat[3][0]);
+ SkTSwap(fMat[1][2], fMat[2][1]);
+ SkTSwap(fMat[1][3], fMat[3][1]);
+ SkTSwap(fMat[2][3], fMat[3][2]);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
void SkMatrix44::mapScalars(const SkScalar src[4], SkScalar dst[4]) const {
SkScalar result[4];
for (int i = 0; i < 4; i++) {
diff --git a/tests/Matrix44Test.cpp b/tests/Matrix44Test.cpp
index af10e00d71..782b51e0bf 100644
--- a/tests/Matrix44Test.cpp
+++ b/tests/Matrix44Test.cpp
@@ -147,6 +147,35 @@ static void test_determinant(skiatest::Reporter* reporter) {
REPORTER_ASSERT(reporter, nearly_equal_double(0, e.determinant()));
}
+static void test_transpose(skiatest::Reporter* reporter) {
+ SkMatrix44 a;
+ SkMatrix44 b;
+
+ int i = 0;
+ for (int row = 0; row < 4; ++row) {
+ for (int col = 0; col < 4; ++col) {
+ a.setDouble(row, col, i);
+ b.setDouble(col, row, i++);
+ }
+ }
+
+ a.transpose();
+ REPORTER_ASSERT(reporter, nearly_equal(a, b));
+}
+
+static void test_get_set_double(skiatest::Reporter* reporter) {
+ SkMatrix44 a;
+ for (int row = 0; row < 4; ++row) {
+ for (int col = 0; col < 4; ++col) {
+ a.setDouble(row, col, 3.141592653589793);
+ REPORTER_ASSERT(reporter, nearly_equal_double(3.141592653589793,
+ a.getDouble(row, col)));
+ a.setDouble(row, col, 0);
+ REPORTER_ASSERT(reporter, nearly_equal_double(0, a.getDouble(row, col)));
+ }
+ }
+}
+
static void TestMatrix44(skiatest::Reporter* reporter) {
#ifdef SK_SCALAR_IS_FLOAT
SkMatrix44 mat, inverse, iden1, iden2, rot;
@@ -217,6 +246,8 @@ static void TestMatrix44(skiatest::Reporter* reporter) {
}
test_determinant(reporter);
+ test_transpose(reporter);
+ test_get_set_double(reporter);
#endif
}