summaryrefslogtreecommitdiff
path: root/src/client/fontengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/fontengine.cpp')
-rw-r--r--src/client/fontengine.cpp70
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;
}