aboutsummaryrefslogtreecommitdiff
path: root/graphics/fontman.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/fontman.cpp')
-rw-r--r--graphics/fontman.cpp100
1 files changed, 88 insertions, 12 deletions
diff --git a/graphics/fontman.cpp b/graphics/fontman.cpp
index f937e55b69..f40cf97602 100644
--- a/graphics/fontman.cpp
+++ b/graphics/fontman.cpp
@@ -21,12 +21,12 @@
#include "graphics/font.h"
#include "graphics/fontman.h"
+#include "common/translation.h"
DECLARE_SINGLETON(Graphics::FontManager);
namespace Graphics {
-const ScummFont *g_scummfont = 0;
FORWARD_DECLARE_FONT(g_sysfont);
FORWARD_DECLARE_FONT(g_sysfont_big);
FORWARD_DECLARE_FONT(g_consolefont);
@@ -34,18 +34,15 @@ FORWARD_DECLARE_FONT(g_consolefont);
FontManager::FontManager() {
// This assert should *never* trigger, because
// FontManager is a singleton, thus there is only
- // one instance of it per time. (g_scummfont gets
+ // one instance of it per time. (g_sysfont gets
// reset to 0 in the desctructor of this class).
- assert(g_scummfont == 0);
- g_scummfont = new ScummFont;
+ assert(g_sysfont == 0);
INIT_FONT(g_sysfont);
INIT_FONT(g_sysfont_big);
INIT_FONT(g_consolefont);
}
FontManager::~FontManager() {
- delete g_scummfont;
- g_scummfont = 0;
delete g_sysfont;
g_sysfont = 0;
delete g_sysfont_big;
@@ -58,7 +55,6 @@ const struct {
const char *name;
FontManager::FontUsage id;
} builtinFontNames[] = {
- { "builtinOSD", FontManager::kOSDFont },
{ "builtinConsole", FontManager::kConsoleFont },
{ "fixed5x8.bdf", FontManager::kConsoleFont },
{ "fixed5x8-iso-8859-1.bdf", FontManager::kConsoleFont },
@@ -69,32 +65,112 @@ const struct {
{ "helvB12.bdf", FontManager::kBigGUIFont },
{ "helvB12-iso-8859-1.bdf", FontManager::kBigGUIFont },
{ "helvB12-ascii.bdf", FontManager::kBigGUIFont },
- { 0, FontManager::kOSDFont }
+ { 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 {
switch (usage) {
- case kOSDFont:
- return g_scummfont;
case kConsoleFont:
return g_consolefont;
case kGUIFont:
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;
+ }
+#ifdef USE_TRANSLATION
+ // 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;
+ }
+#endif
+ // 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;
+#else
+ // We will transform the font filename in the following way:
+ // name.bdf
+ // will become:
+ // name-charset.bdf
+ // Note that name should not contain any dot here!
+
+ // In the first step we look for the dot. In case there is none we will
+ // return the normal filename.
+ Common::String::const_iterator dot = Common::find(filename.begin(), filename.end(), '.');
+ if (dot == filename.end())
+ return filename;
+
+ // Put the translated font filename string back together.
+ Common::String result(filename.begin(), dot);
+ result += '-';
+ result += TransMan.getCurrentCharset();
+ result += dot;
+
+ return result;
+#endif
+}
+
} // End of namespace Graphics