AUTHORS | 1 util/options.cc | 82 +++++++++++++++++++++++++++++++++++++++++++++++--------- util/options.hh | 30 ++++++++++++++++++++ 3 files changed, 100 insertions(+), 13 deletions(-)
New commits: commit 8650def73500204b79c651f58b1be3f94a41973d Author: Behdad Esfahbod <[email protected]> Date: Sat Jul 5 15:50:18 2014 -0400 [util] Add option to set font function implementation to use Supports ft and ot right now. hb-view currently not rendering with ot. Will fix after some clean up. diff --git a/util/options.cc b/util/options.cc index c65888e..738fb7a 100644 --- a/util/options.cc +++ b/util/options.cc @@ -28,10 +28,24 @@ #ifdef HAVE_FREETYPE #include <hb-ft.h> -#else +#endif +#ifdef HAVE_OT #include <hb-ot-font.h> #endif +struct supported_font_funcs_t { + char name[4]; + void (*func) (hb_font_t *); +} supported_font_funcs[] = +{ +#ifdef HAVE_FREETYPE + {"ft", hb_ft_font_set_funcs}, +#endif +#ifdef HAVE_OT + {"ot", hb_ot_font_set_funcs}, +#endif +}; + void fail (hb_bool_t suggest_help, const char *format, ...) @@ -269,7 +283,7 @@ shape_options_t::add_options (option_parser_t *parser) G_OPTION_ARG_CALLBACK, (gpointer) &list_shapers, "List available shapers and quit", NULL}, {"shaper", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_shapers, "Hidden duplicate of --shapers", NULL}, - {"shapers", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_shapers, "Comma-separated list of shapers to try","list"}, + {"shapers", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_shapers, "Set comma-separated list of shapers to try","list"}, {"direction", 0, 0, G_OPTION_ARG_STRING, &this->direction, "Set text direction (default: auto)", "ltr/rtl/ttb/btt"}, {"language", 0, 0, G_OPTION_ARG_STRING, &this->language, "Set text language (default: $LANG)", "langstr"}, {"script", 0, 0, G_OPTION_ARG_STRING, &this->script, "Set text script (default: auto)", "ISO-15924 tag"}, @@ -336,10 +350,28 @@ shape_options_t::add_options (option_parser_t *parser) void font_options_t::add_options (option_parser_t *parser) { + char *text = NULL; + + { + ASSERT_STATIC (ARRAY_LENGTH_CONST (supported_font_funcs) > 0); + GString *s = g_string_new (NULL); + g_string_printf (s, "Set font functions implementation to use (default: %s)\n\n Supported font function implementations are: %s", + supported_font_funcs[0].name, + supported_font_funcs[0].name); + for (unsigned int i = 1; i < ARRAY_LENGTH (supported_font_funcs); i++) + { + g_string_append_c (s, '/'); + g_string_append (s, supported_font_funcs[i].name); + } + text = g_string_free (s, FALSE); + parser->free_later (text); + } + GOptionEntry entries[] = { - {"font-file", 0, 0, G_OPTION_ARG_STRING, &this->font_file, "Font file-name", "filename"}, - {"face-index", 0, 0, G_OPTION_ARG_INT, &this->face_index, "Face index (default: 0)", "index"}, + {"font-file", 0, 0, G_OPTION_ARG_STRING, &this->font_file, "Set font file-name", "filename"}, + {"face-index", 0, 0, G_OPTION_ARG_INT, &this->face_index, "Set face index (default: 0)", "index"}, + {"font-funcs", 0, 0, G_OPTION_ARG_STRING, &this->font_funcs, text, "format"}, {NULL} }; parser->add_group (entries, @@ -484,11 +516,37 @@ font_options_t::get_font (void) const hb_font_set_scale (font, upem, upem); hb_face_destroy (face); -#ifdef HAVE_FREETYPE - hb_ft_font_set_funcs (font); -#else - hb_ot_font_set_funcs (font); -#endif + void (*set_font_funcs) (hb_font_t *) = NULL; + if (!font_funcs) + { + set_font_funcs = supported_font_funcs[0].func; + } + else + { + for (unsigned int i = 0; i < ARRAY_LENGTH (supported_font_funcs); i++) + if (0 == strcasecmp (font_funcs, supported_font_funcs[i].name)) + { + set_font_funcs = supported_font_funcs[i].func; + break; + } + if (!set_font_funcs) + { + GString *s = g_string_new (NULL); + for (unsigned int i = 0; i < ARRAY_LENGTH (supported_font_funcs); i++) + { + if (i) + g_string_append_c (s, '/'); + g_string_append (s, supported_font_funcs[i].name); + } + char *p = g_string_free (s, FALSE); + fail (false, "Unknown font function implementation `%s'; supported values are: %s; default is %s", + font_funcs, + p, + supported_font_funcs[0].name); + //free (p); + } + } + set_font_funcs (font); return font; } diff --git a/util/options.hh b/util/options.hh index 4437707..223778d 100644 --- a/util/options.hh +++ b/util/options.hh @@ -58,12 +58,31 @@ # define g_mapped_file_unref g_mapped_file_free #endif + +/* A few macros copied from hb-private.hh. */ + +#if __GNUC__ >= 4 +#define HB_UNUSED __attribute__((unused)) +#else +#define HB_UNUSED +#endif + #undef MIN template <typename Type> static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; } #undef MAX template <typename Type> static inline Type MAX (const Type &a, const Type &b) { return a > b ? a : b; } +#undef ARRAY_LENGTH +template <typename Type, unsigned int n> +static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; } +/* A const version, but does not detect erratically being called on pointers. */ +#define ARRAY_LENGTH_CONST(__array) ((signed int) (sizeof (__array) / sizeof (__array[0]))) + +#define _ASSERT_STATIC1(_line, _cond) HB_UNUSED typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1] +#define _ASSERT_STATIC0(_line, _cond) _ASSERT_STATIC1 (_line, (_cond)) +#define ASSERT_STATIC(_cond) _ASSERT_STATIC0 (__LINE__, (_cond)) + void fail (hb_bool_t suggest_help, const char *format, ...) G_GNUC_NORETURN G_GNUC_PRINTF (2, 3); @@ -257,6 +276,7 @@ struct font_options_t : option_group_t font_options_t (option_parser_t *parser) { font_file = NULL; face_index = 0; + font_funcs = NULL; font = NULL; @@ -272,6 +292,7 @@ struct font_options_t : option_group_t const char *font_file; int face_index; + const char *font_funcs; private: mutable hb_font_t *font; commit 2306ad46dce1c53b0b1bfabdc04d70e3b99eabb7 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 4 18:09:29 2014 -0400 [util] Fix memory issue diff --git a/util/options.cc b/util/options.cc index f872bb4..c65888e 100644 --- a/util/options.cc +++ b/util/options.cc @@ -371,15 +371,15 @@ void output_options_t::add_options (option_parser_t *parser) { const char *text; - char *text_free = NULL; if (NULL == supported_formats) text = "Set output format"; else { char *items = g_strjoinv ("/", const_cast<char **> (supported_formats)); - text = text_free = g_strdup_printf ("Set output format\n\n Supported formats are: %s", items); + text = g_strdup_printf ("Set output format\n\n Supported output formats are: %s", items); g_free (items); + parser->free_later ((char *) text); } GOptionEntry entries[] = @@ -393,8 +393,6 @@ output_options_t::add_options (option_parser_t *parser) "Output options:", "Options controlling the output", this); - - g_free (text_free); } diff --git a/util/options.hh b/util/options.hh index a236a5d..4437707 100644 --- a/util/options.hh +++ b/util/options.hh @@ -85,11 +85,14 @@ struct option_parser_t memset (this, 0, sizeof (*this)); usage_str = usage; context = g_option_context_new (usage); + to_free = g_ptr_array_new (); add_main_options (); } ~option_parser_t (void) { g_option_context_free (context); + g_ptr_array_foreach (to_free, (GFunc) g_free, NULL); + g_ptr_array_free (to_free, TRUE); } void add_main_options (void); @@ -100,6 +103,10 @@ struct option_parser_t const gchar *help_description, option_group_t *option_group); + void free_later (char *p) { + g_ptr_array_add (to_free, p); + } + void parse (int *argc, char ***argv); G_GNUC_NORETURN void usage (void) { @@ -107,8 +114,10 @@ struct option_parser_t exit (1); } + private: const char *usage_str; GOptionContext *context; + GPtrArray *to_free; }; commit 14a4a9d649798d32c31f79b4045a885626dffc7f Author: Behdad Esfahbod <[email protected]> Date: Tue Jul 1 15:51:54 2014 -0400 Add Roozbeh to AUTHORS He's been my shadow for all Indic-related changes in the last few months. diff --git a/AUTHORS b/AUTHORS index c611d7d..81cdc4c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -4,5 +4,6 @@ Martin Hosken Jonathan Kew Lars Knoll Werner Lemberg +Roozbeh Pournader Owen Taylor David Turner _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
