From bc743feb07cffe7a81e07411a484e499377deb50 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Tue, 10 Dec 2013 18:45:54 +0100 Subject: fontselect: expose a fontprovider selection API Allow the user of libass to select the font provider from ass_set_fonts. This API change actually doesn't break client code which was passing `fc=1`; now the same value will autodetect a usable font provider. Also add an api to list available font providers as that is useful for client code to show drop down menus with a font provider to choose from. --- libass/ass.h | 21 +++++++++++++++++++-- libass/ass_coretext.c | 3 ++- libass/ass_coretext.h | 3 ++- libass/ass_fontselect.c | 43 +++++++++++++++++++++++++++++++------------ libass/ass_fontselect.h | 3 ++- libass/ass_render_api.c | 6 +++--- 6 files changed, 59 insertions(+), 20 deletions(-) (limited to 'libass') diff --git a/libass/ass.h b/libass/ass.h index 1f8a506..a3feb0b 100644 --- a/libass/ass.h +++ b/libass/ass.h @@ -175,6 +175,23 @@ typedef enum { */ int ass_library_version(void); +/** + * \brief Default Font provider to load fonts in libass' database + * + * NONE don't use any default font provider for font lookup + * AUTODETECT use the first available font provider + * CORETEXT force a CoreText based font provider (OS X only) + * FONTCONFIG force a Fontconfig based font provider + * + * libass uses the best shaper available by default. + */ +typedef enum { + ASS_FONTPROVIDER_NONE = 0, + ASS_FONTPROVIDER_AUTODETECT = 1, + ASS_FONTPROVIDER_CORETEXT, + ASS_FONTPROVIDER_FONTCONFIG, +} ASS_DefaultFontProvider; + /** * \brief Initialize the library. * \return library handle or NULL if failed @@ -397,8 +414,8 @@ void ass_set_line_position(ASS_Renderer *priv, double line_position); * NOTE: font lookup must be configured before an ASS_Renderer can be used. */ void ass_set_fonts(ASS_Renderer *priv, const char *default_font, - const char *default_family, int fc, const char *config, - int update); + const char *default_family, ASS_DefaultFontProvider dfp, + const char *config, int update); /** * \brief Set selective style override mode. diff --git a/libass/ass_coretext.c b/libass/ass_coretext.c index bf2e301..5347541 100644 --- a/libass/ass_coretext.c +++ b/libass/ass_coretext.c @@ -277,7 +277,8 @@ static ASS_FontProviderFuncs coretext_callbacks = { }; ASS_FontProvider * -ass_coretext_add_provider(ASS_Library *lib, ASS_FontSelector *selector) +ass_coretext_add_provider(ASS_Library *lib, ASS_FontSelector *selector, + const char *config) { ASS_FontProvider *provider = ass_font_provider_new(selector, &coretext_callbacks, NULL); diff --git a/libass/ass_coretext.h b/libass/ass_coretext.h index 8d96927..07a49fa 100644 --- a/libass/ass_coretext.h +++ b/libass/ass_coretext.h @@ -27,7 +27,8 @@ #ifdef CONFIG_CORETEXT ASS_FontProvider * -ass_coretext_add_provider(ASS_Library *lib, ASS_FontSelector *selector); +ass_coretext_add_provider(ASS_Library *lib, ASS_FontSelector *selector, + const char *config); #endif diff --git a/libass/ass_fontselect.c b/libass/ass_fontselect.c index f804c94..dacff11 100644 --- a/libass/ass_fontselect.c +++ b/libass/ass_fontselect.c @@ -790,6 +790,22 @@ ass_embedded_fonts_add_provider(ASS_Library *lib, ASS_FontSelector *selector, return priv; } +struct font_constructors { + ASS_DefaultFontProvider id; + ASS_FontProvider *(*constructor)(ASS_Library *, ASS_FontSelector *, + const char *); +}; + +struct font_constructors font_constructors[] = { +#ifdef CONFIG_CORETEXT + { ASS_FONTPROVIDER_CORETEXT, &ass_coretext_add_provider }, +#endif +#ifdef CONFIG_FONTCONFIG + { ASS_FONTPROVIDER_FONTCONFIG, &ass_fontconfig_add_provider }, +#endif + { ASS_FONTPROVIDER_NONE, NULL }, +}; + /** * \brief Init font selector. * \param library libass library object @@ -801,7 +817,8 @@ ass_embedded_fonts_add_provider(ASS_Library *lib, ASS_FontSelector *selector, ASS_FontSelector * ass_fontselect_init(ASS_Library *library, FT_Library ftlibrary, const char *family, - const char *path, const char *config, int fc) + const char *path, const char *config, + ASS_DefaultFontProvider dfp) { ASS_FontSelector *priv = calloc(1, sizeof(ASS_FontSelector)); @@ -813,18 +830,20 @@ ass_fontselect_init(ASS_Library *library, priv->embedded_provider = ass_embedded_fonts_add_provider(library, priv, ftlibrary); -#ifdef CONFIG_CORETEXT - if (fc != 0) { - priv->default_provider = ass_coretext_add_provider(library, priv); - return priv; - } -#endif + if (dfp >= ASS_FONTPROVIDER_AUTODETECT) { + int found = 0; + for (int i = 0; !found && font_constructors[i].constructor; i++ ) + if (dfp == font_constructors[i].id || + dfp == ASS_FONTPROVIDER_AUTODETECT) { + priv->default_provider = + font_constructors[i].constructor(library, priv, config); + found = 1; + } -#ifdef CONFIG_FONTCONFIG - if (fc != 0) - priv->default_provider = ass_fontconfig_add_provider(library, - priv, config); -#endif + if (!found) + ass_msg(library, MSGL_WARN, "can't find selected font provider"); + + } return priv; } diff --git a/libass/ass_fontselect.h b/libass/ass_fontselect.h index c1371dd..267b6fe 100644 --- a/libass/ass_fontselect.h +++ b/libass/ass_fontselect.h @@ -34,7 +34,8 @@ typedef struct font_info ASS_FontInfo; ASS_FontSelector * ass_fontselect_init(ASS_Library *library, FT_Library ftlibrary, const char *family, - const char *path, const char *config, int fc); + const char *path, const char *config, + ASS_DefaultFontProvider dfp); char *ass_font_select(ASS_FontSelector *priv, ASS_Library *library, ASS_Font *font, int *index, char **postscript_name, int *uid, ASS_FontStream *data, uint32_t code); diff --git a/libass/ass_render_api.c b/libass/ass_render_api.c index fe883bb..efc88f1 100644 --- a/libass/ass_render_api.c +++ b/libass/ass_render_api.c @@ -135,8 +135,8 @@ void ass_set_line_position(ASS_Renderer *priv, double line_position) } void ass_set_fonts(ASS_Renderer *priv, const char *default_font, - const char *default_family, int fc, const char *config, - int update) + const char *default_family, ASS_DefaultFontProvider dfp, + const char *config, int update) { free(priv->settings.default_font); free(priv->settings.default_family); @@ -147,7 +147,7 @@ void ass_set_fonts(ASS_Renderer *priv, const char *default_font, if (priv->fontselect) ass_fontselect_free(priv->fontselect); priv->fontselect = ass_fontselect_init(priv->library, priv->ftlibrary, - default_family, default_font, config, fc); + default_family, default_font, config, dfp); } void ass_set_selective_style_override_enabled(ASS_Renderer *priv, int bits) -- cgit v1.2.3