Skip to content

Commit

Permalink
Fix issue Minetest crash when custom font path is not exist
Browse files Browse the repository at this point in the history
We try to use default fallback for both mono and main font when custom font path is not exist. This way, if Minetest is not corrupted, we could avoid crash.
  • Loading branch information
srifqi authored and sfan5 committed Nov 8, 2017
1 parent d693f95 commit 9526c68
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 15 deletions.
68 changes: 53 additions & 15 deletions src/fontengine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -332,32 +332,70 @@ void FontEngine::initFont(unsigned int basesize, FontMode mode)
font_path.c_str(), size, true, true, font_shadow,
font_shadow_alpha);

if (font != NULL) {
if (font) {
m_font_cache[mode][basesize] = font;
return;
}

// try fallback font
errorstream << "FontEngine: failed to load: " << font_path << ", trying to fall back "
"to fallback font" << std::endl;
if (font_config_prefix == "mono_") {
const std::string &mono_font_path = m_settings->getDefault("mono_font_path");

font_path = g_settings->get(font_config_prefix + "fallback_font_path");
if (font_path != mono_font_path) {
// try original mono font
errorstream << "FontEngine: failed to load custom mono "
"font: " << font_path << ", trying to fall back to "
"original mono font" << std::endl;

font = gui::CGUITTFont::createTTFont(m_env,
font_path.c_str(), size, true, true, font_shadow,
font_shadow_alpha);
font = gui::CGUITTFont::createTTFont(m_env,
mono_font_path.c_str(), size, true, true,
font_shadow, font_shadow_alpha);

if (font != NULL) {
m_font_cache[mode][basesize] = font;
return;
if (font) {
m_font_cache[mode][basesize] = font;
return;
}
}
} else {
// 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) {
m_font_cache[mode][basesize] = font;
return;
}

const std::string &fallback_font_path = m_settings->getDefault("fallback_font_path");

if (font_path != fallback_font_path) {
// try original fallback font
errorstream << "FontEngine: failed to load custom fallback "
"font: " << font_path << ", trying to fall back to "
"original fallback font" << std::endl;

font = gui::CGUITTFont::createTTFont(m_env,
fallback_font_path.c_str(), size, true, true,
font_shadow, font_shadow_alpha);

if (font) {
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;
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
Expand Down Expand Up @@ -459,7 +497,7 @@ void FontEngine::initSimpleFont(unsigned int basesize, FontMode mode)
}
}

if (font != NULL) {
if (font) {
font->grab();
m_font_cache[mode][basesize] = font;
}
Expand Down
43 changes: 43 additions & 0 deletions src/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,18 @@ const SettingsEntry &Settings::getEntry(const std::string &name) const
}


const SettingsEntry &Settings::getEntryDefault(const std::string &name) const
{
MutexAutoLock lock(m_mutex);

SettingEntries::const_iterator n;
if ((n = m_defaults.find(name)) == m_defaults.end()) {
throw SettingNotFoundException("Setting [" + name + "] not found.");
}
return n->second;
}


Settings *Settings::getGroup(const std::string &name) const
{
const SettingsEntry &entry = getEntry(name);
Expand All @@ -379,6 +391,15 @@ const std::string &Settings::get(const std::string &name) const
}


const std::string &Settings::getDefault(const std::string &name) const
{
const SettingsEntry &entry = getEntryDefault(name);
if (entry.is_group)
throw SettingNotFoundException("Setting [" + name + "] is a group.");
return entry.value;
}


bool Settings::getBool(const std::string &name) const
{
return is_yes(get(name));
Expand Down Expand Up @@ -571,6 +592,17 @@ bool Settings::getEntryNoEx(const std::string &name, SettingsEntry &val) const
}


bool Settings::getEntryDefaultNoEx(const std::string &name, SettingsEntry &val) const
{
try {
val = getEntryDefault(name);
return true;
} catch (SettingNotFoundException &e) {
return false;
}
}


bool Settings::getGroupNoEx(const std::string &name, Settings *&val) const
{
try {
Expand All @@ -593,6 +625,17 @@ bool Settings::getNoEx(const std::string &name, std::string &val) const
}


bool Settings::getDefaultNoEx(const std::string &name, std::string &val) const
{
try {
val = getDefault(name);
return true;
} catch (SettingNotFoundException &e) {
return false;
}
}


bool Settings::getFlag(const std::string &name) const
{
try {
Expand Down
4 changes: 4 additions & 0 deletions src/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,10 @@ class Settings {
***********/

const SettingsEntry &getEntry(const std::string &name) const;
const SettingsEntry &getEntryDefault(const std::string &name) const;
Settings *getGroup(const std::string &name) const;
const std::string &get(const std::string &name) const;
const std::string &getDefault(const std::string &name) const;
bool getBool(const std::string &name) const;
u16 getU16(const std::string &name) const;
s16 getS16(const std::string &name) const;
Expand Down Expand Up @@ -160,8 +162,10 @@ class Settings {
***************************************/

bool getEntryNoEx(const std::string &name, SettingsEntry &val) const;
bool getEntryDefaultNoEx(const std::string &name, SettingsEntry &val) const;
bool getGroupNoEx(const std::string &name, Settings *&val) const;
bool getNoEx(const std::string &name, std::string &val) const;
bool getDefaultNoEx(const std::string &name, std::string &val) const;
bool getFlag(const std::string &name) const;
bool getU16NoEx(const std::string &name, u16 &val) const;
bool getS16NoEx(const std::string &name, s16 &val) const;
Expand Down

0 comments on commit 9526c68

Please sign in to comment.