[cairo-matrix] Check whether a matrix is invertible before use.

Provide an early check as to whether the font matrix is invertible.
This commit is contained in:
Chris Wilson 2007-10-04 15:58:21 +01:00
parent 528da4e5e1
commit 4e44d54f3e
4 changed files with 19 additions and 0 deletions

View file

@ -1289,6 +1289,9 @@ cairo_status_t
_cairo_gstate_set_font_matrix (cairo_gstate_t *gstate,
const cairo_matrix_t *matrix)
{
if (! _cairo_matrix_is_invertible (matrix))
return _cairo_error (CAIRO_STATUS_INVALID_MATRIX);
_cairo_gstate_unset_scaled_font (gstate);
gstate->font_matrix = *matrix;

View file

@ -486,6 +486,16 @@ cairo_matrix_invert (cairo_matrix_t *matrix)
}
slim_hidden_def(cairo_matrix_invert);
cairo_bool_t
_cairo_matrix_is_invertible (const cairo_matrix_t *matrix)
{
double det;
_cairo_matrix_compute_determinant (matrix, &det);
return det != 0. && det * det > 0.;
}
void
_cairo_matrix_compute_determinant (const cairo_matrix_t *matrix,
double *det)

View file

@ -603,6 +603,9 @@ cairo_scaled_font_create (cairo_font_face_t *font_face,
if (cairo_font_options_status ((cairo_font_options_t *) options))
return (cairo_scaled_font_t *)&_cairo_scaled_font_nil;
if (! _cairo_matrix_is_invertible (font_matrix))
return (cairo_scaled_font_t *)&_cairo_scaled_font_nil;
font_map = _cairo_scaled_font_map_lock ();
if (font_map == NULL)
return (cairo_scaled_font_t *)&_cairo_scaled_font_nil;

View file

@ -2104,6 +2104,9 @@ _cairo_matrix_transform_bounding_box (const cairo_matrix_t *matrix,
double *x2, double *y2,
cairo_bool_t *is_tight);
cairo_private cairo_bool_t
_cairo_matrix_is_invertible (const cairo_matrix_t *matrix);
cairo_private void
_cairo_matrix_compute_determinant (const cairo_matrix_t *matrix, double *det);