From f8b1ebc35b6872c2805a22481b7c23b85486fb46 Mon Sep 17 00:00:00 2001 From: "mike@reedtribe.org" Date: Mon, 10 Dec 2012 03:27:47 +0000 Subject: [PATCH] add helpers for isTranslate and isScaleTranslate special-case determinant for isScaleTranslate git-svn-id: http://skia.googlecode.com/svn/trunk@6725 2bbb7eff-a529-9590-31e7-b0007b416f81 --- include/utils/SkMatrix44.h | 19 ++++++++++++++++++- src/utils/SkMatrix44.cpp | 19 +++++++++++-------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/include/utils/SkMatrix44.h b/include/utils/SkMatrix44.h index 2e1872e644..af61a11c68 100644 --- a/include/utils/SkMatrix44.h +++ b/include/utils/SkMatrix44.h @@ -150,8 +150,25 @@ public: return (TypeMask)fTypeMask; } + /** + * Return true if the matrix is identity. + */ inline bool isIdentity() const { - return 0 == this->getType(); + return kIdentity_Mask == this->getType(); + } + + /** + * Return true if the matrix contains translate or is identity. + */ + inline bool isTranslate() const { + return !(this->getType() & ~kTranslate_Mask); + } + + /** + * Return true if the matrix only contains scale or translate or is identity. + */ + inline bool isScaleTranslate() const { + return !(this->getType() & ~(kScale_Mask | kTranslate_Mask)); } void setIdentity(); diff --git a/src/utils/SkMatrix44.cpp b/src/utils/SkMatrix44.cpp index 1c9fd845fb..f76f405c07 100644 --- a/src/utils/SkMatrix44.cpp +++ b/src/utils/SkMatrix44.cpp @@ -411,6 +411,13 @@ static inline double det3x3(double m00, double m01, double m02, promoting our SkMScalar values to double (if needed). */ double SkMatrix44::determinant() const { + if (this->isIdentity()) { + return 1; + } + if (this->isScaleTranslate()) { + return fMat[0][0] * fMat[1][1] * fMat[2][2] * fMat[3][3]; + } + return fMat[0][0] * det3x3(fMat[1][1], fMat[1][2], fMat[1][3], fMat[2][1], fMat[2][2], fMat[2][3], fMat[3][1], fMat[3][2], fMat[3][3]) - @@ -438,23 +445,19 @@ static inline double dabs(double x) { } bool SkMatrix44::invert(SkMatrix44* inverse) const { - const SkMatrix44::TypeMask mask = this->getType(); - - if (kIdentity_Mask == mask) { + if (this->isIdentity()) { if (inverse) { *inverse = *this; return true; } } - - if (kTranslate_Mask == mask) { + if (this->isTranslate()) { if (inverse) { inverse->setTranslate(-fMat[3][0], -fMat[3][1], -fMat[3][2]); } return true; } - - if (bits_isonly(mask, kScale_Mask | kTranslate_Mask)) { + if (this->isScaleTranslate()) { if (0 == fMat[0][0] * fMat[1][1] * fMat[2][2]) { return false; } @@ -470,7 +473,7 @@ bool SkMatrix44::invert(SkMatrix44* inverse) const { inverse->fMat[2][2] = 1 / fMat[2][2]; inverse->fMat[3][3] = 1; - inverse->setTypeMask(mask); + inverse->setTypeMask(this->getType()); } return true; }