--- /dev/null
+\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