summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compare/compare.c1
-rw-r--r--libass/ass_fontselect.c21
-rw-r--r--libass/ass_fontselect.h11
-rw-r--r--libass/ass_render.c6
-rw-r--r--libass/ass_render.h1
-rw-r--r--libass/ass_render_api.c2
-rw-r--r--profile/profile.c1
-rw-r--r--test/test.c1
8 files changed, 35 insertions, 9 deletions
diff --git a/compare/compare.c b/compare/compare.c
index 4639827..a793ae6 100644
--- a/compare/compare.c
+++ b/compare/compare.c
@@ -535,6 +535,7 @@ int main(int argc, char *argv[])
return 1;
}
ass_set_message_cb(lib, msg_callback, NULL);
+ ass_set_extract_fonts(lib, true);
ItemList list;
if (!init_items(&list)) {
diff --git a/libass/ass_fontselect.c b/libass/ass_fontselect.c
index d8313c5..9d25425 100644
--- a/libass/ass_fontselect.c
+++ b/libass/ass_fontselect.c
@@ -990,7 +990,7 @@ static void process_fontdata(ASS_FontProvider *priv, ASS_Library *library,
*/
static ASS_FontProvider *
ass_embedded_fonts_add_provider(ASS_Library *lib, ASS_FontSelector *selector,
- FT_Library ftlib)
+ FT_Library ftlib, size_t *num_emfonts)
{
ASS_FontProvider *priv = ass_font_provider_new(selector, &ft_funcs, NULL);
if (priv == NULL)
@@ -1002,6 +1002,7 @@ ass_embedded_fonts_add_provider(ASS_Library *lib, ASS_FontSelector *selector,
for (size_t i = 0; i < lib->num_fontdata; i++)
process_fontdata(priv, lib, ftlib, i);
+ *num_emfonts = lib->num_fontdata;
return priv;
}
@@ -1035,9 +1036,8 @@ struct font_constructors font_constructors[] = {
* \return newly created font selector
*/
ASS_FontSelector *
-ass_fontselect_init(ASS_Library *library,
- FT_Library ftlibrary, const char *family,
- const char *path, const char *config,
+ass_fontselect_init(ASS_Library *library, FT_Library ftlibrary, size_t *num_emfonts,
+ const char *family, const char *path, const char *config,
ASS_DefaultFontProvider dfp)
{
ASS_FontSelector *priv = calloc(1, sizeof(ASS_FontSelector));
@@ -1050,7 +1050,7 @@ ass_fontselect_init(ASS_Library *library,
priv->index_default = 0;
priv->embedded_provider = ass_embedded_fonts_add_provider(library, priv,
- ftlibrary);
+ ftlibrary, num_emfonts);
if (priv->embedded_provider == NULL) {
ass_msg(library, MSGL_WARN, "failed to create embedded font provider");
@@ -1134,3 +1134,14 @@ void ass_map_font(const ASS_FontMapping *map, int len, const char *name,
}
}
}
+
+size_t ass_update_embedded_fonts(ASS_Library *lib, ASS_FontSelector *selector,
+ FT_Library ftlib, size_t num_loaded)
+{
+ if (!selector->embedded_provider)
+ return num_loaded;
+
+ for (size_t i = num_loaded; i < lib->num_fontdata; i++)
+ process_fontdata(selector->embedded_provider, lib, ftlib, i);
+ return lib->num_fontdata;
+}
diff --git a/libass/ass_fontselect.h b/libass/ass_fontselect.h
index a239a94..56c12d7 100644
--- a/libass/ass_fontselect.h
+++ b/libass/ass_fontselect.h
@@ -225,9 +225,8 @@ void ass_map_font(const ASS_FontMapping *map, int len, const char *name,
ASS_FontProviderMetaData *meta);
ASS_FontSelector *
-ass_fontselect_init(ASS_Library *library,
- FT_Library ftlibrary, const char *family,
- const char *path, const char *config,
+ass_fontselect_init(ASS_Library *library, FT_Library ftlibrary, size_t *num_emfonts,
+ const char *family, 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,
@@ -287,4 +286,10 @@ bool ass_get_font_info(ASS_Library *lib, FT_Library ftlib, const char *path,
*/
void ass_font_provider_free(ASS_FontProvider *provider);
+/**
+ * \brief Update embedded and memory fonts
+ */
+size_t ass_update_embedded_fonts(ASS_Library *lib, ASS_FontSelector *selector,
+ FT_Library ftlib, size_t num_loaded);
+
#endif /* LIBASS_FONTSELECT_H */
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 8aad294..1ed0a14 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -2862,6 +2862,12 @@ ass_start_frame(ASS_Renderer *render_priv, ASS_Track *track,
ass_lazy_track_init(render_priv->library, render_priv->track);
+ if (render_priv->library->num_fontdata != render_priv->num_emfonts) {
+ assert(render_priv->library->num_fontdata > render_priv->num_emfonts);
+ render_priv->num_emfonts = ass_update_embedded_fonts(render_priv->library,
+ render_priv->fontselect, render_priv->ftlibrary, render_priv->num_emfonts);
+ }
+
ass_shaper_set_kerning(render_priv->shaper, track->Kerning);
ass_shaper_set_language(render_priv->shaper, track->Language);
ass_shaper_set_level(render_priv->shaper, render_priv->settings.shaper);
diff --git a/libass/ass_render.h b/libass/ass_render.h
index 18d87ba..116722b 100644
--- a/libass/ass_render.h
+++ b/libass/ass_render.h
@@ -293,6 +293,7 @@ struct ass_renderer {
ASS_Library *library;
FT_Library ftlibrary;
ASS_FontSelector *fontselect;
+ size_t num_emfonts;
ASS_Settings settings;
int render_id;
ASS_Shaper *shaper;
diff --git a/libass/ass_render_api.c b/libass/ass_render_api.c
index 319758d..70cf174 100644
--- a/libass/ass_render_api.c
+++ b/libass/ass_render_api.c
@@ -155,7 +155,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, dfp);
+ &priv->num_emfonts, default_family, default_font, config, dfp);
}
void ass_set_selective_style_override_enabled(ASS_Renderer *priv, int bits)
diff --git a/profile/profile.c b/profile/profile.c
index e7f64f5..b89d10b 100644
--- a/profile/profile.c
+++ b/profile/profile.c
@@ -49,6 +49,7 @@ static void init(int frame_w, int frame_h)
}
ass_set_message_cb(ass_library, msg_callback, NULL);
+ ass_set_extract_fonts(ass_library, 1);
ass_renderer = ass_renderer_init(ass_library);
if (!ass_renderer) {
diff --git a/test/test.c b/test/test.c
index 6726fed..c378e48 100644
--- a/test/test.c
+++ b/test/test.c
@@ -99,6 +99,7 @@ static void init(int frame_w, int frame_h)
}
ass_set_message_cb(ass_library, msg_callback, NULL);
+ ass_set_extract_fonts(ass_library, 1);
ass_renderer = ass_renderer_init(ass_library);
if (!ass_renderer) {