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
This commit is contained in:
parent
c1f224ac07
commit
f8b1ebc35b
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user