From f1ab42fdff7a15d81c8cac0f9192b3d5ff9fb913 Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Sat, 18 Feb 2017 11:40:37 -0800 Subject: Font: attempt fallback font, abort if no fonts found. If you happen to have a font_path setting that is incorrect, minetest will just attempt to start the gui without a valid font which leads to a segfault later on. We can attempt to load the fallback font path fairly easy, but if that fails we should give up with a proper error message and not a weird segfault later. This forces an abort() if the fallback fails as well, and prints a useful error message to the console. --- src/fontengine.cpp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'src/fontengine.cpp') diff --git a/src/fontengine.cpp b/src/fontengine.cpp index 55ff001e7..da327c3f6 100644 --- a/src/fontengine.cpp +++ b/src/fontengine.cpp @@ -343,11 +343,31 @@ void FontEngine::initFont(unsigned int basesize, FontMode mode) if (font != NULL) { m_font_cache[mode][basesize] = font; + return; } - else { - errorstream << "FontEngine: failed to load freetype font: " - << font_path << std::endl; + + // try fallback font + errorstream << "FontEngine: failed to load: " << font_path << ", trying to fall back " + "to fallback font" << std::endl; + + font_path = g_settings->get(font_config_prefix + "fallback_font_path"); + + font = gui::CGUITTFont::createTTFont(m_env, + font_path.c_str(), size, true, true, font_shadow, + font_shadow_alpha); + + if (font != NULL) { + m_font_cache[mode][basesize] = font; + return; } + + // give up + errorstream << "FontEngine: failed to load freetype font: " + << font_path << std::endl; + errorstream << "minetest can not continue without a valid font. Please correct " + "the 'font_path' setting or install the font file in the proper " + "location" << std::endl; + abort(); } #endif } -- cgit v1.2.3