diff options
author | Oleg Oshmyan <chortos@inbox.lv> | 2021-06-17 19:42:25 +0300 |
---|---|---|
committer | Oleg Oshmyan <chortos@inbox.lv> | 2021-07-10 02:36:31 +0300 |
commit | 887e6cc50bfbe8fc354993682edc03c51203e2fc (patch) | |
tree | 5fccc501b40b24192d2573e88fe240703b7d9d98 /libass/ass_fontselect.c | |
parent | 72c4eaadb42c7692ebdd828b0903a907acad5d16 (diff) | |
download | libass-887e6cc50bfbe8fc354993682edc03c51203e2fc.tar.bz2 libass-887e6cc50bfbe8fc354993682edc03c51203e2fc.tar.xz |
fontselect: automatically read metadata from font file if needed
Diffstat (limited to 'libass/ass_fontselect.c')
-rw-r--r-- | libass/ass_fontselect.c | 85 |
1 files changed, 57 insertions, 28 deletions
diff --git a/libass/ass_fontselect.c b/libass/ass_fontselect.c index 670156e..68a4407 100644 --- a/libass/ass_fontselect.c +++ b/libass/ass_fontselect.c @@ -358,23 +358,6 @@ error: return false; } -bool ass_get_font_info(ASS_Library *lib, FT_Library ftlib, const char *path, - const char *postscript_name, int index, - const char *fallback_family_name, - ASS_FontProviderMetaData *info) -{ - FT_Face face = ass_face_open(lib, ftlib, path, postscript_name, index); - if (!face) - return false; - - bool ret = get_font_info(ftlib, face, fallback_family_name, info); - if (ret) - info->postscript_name = strdup(info->postscript_name); - FT_Done_Face(face); - - return ret; -} - /** * \brief Free the dynamically allocated fields of metadata * created by get_font_info. @@ -382,16 +365,17 @@ bool ass_get_font_info(ASS_Library *lib, FT_Library ftlib, const char *path, */ static void free_font_info(ASS_FontProviderMetaData *meta) { - int i; - - for (i = 0; i < meta->n_family; i++) - free(meta->families[i]); - - for (i = 0; i < meta->n_fullname; i++) - free(meta->fullnames[i]); + if (meta->families) { + for (int i = 0; i < meta->n_family; i++) + free(meta->families[i]); + free(meta->families); + } - free(meta->families); - free(meta->fullnames); + if (meta->fullnames) { + for (int i = 0; i < meta->n_fullname; i++) + free(meta->fullnames[i]); + free(meta->fullnames); + } } /** @@ -411,7 +395,48 @@ ass_font_provider_add_font(ASS_FontProvider *provider, int i; int weight, slant, width; ASS_FontSelector *selector = provider->parent; - ASS_FontInfo *info; + ASS_FontInfo *info = NULL; + ASS_FontProviderMetaData implicit_meta = {0}; + + if (!meta->n_family) { + FT_Face face; + if (provider->funcs.get_font_index) + index = provider->funcs.get_font_index(data); + if (!path) { + ASS_FontStream stream = { + .func = provider->funcs.get_data, + .priv = data, + }; + // This name is only used in an error message, so use + // our best name but don't panic if we don't have any. + // Prefer PostScript name because it is unique. + const char *name = meta->postscript_name ? + meta->postscript_name : meta->extended_family; + face = ass_face_stream(selector->library, selector->ftlibrary, + name, &stream, index); + } else { + face = ass_face_open(selector->library, selector->ftlibrary, + path, meta->postscript_name, index); + } + if (!face) + goto error; + if (!get_font_info(selector->ftlibrary, face, meta->extended_family, + &implicit_meta)) { + FT_Done_Face(face); + goto error; + } + if (implicit_meta.postscript_name) { + implicit_meta.postscript_name = + strdup(implicit_meta.postscript_name); + if (!implicit_meta.postscript_name) { + FT_Done_Face(face); + goto error; + } + } + FT_Done_Face(face); + implicit_meta.extended_family = meta->extended_family; + meta = &implicit_meta; + } #if 0 int j; @@ -511,7 +536,11 @@ ass_font_provider_add_font(ASS_FontProvider *provider, return true; error: - ass_font_provider_free_fontinfo(info); + if (info) + ass_font_provider_free_fontinfo(info); + + free_font_info(&implicit_meta); + free(implicit_meta.postscript_name); if (provider->funcs.destroy_font) provider->funcs.destroy_font(data); |