src/hb-font.cc | 25 ++++++++++++++----------- src/hb-font.h | 16 +++++++++------- src/hb-ft.cc | 18 ++++++++++-------- src/hb-ot-shape.cc | 13 +++++++++---- test/test-font.c | 5 ++++- test/test-shape.c | 35 ++++++++++++++++++++++++++--------- 6 files changed, 72 insertions(+), 40 deletions(-)
New commits: commit 0fd8c2f1be693616f19f2f1526369874763d6cf6 Author: Behdad Esfahbod <beh...@behdad.org> Date: Thu May 12 15:14:13 2011 -0400 [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. 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 commit 8e07f93ab4a3ef9adc7942727ef21f2f9a141d10 Author: Behdad Esfahbod <beh...@behdad.org> Date: Thu May 12 14:27:44 2011 -0400 [test/shape] Check shape output diff --git a/test/test-shape.c b/test/test-shape.c index cbdc064..e40e9b2 100644 --- a/test/test-shape.c +++ b/test/test-shape.c @@ -71,7 +71,7 @@ kerning_func (hb_font_t *font, void *font_data, static const char TesT[] = "TesT"; static void -test_shape_ltr (void) +test_shape (void) { hb_blob_t *blob; hb_face_t *face; @@ -106,7 +106,23 @@ test_shape_ltr (void) glyphs = hb_buffer_get_glyph_infos (buffer, NULL); positions = hb_buffer_get_glyph_positions (buffer, NULL); - /* XXX check glyph output and positions */ + { + const hb_codepoint_t output_glyphs[] = {1, 2, 3, 1}; + const hb_position_t output_x_advances[] = {9, 5, 5, 10}; + const hb_position_t output_x_offsets[] = {0, -1, 0, 0}; + unsigned int i; + g_assert_cmpint (len, ==, 4); + for (i = 0; i < len; i++) { + g_assert_cmphex (glyphs[i].codepoint, ==, output_glyphs[i]); + g_assert_cmphex (glyphs[i].cluster, ==, i); + } + for (i = 0; i < len; i++) { + g_assert_cmpint (output_x_advances[i], ==, positions[i].x_advance); + g_assert_cmpint (output_x_offsets [i], ==, positions[i].x_offset); + g_assert_cmpint (0, ==, positions[i].y_advance); + g_assert_cmpint (0, ==, positions[i].y_offset); + } + } hb_buffer_destroy (buffer); hb_font_destroy (font); @@ -118,8 +134,7 @@ main (int argc, char **argv) { hb_test_init (&argc, &argv); - //hb_test_add (test_shape_empty); - hb_test_add (test_shape_ltr); + hb_test_add (test_shape); return hb_test_run(); } commit 805af72405a2f653f08de392d7172291ffe8e902 Author: Behdad Esfahbod <beh...@behdad.org> Date: Thu May 12 12:39:40 2011 -0400 Rename get_kernings() arguments from first/second_glyph to left/right_glyph Makes it clear that kerning is in visual order. diff --git a/src/hb-font.cc b/src/hb-font.cc index 10f686e..6d974fe 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -115,14 +115,14 @@ hb_font_get_glyph_nil (hb_font_t *font HB_UNUSED, static void hb_font_get_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, - hb_codepoint_t first_glyph, - hb_codepoint_t second_glyph, + hb_codepoint_t left_glyph, + hb_codepoint_t right_glyph, hb_position_t *x_kern, hb_position_t *y_kern, void *user_data HB_UNUSED) { if (font->parent) { - hb_font_get_kerning (font->parent, first_glyph, second_glyph, x_kern, y_kern); + hb_font_get_kerning (font->parent, left_glyph, right_glyph, x_kern, y_kern); font->parent_scale_distance (x_kern, y_kern); return; } @@ -298,12 +298,12 @@ hb_font_get_glyph (hb_font_t *font, void hb_font_get_kerning (hb_font_t *font, - hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, + hb_codepoint_t left_glyph, hb_codepoint_t right_glyph, hb_position_t *x_kern, hb_position_t *y_kern) { *x_kern = *y_kern = 0; return font->klass->get.kerning (font, font->user_data, - first_glyph, second_glyph, + left_glyph, right_glyph, x_kern, y_kern, font->klass->user_data.kerning); } diff --git a/src/hb-font.h b/src/hb-font.h index 97831ff..c6f80c3 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -144,7 +144,7 @@ typedef hb_codepoint_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_ hb_codepoint_t unicode, hb_codepoint_t variation_selector, void *user_data); typedef void (*hb_font_get_kerning_func_t) (hb_font_t *font, void *font_data, - hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, + hb_codepoint_t left_glyph, hb_codepoint_t right_glyph, hb_position_t *x_kern, hb_position_t *y_kern, void *user_data); @@ -196,7 +196,7 @@ hb_font_get_glyph (hb_font_t *font, void hb_font_get_kerning (hb_font_t *font, - hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, + hb_codepoint_t left_glyph, hb_codepoint_t right_glyph, hb_position_t *x_kern, hb_position_t *y_kern); diff --git a/src/hb-ft.cc b/src/hb-ft.cc index 9535ba1..b3a5cd0 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -131,8 +131,8 @@ hb_ft_get_glyph (hb_font_t *font HB_UNUSED, static void hb_ft_get_kerning (hb_font_t *font HB_UNUSED, void *font_data, - hb_codepoint_t first_glyph, - hb_codepoint_t second_glyph, + hb_codepoint_t left_glyph, + hb_codepoint_t right_glyph, hb_position_t *x_kern, hb_position_t *y_kern, void *user_data HB_UNUSED) @@ -141,7 +141,7 @@ hb_ft_get_kerning (hb_font_t *font HB_UNUSED, FT_Vector kerning; /* TODO: Kern type? */ - if (FT_Get_Kerning (ft_face, first_glyph, second_glyph, FT_KERNING_DEFAULT, &kerning)) + if (FT_Get_Kerning (ft_face, left_glyph, right_glyph, FT_KERNING_DEFAULT, &kerning)) return; *x_kern = kerning.x; _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/harfbuzz