summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@blackbox>2009-07-17 02:56:05 +0200
committerGrigori Goronzy <greg@blackbox>2009-07-17 02:56:05 +0200
commitb4e604380d8ec8fa5b991a1b028240fc4436eec7 (patch)
treec3cfb14da2975a34c7f90884bb6086078aae2119
parent0f2cf3f12a3eed740d7717fb35c11ba5d8fe4c22 (diff)
downloadlibass-b4e604380d8ec8fa5b991a1b028240fc4436eec7.tar.bz2
libass-b4e604380d8ec8fa5b991a1b028240fc4436eec7.tar.xz
Improve fontconfig setup
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.
-rw-r--r--libass/ass.h11
-rw-r--r--libass/ass_fontconfig.c37
-rw-r--r--libass/ass_fontconfig.h5
-rw-r--r--libass/ass_render.c12
-rw-r--r--libass/libass.sym1
-rw-r--r--test/test.c2
6 files changed, 48 insertions, 20 deletions
diff --git a/libass/ass.h b/libass/ass.h
index 0a03ec2..b7eab3c 100644
--- a/libass/ass.h
+++ b/libass/ass.h
@@ -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
diff --git a/libass/ass_fontconfig.c b/libass/ass_fontconfig.c
index d8d64e2..4eee197 100644
--- a/libass/ass_fontconfig.c
+++ b/libass/ass_fontconfig.c
@@ -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)
diff --git a/libass/ass_fontconfig.h b/libass/ass_fontconfig.h
index 53441cc..24c164d 100644
--- a/libass/ass_fontconfig.h
+++ b/libass/ass_fontconfig.h
@@ -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 */
diff --git a/libass/ass_render.c b/libass/ass_render.c
index df4e74c..b5e8ab7 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -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);
}
/**
diff --git a/libass/libass.sym b/libass/libass.sym
index 5cb1c40..c702842 100644
--- a/libass/libass.sym
+++ b/libass/libass.sym
@@ -31,3 +31,4 @@ ass_clear_fonts
ass_step_sub
ass_process_force_style
ass_set_message_cb
+ass_fonts_update
diff --git a/test/test.c b/test/test.c
index 8c7b602..6809986 100644
--- a/test/test.c
+++ b/test/test.c
@@ -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)