summaryrefslogtreecommitdiffstats
path: root/libass/ass_fontselect.c
diff options
context:
space:
mode:
authorOleg Oshmyan <chortos@inbox.lv>2021-06-17 19:42:25 +0300
committerOleg Oshmyan <chortos@inbox.lv>2021-07-10 02:36:31 +0300
commit887e6cc50bfbe8fc354993682edc03c51203e2fc (patch)
tree5fccc501b40b24192d2573e88fe240703b7d9d98 /libass/ass_fontselect.c
parent72c4eaadb42c7692ebdd828b0903a907acad5d16 (diff)
downloadlibass-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.c85
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);