From b4b744244799d9c3c81df809313e6a85347f1bd0 Mon Sep 17 00:00:00 2001 From: Oleg Oshmyan Date: Fri, 26 Mar 2021 04:29:55 +0200 Subject: fontselect: coretext: reuse main FT_Library --- libass/ass_coretext.c | 22 ++++++++-------------- libass/ass_coretext.h | 2 +- libass/ass_directwrite.c | 3 ++- libass/ass_directwrite.h | 2 +- libass/ass_fontconfig.c | 2 +- libass/ass_fontconfig.h | 2 +- libass/ass_fontselect.c | 8 +++++--- libass/ass_fontselect.h | 4 +++- 8 files changed, 22 insertions(+), 23 deletions(-) diff --git a/libass/ass_coretext.c b/libass/ass_coretext.c index 7bb34ac..b6870a6 100644 --- a/libass/ass_coretext.c +++ b/libass/ass_coretext.c @@ -125,18 +125,12 @@ static char *get_name(CTFontDescriptorRef fontd, CFStringRef attr) return ret; } -static void process_descriptors(ASS_Library *lib, ASS_FontProvider *provider, - CFArrayRef fontsd) +static void process_descriptors(ASS_Library *lib, FT_Library ftlib, + ASS_FontProvider *provider, CFArrayRef fontsd) { if (!fontsd) return; - FT_Library ftlib; - if (FT_Init_FreeType(&ftlib)) { - ass_msg(lib, MSGL_WARN, "Failed to create FT lib"); - return; - } - for (int i = 0; i < CFArrayGetCount(fontsd); i++) { ASS_FontProviderMetaData meta = {0}; CTFontDescriptorRef fontd = CFArrayGetValueAtIndex(fontsd, i); @@ -170,13 +164,13 @@ static void process_descriptors(ASS_Library *lib, ASS_FontProvider *provider, free(ps_name); free(path); } - - FT_Done_FreeType(ftlib); } -static void match_fonts(ASS_Library *lib, ASS_FontProvider *provider, +static void match_fonts(void *priv, ASS_Library *lib, ASS_FontProvider *provider, char *name) { + FT_Library ftlib = priv; + enum { attributes_n = 3 }; CTFontDescriptorRef ctdescrs[attributes_n]; CFMutableDictionaryRef cfattrs[attributes_n]; @@ -204,7 +198,7 @@ static void match_fonts(ASS_Library *lib, ASS_FontProvider *provider, CFArrayRef fontsd = CTFontCollectionCreateMatchingFontDescriptors(ctcoll); - process_descriptors(lib, provider, fontsd); + process_descriptors(lib, ftlib, provider, fontsd); SAFE_CFRelease(fontsd); SAFE_CFRelease(ctcoll); @@ -261,7 +255,7 @@ static ASS_FontProviderFuncs coretext_callbacks = { ASS_FontProvider * ass_coretext_add_provider(ASS_Library *lib, ASS_FontSelector *selector, - const char *config) + const char *config, FT_Library ftlib) { - return ass_font_provider_new(selector, &coretext_callbacks, NULL); + return ass_font_provider_new(selector, &coretext_callbacks, ftlib); } diff --git a/libass/ass_coretext.h b/libass/ass_coretext.h index 31edc5f..85495d4 100644 --- a/libass/ass_coretext.h +++ b/libass/ass_coretext.h @@ -26,7 +26,7 @@ ASS_FontProvider * ass_coretext_add_provider(ASS_Library *lib, ASS_FontSelector *selector, - const char *config); + const char *config, FT_Library ftlib); #endif diff --git a/libass/ass_directwrite.c b/libass/ass_directwrite.c index 399aef7..49ab2d9 100644 --- a/libass/ass_directwrite.c +++ b/libass/ass_directwrite.c @@ -749,7 +749,8 @@ typedef HRESULT (WINAPI *DWriteCreateFactoryFn)( */ ASS_FontProvider *ass_directwrite_add_provider(ASS_Library *lib, ASS_FontSelector *selector, - const char *config) + const char *config, + FT_Library ftlib) { HRESULT hr = S_OK; IDWriteFactory *dwFactory = NULL; diff --git a/libass/ass_directwrite.h b/libass/ass_directwrite.h index acb2e19..bb1159c 100644 --- a/libass/ass_directwrite.h +++ b/libass/ass_directwrite.h @@ -24,6 +24,6 @@ ASS_FontProvider * ass_directwrite_add_provider(ASS_Library *lib, ASS_FontSelector *selector, - const char *config); + const char *config, FT_Library ftlib); #endif diff --git a/libass/ass_fontconfig.c b/libass/ass_fontconfig.c index fc258d9..1e33106 100644 --- a/libass/ass_fontconfig.c +++ b/libass/ass_fontconfig.c @@ -317,7 +317,7 @@ static ASS_FontProviderFuncs fontconfig_callbacks = { ASS_FontProvider * ass_fontconfig_add_provider(ASS_Library *lib, ASS_FontSelector *selector, - const char *config) + const char *config, FT_Library ftlib) { int rc; ProviderPrivate *fc = NULL; diff --git a/libass/ass_fontconfig.h b/libass/ass_fontconfig.h index 2db82d7..bcdf9c9 100644 --- a/libass/ass_fontconfig.h +++ b/libass/ass_fontconfig.h @@ -26,7 +26,7 @@ ASS_FontProvider * ass_fontconfig_add_provider(ASS_Library *lib, ASS_FontSelector *selector, - const char *config); + const char *config, FT_Library ftlib); #endif diff --git a/libass/ass_fontselect.c b/libass/ass_fontselect.c index 9d25425..b75920f 100644 --- a/libass/ass_fontselect.c +++ b/libass/ass_fontselect.c @@ -658,7 +658,8 @@ static char *select_font(ASS_FontSelector *priv, ASS_Library *library, // TODO: consider changing the API to make more efficient // implementations possible. for (int i = 0; i < meta.n_fullname; i++) { - default_provider->funcs.match_fonts(library, default_provider, + default_provider->funcs.match_fonts(default_provider->priv, + library, default_provider, meta.fullnames[i]); } result = find_font(priv, library, meta, bold, italic, index, @@ -1010,7 +1011,7 @@ ass_embedded_fonts_add_provider(ASS_Library *lib, ASS_FontSelector *selector, struct font_constructors { ASS_DefaultFontProvider id; ASS_FontProvider *(*constructor)(ASS_Library *, ASS_FontSelector *, - const char *); + const char *, FT_Library); const char *name; }; @@ -1061,7 +1062,8 @@ ass_fontselect_init(ASS_Library *library, FT_Library ftlibrary, size_t *num_emfo if (dfp == font_constructors[i].id || dfp == ASS_FONTPROVIDER_AUTODETECT) { priv->default_provider = - font_constructors[i].constructor(library, priv, config); + font_constructors[i].constructor(library, priv, + config, ftlibrary); if (priv->default_provider) { ass_msg(library, MSGL_INFO, "Using font provider %s", font_constructors[i].name); diff --git a/libass/ass_fontselect.h b/libass/ass_fontselect.h index 56c12d7..2cb5672 100644 --- a/libass/ass_fontselect.h +++ b/libass/ass_fontselect.h @@ -101,11 +101,13 @@ typedef void (*DestroyProviderFunc)(void *priv); * This is called by fontselect whenever a new logical font is created. The * font provider set as default is used. * + * \param priv font provider private data * \param lib ASS_Library instance * \param provider font provider instance * \param name font name (as specified in script) */ -typedef void (*MatchFontsFunc)(ASS_Library *lib, +typedef void (*MatchFontsFunc)(void *priv, + ASS_Library *lib, ASS_FontProvider *provider, char *name); -- cgit v1.2.3