#include "ass_coretext.h"
+#define CT_FONTS_EAGER_LOAD 0
+#define CT_FONTS_LAZY_LOAD !CT_FONTS_EAGER_LOAD
+
static char *cfstr2buf(CFStringRef string)
{
const char *buf_ptr = CFStringGetCStringPtr(string, kCFStringEncodingUTF8);
#endif
}
-static void scan_fonts(ASS_Library *lib, ASS_FontProvider *provider)
+static void process_descriptors(ASS_FontProvider *provider, CFArrayRef fontsd)
{
ASS_FontProviderMetaData meta;
char *families[1];
char *identifiers[1];
char *fullnames[1];
- CTFontCollectionRef coll = CTFontCollectionCreateFromAvailableFonts(NULL);
- CFArrayRef fontsd = CTFontCollectionCreateMatchingFontDescriptors(coll);
+ if (!fontsd)
+ return;
for (int i = 0; i < CFArrayGetCount(fontsd); i++) {
CTFontDescriptorRef fontd = CFArrayGetValueAtIndex(fontsd, i);
free(path);
}
+}
+
+#if CT_FONTS_EAGER_LOAD
+static void scan_fonts(ASS_Library *lib, ASS_FontProvider *provider)
+{
+
+ CTFontCollectionRef coll = CTFontCollectionCreateFromAvailableFonts(NULL);
+ CFArrayRef fontsd = CTFontCollectionCreateMatchingFontDescriptors(coll);
+
+ process_descriptors(provider, fontsd);
CFRelease(fontsd);
CFRelease(coll);
}
+#endif
+
+#if CT_FONTS_LAZY_LOAD
+static void match_fonts(ASS_Library *lib, ASS_FontProvider *provider,
+ char *name)
+{
+ void *descr_ary[1];
+
+ CFStringRef cfname =
+ CFStringCreateWithCString(NULL, name, kCFStringEncodingUTF8);
+ CFMutableDictionaryRef cfattrs = CFDictionaryCreateMutable(NULL, 0, 0, 0);
+ CFDictionaryAddValue(cfattrs, kCTFontDisplayNameAttribute, cfname);
+ CTFontDescriptorRef ctdescr = CTFontDescriptorCreateWithAttributes(cfattrs);
+
+ descr_ary[0] = (void *)ctdescr;
+ CFArrayRef descriptors =
+ CFArrayCreate(NULL, (const void **)&descr_ary, 1, NULL);
+
+ CTFontCollectionRef ctcoll =
+ CTFontCollectionCreateWithFontDescriptors(descriptors, 0);
+
+ CFArrayRef fontsd =
+ CTFontCollectionCreateMatchingFontDescriptors(ctcoll);
+
+ process_descriptors(provider, fontsd);
+
+ if (fontsd)
+ CFRelease(fontsd);
+ CFRelease(ctcoll);
+ CFRelease(cfattrs);
+ CFRelease(ctdescr);
+ CFRelease(descriptors);
+ CFRelease(cfname);
+}
+#endif
static ASS_FontProviderFuncs coretext_callbacks = {
NULL,
check_glyph,
destroy_font,
+ NULL,
+#if CT_FONTS_EAGER_LOAD
NULL
+#else
+ match_fonts
+#endif
};
ASS_FontProvider *
ASS_FontProvider *provider =
ass_font_provider_new(selector, &coretext_callbacks, NULL);
+#if CT_FONTS_EAGER_LOAD
scan_fonts(lib, provider);
+#endif
return provider;
}
{
int num_fonts = priv->n_font;
int idx = 0;
- ASS_FontInfo *font_infos = priv->font_infos;
ASS_FontInfo req;
char *req_fullname;
+ char *tfamily = trim_space(strdup(family));
+
+ ASS_FontProvider *default_provider = priv->default_provider;
+ if (default_provider && default_provider->funcs.match_fonts)
+ default_provider->funcs.match_fonts(library, default_provider, tfamily);
+
+ ASS_FontInfo *font_infos = priv->font_infos;
// do we actually have any fonts?
if (!priv->n_font)
req.width = 100;
req.n_fullname = 1;
req.fullnames = &req_fullname;
- req.fullnames[0] = trim_space(strdup(family));
+ req.fullnames[0] = tfamily;
// calculate similarities
font_info_req_similarity(font_infos, num_fonts, &req);
typedef int (*CheckGlyphFunc)(void *, uint32_t);
typedef void (*DestroyFontFunc)(void *);
typedef void (*DestroyProviderFunc)(void *);
+typedef void (*MatchFontsFunc)(ASS_Library *lib,
+ ASS_FontProvider *provider,
+ char *name);
typedef struct font_provider_funcs {
GetDataFunc get_data; // callback for memory fonts
CheckGlyphFunc check_glyph; // test codepoint for coverage
DestroyFontFunc destroy_font; // destroy a single font
DestroyProviderFunc destroy_provider; // destroy provider only
+ MatchFontsFunc match_fonts; // match fonts against some name
// XXX: add function for alias handling
} ASS_FontProviderFuncs;