]> granicus.if.org Git - libass/commitdiff
Improve fontconfig setup
authorGrigori Goronzy <greg@blackbox>
Fri, 17 Jul 2009 00:56:05 +0000 (02:56 +0200)
committerGrigori Goronzy <greg@blackbox>
Fri, 17 Jul 2009 00:56:05 +0000 (02:56 +0200)
Add an argument to ass_set_fonts for controlling whether the fontconfig
font cache should be built/updated.  Add a new function ass_fonts_update
to make it possible to update fonts later on.
Additionally, stop using FcConfigSetDefault for thread safety.

libass/ass.h
libass/ass_fontconfig.c
libass/ass_fontconfig.h
libass/ass_render.c
libass/libass.sym
test/test.c

index 0a03ec2a0cea1698f6e7336a4c9246a3143f6457..b7eab3c7ec1b3cd8d7b227294047c6b53827e116 100644 (file)
@@ -100,9 +100,16 @@ void ass_set_line_spacing(ass_renderer_t *priv, double line_spacing);
  * \param fc bool, use fontconfig?
  * \param config path to fontconfig configuration file, or NULL. Only matters
  * if fontconfig is used
+ * \param update whether fontconfig cache should be built/updated now. Make
+ * sure to call ass_fonts_update later if 0! Only matters if fontconfig
+ * is used.
+ * \return success
  */
