test/test-shape-complex.c | 16 +++++++++++ util/hb-shape.cc | 7 +++-- util/options.cc | 62 +++++++++++++++++++++++++++++++++++++++++++--- util/options.hh | 27 +++++++++++++++++--- 4 files changed, 103 insertions(+), 9 deletions(-)
New commits: commit cdc673d97c5ffedb386865a81f54a5cedcbad27c Author: Behdad Esfahbod <[email protected]> Date: Thu Jan 19 12:46:18 2012 -0500 [hb-shape] Add --show-line-num Ok, much more useful as a test suite driver now. diff --git a/util/hb-shape.cc b/util/hb-shape.cc index 1910848..a76a778 100644 --- a/util/hb-shape.cc +++ b/util/hb-shape.cc @@ -42,7 +42,7 @@ struct output_buffer_t : output_options_t, format_options_t protected: GString *gs; hb_font_t *font; - hb_buffer_t *scratch; + unsigned int line_no; }; void @@ -51,7 +51,7 @@ output_buffer_t::init (const font_options_t *font_opts) get_file_handle (); font = hb_font_reference (font_opts->get_font ()); gs = g_string_new (NULL); - scratch = hb_buffer_create (); + line_no = 0; } void @@ -59,29 +59,15 @@ output_buffer_t::consume_line (hb_buffer_t *buffer, const char *text, unsigned int text_len) { + line_no++; g_string_set_size (gs, 0); - - if (show_text) { - g_string_append_len (gs, text, text_len); - g_string_append_c (gs, '\n'); - } - - if (show_unicode) { - hb_buffer_reset (scratch); - hb_buffer_add_utf8 (scratch, text, text_len, 0, -1); - serialize_unicode (buffer, gs); - g_string_append_c (gs, '\n'); - } - - serialize_glyphs (buffer, font, gs); - fprintf (fp, "%s\n", gs->str); + serialize_line (buffer, line_no, text, text_len, font, gs); + fprintf (fp, "%s", gs->str); } void output_buffer_t::finish (const font_options_t *font_opts) { - hb_buffer_destroy (scratch); - scratch = NULL; g_string_free (gs, TRUE); gs = NULL; hb_font_destroy (font); diff --git a/util/options.cc b/util/options.cc index e497d72..2bf2c58 100644 --- a/util/options.cc +++ b/util/options.cc @@ -678,6 +678,7 @@ format_options_t::add_options (option_parser_t *parser) {"no-clusters", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &this->show_clusters, "Do not show cluster mapping", NULL}, {"show-text", 0, 0, G_OPTION_ARG_NONE, &this->show_text, "Show input text", NULL}, {"show-unicode", 0, 0, G_OPTION_ARG_NONE, &this->show_unicode, "Show input Unicode codepoints", NULL}, + {"show-line-num", 0, 0, G_OPTION_ARG_NONE, &this->show_line_num, "Show line numbers", NULL}, {NULL} }; parser->add_group (entries, @@ -750,3 +751,36 @@ format_options_t::serialize_glyphs (hb_buffer_t *buffer, } g_string_append_c (gs, '>'); } +void +format_options_t::serialize_line_no (unsigned int line_no, + GString *gs) +{ + if (show_line_num) + g_string_append_printf (gs, "%d: ", line_no); +} +void +format_options_t::serialize_line (hb_buffer_t *buffer, + unsigned int line_no, + const char *text, + unsigned int text_len, + hb_font_t *font, + GString *gs) +{ + if (show_text) { + serialize_line_no (line_no, gs); + g_string_append_len (gs, text, text_len); + g_string_append_c (gs, '\n'); + } + + if (show_unicode) { + serialize_line_no (line_no, gs); + hb_buffer_reset (scratch); + hb_buffer_add_utf8 (scratch, text, text_len, 0, -1); + serialize_unicode (buffer, gs); + g_string_append_c (gs, '\n'); + } + + serialize_line_no (line_no, gs); + serialize_glyphs (buffer, font, gs); + g_string_append_c (gs, '\n'); +} diff --git a/util/options.hh b/util/options.hh index 470a313..444569e 100644 --- a/util/options.hh +++ b/util/options.hh @@ -285,19 +285,31 @@ struct format_options_t : option_group_t show_clusters = true; show_text = false; show_unicode = false; + show_line_num = false; + scratch = hb_buffer_create (); add_options (parser); } ~format_options_t (void) { + hb_buffer_destroy (scratch); } void add_options (option_parser_t *parser); - void serialize_unicode (hb_buffer_t *buffer, - GString *gs); - void serialize_glyphs (hb_buffer_t *buffer, - hb_font_t *font, - GString *gs); + void serialize_unicode (hb_buffer_t *buffer, + GString *gs); + void serialize_glyphs (hb_buffer_t *buffer, + hb_font_t *font, + GString *gs); + void serialize_line_no (unsigned int line_no, + GString *gs); + void serialize_line (hb_buffer_t *buffer, + unsigned int line_no, + const char *text, + unsigned int text_len, + hb_font_t *font, + GString *gs); + protected: hb_bool_t show_glyph_names; @@ -305,6 +317,9 @@ struct format_options_t : option_group_t hb_bool_t show_clusters; hb_bool_t show_text; hb_bool_t show_unicode; + hb_bool_t show_line_num; + private: + hb_buffer_t *scratch; }; commit cc4d9810d6318ca2e4de3b8d62f03b51cc21ee05 Author: Behdad Esfahbod <[email protected]> Date: Thu Jan 19 12:32:20 2012 -0500 [hb-shape] Add --show-text and --show-unicode options diff --git a/util/hb-shape.cc b/util/hb-shape.cc index 906bac2..1910848 100644 --- a/util/hb-shape.cc +++ b/util/hb-shape.cc @@ -42,6 +42,7 @@ struct output_buffer_t : output_options_t, format_options_t protected: GString *gs; hb_font_t *font; + hb_buffer_t *scratch; }; void @@ -50,6 +51,7 @@ output_buffer_t::init (const font_options_t *font_opts) get_file_handle (); font = hb_font_reference (font_opts->get_font ()); gs = g_string_new (NULL); + scratch = hb_buffer_create (); } void @@ -58,13 +60,28 @@ output_buffer_t::consume_line (hb_buffer_t *buffer, unsigned int text_len) { g_string_set_size (gs, 0); - serialize (buffer, font, gs); + + if (show_text) { + g_string_append_len (gs, text, text_len); + g_string_append_c (gs, '\n'); + } + + if (show_unicode) { + hb_buffer_reset (scratch); + hb_buffer_add_utf8 (scratch, text, text_len, 0, -1); + serialize_unicode (buffer, gs); + g_string_append_c (gs, '\n'); + } + + serialize_glyphs (buffer, font, gs); fprintf (fp, "%s\n", gs->str); } void output_buffer_t::finish (const font_options_t *font_opts) { + hb_buffer_destroy (scratch); + scratch = NULL; g_string_free (gs, TRUE); gs = NULL; hb_font_destroy (font); diff --git a/util/options.cc b/util/options.cc index 6585eb4..e497d72 100644 --- a/util/options.cc +++ b/util/options.cc @@ -676,6 +676,8 @@ format_options_t::add_options (option_parser_t *parser) {"no-glyph-names", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &this->show_glyph_names, "Use glyph indices instead of names", NULL}, {"no-positions", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &this->show_positions, "Do not show glyph positions", NULL}, {"no-clusters", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &this->show_clusters, "Do not show cluster mapping", NULL}, + {"show-text", 0, 0, G_OPTION_ARG_NONE, &this->show_text, "Show input text", NULL}, + {"show-unicode", 0, 0, G_OPTION_ARG_NONE, &this->show_unicode, "Show input Unicode codepoints", NULL}, {NULL} }; parser->add_group (entries, @@ -686,9 +688,27 @@ format_options_t::add_options (option_parser_t *parser) } void -format_options_t::serialize (hb_buffer_t *buffer, - hb_font_t *font, - GString *gs) +format_options_t::serialize_unicode (hb_buffer_t *buffer, + GString *gs) +{ + unsigned int num_glyphs = hb_buffer_get_length (buffer); + hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL); + + g_string_append_c (gs, '<'); + for (unsigned int i = 0; i < num_glyphs; i++) + { + if (i) + g_string_append_c (gs, ','); + g_string_append_printf (gs, "U+%04X", info->codepoint); + info++; + } + g_string_append_c (gs, '>'); +} + +void +format_options_t::serialize_glyphs (hb_buffer_t *buffer, + hb_font_t *font, + GString *gs) { FT_Face ft_face = show_glyph_names ? hb_ft_font_get_face (font) : NULL; diff --git a/util/options.hh b/util/options.hh index fbf5f36..470a313 100644 --- a/util/options.hh +++ b/util/options.hh @@ -283,6 +283,8 @@ struct format_options_t : option_group_t show_glyph_names = true; show_positions = true; show_clusters = true; + show_text = false; + show_unicode = false; add_options (parser); } @@ -291,14 +293,18 @@ struct format_options_t : option_group_t void add_options (option_parser_t *parser); - void serialize (hb_buffer_t *buffer, - hb_font_t *font, - GString *gs); + void serialize_unicode (hb_buffer_t *buffer, + GString *gs); + void serialize_glyphs (hb_buffer_t *buffer, + hb_font_t *font, + GString *gs); protected: hb_bool_t show_glyph_names; hb_bool_t show_positions; hb_bool_t show_clusters; + hb_bool_t show_text; + hb_bool_t show_unicode; }; commit 27c36af411c7c4d75dd25d79fc76dd92c6bb9643 Author: Behdad Esfahbod <[email protected]> Date: Thu Jan 19 12:30:43 2012 -0500 Fix OOB in hb-shape diff --git a/util/options.cc b/util/options.cc index 5ded644..6585eb4 100644 --- a/util/options.cc +++ b/util/options.cc @@ -631,7 +631,7 @@ text_options_t::get_line (unsigned int *len) char buf[BUFSIZ]; while (fgets (buf, sizeof (buf), fp)) { unsigned int bytes = strlen (buf); - if (buf[bytes - 1] == '\n') { + if (bytes && buf[bytes - 1] == '\n') { bytes--; g_string_append_len (gs, buf, bytes); break; commit 8d2781d69274672303e30522e222bd01c6b5e781 Author: Behdad Esfahbod <[email protected]> Date: Thu Jan 19 11:36:39 2012 -0500 [test] Add two Indic test cases from Bernard Massot diff --git a/test/test-shape-complex.c b/test/test-shape-complex.c index dea12ec..8f25d8f 100644 --- a/test/test-shape-complex.c +++ b/test/test-shape-complex.c @@ -181,6 +181,21 @@ static const test_set_t tests_devanagari2 = { } }; +static const test_set_t tests_devanagari3 = { + {"Lohit-Devanagari.ttf", 0}, + { + { "Ka Halant Ssa Halant", + { 0x0915, 0x094D, 0x0937, 0x094D, 0}, + { 0x00C4, 0x007D, 0} + }, + { "Ja Halant Nya Halant", + { 0x091C, 0x094D, 0x091E, 0x094D, 0}, + { 0x00C5, 0x007D, 0} + }, + {{0}} + } +}; + static const test_set_t tests_bengali1 = { {"AkaashNormal.ttf", 0}, { @@ -1151,6 +1166,7 @@ main (int argc, char **argv) TEST_SET (devanagari1); TEST_SET (devanagari2); + TEST_SET (devanagari3); TEST_SET (bengali1); TEST_SET (bengali2); TEST_SET (bengali3); _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
