void SkMatrix44::asRowMajord(double dst[]) const { const SkMScalar* src = &fMat[0][0]; for (int i = 0; i < 4; ++i) { dst[0] = SkMScalarToDouble(src[0]); dst[4] = SkMScalarToDouble(src[1]); dst[8] = SkMScalarToDouble(src[2]); dst[12] = SkMScalarToDouble(src[3]); src += 4; dst += 1; } }
void SkMatrix44::setRowMajord(const double src[]) { SkMScalar* dst = &fMat[0][0]; for (int i = 0; i < 4; ++i) { dst[0] = SkMScalarToDouble(src[0]); dst[4] = SkMScalarToDouble(src[1]); dst[8] = SkMScalarToDouble(src[2]); dst[12] = SkMScalarToDouble(src[3]); src += 4; dst += 1; } }
void SkMatrix44::asColMajord(double dst[]) const { const SkMScalar* src = &fMat[0][0]; #ifdef SK_MSCALAR_IS_DOUBLE memcpy(dst, src, 16 * sizeof(double)); #else for (int i = 0; i < 16; ++i) { dst[i] = SkMScalarToDouble(src[i]); } #endif }
void SkMatrix44::setColMajord(const double src[]) { SkMScalar* dst = &fMat[0][0]; #ifdef SK_MSCALAR_IS_DOUBLE memcpy(dst, src, 16 * sizeof(double)); #elif defined SK_MSCALAR_IS_FLOAT for (int i = 0; i < 16; ++i) { dst[i] = SkMScalarToDouble(src[i]); } #endif }
void SkMatrix44::setConcat(const SkMatrix44& a, const SkMatrix44& b) { SkMScalar result[4][4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { double value = 0; for (int k = 0; k < 4; k++) { value += SkMScalarToDouble(a.fMat[k][i]) * b.fMat[j][k]; } result[j][i] = SkDoubleToMScalar(value); } } memcpy(fMat, result, sizeof(result)); }