summaryrefslogtreecommitdiff
path: root/fitz
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2012-02-14 23:11:09 +0100
committerTor Andersson <tor.andersson@artifex.com>2012-02-15 18:19:54 +0100
commitc77a54335307df40c686a914bba58695cf6b8001 (patch)
treefb78427c3cdb4ecf041d215fd353b3dbddcfd38b /fitz
parent47b48a9cb240b5b7a22418378eb5c53876157427 (diff)
downloadmupdf-c77a54335307df40c686a914bba58695cf6b8001.tar.xz
Check determinant before inverting a matrix to avoid division by zero.
Diffstat (limited to 'fitz')
-rw-r--r--fitz/base_geometry.c23
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