aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2012-01-07 01:00:31 +0100
committerJohannes Schickel2012-01-07 01:03:07 +0100
commit050b8e33604bb50d48a9a43f61c85baccb17ab1d (patch)
treec4bea936ebe8425f91ecc80cdcd9fc34b103f712
parent0d3e79cf77af364063944b5884c34c9da7c0466d (diff)
downloadscummvm-rg350-050b8e33604bb50d48a9a43f61c85baccb17ab1d.tar.gz
scummvm-rg350-050b8e33604bb50d48a9a43f61c85baccb17ab1d.tar.bz2
scummvm-rg350-050b8e33604bb50d48a9a43f61c85baccb17ab1d.zip
GUI: Rework how the default localized font is managed.
Now we set the default localized font to the "text_default" font of the currently active theme and default to the big GUI font in case none is specified properly.
-rw-r--r--graphics/fontman.cpp64
-rw-r--r--graphics/fontman.h19
-rw-r--r--gui/ThemeEngine.cpp14
-rw-r--r--gui/ThemeEngine.h2
4 files changed, 44 insertions, 55 deletions
diff --git a/graphics/fontman.cpp b/graphics/fontman.cpp
index a10d27a2b0..9c7285ef2f 100644
--- a/graphics/fontman.cpp
+++ b/graphics/fontman.cpp
@@ -72,6 +72,20 @@ const struct {
{ 0, FontManager::kConsoleFont }
};
+bool FontManager::setLocalizedFont(const Common::String &name) {
+ Common::String lowercaseName = name;
+ lowercaseName.toLowercase();
+
+ // We only update the localized font in case the name is properly assigned
+ // to a font.
+ if (_fontMap.contains(lowercaseName) && _fontMap.getVal(lowercaseName) != 0) {
+ _localizedFontName = lowercaseName;
+ return true;
+ } else {
+ return false;
+ }
+}
+
bool FontManager::assignFontToName(const Common::String &name, const Font *font) {
Common::String lowercaseName = name;
lowercaseName.toLowercase();
@@ -103,6 +117,11 @@ void FontManager::removeFontName(const Common::String &name) {
Common::String lowercaseName = name;
lowercaseName.toLowercase();
_fontMap.erase(lowercaseName);
+
+ // In case the current localized font is removed, we fall back to the
+ // default font again.
+ if (_localizedFontName == lowercaseName)
+ _localizedFontName.clear();
}
const Font *FontManager::getFontByName(const Common::String &name) const {
@@ -126,51 +145,16 @@ const Font *FontManager::getFontByUsage(FontUsage usage) const {
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;
- }
+ // By default use the big font as localized font
+ if (_localizedFontName.empty())
+ return g_sysfont_big;
+ else
+ return _fontMap[_localizedFontName];
}
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;
diff --git a/graphics/fontman.h b/graphics/fontman.h
index 77ae508c16..e229860f24 100644
--- a/graphics/fontman.h
+++ b/graphics/fontman.h
@@ -43,6 +43,14 @@ public:
};
/**
+ * Sets the localized font name.
+ *
+ * @param name the name of the localized font.
+ * @return true when the font was present, false otherwise.
+ */
+ bool setLocalizedFont(const Common::String &name);
+
+ /**
* Retrieve a font object based on its 'name'.
*
* @param name the name of the font to be retrieved.
@@ -96,22 +104,13 @@ public:
//const Font *getFontBySize(int size???) const;
-protected:
- /**
- * Get the name of the localized font for the given usage. There is no garanty that
- * the font exists. If the usage is kLocalizedFont it returns an empty string.
- *
- * @param usage a FontUsage enum value indicating what the font will be used for.
- * @return the name of a localized font or an empty string if no suitable font was found.
- */
- Common::String getLocalizedFontNameByUsage(FontUsage usage) const;
-
private:
friend class Common::Singleton<SingletonBaseType>;
FontManager();
~FontManager();
Common::HashMap<Common::String, const Font *> _fontMap;
+ Common::String _localizedFontName;
};
diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index ae93154419..461e9cff2a 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -571,14 +571,15 @@ bool ThemeEngine::addFont(TextData textId, const Common::String &file) {
} else {
Common::String localized = FontMan.genLocalizedFontFilename(file);
// Try localized fonts
- _texts[textId]->_fontPtr = loadFont(localized);
+ _texts[textId]->_fontPtr = loadFont(localized, textId == kTextDataDefault);
if (!_texts[textId]->_fontPtr) {
// Try standard fonts
- _texts[textId]->_fontPtr = loadFont(file);
+ _texts[textId]->_fontPtr = loadFont(file, textId == kTextDataDefault);
if (!_texts[textId]->_fontPtr)
error("Couldn't load font '%s'", file.c_str());
+
#ifdef USE_TRANSLATION
TransMan.setLanguage("C");
#endif
@@ -1385,7 +1386,7 @@ DrawData ThemeEngine::parseDrawDataId(const Common::String &name) const {
* External data loading
*********************************************************/
-const Graphics::Font *ThemeEngine::loadFont(const Common::String &filename) {
+const Graphics::Font *ThemeEngine::loadFont(const Common::String &filename, const bool makeLocalizedFont) {
// Try already loaded fonts.
const Graphics::Font *font = FontMan.getFontByName(filename);
if (font)
@@ -1417,8 +1418,13 @@ const Graphics::Font *ThemeEngine::loadFont(const Common::String &filename) {
}
// If the font is successfully loaded store it in the font manager.
- if (font)
+ if (font) {
FontMan.assignFontToName(filename, font);
+ // If this font should be the new default localized font, we set it up
+ // for that.
+ if (makeLocalizedFont)
+ FontMan.setLocalizedFont(filename);
+ }
return font;
}
diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h
index def64ec025..2377098957 100644
--- a/gui/ThemeEngine.h
+++ b/gui/ThemeEngine.h
@@ -536,7 +536,7 @@ protected:
*/
void unloadTheme();
- const Graphics::Font *loadFont(const Common::String &filename);
+ const Graphics::Font *loadFont(const Common::String &filename, const bool makeLocalizedFont);
Common::String genCacheFilename(const Common::String &filename) const;
/**