summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libass/ass.h21
-rw-r--r--libass/ass_coretext.c3
-rw-r--r--libass/ass_coretext.h3
-rw-r--r--libass/ass_fontselect.c43
-rw-r--r--libass/ass_fontselect.h3
-rw-r--r--libass/ass_render_api.c6
-rw-r--r--test/test.c3
7 files changed, 61 insertions, 21 deletions
diff --git a/libass/ass.h b/libass/ass.h
index 1f8a506..a3feb0b 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 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)
diff --git a/test/test.c b/test/test.c
index f533e7a..8522840 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)