diff options
author | Carl Worth <cworth@cworth.org> | 2007-04-10 17:12:51 -0700 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2007-04-11 01:18:08 -0700 |
commit | 4ce2b62bcea49eccc0a4ee3781a115e4a34d3ad4 (patch) | |
tree | a0e5094aa4136bfa7beefa6c4108e00ab39d6f0f | |
parent | fd8c1e4dc851dd4ce8f84a3e47abdc4906c83b0f (diff) |
_cairo_scaled_font_init: Detect an invalid matrix and return an error.
Also fix all callers to notice and propagate the error, (though
some paths will still lose the CAIRO_STATUS_INVALID_MATRIX value
due to a return value of NULL at one point).
-rw-r--r-- | src/cairo-atsui-font.c | 9 | ||||
-rw-r--r-- | src/cairo-scaled-font.c | 24 | ||||
-rw-r--r-- | src/cairo-win32-font.c | 10 |
3 files changed, 30 insertions, 13 deletions
diff --git a/src/cairo-atsui-font.c b/src/cairo-atsui-font.c index 8aca2076d..92d38f248 100644 --- a/src/cairo-atsui-font.c +++ b/src/cairo-atsui-font.c @@ -230,8 +230,13 @@ _cairo_atsui_font_create_scaled (cairo_font_face_t *font_face, if (font == NULL) return CAIRO_STATUS_NO_MEMORY; - _cairo_scaled_font_init(&font->base, font_face, font_matrix, ctm, options, - &cairo_atsui_scaled_font_backend); + status = _cairo_scaled_font_init (&font->base, + font_face, font_matrix, ctm, options, + &cairo_atsui_scaled_font_backend); + if (status) { + free (font); + return status; + } _cairo_matrix_compute_scale_factors (&font->base.scale, &xscale, &yscale, 1); diff --git a/src/cairo-scaled-font.c b/src/cairo-scaled-font.c index 6b51e7f0c..954a4a4ba 100644 --- a/src/cairo-scaled-font.c +++ b/src/cairo-scaled-font.c @@ -351,6 +351,23 @@ _cairo_scaled_font_init (cairo_scaled_font_t *scaled_font, const cairo_font_options_t *options, const cairo_scaled_font_backend_t *backend) { + cairo_matrix_t inverse; + cairo_status_t status; + + /* Initialize scaled_font->scale early for easier bail out on an + * invalid matrix. */ + _cairo_scaled_font_init_key (scaled_font, font_face, + font_matrix, ctm, options); + + cairo_matrix_multiply (&scaled_font->scale, + &scaled_font->font_matrix, + &scaled_font->ctm); + + inverse = scaled_font->scale; + status = cairo_matrix_invert (&inverse); + if (status) + return status; + scaled_font->glyphs = _cairo_cache_create (_cairo_scaled_glyph_keys_equal, _cairo_scaled_glyph_destroy, max_glyphs_cached_per_font); @@ -361,15 +378,8 @@ _cairo_scaled_font_init (cairo_scaled_font_t *scaled_font, _cairo_user_data_array_init (&scaled_font->user_data); - _cairo_scaled_font_init_key (scaled_font, font_face, - font_matrix, ctm, options); - cairo_font_face_reference (font_face); - cairo_matrix_multiply (&scaled_font->scale, - &scaled_font->font_matrix, - &scaled_font->ctm); - CAIRO_MUTEX_INIT (&scaled_font->mutex); scaled_font->surface_backend = NULL; diff --git a/src/cairo-win32-font.c b/src/cairo-win32-font.c index 82e3bfcf8..e1f263b67 100644 --- a/src/cairo-win32-font.c +++ b/src/cairo-win32-font.c @@ -283,11 +283,13 @@ _win32_scaled_font_create (LOGFONTW *logfont, cairo_matrix_multiply (&scale, font_matrix, ctm); _compute_transform (f, &scale); - _cairo_scaled_font_init (&f->base, font_face, - font_matrix, ctm, options, - &cairo_win32_scaled_font_backend); + status = _cairo_scaled_font_init (&f->base, font_face, + font_matrix, ctm, options, + &cairo_win32_scaled_font_backend); + + if (status == CAIRO_STATUS_SUCCESS) + status = _cairo_win32_scaled_font_set_metrics (f); - status = _cairo_win32_scaled_font_set_metrics (f); if (status) { cairo_scaled_font_destroy (&f->base); return NULL; |