From a602c7a9b72650d77f73484ce900f2039db6beaf Mon Sep 17 00:00:00 2001 From: Oleg Oshmyan Date: Thu, 17 Jun 2021 18:35:41 +0300 Subject: fontselect: save library and ftlibrary in ASS_FontSelector ...instead of passing them as arguments everywhere. --- libass/ass_font.c | 2 +- libass/ass_fontselect.c | 71 ++++++++++++++++++++++++++----------------------- libass/ass_fontselect.h | 5 ++-- libass/ass_render.c | 4 +-- 4 files changed, 42 insertions(+), 40 deletions(-) diff --git a/libass/ass_font.c b/libass/ass_font.c index 55514b5..9dc8772 100644 --- a/libass/ass_font.c +++ b/libass/ass_font.c @@ -226,7 +226,7 @@ static int add_face(ASS_FontSelector *fontsel, ASS_Font *font, uint32_t ch) if (font->n_faces == ASS_FONT_MAX_FACES) return -1; - path = ass_font_select(fontsel, font->library, font , &index, + path = ass_font_select(fontsel, font, &index, &postscript_name, &uid, &stream, ch); if (!path) diff --git a/libass/ass_fontselect.c b/libass/ass_fontselect.c index 90fe0dc..1ca13db 100644 --- a/libass/ass_fontselect.c +++ b/libass/ass_fontselect.c @@ -81,6 +81,9 @@ struct font_info { }; struct font_selector { + ASS_Library *library; + FT_Library ftlibrary; + // uid counter int uid; @@ -531,7 +534,7 @@ static bool check_glyph(ASS_FontInfo *fi, uint32_t code) } static char * -find_font(ASS_FontSelector *priv, ASS_Library *library, +find_font(ASS_FontSelector *priv, ASS_FontProviderMetaData meta, bool match_extended_family, unsigned bold, unsigned italic, int *index, char **postscript_name, int *uid, ASS_FontStream *stream, @@ -635,7 +638,7 @@ find_font(ASS_FontSelector *priv, ASS_Library *library, return result; } -static char *select_font(ASS_FontSelector *priv, ASS_Library *library, +static char *select_font(ASS_FontSelector *priv, const char *family, bool match_extended_family, unsigned bold, unsigned italic, int *index, char **postscript_name, int *uid, @@ -664,7 +667,7 @@ static char *select_font(ASS_FontSelector *priv, ASS_Library *library, meta = default_meta; } - result = find_font(priv, library, meta, match_extended_family, + result = find_font(priv, meta, match_extended_family, bold, italic, index, postscript_name, uid, stream, code, &name_match); @@ -677,10 +680,10 @@ static char *select_font(ASS_FontSelector *priv, ASS_Library *library, // implementations possible. for (int i = 0; i < meta.n_fullname; i++) { default_provider->funcs.match_fonts(default_provider->priv, - library, default_provider, + priv->library, default_provider, meta.fullnames[i]); } - result = find_font(priv, library, meta, match_extended_family, + result = find_font(priv, meta, match_extended_family, bold, italic, index, postscript_name, uid, stream, code, &name_match); } @@ -698,7 +701,6 @@ static char *select_font(ASS_FontSelector *priv, ASS_Library *library, /** * \brief Find a font. Use default family or path if necessary. - * \param library ASS library handle * \param family font family * \param treat_family_as_pattern treat family as fontconfig pattern * \param bold font weight value @@ -707,7 +709,7 @@ static char *select_font(ASS_FontSelector *priv, ASS_Library *library, * \param code: the character that should be present in the font, can be 0 * \return font file path */ -char *ass_font_select(ASS_FontSelector *priv, ASS_Library *library, +char *ass_font_select(ASS_FontSelector *priv, ASS_Font *font, int *index, char **postscript_name, int *uid, ASS_FontStream *data, uint32_t code) { @@ -718,14 +720,14 @@ char *ass_font_select(ASS_FontSelector *priv, ASS_Library *library, ASS_FontProvider *default_provider = priv->default_provider; if (family && *family) - res = select_font(priv, library, family, false, bold, italic, index, + res = select_font(priv, family, false, bold, italic, index, postscript_name, uid, data, code); if (!res && priv->family_default) { - res = select_font(priv, library, priv->family_default, false, bold, + res = select_font(priv, priv->family_default, false, bold, italic, index, postscript_name, uid, data, code); if (res) - ass_msg(library, MSGL_WARN, "fontselect: Using default " + ass_msg(priv->library, MSGL_WARN, "fontselect: Using default " "font family: (%s, %d, %d) -> %s, %d, %s", family, bold, italic, res, *index, *postscript_name ? *postscript_name : "(none)"); @@ -736,10 +738,10 @@ char *ass_font_select(ASS_FontSelector *priv, ASS_Library *library, if (!search_family || !*search_family) search_family = "Arial"; char *fallback_family = default_provider->funcs.get_fallback( - default_provider->priv, library, search_family, code); + default_provider->priv, priv->library, search_family, code); if (fallback_family) { - res = select_font(priv, library, fallback_family, true, bold, italic, + res = select_font(priv, fallback_family, true, bold, italic, index, postscript_name, uid, data, code); free(fallback_family); } @@ -748,18 +750,19 @@ char *ass_font_select(ASS_FontSelector *priv, ASS_Library *library, if (!res && priv->path_default) { res = priv->path_default; *index = priv->index_default; - ass_msg(library, MSGL_WARN, "fontselect: Using default font: " + ass_msg(priv->library, MSGL_WARN, "fontselect: Using default font: " "(%s, %d, %d) -> %s, %d, %s", family, bold, italic, priv->path_default, *index, *postscript_name ? *postscript_name : "(none)"); } if (res) - ass_msg(library, MSGL_INFO, + ass_msg(priv->library, MSGL_INFO, "fontselect: (%s, %d, %d) -> %s, %d, %s", family, bold, italic, res, *index, *postscript_name ? *postscript_name : "(none)"); else - ass_msg(library, MSGL_WARN, "fontselect: failed to find any fallback for font: " + ass_msg(priv->library, MSGL_WARN, + "fontselect: failed to find any fallback for font: " "(%s, %d, %d)", family, bold, italic); return res; @@ -919,15 +922,15 @@ static void free_font_info(ASS_FontProviderMetaData *meta) /** * \brief Process memory font. * \param priv private data - * \param library library object - * \param ftlibrary freetype library object - * \param idx index of the processed font in library->fontdata + * \param idx index of the processed font in priv->library->fontdata * * Builds a FontInfo with FreeType and some table reading. */ -static void process_fontdata(ASS_FontProvider *priv, ASS_Library *library, - FT_Library ftlibrary, int idx) +static void process_fontdata(ASS_FontProvider *priv, int idx) { + ASS_FontSelector *selector = priv->parent; + ASS_Library *library = selector->library; + int rc; const char *name = library->fontdata[idx].name; const char *data = library->fontdata[idx].data; @@ -940,7 +943,7 @@ static void process_fontdata(ASS_FontProvider *priv, ASS_Library *library, ASS_FontProviderMetaData info; FontDataFT *ft; - rc = FT_New_Memory_Face(ftlibrary, (unsigned char *) data, + rc = FT_New_Memory_Face(selector->ftlibrary, (unsigned char *) data, data_size, face_index, &face); if (rc) { ass_msg(library, MSGL_WARN, "Error opening memory font '%s'", @@ -953,7 +956,7 @@ static void process_fontdata(ASS_FontProvider *priv, ASS_Library *library, charmap_magic(library, face); memset(&info, 0, sizeof(ASS_FontProviderMetaData)); - if (!get_font_info(ftlibrary, face, NULL, &info)) { + if (!get_font_info(selector->ftlibrary, face, NULL, &info)) { ass_msg(library, MSGL_WARN, "Error getting metadata for embedded font '%s'", name); FT_Done_Face(face); @@ -985,25 +988,24 @@ static void process_fontdata(ASS_FontProvider *priv, ASS_Library *library, /** * \brief Create font provider for embedded fonts. This parses the fonts known * to the current ASS_Library and adds them to the selector. - * \param lib library * \param selector font selector - * \param ftlib FreeType library - used for querying fonts * \return font provider */ static ASS_FontProvider * -ass_embedded_fonts_add_provider(ASS_Library *lib, ASS_FontSelector *selector, - FT_Library ftlib, size_t *num_emfonts) +ass_embedded_fonts_add_provider(ASS_FontSelector *selector, size_t *num_emfonts) { ASS_FontProvider *priv = ass_font_provider_new(selector, &ft_funcs, NULL); if (priv == NULL) return NULL; + ASS_Library *lib = selector->library; + if (lib->fonts_dir && lib->fonts_dir[0]) { load_fonts_from_dir(lib, lib->fonts_dir); } for (size_t i = 0; i < lib->num_fontdata; i++) - process_fontdata(priv, lib, ftlib, i); + process_fontdata(priv, i); *num_emfonts = lib->num_fontdata; return priv; @@ -1046,13 +1048,14 @@ ass_fontselect_init(ASS_Library *library, FT_Library ftlibrary, size_t *num_emfo if (priv == NULL) return NULL; + priv->library = library; + priv->ftlibrary = ftlibrary; priv->uid = 1; priv->family_default = family ? strdup(family) : NULL; priv->path_default = path ? strdup(path) : NULL; priv->index_default = 0; - priv->embedded_provider = ass_embedded_fonts_add_provider(library, priv, - ftlibrary, num_emfonts); + priv->embedded_provider = ass_embedded_fonts_add_provider(priv, num_emfonts); if (priv->embedded_provider == NULL) { ass_msg(library, MSGL_WARN, "failed to create embedded font provider"); @@ -1138,13 +1141,13 @@ 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) +size_t ass_update_embedded_fonts(ASS_FontSelector *selector, 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; + size_t num_fontdata = selector->library->num_fontdata; + for (size_t i = num_loaded; i < num_fontdata; i++) + process_fontdata(selector->embedded_provider, i); + return num_fontdata; } diff --git a/libass/ass_fontselect.h b/libass/ass_fontselect.h index eb0d112..50c1968 100644 --- a/libass/ass_fontselect.h +++ b/libass/ass_fontselect.h @@ -242,7 +242,7 @@ ASS_FontSelector * 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, +char *ass_font_select(ASS_FontSelector *priv, ASS_Font *font, int *index, char **postscript_name, int *uid, ASS_FontStream *data, uint32_t code); void ass_fontselect_free(ASS_FontSelector *priv); @@ -305,7 +305,6 @@ 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); +size_t ass_update_embedded_fonts(ASS_FontSelector *selector, size_t num_loaded); #endif /* LIBASS_FONTSELECT_H */ diff --git a/libass/ass_render.c b/libass/ass_render.c index 3b707a7..0bf6676 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -2878,8 +2878,8 @@ ass_start_frame(ASS_Renderer *render_priv, ASS_Track *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); + render_priv->num_emfonts = ass_update_embedded_fonts( + render_priv->fontselect, render_priv->num_emfonts); } ass_shaper_set_kerning(render_priv->shaper, track->Kerning); -- cgit v1.2.3