add new experimental matrix
authorreed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 27 Jan 2010 01:45:16 +0000 (01:45 +0000)
committerreed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 27 Jan 2010 01:45:16 +0000 (01:45 +0000)
git-svn-id: http://skia.googlecode.com/svn/trunk@483 2bbb7eff-a529-9590-31e7-b0007b416f81

experimental/SkMatrix44.cpp [new file with mode: 0644]

diff --git a/experimental/SkMatrix44.cpp b/experimental/SkMatrix44.cpp
new file mode 100644 (file)
index 0000000..bbc5002
--- /dev/null
@@ -0,0 +1,99 @@
+\r
+typedef float SkMScalar;\r
+static const SkMScalar SK_MScalar1 = 1;\r
+\r
+struct SkVector4 {\r
+       SkScalar fData[4];\r
+};\r
+\r
+class SkMatrix44 {\r
+public:\r
+       SkMatrix44();\r
+       explicit SkMatrix44(const SkMatrix44&);\r
+       SkMatrix44(const SkMatrix44& a, const SkMatrix44& b);\r
+\r
+       void setIdentity();\r
+       void setTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz);\r
+       void preTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz);\r
+       void postTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz);\r
+       void setConcat(const SkMatrix44& a, const SkMatrix44& b);\r
+\r
+       void map(const SkScalar src[4], SkScalar dst[4]);\r
+\r
+       SkVector4 operator*(const SkVector4& src) {\r
+               SkVector4 dst;\r
+               this->map(src.fData, dst.fData);\r
+               return dst;\r
+       }\r
+\r
+       friend SkMatrix44* operator*(const SkMatrix44& a, const SkMatrix44& b) {\r
+               return SkMatrix(a, b);\r
+       }\r
+\r
+private:\r
+       SkMScalar fMat[4][4];\r
+};\r
+\r
+SkMatrix44::SkMatrix44() {\r
+       this->setIdentity();\r
+}\r
+\r
+SkMatrix44::SkMatrix44(const SkMatrix44& src) {\r
+       memcpy(this, &src, sizeof(src));\r
+}\r
+\r
+SkMatrix44::SkMatrix44(const SkMatrix44& a, const SkMatrix44& b) {\r
+       this->setConcat(a, b);\r
+}\r
+\r
+void SkMatrix44:setIdentity() {\r
+       sk_bzero(fMat, sizeof(fMat));\r
+       fMat[0][0] = fMat[1][1] = fMat[2][2] = fMat[3][3] = SK_MScalar1;\r
+}\r
+\r
+void SkMatrix44::setTranslate(SkMScalar tx, SkMScalar ty, SkMScalar tz) {\r
+       sk_bzero(fMat, sizeof(fMat));\r
+       fMat[3][0] = tx;\r
+       fMat[3][1] = ty;\r
+       fMat[3][2] = tz;\r
+       fMat[3][3] = SK_MScalar1;\r
+}\r
+\r
+void SkMatrix44::preTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz) {\r
+       SkMatrix44 mat;\r
+       mat.setTranslate(dx, dy, dz);\r
+       this->preConcat(mat);\r
+}\r
+\r
+void SkMatrix44::postTranslate(SkMScalar dx, SkMScalar dy, SkMScalar dz) {\r
+       fMat[3][0] += dx;\r
+       fMat[3][1] += dy;\r
+       fMat[3][2] += dz;\r
+}\r
+\r
+void SkMatrix44::map(const SkScalar src[4], SkScalar dst[4]) {\r
+       SkScalar result[4];\r
+       for (int i = 0; i < 4; i++) {\r
+               SkMScalar value = 0;\r
+               for (int j = 0; j < 4; j++) {\r
+                       value += fMat[j][i] * src[j];\r
+               }\r
+               result[i] = value;\r
+       }\r
+       memcpy(dst, result, sizeof(result));\r
+}\r
+\r
+void SkMatrix44::setConcat(const SkMatrix44& a, const SkMatrix44& b) {\r
+       SkMScalar result[4][4];\r
+       for (int i = 0; i < 4; i++) {\r
+               for (int j = 0; j < 4; j++) {\r
+                       SkMScalar value = 0;\r
+                       for (int k = 0; k < 4; k++) {\r
+                               value += a.fMat[k][j] * b.fMat[i][k];\r
+                       }\r
+                       result[j][i] = value;\r
+               }\r
+       }\r
+       memcpy(fMat, result, sizeof(result));\r
+}\r
+\r