diff options
-rw-r--r-- | compare/compare.c | 1 | ||||
-rw-r--r-- | libass/ass_fontselect.c | 21 | ||||
-rw-r--r-- | libass/ass_fontselect.h | 11 | ||||
-rw-r--r-- | libass/ass_render.c | 6 | ||||
-rw-r--r-- | libass/ass_render.h | 1 | ||||
-rw-r--r-- | libass/ass_render_api.c | 2 | ||||
-rw-r--r-- | profile/profile.c | 1 | ||||
-rw-r--r-- | test/test.c | 1 |
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) { |