summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOneric <oneric@oneric.stub>2021-03-26 17:30:25 +0100
committerOneric <oneric@oneric.stub>2021-04-22 23:56:34 +0200
commit1140b6b885c89d37eef13dc1f31f144e9a76a4d7 (patch)
tree7fc25926f73032bed2e5c85702196128df70d91c
parent006c46b5a0eee4d410b87f20b9c435dd252a7109 (diff)
downloadlibass-1140b6b885c89d37eef13dc1f31f144e9a76a4d7.tar.bz2
libass-1140b6b885c89d37eef13dc1f31f144e9a76a4d7.tar.xz
Fix embedded and memory fonts
Previously only both only worked when ass_set_fonts was called after all embedded and memory fonts were already added. Especially for embedded fonts this meant it won't work for most users, except mpv, including our own utilities, even if extract_fonts was set. Now that it works, enable extract_fonts in our utilities. GitHub: fixes #266
-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) {