diff options
author | Grigori Goronzy <greg@blackbox> | 2009-07-17 02:56:05 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@blackbox> | 2009-07-17 02:56:05 +0200 |
commit | b4e604380d8ec8fa5b991a1b028240fc4436eec7 (patch) | |
tree | c3cfb14da2975a34c7f90884bb6086078aae2119 | |
parent | 0f2cf3f12a3eed740d7717fb35c11ba5d8fe4c22 (diff) | |
download | libass-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.h | 11 | ||||
-rw-r--r-- | libass/ass_fontconfig.c | 37 | ||||
-rw-r--r-- | libass/ass_fontconfig.h | 5 | ||||
-rw-r--r-- | libass/ass_render.c | 12 | ||||
-rw-r--r-- | libass/libass.sym | 1 | ||||
-rw-r--r-- | test/test.c | 2 |
6 files changed, 48 insertions, 20 deletions
diff --git a/libass/ass.h b/libass/ass.h index 0a03ec2a..b7eab3c7 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 d8d64e22..4eee1975 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 53441cce..24c164d9 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 df4e74c9..b5e8ab70 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 5cb1c40a..c702842c 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 8c7b6021..68099868 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) |