|
@@ -298,6 +298,40 @@ const Sprite *CoreTextFontCache::Interna
|
|
|
return new_glyph.sprite;
|
|
|
}
|
|
|
|
|
|
static CTFontDescriptorRef LoadFontFromFile(const std::string &font_name)
|
|
|
{
|
|
|
if (!MacOSVersionIsAtLeast(10, 6, 0)) return nullptr;
|
|
|
|
|
|
/* Might be a font file name, try load it. Direct font loading is
|
|
|
* only supported starting on OSX 10.6. */
|
|
|
CFAutoRelease<CFStringRef> path;
|
|
|
|
|
|
/* See if this is an absolute path. */
|
|
|
if (FileExists(font_name)) {
|
|
|
path.reset(CFStringCreateWithCString(kCFAllocatorDefault, font_name.c_str(), kCFStringEncodingUTF8));
|
|
|
} else {
|
|
|
/* Scan the search-paths to see if it can be found. */
|
|
|
std::string full_font = FioFindFullPath(BASE_DIR, font_name);
|
|
|
if (!full_font.empty()) {
|
|
|
path.reset(CFStringCreateWithCString(kCFAllocatorDefault, full_font.c_str(), kCFStringEncodingUTF8));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (path) {
|
|
|
/* Try getting a font descriptor to see if the system can use it. */
|
|
|
CFAutoRelease<CFURLRef> url(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, path.get(), kCFURLPOSIXPathStyle, false));
|
|
|
CFAutoRelease<CFArrayRef> descs(CTFontManagerCreateFontDescriptorsFromURL(url.get()));
|
|
|
|
|
|
if (descs && CFArrayGetCount(descs.get()) > 0) {
|
|
|
CTFontDescriptorRef font_ref = (CTFontDescriptorRef)CFArrayGetValueAtIndex(descs.get(), 0);
|
|
|
CFRetain(font_ref);
|
|
|
return font_ref;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return nullptr;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Loads the TrueType font.
|
|
|
* If a CoreText font description is present, e.g. from the automatic font
|
|
@@ -318,33 +352,9 @@ void LoadCoreTextFont(FontSize fs)
|
|
|
}
|
|
|
|
|
|
if (!font_ref && MacOSVersionIsAtLeast(10, 6, 0)) {
|
|
|
/* Might be a font file name, try load it. Direct font loading is
|
|
|
* only supported starting on OSX 10.6. */
|
|
|
CFAutoRelease<CFStringRef> path;
|
|
|
|
|
|
/* See if this is an absolute path. */
|
|
|
if (FileExists(settings->font)) {
|
|
|
path.reset(CFStringCreateWithCString(kCFAllocatorDefault, settings->font.c_str(), kCFStringEncodingUTF8));
|
|
|
} else {
|
|
|
/* Scan the search-paths to see if it can be found. */
|
|
|
std::string full_font = FioFindFullPath(BASE_DIR, settings->font);
|
|
|
if (!full_font.empty()) {
|
|
|
path.reset(CFStringCreateWithCString(kCFAllocatorDefault, full_font.c_str(), kCFStringEncodingUTF8));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (path) {
|
|
|
/* Try getting a font descriptor to see if the system can use it. */
|
|
|
CFAutoRelease<CFURLRef> url(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, path.get(), kCFURLPOSIXPathStyle, false));
|
|
|
CFAutoRelease<CFArrayRef> descs(CTFontManagerCreateFontDescriptorsFromURL(url.get()));
|
|
|
|
|
|
if (descs && CFArrayGetCount(descs.get()) > 0) {
|
|
|
font_ref.reset((CTFontDescriptorRef)CFArrayGetValueAtIndex(descs.get(), 0));
|
|
|
CFRetain(font_ref.get());
|
|
|
} else {
|
|
|
ShowInfo("Unable to load file '{}' for {} font, using default OS font selection instead", settings->font, FontSizeToName(fs));
|
|
|
}
|
|
|
}
|
|
|
/* Might be a font file name, try load it. */
|
|
|
font_ref.reset(LoadFontFromFile(settings->font));
|
|
|
if (!font_ref) ShowInfo("Unable to load file '{}' for {} font, using default OS font selection instead", settings->font, FontSizeToName(fs));
|
|
|
}
|
|
|
|
|
|
if (!font_ref) {
|
|
@@ -372,3 +382,17 @@ void LoadCoreTextFont(FontSize fs)
|
|
|
|
|
|
new CoreTextFontCache(fs, std::move(font_ref), settings->size);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Load a TrueType font from a file.
|
|
|
* @param fs The font size to load.
|
|
|
* @param file_name Path to the font file.
|
|
|
* @param size Requested font size.
|
|
|
*/
|
|
|
void LoadCoreTextFont(FontSize fs, const std::string &file_name, uint size)
|
|
|
{
|
|
|
CFAutoRelease<CTFontDescriptorRef> font_ref{LoadFontFromFile(file_name)};
|
|
|
if (font_ref) {
|
|
|
new CoreTextFontCache(fs, std::move(font_ref), size);
|
|
|
}
|
|
|
}
|