From 47e9e994358f17c776f20084d7b9750d3de79068 Mon Sep 17 00:00:00 2001 From: Rodger Combs Date: Tue, 15 Jan 2019 18:17:57 -0600 Subject: fontselect: provide a way to use freetype to get font info --- libass/ass_fontselect.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'libass/ass_fontselect.c') diff --git a/libass/ass_fontselect.c b/libass/ass_fontselect.c index 85ff0dc..651fc7a 100644 --- a/libass/ass_fontselect.c +++ b/libass/ass_fontselect.c @@ -848,6 +848,47 @@ error: return false; } +bool ass_get_font_info(ASS_Library *lib, FT_Library ftlib, const char *path, + const char *postscript_name, int index, + ASS_FontProviderMetaData *info) +{ + bool ret = false; + FT_Face face = NULL; + int error = FT_New_Face(ftlib, path, index, &face); + if (error) { + ass_msg(lib, MSGL_WARN, "Error opening font: '%s', %d", path, index); + return false; + } + + if (postscript_name && index < 0 && face->num_faces > 0) { + // The font provider gave us a postscript name and is not sure + // about the face index.. so use the postscript name to find the + // correct face_index in the collection! + for (int i = 0; i < face->num_faces; i++) { + FT_Done_Face(face); + error = FT_New_Face(ftlib, path, i, &face); + if (error) { + ass_msg(lib, MSGL_WARN, "Error opening font: '%s', %d", path, i); + return false; + } + + const char *face_psname = FT_Get_Postscript_Name(face); + if (face_psname != NULL && + strcmp(face_psname, postscript_name) == 0) + break; + } + } + + if (face) { + ret = get_font_info(ftlib, face, 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. -- cgit v1.2.3