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
diff --git a/include/utils/SkMatrix44.h b/include/utils/SkMatrix44.h
index 2e1872e..af61a11 100644
--- a/include/utils/SkMatrix44.h
+++ b/include/utils/SkMatrix44.h
@@ -150,8 +150,25 @@
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 1c9fd84..f76f405 100644
--- a/src/utils/SkMatrix44.cpp
+++ b/src/utils/SkMatrix44.cpp
@@ -411,6 +411,13 @@
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 @@
}
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 @@
inverse->fMat[2][2] = 1 / fMat[2][2];
inverse->fMat[3][3] = 1;
- inverse->setTypeMask(mask);
+ inverse->setTypeMask(this->getType());
}
return true;
}