From 0fd8c2f1be693616f19f2f1526369874763d6cf6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 12 May 2011 15:14:13 -0400 Subject: [PATCH] [API] Make get_glyph() callback return a boolean We need to know whether the glyph exists, so we can fallback to composing / decomposing. Assuming that glyph==0 means "doesn't exist" wouldn't work for applications like Pango that want to use different "doesn't exist" glyph codes for different characters. An explicit return value fixes that. --- src/hb-font.cc | 15 +++++++++------ src/hb-font.h | 12 +++++++----- src/hb-ft.cc | 12 +++++++----- src/hb-ot-shape.cc | 13 +++++++++---- test/test-font.c | 5 ++++- test/test-shape.c | 12 +++++++----- 6 files changed, 43 insertions(+), 26 deletions(-) diff --git a/src/hb-font.cc b/src/hb-font.cc index 6d974fe..6657718 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -99,17 +99,19 @@ hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, extents->width = extents->height = 0; } -static hb_codepoint_t +static hb_bool_t hb_font_get_glyph_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, void *user_data HB_UNUSED) { if (font->parent) - return hb_font_get_glyph (font->parent, unicode, variation_selector); + return hb_font_get_glyph (font->parent, unicode, variation_selector, glyph); - return 0; + *glyph = 0; + return FALSE; } static void @@ -287,12 +289,13 @@ hb_font_get_glyph_extents (hb_font_t *font, font->klass->user_data.glyph_extents); } -hb_codepoint_t +hb_bool_t hb_font_get_glyph (hb_font_t *font, - hb_codepoint_t unicode, hb_codepoint_t variation_selector) + hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph) { return font->klass->get.glyph (font, font->user_data, - unicode, variation_selector, + unicode, variation_selector, glyph, font->klass->user_data.glyph); } diff --git a/src/hb-font.h b/src/hb-font.h index c6f80c3..e38d3a7 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -140,9 +140,10 @@ typedef void (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_da hb_codepoint_t glyph, hb_glyph_extents_t *extents, void *user_data); -typedef hb_codepoint_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data, - hb_codepoint_t unicode, hb_codepoint_t variation_selector, - void *user_data); +typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data, + hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, + void *user_data); typedef void (*hb_font_get_kerning_func_t) (hb_font_t *font, void *font_data, hb_codepoint_t left_glyph, hb_codepoint_t right_glyph, hb_position_t *x_kern, hb_position_t *y_kern, @@ -190,9 +191,10 @@ hb_font_get_glyph_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents); -hb_codepoint_t +hb_bool_t hb_font_get_glyph (hb_font_t *font, - hb_codepoint_t unicode, hb_codepoint_t variation_selector); + hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph); void hb_font_get_kerning (hb_font_t *font, diff --git a/src/hb-ft.cc b/src/hb-ft.cc index b3a5cd0..a9186f8 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -107,11 +107,12 @@ hb_ft_get_glyph_extents (hb_font_t *font HB_UNUSED, } } -static hb_codepoint_t +static hb_bool_t hb_ft_get_glyph (hb_font_t *font HB_UNUSED, void *font_data, hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, void *user_data HB_UNUSED) { @@ -119,13 +120,14 @@ hb_ft_get_glyph (hb_font_t *font HB_UNUSED, #ifdef HAVE_FT_FACE_GETCHARVARIANTINDEX if (unlikely (variation_selector)) { - hb_codepoint_t glyph = FT_Face_GetCharVariantIndex (ft_face, unicode, variation_selector); - if (glyph) - return glyph; + *glyph = FT_Face_GetCharVariantIndex (ft_face, unicode, variation_selector); + if (*glyph) + return TRUE; } #endif - return FT_Get_Char_Index (ft_face, unicode); + *glyph = FT_Get_Char_Index (ft_face, unicode); + return *glyph != 0; } static void diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc index 71eae42..ad6c2e2 100644 --- a/src/hb-ot-shape.cc +++ b/src/hb-ot-shape.cc @@ -216,18 +216,23 @@ hb_map_glyphs (hb_font_t *font, if (unlikely (!buffer->len)) return; + hb_codepoint_t glyph; buffer->clear_output (); unsigned int count = buffer->len - 1; for (buffer->i = 0; buffer->i < count;) { if (unlikely (is_variation_selector (buffer->info[buffer->i + 1].codepoint))) { - buffer->replace_glyph (hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, buffer->info[buffer->i + 1].codepoint)); + hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, buffer->info[buffer->i + 1].codepoint, &glyph); + buffer->replace_glyph (glyph); buffer->i++; } else { - buffer->replace_glyph (hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, 0)); + hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, 0, &glyph); + buffer->replace_glyph (glyph); } } - if (likely (buffer->i < buffer->len)) - buffer->replace_glyph (hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, 0)); + if (likely (buffer->i < buffer->len)) { + hb_font_get_glyph (font, buffer->info[buffer->i].codepoint, 0, &glyph); + buffer->replace_glyph (glyph); + } buffer->swap (); } diff --git a/test/test-font.c b/test/test-font.c index aa78a20..9c7d3e4 100644 --- a/test/test-font.c +++ b/test/test-font.c @@ -112,6 +112,7 @@ test_face_createfortables (void) static void _test_font_nil_funcs (hb_font_t *font) { + hb_codepoint_t glyph; hb_position_t x, y; hb_glyph_extents_t extents; @@ -133,7 +134,9 @@ _test_font_nil_funcs (hb_font_t *font) g_assert_cmpint (extents.width, ==, 0); g_assert_cmpint (extents.height, ==, 0); - g_assert (0 == hb_font_get_glyph (font, 17, 2)); + glyph = 3; + g_assert (!hb_font_get_glyph (font, 17, 2, &glyph)); + g_assert_cmpint (glyph, ==, 0); x = y = 13; hb_font_get_kerning (font, 17, 19, &x, &y); diff --git a/test/test-shape.c b/test/test-shape.c index e40e9b2..ab3ddf1 100644 --- a/test/test-shape.c +++ b/test/test-shape.c @@ -44,17 +44,19 @@ glyph_advance_func (hb_font_t *font, void *font_data, } } -static hb_codepoint_t +static hb_bool_t glyph_func (hb_font_t *font, void *font_data, hb_codepoint_t unicode, hb_codepoint_t variant_selector, + hb_codepoint_t *glyph, void *user_data) { switch (unicode) { - case 'T': return 1; - case 'e': return 2; - case 's': return 3; - default: return 0; + case 'T': *glyph = 1; return TRUE; + case 'e': *glyph = 2; return TRUE; + case 's': *glyph = 3; return TRUE; } + + return FALSE; } static void -- 2.7.4