diff options
author | Stefano Pigozzi <stefano.pigozzi@gmail.com> | 2013-12-10 18:45:54 +0100 |
---|---|---|
committer | Grigori Goronzy <greg@chown.ath.cx> | 2015-07-10 10:42:40 +0200 |
commit | bc743feb07cffe7a81e07411a484e499377deb50 (patch) | |
tree | 1d5bd66659bbef67c0a1145a4bbcd4b109c06230 | |
parent | e95626628eab9a892047c60e4b9926ab50ce1bd4 (diff) | |
download | libass-bc743feb07cffe7a81e07411a484e499377deb50.tar.bz2 libass-bc743feb07cffe7a81e07411a484e499377deb50.tar.xz |
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.
-rw-r--r-- | libass/ass.h | 21 | ||||
-rw-r--r-- | libass/ass_coretext.c | 3 | ||||
-rw-r--r-- | libass/ass_coretext.h | 3 | ||||
-rw-r--r-- | libass/ass_fontselect.c | 43 | ||||
-rw-r--r-- | libass/ass_fontselect.h | 3 | ||||
-rw-r--r-- | libass/ass_render_api.c | 6 | ||||
-rw-r--r-- | test/test.c | 3 |
7 files changed, 61 insertions, 21 deletions
diff --git a/libass/ass.h b/libass/ass.h index 1f8a506b..a3feb0b3 100644 --- a/libass/ass.h +++ b/libass/ass.h @@ -176,6 +176,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 bf2e3014..5347541b 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 8d969275..07a49fa6 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 f804c94f..dacff11e 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 c1371ddc..267b6fe2 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 fe883bbe..efc88f1f 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) diff --git a/test/test.c b/test/test.c index f533e7ad..8522840c 100644 --- a/test/test.c +++ b/test/test.c @@ -107,7 +107,8 @@ static void init(int frame_w, int frame_h) } ass_set_frame_size(ass_renderer, frame_w, frame_h); - ass_set_fonts(ass_renderer, NULL, "Sans", 1, NULL, 1); + ass_set_fonts(ass_renderer, NULL, "Sans", + ASS_FONTPROVIDER_AUTODETECT, NULL, 1); } static image_t *gen_image(int width, int height) |