Clone in a terminal:
FontCache.vala
/*
	Copyright (C) 2014 Johan Mattsson

	This library is free software; you can redistribute it and/or modify 
	it under the terms of the GNU Lesser General Public License as 
	published by the Free Software Foundation; either version 3 of the 
	License, or (at your option) any later version.

	This library is distributed in the hope that it will be useful, but 
	WITHOUT ANY WARRANTY; without even the implied warranty of 
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
	Lesser General Public License for more details.
*/

using Gee;

namespace BirdFont {

/** Thread specific font cache. */	
public class FontCache {	
	public static FallbackFont fallback_font;
	
	static FontCache? default_cache = null;
	Gee.HashMap<string, CachedFont> fonts;
	CachedFont fallback;
	
	public FontCache () {
		if (is_null (fallback_font)) {
			fallback_font = new FallbackFont ();
		}
		
		fallback = new CachedFont (null);
		fonts = new Gee.HashMap<string, CachedFont> ();
	}
	
	public CachedFont get_font (string file_name) {
		CachedFont c;
		Font f;
		bool ok;

		if (file_name == "") {
			return fallback;
		}
		
		if (fonts.has_key (file_name)) {
			c = fonts.get (file_name);
			return c;
		}
		
		f = new Font ();
		f.set_file (file_name);
		ok = f.load ();
		if (!ok) {
			stderr.printf ("Can't load %s\n", file_name);
			return new CachedFont (null);
		}
		
		c = new CachedFont (f);
		
		if (file_name == "") {
			warning ("No file.");
			return c;
		}
		
		fonts.set (file_name, c);
		return c;
	}

	public static FontCache get_default_cache () {
		if (default_cache == null) {
			default_cache = new FontCache ();
		}
		
		return (!) default_cache;
	}

	public CachedFont get_fallback () {
		return fallback;
	}

}

}

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112