[lasem/wip/emmanuel/extents] svg_matrix: add a is_invertible function



commit 80933a6c70331b37ad68b8c0c038c30b1dab46ce
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Mon Jul 11 11:37:15 2016 +0200

    svg_matrix: add a is_invertible function

 src/lsmsvgmatrix.c |   16 ++++++++++++++++
 src/lsmsvgmatrix.h |    3 ++-
 2 files changed, 18 insertions(+), 1 deletions(-)
---
diff --git a/src/lsmsvgmatrix.c b/src/lsmsvgmatrix.c
index 895ba6c..fa23484 100644
--- a/src/lsmsvgmatrix.c
+++ b/src/lsmsvgmatrix.c
@@ -30,6 +30,22 @@ lsm_svg_matrix_is_identity (const LsmSvgMatrix *matrix)
        return ((matrix->flags & LSM_SVG_MATRIX_FLAGS_IDENTITY) != 0);
 }
 
+static double
+_compute_determinant (const LsmSvgMatrix *matrix)
+{
+    return matrix->a * matrix->d - matrix->b * matrix->c;
+}
+
+gboolean
+lsm_svg_matrix_is_invertible (const LsmSvgMatrix *matrix)
+{
+    double det;
+
+    det = _compute_determinant (matrix);
+
+    return isfinite (det) && det != 0.;
+}
+
 void
 lsm_svg_matrix_init (LsmSvgMatrix *matrix, double a, double b, double c, double d, double e, double f)
 {
diff --git a/src/lsmsvgmatrix.h b/src/lsmsvgmatrix.h
index 22a88b8..9604fb1 100644
--- a/src/lsmsvgmatrix.h
+++ b/src/lsmsvgmatrix.h
@@ -35,7 +35,8 @@ typedef struct {
        LsmSvgMatrixFlags flags;
 } LsmSvgMatrix;
 
-gboolean lsm_svg_matrix_is_identity (const LsmSvgMatrix *matrix);
+gboolean lsm_svg_matrix_is_identity            (const LsmSvgMatrix *matrix);
+gboolean lsm_svg_matrix_is_invertible          (const LsmSvgMatrix *matrix);
 
 void   lsm_svg_matrix_init                     (LsmSvgMatrix *matrix, double a, double b,
                                                                       double c, double d,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]