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;
     }