diff options
Diffstat (limited to 'src/client/fontengine.cpp')
-rw-r--r-- | src/client/fontengine.cpp | 70 |
1 files changed, 53 insertions, 17 deletions
diff --git a/src/client/fontengine.cpp b/src/client/fontengine.cpp index 858d6780e..8120f82df 100644 --- a/src/client/fontengine.cpp +++ b/src/client/fontengine.cpp @@ -41,6 +41,11 @@ static void font_setting_changed(const std::string &name, void *userdata) g_fontengine->readSettings(); } +unsigned int get_font_cache_index(FontMode mode, bool bold = false, bool italic = false) +{ + return (mode << 2) | (bold << 1) | italic; +} + /******************************************************************************/ FontEngine::FontEngine(Settings* main_settings, gui::IGUIEnvironment* env) : m_settings(main_settings), @@ -59,7 +64,12 @@ FontEngine::FontEngine(Settings* main_settings, gui::IGUIEnvironment* env) : if (m_currentMode == FM_Standard) { m_settings->registerChangedCallback("font_size", font_setting_changed, NULL); + m_settings->registerChangedCallback("font_bold", font_setting_changed, NULL); + m_settings->registerChangedCallback("font_italic", font_setting_changed, NULL); m_settings->registerChangedCallback("font_path", font_setting_changed, NULL); + m_settings->registerChangedCallback("font_path_bold", font_setting_changed, NULL); + m_settings->registerChangedCallback("font_path_italic", font_setting_changed, NULL); + m_settings->registerChangedCallback("font_path_bolditalic", font_setting_changed, NULL); m_settings->registerChangedCallback("font_shadow", font_setting_changed, NULL); m_settings->registerChangedCallback("font_shadow_alpha", font_setting_changed, NULL); } @@ -96,7 +106,8 @@ void FontEngine::cleanCache() } /******************************************************************************/ -irr::gui::IGUIFont* FontEngine::getFont(unsigned int font_size, FontMode mode) +irr::gui::IGUIFont *FontEngine::getFont(unsigned int font_size, FontMode mode, + bool bold, bool italic) { if (mode == FM_Unspecified) { mode = m_currentMode; @@ -110,22 +121,30 @@ irr::gui::IGUIFont* FontEngine::getFont(unsigned int font_size, FontMode mode) if (font_size == FONT_SIZE_UNSPECIFIED) font_size = m_default_size[mode]; - const auto &cache = m_font_cache[mode]; + unsigned int cache_index = get_font_cache_index(mode, bold, italic); + + const auto &cache = m_font_cache[cache_index]; + if (cache.find(font_size) == cache.end()) { if (mode == FM_Simple || mode == FM_SimpleMono) initSimpleFont(font_size, mode); else - initFont(font_size, mode); + initFont(font_size, mode, bold, italic); } + if (m_font_cache[cache_index].find(font_size) == + m_font_cache[cache_index].end()) + initFont(font_size, mode, bold, italic); + const auto &font = cache.find(font_size); return font != cache.end() ? font->second : nullptr; } /******************************************************************************/ -unsigned int FontEngine::getTextHeight(unsigned int font_size, FontMode mode) +unsigned int FontEngine::getTextHeight(unsigned int font_size, FontMode mode, + bool bold, bool italic) { - irr::gui::IGUIFont* font = getFont(font_size, mode); + irr::gui::IGUIFont *font = getFont(font_size, mode, bold, italic); // use current skin font as fallback if (font == NULL) { @@ -138,9 +157,9 @@ unsigned int FontEngine::getTextHeight(unsigned int font_size, FontMode mode) /******************************************************************************/ unsigned int FontEngine::getTextWidth(const std::wstring& text, - unsigned int font_size, FontMode mode) + unsigned int font_size, FontMode mode, bool bold, bool italic) { - irr::gui::IGUIFont* font = getFont(font_size, mode); + irr::gui::IGUIFont *font = getFont(font_size, mode, bold, italic); // use current skin font as fallback if (font == NULL) { @@ -153,9 +172,10 @@ unsigned int FontEngine::getTextWidth(const std::wstring& text, /** get line height for a specific font (including empty room between lines) */ -unsigned int FontEngine::getLineHeight(unsigned int font_size, FontMode mode) +unsigned int FontEngine::getLineHeight(unsigned int font_size, FontMode mode, + bool bold, bool italic) { - irr::gui::IGUIFont* font = getFont(font_size, mode); + irr::gui::IGUIFont *font = getFont(font_size, mode, bold, italic); // use current skin font as fallback if (font == NULL) { @@ -183,6 +203,10 @@ void FontEngine::readSettings() m_currentMode = is_yes(gettext("needs_fallback_font")) ? FM_Fallback : FM_Standard; + + m_default_bold = m_settings->getBool("font_bold"); + m_default_italic = m_settings->getBool("font_italic"); + } else { m_currentMode = FM_Simple; } @@ -226,14 +250,17 @@ void FontEngine::updateFontCache() } /******************************************************************************/ -void FontEngine::initFont(unsigned int basesize, FontMode mode) +void FontEngine::initFont(unsigned int basesize, FontMode mode, + bool bold, bool italic) { assert(mode != FM_Unspecified); assert(basesize != FONT_SIZE_UNSPECIFIED); - if (m_font_cache[mode].find(basesize) != m_font_cache[mode].end()) - return; + int cache_index = get_font_cache_index(mode, bold, italic); + if (m_font_cache[cache_index].find(basesize) != + m_font_cache[cache_index].end()) + return; std::string setting_prefix = ""; @@ -249,8 +276,13 @@ void FontEngine::initFont(unsigned int basesize, FontMode mode) break; } + std::string setting_suffix = (bold) ? + ((italic) ? "_bold_italic" : "_bold") : + ((italic) ? "_italic" : ""); + u32 size = std::floor(RenderingEngine::getDisplayDensity() * m_settings->getFloat("gui_scaling") * basesize); + if (size == 0) { errorstream << "FontEngine: attempt to use font size 0" << std::endl; errorstream << " display density: " << RenderingEngine::getDisplayDensity() << std::endl; @@ -260,10 +292,14 @@ void FontEngine::initFont(unsigned int basesize, FontMode mode) u16 font_shadow = 0; u16 font_shadow_alpha = 0; g_settings->getU16NoEx(setting_prefix + "font_shadow", font_shadow); - g_settings->getU16NoEx(setting_prefix + "font_shadow_alpha", font_shadow_alpha); + g_settings->getU16NoEx(setting_prefix + "font_shadow_alpha", + font_shadow_alpha); + + std::string wanted_font_path; + wanted_font_path = g_settings->get(setting_prefix + "font_path" + setting_suffix); std::string fallback_settings[] = { - m_settings->get(setting_prefix + "font_path"), + wanted_font_path, m_settings->get("fallback_font_path"), m_settings->getDefault(setting_prefix + "font_path") }; @@ -275,7 +311,7 @@ void FontEngine::initFont(unsigned int basesize, FontMode mode) font_shadow_alpha); if (font) { - m_font_cache[mode][basesize] = font; + m_font_cache[cache_index][basesize] = font; return; } @@ -340,7 +376,7 @@ void FontEngine::initSimpleFont(unsigned int basesize, FontMode mode) path.str(""); // Clear path << basename << "_" << (size + offset * sign) << ext; - if (!fs::PathExists(path.str())) + if (!fs::PathExists(path.str())) continue; font = m_env->getFont(path.str().c_str()); @@ -365,5 +401,5 @@ void FontEngine::initSimpleFont(unsigned int basesize, FontMode mode) } if (font) - m_font_cache[mode][basesize] = font; + m_font_cache[get_font_cache_index(mode)][basesize] = font; } |