summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2007-04-10 17:12:51 -0700
committerCarl Worth <cworth@cworth.org>2007-04-11 01:18:08 -0700
commit4ce2b62bcea49eccc0a4ee3781a115e4a34d3ad4 (patch)
treea0e5094aa4136bfa7beefa6c4108e00ab39d6f0f
parentfd8c1e4dc851dd4ce8f84a3e47abdc4906c83b0f (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.c9
-rw-r--r--src/cairo-scaled-font.c24
-rw-r--r--src/cairo-win32-font.c10
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;