configure.ac | 2 util/Makefile.am | 32 ++++++++---- util/hb-ot-shape-closure.cc | 112 ++++++++++++++++++++++++++++++++++++++++++++ util/hb-shape.cc | 70 ++++++++++++--------------- util/hb-view.cc | 8 +-- util/hb-view.hh | 80 ------------------------------- util/main-font-text.hh | 80 +++++++++++++++++++++++++++++++ util/options.hh | 12 ++++ util/shape-consumer.hh | 69 +++++++++++++++++++++++++++ 9 files changed, 331 insertions(+), 134 deletions(-)
New commits: commit c87b317f0eb118e67134e8e419a6d65e0fa40d30 Author: Behdad Esfahbod <[email protected]> Date: Tue May 15 23:53:18 2012 -0400 [util] Add hb-ot-shape-closure tool Computes all the glyphs that may be generated given a font and set of Unicode characters. The order of the Unicode characters is irrelevant. Sample output: behdad:util 0$ ./hb-ot-shape-closure Doulos\ SIL\ Regular.ttf f f f_f behdad:util 0$ ./hb-ot-shape-closure Doulos\ SIL\ Regular.ttf i i behdad:util 0$ ./hb-ot-shape-closure Doulos\ SIL\ Regular.ttf fi f f_i f_f_i f_f i behdad:util 0$ ./hb-ot-shape-closure DroidNaskh-Regular.ttf ب uni0628 uni0628.init uni0628.medi uni0628.fina behdad:util 0$ ./hb-ot-shape-closure DroidNaskh-Regular.ttf ا uni0627 uni0627.fina behdad:util 0$ ./hb-ot-shape-closure DroidNaskh-Regular.ttf با uni0627 uni0627.fina uni0628 uni0628.init uni0628.medi uni0628.fina behdad:util 0$ ./hb-ot-shape-closure DroidNaskh-Regular.ttf با --no-glyph-names 5 6 133 134 135 136 diff --git a/configure.ac b/configure.ac index 853d083..073228b 100644 --- a/configure.ac +++ b/configure.ac @@ -159,7 +159,7 @@ AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype) dnl =========================================================================== -have_ot=true; +have_ot=true if $have_ot; then AC_DEFINE(HAVE_OT, 1, [Have native OpenType Layout backend]) fi diff --git a/util/Makefile.am b/util/Makefile.am index 1a336b9..944b1aa 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -24,6 +24,7 @@ LDADD = \ if HAVE_GLIB if HAVE_FREETYPE + if HAVE_CAIRO_FT hb_view_SOURCES = \ hb-view.cc \ @@ -46,12 +47,8 @@ hb_view_LDADD = \ $(CAIRO_FT_LIBS) \ $(NULL) bin_PROGRAMS += hb-view -endif -endif -endif +endif # HAVE_CAIRO_FT -if HAVE_GLIB -if HAVE_FREETYPE hb_shape_SOURCES = \ hb-shape.cc \ options.cc \ @@ -60,7 +57,18 @@ hb_shape_SOURCES = \ shape-consumer.hh \ $(NULL) bin_PROGRAMS += hb-shape -endif -endif + +if HAVE_OT +hb_ot_shape_closure_SOURCES = \ + hb-ot-shape-closure.cc \ + options.cc \ + options.hh \ + main-font-text.hh \ + $(NULL) +bin_PROGRAMS += hb-ot-shape-closure +endif # HAVE_OT + +endif # HAVE_FREETYPE +endif # HAVE_GLIB -include $(top_srcdir)/git.mk diff --git a/util/hb-ot-shape-closure.cc b/util/hb-ot-shape-closure.cc new file mode 100644 index 0000000..afd88ae --- /dev/null +++ b/util/hb-ot-shape-closure.cc @@ -0,0 +1,112 @@ +/* + * Copyright © 2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "main-font-text.hh" + +#ifdef HAVE_FREETYPE +#include <hb-ft.h> +#endif + +struct shape_closure_consumer_t : option_group_t +{ + shape_closure_consumer_t (option_parser_t *parser) : + shaper (parser), + show_glyph_names (true) + { + add_options (parser); + } + + void add_options (struct option_parser_t *parser) + { + GOptionEntry entries[] = + { + {"no-glyph-names", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &this->show_glyph_names, "Use glyph indices instead of names", NULL}, + {NULL} + }; + parser->add_group (entries, + "format", + "Format options:", + "Options controlling output formatting", + this); + } + + void init (const font_options_t *font_opts) + { + glyphs = hb_set_create (); + font = hb_font_reference (font_opts->get_font ()); + } + void consume_line (hb_buffer_t *buffer, + const char *text, + unsigned int text_len) + { + FT_Face ft_face = show_glyph_names ? hb_ft_font_get_face (font) : NULL; + + hb_set_clear (glyphs); + shaper.shape_closure (text, text_len, font, buffer, glyphs); + /* Print it out! */ + hb_codepoint_t start = hb_set_min (glyphs); + hb_codepoint_t end = 1 + hb_set_max (glyphs); + bool first = true; + for (hb_codepoint_t i = start; i < end; i++) + if (hb_set_has (glyphs, i)) { + if (first) + first = false; + else + printf (" "); + /* TODO refactor this */ + char glyph_name[30]; + if (show_glyph_names) { + if (!FT_Get_Glyph_Name (ft_face, i, glyph_name, sizeof (glyph_name))) + printf ("%s", glyph_name); + else + printf ("gid%u", i); + } else + printf ("%u", i); + } + } + void finish (const font_options_t *font_opts) + { + printf ("\n"); + hb_font_destroy (font); + font = NULL; + hb_set_destroy (glyphs); + glyphs = NULL; + } + + protected: + shape_options_t shaper; + hb_bool_t show_glyph_names; + + hb_set_t *glyphs; + hb_font_t *font; +}; + +int +main (int argc, char **argv) +{ + main_font_text_t<shape_closure_consumer_t> driver; + return driver.main (argc, argv); +} diff --git a/util/options.hh b/util/options.hh index dec165b..5a79cef 100644 --- a/util/options.hh +++ b/util/options.hh @@ -48,6 +48,9 @@ #endif #include <hb.h> +#ifdef HAVE_OT +#include <hb-ot.h> +#endif #include <glib.h> #include <glib/gprintf.h> @@ -181,6 +184,15 @@ struct shape_options_t : option_group_t return hb_shape_full (font, buffer, features, num_features, shapers); } + void shape_closure (const char *text, int text_len, + hb_font_t *font, hb_buffer_t *buffer, + hb_set_t *glyphs) { + hb_buffer_reset (buffer); + hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len); + setup_buffer (buffer); + hb_ot_shape_glyphs_closure (font, buffer, features, num_features, glyphs); + } + const char *direction; const char *language; const char *script; commit 45675e589e6ef9f81b2a4199cf33e3e7778433a8 Author: Behdad Esfahbod <[email protected]> Date: Tue May 15 23:10:39 2012 -0400 [util] Refactor to accommodate for upcoming new tool diff --git a/util/Makefile.am b/util/Makefile.am index 9b4b34a..1a336b9 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -27,11 +27,12 @@ if HAVE_FREETYPE if HAVE_CAIRO_FT hb_view_SOURCES = \ hb-view.cc \ - hb-view.hh \ - ansi-print.cc \ - ansi-print.hh \ options.cc \ options.hh \ + main-font-text.hh \ + shape-consumer.hh \ + ansi-print.cc \ + ansi-print.hh \ helper-cairo.cc \ helper-cairo.hh \ helper-cairo-ansi.cc \ @@ -53,9 +54,10 @@ if HAVE_GLIB if HAVE_FREETYPE hb_shape_SOURCES = \ hb-shape.cc \ - hb-view.hh \ options.cc \ options.hh \ + main-font-text.hh \ + shape-consumer.hh \ $(NULL) bin_PROGRAMS += hb-shape endif diff --git a/util/hb-shape.cc b/util/hb-shape.cc index b22bc1f..3758be0 100644 --- a/util/hb-shape.cc +++ b/util/hb-shape.cc @@ -1,6 +1,6 @@ /* * Copyright © 2010 Behdad Esfahbod - * Copyright © 2011 Google, Inc. + * Copyright © 2011,2012 Google, Inc. * * This is part of HarfBuzz, a text shaping library. * @@ -25,59 +25,51 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-view.hh" +#include "main-font-text.hh" +#include "shape-consumer.hh" -struct output_buffer_t : output_options_t, format_options_t +struct output_buffer_t : output_options_t { output_buffer_t (option_parser_t *parser) : output_options_t (parser), - format_options_t (parser) {} + format (parser) {} - void init (const font_options_t *font_opts); + void init (const font_options_t *font_opts) + { + get_file_handle (); + gs = g_string_new (NULL); + line_no = 0; + font = hb_font_reference (font_opts->get_font ()); + } void consume_line (hb_buffer_t *buffer, const char *text, unsigned int text_len, - hb_bool_t utf8_clusters); - void finish (const font_options_t *font_opts); + hb_bool_t utf8_clusters) + { + line_no++; + g_string_set_size (gs, 0); + format.serialize_line (buffer, line_no, text, text_len, font, utf8_clusters, gs); + fprintf (fp, "%s", gs->str); + } + void finish (const font_options_t *font_opts) + { + hb_font_destroy (font); + g_string_free (gs, TRUE); + gs = NULL; + font = NULL; + } protected: + format_options_t format; + GString *gs; - hb_font_t *font; unsigned int line_no; + hb_font_t *font; }; -void -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); - line_no = 0; -} - -void -output_buffer_t::consume_line (hb_buffer_t *buffer, - const char *text, - unsigned int text_len, - hb_bool_t utf8_clusters) -{ - line_no++; - g_string_set_size (gs, 0); - serialize_line (buffer, line_no, text, text_len, font, utf8_clusters, gs); - fprintf (fp, "%s", gs->str); -} - -void -output_buffer_t::finish (const font_options_t *font_opts) -{ - g_string_free (gs, TRUE); - gs = NULL; - hb_font_destroy (font); - font = NULL; -} - int main (int argc, char **argv) { - return hb_view_t<output_buffer_t>::main (argc, argv); + main_font_text_t<shape_consumer_t<output_buffer_t> > driver; + return driver.main (argc, argv); } diff --git a/util/hb-view.cc b/util/hb-view.cc index 3bd1364..26fad66 100644 --- a/util/hb-view.cc +++ b/util/hb-view.cc @@ -1,6 +1,6 @@ /* * Copyright © 2010 Behdad Esfahbod - * Copyright © 2011 Google, Inc. + * Copyright © 2011,2012 Google, Inc. * * This is part of HarfBuzz, a text shaping library. * @@ -25,11 +25,13 @@ * Google Author(s): Behdad Esfahbod */ -#include "hb-view.hh" +#include "main-font-text.hh" +#include "shape-consumer.hh" #include "view-cairo.hh" int main (int argc, char **argv) { - return hb_view_t<view_cairo_t>::main (argc, argv); + main_font_text_t<shape_consumer_t<view_cairo_t> > driver; + return driver.main (argc, argv); } diff --git a/util/hb-view.hh b/util/hb-view.hh deleted file mode 100644 index 61af2a8..0000000 --- a/util/hb-view.hh +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright © 2011 Google, Inc. - * - * This is part of HarfBuzz, a text shaping library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Google Author(s): Behdad Esfahbod - */ - -#include "options.hh" - -#ifndef HB_VIEW_HH -#define HB_VIEW_HH - -template <typename output_t> -struct hb_view_t -{ - static int - main (int argc, char **argv) - { - option_parser_t options ("[FONT-FILE] [TEXT]"); - - shape_options_t shaper (&options); - font_options_t font_opts (&options); - text_options_t input (&options); - - output_t output (&options); - - options.parse (&argc, &argv); - - argc--, argv++; - if (argc && !font_opts.font_file) font_opts.font_file = argv[0], argc--, argv++; - if (argc && !input.text && !input.text_file) input.text = argv[0], argc--, argv++; - if (argc) - fail (TRUE, "Too many arguments on the command line"); - if (!font_opts.font_file) - options.usage (); - if (!input.text && !input.text_file) - input.text_file = "-"; - - output.init (&font_opts); - - hb_buffer_t *buffer = hb_buffer_create (); - unsigned int text_len; - const char *text; - while ((text = input.get_line (&text_len))) - { - if (!shaper.shape (text, text_len, - font_opts.get_font (), - buffer)) - fail (FALSE, "All shapers failed"); - - output.consume_line (buffer, text, text_len, shaper.utf8_clusters); - } - hb_buffer_destroy (buffer); - - output.finish (&font_opts); - - return 0; - } -}; - -#endif diff --git a/util/main-font-text.hh b/util/main-font-text.hh new file mode 100644 index 0000000..1a9739f --- /dev/null +++ b/util/main-font-text.hh @@ -0,0 +1,80 @@ +/* + * Copyright © 2011,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "options.hh" + +#ifndef HB_MAIN_FONT_TEXT_HH +#define HB_MAIN_FONT_TEXT_HH + +/* main() body for utilities taking font and processing text.*/ + +template <typename consumer_t> +struct main_font_text_t +{ + main_font_text_t (void) + : options ("[FONT-FILE] [TEXT]"), + font_opts (&options), + input (&options), + consumer (&options) {} + + int + main (int argc, char **argv) + { + options.parse (&argc, &argv); + + argc--, argv++; + if (argc && !font_opts.font_file) font_opts.font_file = argv[0], argc--, argv++; + if (argc && !input.text && !input.text_file) input.text = argv[0], argc--, argv++; + if (argc) + fail (TRUE, "Too many arguments on the command line"); + if (!font_opts.font_file) + options.usage (); + if (!input.text && !input.text_file) + input.text_file = "-"; + + consumer.init (&font_opts); + + hb_buffer_t *buffer = hb_buffer_create (); + unsigned int text_len; + const char *text; + while ((text = input.get_line (&text_len))) + consumer.consume_line (buffer, text, text_len); + hb_buffer_destroy (buffer); + + consumer.finish (&font_opts); + + return 0; + } + + protected: + option_parser_t options; + font_options_t font_opts; + text_options_t input; + consumer_t consumer; +}; + +#endif + diff --git a/util/shape-consumer.hh b/util/shape-consumer.hh new file mode 100644 index 0000000..d395b24 --- /dev/null +++ b/util/shape-consumer.hh @@ -0,0 +1,69 @@ +/* + * Copyright © 2011,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#include "options.hh" + +#ifndef HB_SHAPE_CONSUMER_HH +#define HB_SHAPE_CONSUMER_HH + + +template <typename output_t> +struct shape_consumer_t +{ + shape_consumer_t (option_parser_t *parser) + : shaper (parser), + output (parser) {} + + void init (const font_options_t *font_opts) + { + font = hb_font_reference (font_opts->get_font ()); + output.init (font_opts); + } + void consume_line (hb_buffer_t *buffer, + const char *text, + unsigned int text_len) + { + if (!shaper.shape (text, text_len, font, buffer)) + fail (FALSE, "All shapers failed"); + + output.consume_line (buffer, text, text_len, shaper.utf8_clusters); + } + void finish (const font_options_t *font_opts) + { + output.finish (font_opts); + hb_font_destroy (font); + font = NULL; + } + + protected: + shape_options_t shaper; + output_t output; + + hb_font_t *font; +}; + + +#endif
_______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
