summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libass/ass_coretext.c32
-rw-r--r--libass/ass_directwrite.c3
-rw-r--r--libass/ass_fontconfig.c3
-rw-r--r--libass/ass_fontselect.c2
-rw-r--r--libass/ass_fontselect.h2
5 files changed, 32 insertions, 10 deletions
diff --git a/libass/ass_coretext.c b/libass/ass_coretext.c
index 49a96ff..f1063ba 100644
--- a/libass/ass_coretext.c
+++ b/libass/ass_coretext.c
@@ -246,8 +246,11 @@ static void match_fonts(void *priv, ASS_Library *lib, ASS_FontProvider *provider
SAFE_CFRelease(cfname);
}
-static char *get_fallback(void *priv, const char *family, uint32_t codepoint)
+static char *get_fallback(void *priv, ASS_Library *lib,
+ const char *family, uint32_t codepoint)
{
+ FT_Library ftlib = priv;
+
CFStringRef name = CFStringCreateWithBytes(
0, (UInt8 *)family, strlen(family), kCFStringEncodingUTF8, false);
CTFontRef font = CTFontCreateWithName(name, 0, NULL);
@@ -256,17 +259,32 @@ static char *get_fallback(void *priv, const char *family, uint32_t codepoint)
0, (UInt8*)&codepointle, sizeof(codepointle),
kCFStringEncodingUTF32LE, false);
CTFontRef fb = CTFontCreateForString(font, r, CFRangeMake(0, 1));
- CFNumberRef cfformat = CTFontCopyAttribute(fb, kCTFontFormatAttribute);
- CFStringRef cfname = is_postscript_font_format(cfformat) ?
- CTFontCopyPostScriptName(fb) : CTFontCopyFullName(fb);
- char *res_name = cfstr2buf(cfname);
+ CTFontDescriptorRef fontd = CTFontCopyFontDescriptor(fb);
+
+ char *res_name = NULL;
+ char *path = NULL;
+ ASS_FontProviderMetaData meta = {0};
+ if (get_font_info_ct(lib, ftlib, fontd, &path, &meta))
+ res_name = meta.families[0];
+
+ for (int i = 1 /* skip res_name */; i < meta.n_family; i++)
+ free(meta.families[i]);
+
+ for (int i = 0; i < meta.n_fullname; i++)
+ free(meta.fullnames[i]);
+
+ free(meta.families);
+ free(meta.fullnames);
+
+ free(meta.postscript_name);
+
+ free(path);
SAFE_CFRelease(name);
SAFE_CFRelease(font);
SAFE_CFRelease(r);
SAFE_CFRelease(fb);
- SAFE_CFRelease(cfformat);
- SAFE_CFRelease(cfname);
+ SAFE_CFRelease(fontd);
return res_name;
}
diff --git a/libass/ass_directwrite.c b/libass/ass_directwrite.c
index 49ab2d9..0ad9118 100644
--- a/libass/ass_directwrite.c
+++ b/libass/ass_directwrite.c
@@ -424,7 +424,8 @@ static int encode_utf16(wchar_t *chars, uint32_t codepoint)
}
}
-static char *get_fallback(void *priv, const char *base, uint32_t codepoint)
+static char *get_fallback(void *priv, ASS_Library *lib,
+ const char *base, uint32_t codepoint)
{
HRESULT hr;
ProviderPrivate *provider_priv = (ProviderPrivate *)priv;
diff --git a/libass/ass_fontconfig.c b/libass/ass_fontconfig.c
index 1e33106..a4ffb42 100644
--- a/libass/ass_fontconfig.c
+++ b/libass/ass_fontconfig.c
@@ -220,7 +220,8 @@ static void cache_fallbacks(ProviderPrivate *fc)
FcPatternDestroy(pat);
}
-static char *get_fallback(void *priv, const char *family, uint32_t codepoint)
+static char *get_fallback(void *priv, ASS_Library *lib,
+ const char *family, uint32_t codepoint)
{
ProviderPrivate *fc = (ProviderPrivate *)priv;
FcResult result;
diff --git a/libass/ass_fontselect.c b/libass/ass_fontselect.c
index 6b62511..3013f4a 100644
--- a/libass/ass_fontselect.c
+++ b/libass/ass_fontselect.c
@@ -717,7 +717,7 @@ char *ass_font_select(ASS_FontSelector *priv, ASS_Library *library,
if (!search_family || !*search_family)
search_family = "Arial";
char *fallback_family = default_provider->funcs.get_fallback(
- default_provider->priv, search_family, code);
+ default_provider->priv, library, search_family, code);
if (fallback_family) {
res = select_font(priv, library, fallback_family, bold, italic,
diff --git a/libass/ass_fontselect.h b/libass/ass_fontselect.h
index d029b0b..942ea00 100644
--- a/libass/ass_fontselect.h
+++ b/libass/ass_fontselect.h
@@ -144,12 +144,14 @@ typedef void (*SubstituteFontFunc)(void *priv, const char *name,
* fallbacks.
*
* \param priv font provider private data
+ * \param lib ASS_Library instance
* \param family original font family name (try matching a similar font) (never NULL)
* \param codepoint Unicode codepoint (UTF-32)
* \return output font family, allocated with malloc(), must be freed
* by caller.
*/
typedef char *(*GetFallbackFunc)(void *priv,
+ ASS_Library *lib,
const char *family,
uint32_t codepoint);