aboutsummaryrefslogtreecommitdiff
path: root/graphics/fontman.cpp
diff options
context:
space:
mode:
authorThierry Crozat2011-05-22 21:55:28 +0100
committerThierry Crozat2011-06-06 23:20:10 +0100
commit197ef8f1783bc5eed5c894e46a7c1d6c528db7e1 (patch)
treebf2bcc838ba77c86abd6b1fa7fa5a06490512261 /graphics/fontman.cpp
parent6b13782967b8b775c359b0ff54e7a17534248dbe (diff)
downloadscummvm-rg350-197ef8f1783bc5eed5c894e46a7c1d6c528db7e1.tar.gz
scummvm-rg350-197ef8f1783bc5eed5c894e46a7c1d6c528db7e1.tar.bz2
scummvm-rg350-197ef8f1783bc5eed5c894e46a7c1d6c528db7e1.zip
GRAPHICS: Add kLocalizedFont in FontManager
This makes it easy to get a localized font for the current TranslationManager charset if one has been loaded. It tries first to find one for the BigGUI or GUI fonts and then looks for any acceptable font. Also only use lower case font name for the FontManager HashMap. This is to avoid issues with the case when looking for a font by its name. There was for example an issue for font helvB12 that is named helvb12 in the scummmodern theme.
Diffstat (limited to 'graphics/fontman.cpp')
-rw-r--r--graphics/fontman.cpp58
1 files changed, 56 insertions, 2 deletions
diff --git a/graphics/fontman.cpp b/graphics/fontman.cpp
index 27fe21ab97..6f1d282d54 100644
--- a/graphics/fontman.cpp
+++ b/graphics/fontman.cpp
@@ -68,14 +68,29 @@ const struct {
{ 0, FontManager::kConsoleFont }
};
+bool FontManager::assignFontToName(const Common::String &name, const Font *font) {
+ Common::String lowercaseName = name;
+ lowercaseName.toLowercase();
+ _fontMap[lowercaseName] = font;
+ return true;
+}
+
+void FontManager::removeFontName(const Common::String &name) {
+ Common::String lowercaseName = name;
+ lowercaseName.toLowercase();
+ _fontMap.erase(lowercaseName);
+}
+
const Font *FontManager::getFontByName(const Common::String &name) const {
for (int i = 0; builtinFontNames[i].name; i++)
if (!scumm_stricmp(name.c_str(), builtinFontNames[i].name))
return getFontByUsage(builtinFontNames[i].id);
- if (!_fontMap.contains(name))
+ Common::String lowercaseName = name;
+ lowercaseName.toLowercase();
+ if (!_fontMap.contains(lowercaseName))
return 0;
- return _fontMap[name];
+ return _fontMap[lowercaseName];
}
const Font *FontManager::getFontByUsage(FontUsage usage) const {
@@ -86,11 +101,50 @@ const Font *FontManager::getFontByUsage(FontUsage usage) const {
return g_sysfont;
case kBigGUIFont:
return g_sysfont_big;
+ case kLocalizedFont:
+ {
+ // First try to find a kBigGUIFont
+ Common::String fontName = getLocalizedFontNameByUsage(kBigGUIFont);
+ if (!fontName.empty()) {
+ const Font *font = getFontByName(fontName);
+ if (font)
+ return font;
+ }
+ // Try kGUIFont
+ fontName = getLocalizedFontNameByUsage(kGUIFont);
+ if (!fontName.empty()) {
+ const Font *font = getFontByName(fontName);
+ if (font)
+ return font;
+ }
+ // Accept any other font that has the charset in its name
+ for (Common::HashMap<Common::String, const Font *>::const_iterator it = _fontMap.begin() ; it != _fontMap.end() ; ++it) {
+ if (it->_key.contains(TransMan.getCurrentCharset()))
+ return it->_value;
+ }
+ // Fallback: return a non localized kGUIFont.
+ // Maybe we should return a null pointer instead?
+ return g_sysfont;
+ }
}
return 0;
}
+Common::String FontManager::getLocalizedFontNameByUsage(FontUsage usage) const {
+ // We look for a name that matches the usage and that ends in .bdf.
+ // It should also not contain "-ascii" or "-iso-" in its name.
+ // We take the first name that matches.
+ for (int i = 0; builtinFontNames[i].name; i++) {
+ if (builtinFontNames[i].id == usage) {
+ Common::String fontName(builtinFontNames[i].name);
+ if (!fontName.contains("-ascii") && !fontName.contains("-iso-") && fontName.contains(".bdf"))
+ return genLocalizedFontFilename(fontName);
+ }
+ }
+ return Common::String();
+}
+
Common::String FontManager::genLocalizedFontFilename(const Common::String &filename) const {
#ifndef USE_TRANSLATION
return filename;