src/hb-font.cc | 10 - src/hb-font.h | 2 src/hb-ft.cc | 2 test/test-font.c | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 284 insertions(+), 20 deletions(-)
New commits: commit 52df150efeff4cf003cee65f8c91618f1a980bc8 Author: Behdad Esfahbod <[email protected]> Date: Thu May 12 00:46:57 2011 -0400 Fix font subclass chainup Test passing now. diff --git a/src/hb-font.cc b/src/hb-font.cc index 7cdf5f6..10f686e 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -536,11 +536,7 @@ hb_font_create_sub_font (hb_font_t *parent) font->x_ppem = parent->x_ppem; font->y_ppem = parent->y_ppem; - /* We can safely copy user_data from parent since we hold a reference - * onto it and it's immutable. We should not copy the destroy notifiers - * though. */ - font->klass = hb_font_funcs_reference (parent->klass); - font->user_data = parent->user_data; + font->klass = &_hb_font_funcs_nil; return font; } commit f2c1dd4f746c36a44cf33d0257a3cd800107c286 Author: Behdad Esfahbod <[email protected]> Date: Thu May 12 00:35:12 2011 -0400 [test/font] Test font_funcs subclassing diff --git a/test/test-font.c b/test/test-font.c index 01d20b4..aa78a20 100644 --- a/test/test-font.c +++ b/test/test-font.c @@ -183,7 +183,7 @@ test_fontfuncs_empty (void) } static void -test_fontfuncs_custom (void) +test_fontfuncs_nil (void) { hb_font_funcs_t *ffuncs; @@ -195,6 +195,158 @@ test_fontfuncs_custom (void) hb_font_funcs_destroy (ffuncs); } +static hb_bool_t +contour_point_func1 (hb_font_t *font, void *font_data, + hb_codepoint_t glyph, unsigned int point_index, + hb_position_t *x, hb_position_t *y, + void *user_data) +{ + if (glyph == 1) { + *x = 2; + *y = 3; + return TRUE; + } + if (glyph == 2) { + *x = 4; + *y = 5; + return TRUE; + } + + return FALSE; +} + +static hb_bool_t +contour_point_func2 (hb_font_t *font, void *font_data, + hb_codepoint_t glyph, unsigned int point_index, + hb_position_t *x, hb_position_t *y, + void *user_data) +{ + if (glyph == 1) { + *x = 6; + *y = 7; + return TRUE; + } + + return hb_font_get_contour_point (hb_font_get_parent (font), + glyph, point_index, x, y); +} + +static void +glyph_advance_func1 (hb_font_t *font, void *font_data, + hb_codepoint_t glyph, + hb_position_t *x_advance, hb_position_t *y_advance, + void *user_data) +{ + if (glyph == 1) { + *x_advance = 8; + *y_advance = 9; + } +} + +static void +test_fontfuncs_subclassing (void) +{ + hb_blob_t *blob; + hb_face_t *face; + + hb_font_funcs_t *ffuncs1; + hb_font_funcs_t *ffuncs2; + + hb_font_t *font1; + hb_font_t *font2; + hb_font_t *font3; + + hb_position_t x; + hb_position_t y; + + blob = hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL); + face = hb_face_create (blob, 0); + hb_blob_destroy (blob); + font1 = hb_font_create (face); + hb_face_destroy (face); + hb_font_set_scale (font1, 10, 10); + + /* setup font1 */ + ffuncs1 = hb_font_funcs_create (); + hb_font_funcs_set_contour_point_func (ffuncs1, contour_point_func1, NULL, NULL); + hb_font_funcs_set_glyph_advance_func (ffuncs1, glyph_advance_func1, NULL, NULL); + hb_font_set_funcs (font1, ffuncs1, NULL, NULL); + hb_font_funcs_destroy (ffuncs1); + + x = y = 1; + g_assert (hb_font_get_contour_point (font1, 1, 2, &x, &y)); + g_assert_cmpint (x, ==, 2); + g_assert_cmpint (y, ==, 3); + g_assert (hb_font_get_contour_point (font1, 2, 5, &x, &y)); + g_assert_cmpint (x, ==, 4); + g_assert_cmpint (y, ==, 5); + g_assert (!hb_font_get_contour_point (font1, 3, 7, &x, &y)); + g_assert_cmpint (x, ==, 0); + g_assert_cmpint (y, ==, 0); + hb_font_get_glyph_advance (font1, 1, &x, &y); + g_assert_cmpint (x, ==, 8); + g_assert_cmpint (y, ==, 9); + hb_font_get_glyph_advance (font1, 2, &x, &y); + g_assert_cmpint (x, ==, 0); + g_assert_cmpint (y, ==, 0); + + + font2 = hb_font_create_sub_font (font1); + g_assert (hb_font_is_immutable (font1)); + hb_font_destroy (font1); + + /* setup font2 to override some funcs */ + ffuncs2 = hb_font_funcs_create (); + hb_font_funcs_set_contour_point_func (ffuncs2, contour_point_func2, NULL, NULL); + hb_font_set_funcs (font2, ffuncs2, NULL, NULL); + hb_font_funcs_destroy (ffuncs2); + + x = y = 1; + g_assert (hb_font_get_contour_point (font2, 1, 2, &x, &y)); + g_assert_cmpint (x, ==, 6); + g_assert_cmpint (y, ==, 7); + g_assert (hb_font_get_contour_point (font2, 2, 5, &x, &y)); + g_assert_cmpint (x, ==, 4); + g_assert_cmpint (y, ==, 5); + g_assert (!hb_font_get_contour_point (font2, 3, 7, &x, &y)); + g_assert_cmpint (x, ==, 0); + g_assert_cmpint (y, ==, 0); + hb_font_get_glyph_advance (font2, 1, &x, &y); + g_assert_cmpint (x, ==, 8); + g_assert_cmpint (y, ==, 9); + hb_font_get_glyph_advance (font2, 2, &x, &y); + g_assert_cmpint (x, ==, 0); + g_assert_cmpint (y, ==, 0); + + + font3 = hb_font_create_sub_font (font2); + g_assert (hb_font_is_immutable (font2)); + hb_font_destroy (font2); + + /* setup font3 to override scale */ + hb_font_set_scale (font3, 20, 30); + + x = y = 1; + g_assert (hb_font_get_contour_point (font3, 1, 2, &x, &y)); + g_assert_cmpint (x, ==, 6*2); + g_assert_cmpint (y, ==, 7*3); + g_assert (hb_font_get_contour_point (font3, 2, 5, &x, &y)); + g_assert_cmpint (x, ==, 4*2); + g_assert_cmpint (y, ==, 5*3); + g_assert (!hb_font_get_contour_point (font3, 3, 7, &x, &y)); + g_assert_cmpint (x, ==, 0*2); + g_assert_cmpint (y, ==, 0*3); + hb_font_get_glyph_advance (font3, 1, &x, &y); + g_assert_cmpint (x, ==, 8*2); + g_assert_cmpint (y, ==, 9*3); + hb_font_get_glyph_advance (font3, 2, &x, &y); + g_assert_cmpint (x, ==, 0*2); + g_assert_cmpint (y, ==, 0*3); + + + hb_font_destroy (font3); +} + static void test_font_empty (void) @@ -343,11 +495,11 @@ main (int argc, char **argv) hb_test_add (test_face_createfortables); hb_test_add (test_fontfuncs_empty); - hb_test_add (test_fontfuncs_custom); + hb_test_add (test_fontfuncs_nil); + hb_test_add (test_fontfuncs_subclassing); hb_test_add (test_font_empty); hb_test_add (test_font_properties); - return hb_test_run(); } commit 14f1e81b77971204e9325e2a8b6f8b690fac20a7 Author: Behdad Esfahbod <[email protected]> Date: Thu May 12 00:18:28 2011 -0400 [test/font] Test empty funcs diff --git a/test/test-font.c b/test/test-font.c index e04672b..01d20b4 100644 --- a/test/test-font.c +++ b/test/test-font.c @@ -109,19 +109,90 @@ test_face_createfortables (void) g_assert (freed); } +static void +_test_font_nil_funcs (hb_font_t *font) +{ + hb_position_t x, y; + hb_glyph_extents_t extents; + + x = y = 13; + g_assert (!hb_font_get_contour_point (font, 17, 2, &x, &y)); + g_assert_cmpint (x, ==, 0); + g_assert_cmpint (y, ==, 0); + + x = y = 13; + hb_font_get_glyph_advance (font, 17, &x, &y); + g_assert_cmpint (x, ==, 0); + g_assert_cmpint (y, ==, 0); + + extents.x_bearing = extents.y_bearing = 13; + extents.width = extents.height = 15; + hb_font_get_glyph_extents (font, 17, &extents); + g_assert_cmpint (extents.x_bearing, ==, 0); + g_assert_cmpint (extents.y_bearing, ==, 0); + g_assert_cmpint (extents.width, ==, 0); + g_assert_cmpint (extents.height, ==, 0); + + g_assert (0 == hb_font_get_glyph (font, 17, 2)); + + x = y = 13; + hb_font_get_kerning (font, 17, 19, &x, &y); + g_assert_cmpint (x, ==, 0); + g_assert_cmpint (y, ==, 0); +} + +static void +_test_fontfuncs_nil (hb_font_funcs_t *ffuncs) +{ + hb_blob_t *blob; + hb_face_t *face; + hb_font_t *font; + hb_font_t *subfont; + int freed = 0; + + blob = hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL); + face = hb_face_create (blob, 0); + hb_blob_destroy (blob); + font = hb_font_create (face); + hb_face_destroy (face); + + + hb_font_set_funcs (font, ffuncs, &freed, free_up); + g_assert_cmpint (freed, ==, 0); + + _test_font_nil_funcs (font); + + subfont = hb_font_create_sub_font (font); + + g_assert_cmpint (freed, ==, 0); + hb_font_destroy (font); + g_assert_cmpint (freed, ==, 0); + + _test_font_nil_funcs (subfont); + + hb_font_destroy (subfont); + g_assert_cmpint (freed, ==, 1); +} static void test_fontfuncs_empty (void) { g_assert (hb_font_funcs_get_empty ()); g_assert (hb_font_funcs_is_immutable (hb_font_funcs_get_empty ())); + _test_fontfuncs_nil (hb_font_funcs_get_empty ()); } static void test_fontfuncs_custom (void) { - g_assert (hb_font_funcs_get_empty ()); - g_assert (hb_font_funcs_is_immutable (hb_font_funcs_get_empty ())); + hb_font_funcs_t *ffuncs; + + ffuncs = hb_font_funcs_create (); + + g_assert (!hb_font_funcs_is_immutable (ffuncs)); + _test_fontfuncs_nil (hb_font_funcs_get_empty ()); + + hb_font_funcs_destroy (ffuncs); } commit 2ca0b5ae1e65d3f43df3a4a2144a1451d8b485c4 Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 23:57:36 2011 -0400 [test/font] Test more diff --git a/test/test-font.c b/test/test-font.c index c4f6cea..e04672b 100644 --- a/test/test-font.c +++ b/test/test-font.c @@ -29,6 +29,9 @@ /* Unit tests for hb-font.h */ +static const char test_data[] = "test\0data"; + + static void test_face_empty (void) { @@ -36,10 +39,30 @@ test_face_empty (void) g_assert (hb_face_get_empty () == hb_face_create (hb_blob_get_empty (), 0)); g_assert (hb_face_get_empty () == hb_face_create (NULL, 0)); - g_assert (hb_face_reference_table (hb_face_get_empty (), HB_TAG('h','e','a','d')) == hb_blob_get_empty ()); + g_assert (hb_face_reference_table (hb_face_get_empty (), HB_TAG ('h','e','a','d')) == hb_blob_get_empty ()); + + g_assert_cmpint (hb_face_get_upem (hb_face_get_empty ()), ==, 1000); } static void +test_face_create (void) +{ + hb_face_t *face; + hb_blob_t *blob; + + blob = hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL); + face = hb_face_create (blob, 0); + hb_blob_destroy (blob); + + g_assert (hb_face_reference_table (face, HB_TAG ('h','e','a','d')) == hb_blob_get_empty ()); + + g_assert_cmpint (hb_face_get_upem (face), ==, 1000); + + hb_face_destroy (face); +} + + +static void free_up (void *user_data) { int *freed = (int *) user_data; @@ -52,18 +75,36 @@ free_up (void *user_data) static hb_blob_t * get_table (hb_face_t *face, hb_tag_t tag, void *user_data) { + if (tag == HB_TAG ('a','b','c','d')) + return hb_blob_create (test_data, sizeof (test_data), HB_MEMORY_MODE_READONLY, NULL, NULL); + return hb_blob_get_empty (); } static void -test_face_fortables (void) +test_face_createfortables (void) { hb_face_t *face; + hb_blob_t *blob; + const char *data; + unsigned int len; int freed = 0; face = hb_face_create_for_tables (get_table, &freed, free_up); g_assert (!freed); + g_assert (hb_face_reference_table (face, HB_TAG ('h','e','a','d')) == hb_blob_get_empty ()); + + blob = hb_face_reference_table (face, HB_TAG ('a','b','c','d')); + g_assert (blob != hb_blob_get_empty ()); + + data = hb_blob_get_data (blob, &len); + g_assert_cmpint (len, ==, sizeof (test_data)); + g_assert (0 == memcmp (data, test_data, sizeof (test_data))); + hb_blob_destroy (blob); + + g_assert_cmpint (hb_face_get_upem (face), ==, 1000); + hb_face_destroy (face); g_assert (freed); } @@ -77,6 +118,14 @@ test_fontfuncs_empty (void) } static void +test_fontfuncs_custom (void) +{ + g_assert (hb_font_funcs_get_empty ()); + g_assert (hb_font_funcs_is_immutable (hb_font_funcs_get_empty ())); +} + + +static void test_font_empty (void) { g_assert (hb_font_get_empty ()); @@ -89,8 +138,6 @@ test_font_empty (void) g_assert (hb_font_get_parent (hb_font_get_empty ()) == NULL); } -static const char test_data[] = "test\0data"; - static void test_font_properties (void) { @@ -221,17 +268,15 @@ main (int argc, char **argv) hb_test_init (&argc, &argv); hb_test_add (test_face_empty); - hb_test_add (test_face_fortables); + hb_test_add (test_face_create); + hb_test_add (test_face_createfortables); hb_test_add (test_fontfuncs_empty); + hb_test_add (test_fontfuncs_custom); hb_test_add (test_font_empty); hb_test_add (test_font_properties); - /* - * hb_font_set_funcs - * hb_font_funcs - */ return hb_test_run(); } commit 7033518f756490e9cf00b96387fee6f2f7fae785 Author: Behdad Esfahbod <[email protected]> Date: Wed May 11 23:31:15 2011 -0400 [API] Pass face to get_table() diff --git a/src/hb-font.cc b/src/hb-font.cc index a0485a5..7cdf5f6 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -379,7 +379,7 @@ _hb_face_for_data_closure_destroy (hb_face_for_data_closure_t *closure) } static hb_blob_t * -_hb_face_for_data_get_table (hb_tag_t tag, void *user_data) +_hb_face_for_data_get_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) { hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) user_data; @@ -462,7 +462,7 @@ hb_face_reference_table (hb_face_t *face, if (unlikely (!face || !face->get_table)) return hb_blob_get_empty (); - blob = face->get_table (tag, face->user_data); + blob = face->get_table (face, tag, face->user_data); if (unlikely (!blob)) return hb_blob_get_empty (); diff --git a/src/hb-font.h b/src/hb-font.h index bb53f8f..97831ff 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -44,7 +44,7 @@ hb_face_t * hb_face_create (hb_blob_t *blob, unsigned int index); -typedef hb_blob_t * (*hb_get_table_func_t) (hb_tag_t tag, void *user_data); +typedef hb_blob_t * (*hb_get_table_func_t) (hb_face_t *face, hb_tag_t tag, void *user_data); /* calls destroy() when not needing user_data anymore */ hb_face_t * diff --git a/src/hb-ft.cc b/src/hb-ft.cc index a0c7521..9535ba1 100644 --- a/src/hb-ft.cc +++ b/src/hb-ft.cc @@ -170,7 +170,7 @@ hb_ft_get_font_funcs (void) static hb_blob_t * -get_table (hb_tag_t tag, void *user_data) +get_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) { FT_Face ft_face = (FT_Face) user_data; FT_Byte *buffer; diff --git a/test/test-font.c b/test/test-font.c index 6063736..c4f6cea 100644 --- a/test/test-font.c +++ b/test/test-font.c @@ -50,7 +50,7 @@ free_up (void *user_data) } static hb_blob_t * -get_table (hb_tag_t tag, void *user_data) +get_table (hb_face_t *face, hb_tag_t tag, void *user_data) { return hb_blob_get_empty (); } _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
