diff options
-rw-r--r-- | src/cairo-scaled-font.c | 8 | ||||
-rw-r--r-- | src/cairo-user-font.c | 5 | ||||
-rw-r--r-- | src/cairo.h | 2 |
3 files changed, 11 insertions, 4 deletions
diff --git a/src/cairo-scaled-font.c b/src/cairo-scaled-font.c index c5486554..caa345f1 100644 --- a/src/cairo-scaled-font.c +++ b/src/cairo-scaled-font.c @@ -1336,9 +1336,10 @@ slim_hidden_def (cairo_scaled_font_glyph_extents); * entries available there. If the provided glyph array is too short for * the conversion, a new glyph array is allocated using cairo_glyph_allocate() * and placed in @glyphs. Upon return, @num_glyphs always contains the - * number of generated glyphs. If the value @glyphs points at has changed + * number of generated glyphs. If the value @glyphs points to has changed * after the call, the user is responsible for freeing the allocated glyph - * array using cairo_glyph_free(). + * array using cairo_glyph_free(). This may happen even if the provided + * array was large enough. * * If @clusters is not %NULL, @num_clusters and @cluster_flags should not be %NULL, * and cluster mapping will be computed. @@ -1351,7 +1352,8 @@ slim_hidden_def (cairo_scaled_font_glyph_extents); * and placed in @clusters. Upon return, @num_clusters always contains the * number of generated clusters. If the value @clusters points at has changed * after the call, the user is responsible for freeing the allocated cluster - * array using cairo_text_cluster_free(). + * array using cairo_text_cluster_free(). This may happen even if the provided + * array was large enough. * * In the simplest case, @glyphs and @clusters can point to %NULL initially * and a suitable array will be allocated. In code: diff --git a/src/cairo-user-font.c b/src/cairo-user-font.c index 4feb0cec..616eff04 100644 --- a/src/cairo-user-font.c +++ b/src/cairo-user-font.c @@ -288,6 +288,7 @@ _cairo_user_text_to_glyphs (void *abstract_font, if (face->scaled_font_methods.text_to_glyphs) { int i; + cairo_glyph_t *orig_glyphs = *glyphs; int orig_num_glyphs = *num_glyphs; status = face->scaled_font_methods.text_to_glyphs (&scaled_font->base, @@ -299,6 +300,10 @@ _cairo_user_text_to_glyphs (void *abstract_font, return status; if (*num_glyphs < 0) { + if (orig_glyphs != *glyphs) { + cairo_glyph_free (*glyphs); + *glyphs = orig_glyphs; + } *num_glyphs = orig_num_glyphs; return CAIRO_INT_STATUS_UNSUPPORTED; } diff --git a/src/cairo.h b/src/cairo.h index 0cff8d9c..55ea2d64 100644 --- a/src/cairo.h +++ b/src/cairo.h @@ -1546,7 +1546,7 @@ typedef cairo_status_t (*cairo_user_scaled_font_render_glyph_func_t) (cairo_scal * If the value @clusters points at has changed after the call, the caller * will free the allocated cluster array using cairo_text_cluster_free(). * - * The callback is optional. If not set, or if @num_glyphs is negative upon + * The callback is optional. If @num_glyphs is negative upon * the callback returning, the unicode_to_glyph callback * is tried. See #cairo_user_scaled_font_unicode_to_glyph_func_t. * |