summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cairo-scaled-font.c8
-rw-r--r--src/cairo-user-font.c5
-rw-r--r--src/cairo.h2
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.
*