-int ass_set_fonts(ass_renderer_t *priv, const char *default_font,
-                  const char *default_family, int fc, const char *config);
+void ass_set_fonts(ass_renderer_t *priv, const char *default_font,
+                   const char *default_family, int fc, const char *config,
+                   int update);
+
+int ass_fonts_update(ass_renderer_t *priv);
 
 /**
  * \brief render a frame, producing a list of ass_image_t
index d8d64e2299b33461e4fd1303a8764ade22a96c13..4eee1975f045300cce75f3f999bdd5e7aece70d1 100644 (file)
@@ -427,11 +427,15 @@ static void process_fontdata(fc_instance_t *priv, ass_library_t *library,
  * \param ftlibrary freetype library object
  * \param family default font family
  * \param path default font path
+ * \param fc whether fontconfig should be used
+ * \param config path to a fontconfig configuration file, or NULL
+ * \param update whether the fontconfig cache should be built/updated
  * \return pointer to fontconfig private data
 */
 fc_instance_t *fontconfig_init(ass_library_t *library,
                                FT_Library ftlibrary, const char *family,
-                               const char *path, int fc, const char *config)
+                               const char *path, int fc, const char *config,
+                               int update)
 {
     int rc;
     fc_instance_t *priv = calloc(1, sizeof(fc_instance_t));
@@ -444,20 +448,18 @@ fc_instance_t *fontconfig_init(ass_library_t *library,
         goto exit;
     }
 
-    if (config) {
-        priv->config = FcConfigCreate();
-        rc = FcConfigParseAndLoad(priv->config, (unsigned char *)config,
-                                  FcTrue);
+    if (!config)
+        config = (char *) FcConfigFilename(NULL);
+
+    priv->config = FcConfigCreate();
+    rc = FcConfigParseAndLoad(priv->config, (unsigned char *) config, FcTrue);
+    if (rc && update) {
         FcConfigBuildFonts(priv->config);
-        FcConfigSetCurrent(priv->config);
-    } else {
-        rc = FcInit();
-        assert(rc);
-        priv->config = FcConfigGetCurrent();
     }
 
     if (!rc || !priv->config) {
         ass_msg(library, MSGL_FATAL, "%s failed", "FcInitLoadConfigAndFonts");
+        FcConfigDestroy(priv->config);
         goto exit;
     }
 
@@ -507,13 +509,18 @@ fc_instance_t *fontconfig_init(ass_library_t *library,
     }
 
     priv->family_default = family ? strdup(family) : NULL;
-  exit:
+exit:
     priv->path_default = path ? strdup(path) : NULL;
     priv->index_default = 0;
 
     return priv;
 }
 
+int fontconfig_update(fc_instance_t *priv)
+{
+        return FcConfigBuildFonts(priv->config);
+}
+
 #else                           /* CONFIG_FONTCONFIG */
 
 char *fontconfig_select(fc_instance_t *priv, const char *family,
@@ -526,7 +533,8 @@ char *fontconfig_select(fc_instance_t *priv, const char *family,
 
 fc_instance_t *fontconfig_init(ass_library_t *library,
                                FT_Library ftlibrary, const char *family,
-                               const char *path, int fc)
+                               const char *path, int fc, const char *config,
+                               int update)
 {
     fc_instance_t *priv;
 
@@ -540,6 +548,11 @@ fc_instance_t *fontconfig_init(ass_library_t *library,
     return priv;
 }
 
+int fontconfig_update(fc_instance_t *priv)
+{
+    // Do nothing
+}
+
 #endif
 
 void fontconfig_done(fc_instance_t *priv)
index 53441cce674f579458810771dd84fe9f40b45acb..24c164d9d188040c94e05d50144fb2ddd325e8f8 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <stdint.h>
 #include "ass_types.h"
+#include "ass.h"
 #include <ft2build.h>
 #include FT_FREETYPE_H
 
@@ -34,11 +35,13 @@ typedef struct fc_instance_s fc_instance_t;
 
 fc_instance_t *fontconfig_init(ass_library_t *library,
                                FT_Library ftlibrary, const char *family,
-                               const char *path, int fc, const char *config);
+                               const char *path, int fc, const char *config,
+                               int update);
 char *fontconfig_select(ass_library_t *library, fc_instance_t *priv,
                         const char *family, int treat_family_as_pattern,
                         unsigned bold, unsigned italic, int *index,
                         uint32_t code);
 void fontconfig_done(fc_instance_t *priv);
+int fontconfig_update(fc_instance_t *priv);
 
 #endif                          /* LIBASS_FONTCONFIG_H */
index df4e74c9d3025dc442ad9207bed78ffbb8bb81c5..b5e8ab707f7a986605c5f6366fbcbfcbc1accad8 100644 (file)
@@ -3186,8 +3186,9 @@ void ass_set_line_spacing(ass_renderer_t *priv, double line_spacing)
     priv->settings.line_spacing = line_spacing;
 }
 
-int ass_set_fonts(ass_renderer_t *priv, const char *default_font,
-                  const char *default_family, int fc, const char *config)
+void ass_set_fonts(ass_renderer_t *priv, const char *default_font,
+                   const char *default_family, int fc, const char *config,
+                   int update)
 {
     if (priv->settings.default_font)
         free(priv->settings.default_font);
@@ -3204,9 +3205,12 @@ int ass_set_fonts(ass_renderer_t *priv, const char *default_font,
         fontconfig_done(priv->fontconfig_priv);
     priv->fontconfig_priv =
         fontconfig_init(priv->library, priv->ftlibrary, default_family,
-                        default_font, fc, config);
+                        default_font, fc, config, update);
+}
 
-    return !!priv->fontconfig_priv;
+int ass_fonts_update(ass_renderer_t *render_priv)
+{
+    return fontconfig_update(render_priv->fontconfig_priv);
 }
 
 /**
index 5cb1c40a4b79c67aeeb50c440e2d1860302c142c..c702842c98af4070d1a784134081d25efe0376e1 100644 (file)
@@ -31,3 +31,4 @@ ass_clear_fonts
 ass_step_sub
 ass_process_force_style
 ass_set_message_cb
+ass_fonts_update
index 8c7b6021abdb57d038b7508f118469ad21b948e5..68099868cbea399c69e9bab1d9efc3713af7e9f6 100644 (file)
@@ -93,7 +93,7 @@ static void init(int frame_w, int frame_h)
     ass_set_margins(ass_renderer, 0, 0, 0, 0);
     ass_set_use_margins(ass_renderer, 0);
     ass_set_font_scale(ass_renderer, 1.);
-    ass_set_fonts(ass_renderer, NULL, "Sans", 1, NULL);
+    ass_set_fonts(ass_renderer, NULL, "Sans", 1, NULL, 1);
 }
 
 static image_t *gen_image(int width, int height)