From c77a54335307df40c686a914bba58695cf6b8001 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Tue, 14 Feb 2012 23:11:09 +0100 Subject: Check determinant before inverting a matrix to avoid division by zero. --- fitz/base_geometry.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'fitz') 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 -- cgit v1.2.3