]> granicus.if.org Git - libass/commitdiff
fontselect: expose a fontprovider selection API
authorStefano Pigozzi <stefano.pigozzi@gmail.com>
Tue, 10 Dec 2013 17:45:54 +0000 (18:45 +0100)
committerGrigori Goronzy <greg@chown.ath.cx>
Fri, 10 Jul 2015 08:42:40 +0000 (10:42 +0200)
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
libass/ass_coretext.c
libass/ass_coretext.h
libass/ass_fontselect.c
libass/ass_fontselect.h
libass/ass_render_api.c
test/test.c

index 1f8a506bb7eb2bdc0ebabcb3a509c938dc6f9cee..a3feb0b3e3814dfe57812052d56637927e1e3701 100644 (file)
@@ -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.
index bf2e30140bc2e4ef58cc8cd870a07840ca52abc4..5347541b1ccac6e227b914d9ad744a9deda5d762 100644 (file)
@@ -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);
index 8d96927520bf36316b6c5bfad965fbfa2b26eb9d..07a49fa6d9ced16321e056d7c80e7cb65e961a4f 100644 (file)
@@ -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
 
index f804c94f75ea04ba4817c11243e33b7951d2c5e2..dacff11e5432f390a6670dec62134486b8c92b37 100644 (file)
@@ -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;
 }
index c1371ddc2ffbe3fc66de66c823c2756a9367408b..267b6fe2b9c9f4f329c3d79cdd21a15b81945ee7 100644 (file)
@@ -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);
index fe883bbef873c1802e544fc5531c8e7d8d5e7f64..efc88f1f738ef5d9d87c0fd2f1279207ded55dfd 100644 (file)
@@ -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)
index f533e7ad27ff9a43d2a20ea4faeee014e99caf89..8522840c25fb952ee250761b33a322409136936e 100644 (file)
@@ -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)