summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleg Oshmyan <chortos@inbox.lv>2021-03-26 04:29:55 +0200
committerOleg Oshmyan <chortos@inbox.lv>2021-04-29 03:18:15 +0300
commitb4b744244799d9c3c81df809313e6a85347f1bd0 (patch)
treeccfbf3e4414c28cb7c38aeec4204f48eca745ec7
parentf9caed9af523079419f856b9eba79fbff762f9ed (diff)
downloadlibass-b4b744244799d9c3c81df809313e6a85347f1bd0.tar.bz2
libass-b4b744244799d9c3c81df809313e6a85347f1bd0.tar.xz
fontselect: coretext: reuse main FT_Library
-rw-r--r--libass/ass_coretext.c22
-rw-r--r--libass/ass_coretext.h2
-rw-r--r--libass/ass_directwrite.c3
-rw-r--r--libass/ass_directwrite.h2
-rw-r--r--libass/ass_fontconfig.c2
-rw-r--r--libass/ass_fontconfig.h2
-rw-r--r--libass/ass_fontselect.c8
-rw-r--r--libass/ass_fontselect.h4
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);