diff --git a/src/hb-font.cc b/src/hb-font.cc index 6d974fe5a..665771859 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 c6f80c3bf..e38d3a789 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 b3a5cd091..a9186f850 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 71eae42be..ad6c2e275 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 aa78a20ab..9c7d3e42f 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 e40e9b249..ab3ddf119 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