Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(673)

Unified Diff: src/utils/SkMatrix44.cpp

Issue 22904003: Make SkMatrix44::invert() check for finite 1/det instead of magic value (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Shrink range of one matrix test to pass is_identity() check on i386-linux Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tests/Matrix44Test.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/utils/SkMatrix44.cpp
diff --git a/src/utils/SkMatrix44.cpp b/src/utils/SkMatrix44.cpp
index 92c8715faaec94972770f8db05b372c1245366a8..9ceecbdf2a95935b3a9535188dd3937115a8f574 100644
--- a/src/utils/SkMatrix44.cpp
+++ b/src/utils/SkMatrix44.cpp
@@ -529,13 +529,16 @@ bool SkMatrix44::invert(SkMatrix44* inverse) const {
// Calculate the determinant
double det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
- if (dabs(det) < TOO_SMALL_FOR_DETERMINANT) {
+ double invdet = 1.0 / det;
+ // If det is zero, we want to return false. However, we also want to return false
+ // if 1/det overflows to infinity (i.e. det is denormalized). Both of these are
+ // handled by checking that 1/det is finite.
+ if (!sk_float_isfinite(invdet)) {
return false;
}
if (NULL == inverse) {
return true;
}
- double invdet = 1.0 / det;
b00 *= invdet;
b01 *= invdet;
@@ -568,7 +571,6 @@ bool SkMatrix44::invert(SkMatrix44* inverse) const {
inverse->fMat[3][3] = SkDoubleToMScalar(a20 * b03 - a21 * b01 + a22 * b00);
inverse->dirtyTypeMask();
- inverse->dirtyTypeMask();
return true;
}
« no previous file with comments | « no previous file | tests/Matrix44Test.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698