diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2012-02-14 23:11:09 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2012-02-15 18:19:54 +0100 |
commit | c77a54335307df40c686a914bba58695cf6b8001 (patch) | |
tree | fb78427c3cdb4ecf041d215fd353b3dbddcfd38b | |
parent | 47b48a9cb240b5b7a22418378eb5c53876157427 (diff) | |
download | mupdf-c77a54335307df40c686a914bba58695cf6b8001.tar.xz |
Check determinant before inverting a matrix to avoid division by zero.
-rw-r--r-- | fitz/base_geometry.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/fitz/base_geometry.c b/fitz/base_geometry.c index e8d9032f..fc5ce517 100644 --- a/fitz/base_geometry.c +++ b/fitz/base_geometry.c @@ -97,15 +97,20 @@ fz_translate(float tx, float ty) fz_matrix fz_invert_matrix(fz_matrix src) { - fz_matrix dst; - float rdet = 1 / (src.a * src.d - src.b * src.c); - dst.a = src.d * rdet; - dst.b = -src.b * rdet; - dst.c = -src.c * rdet; - dst.d = src.a * rdet; - dst.e = -src.e * dst.a - src.f * dst.c; - dst.f = -src.e * dst.b - src.f * dst.d; - return dst; + float det = src.a * src.d - src.b * src.c; + if (det < -FLT_EPSILON || det > FLT_EPSILON) + { + fz_matrix dst; + float rdet = 1 / det; + dst.a = src.d * rdet; + dst.b = -src.b * rdet; + dst.c = -src.c * rdet; + dst.d = src.a * rdet; + dst.e = -src.e * dst.a - src.f * dst.c; + dst.f = -src.e * dst.b - src.f * dst.d; + return dst; + } + return src; } int |