mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-06-14 06:28:29 +02:00
[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:
parent
528da4e5e1
commit
4e44d54f3e
4 changed files with 19 additions and 0 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue