File diff r28451:c8ec2474d01b → r28452:36c20baf9fe4
src/os/macosx/font_osx.cpp
Show inline comments
 
@@ -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);
 
	}
 
}