[Scummvm-git-logs] scummvm master -> 20e29b2198558fc3054c7ccd6a68f5b1ac4aee47
djsrv
dservilla at gmail.com
Tue Jun 30 02:11:47 UTC 2020
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
20e29b2198 GRAPHICS: MACGUI: Load TrueType fonts
Commit: 20e29b2198558fc3054c7ccd6a68f5b1ac4aee47
https://github.com/scummvm/scummvm/commit/20e29b2198558fc3054c7ccd6a68f5b1ac4aee47
Author: djsrv (dservilla at gmail.com)
Date: 2020-06-29T22:11:13-04:00
Commit Message:
GRAPHICS: MACGUI: Load TrueType fonts
Changed paths:
graphics/macgui/macfontmanager.cpp
graphics/macgui/macfontmanager.h
diff --git a/graphics/macgui/macfontmanager.cpp b/graphics/macgui/macfontmanager.cpp
index 57979db3e3..20f5055166 100644
--- a/graphics/macgui/macfontmanager.cpp
+++ b/graphics/macgui/macfontmanager.cpp
@@ -122,7 +122,9 @@ MacFontManager::MacFontManager(uint32 mode) : _mode(mode) {
}
MacFontManager::~MacFontManager() {
- for(Common::HashMap<int, const Graphics::Font *>::iterator it = _uniFonts.begin(); it != _uniFonts.end(); it++)
+ for (Common::HashMap<int, const Graphics::Font *>::iterator it = _uniFonts.begin(); it != _uniFonts.end(); it++)
+ delete it->_value;
+ for (Common::HashMap<int, Common::SeekableReadStream *>::iterator it = _ttfData.begin(); it != _ttfData.end(); it++)
delete it->_value;
}
@@ -261,9 +263,21 @@ void MacFontManager::loadFonts(Common::MacResManager *fontFile) {
if (!fontstream)
fontstream = fontFile->getResource(MKTAG('F', 'O', 'N', 'T'), (*assoc)[i]._fontID);
+#ifdef USE_FREETYPE2
if (!fontstream) {
- warning("MacFontManager: Unknown FontId: %d", (*assoc)[i]._fontID);
+ // The sfnt resource should be just a copy of a TTF
+ fontstream = fontFile->getResource(MKTAG('s', 'f', 'n', 't'), (*assoc)[i]._fontID);
+ _ttfData[_fontIds.getVal(familyName, kMacFontNonStandard)] = fontstream;
+ return;
+ }
+#endif
+ if (!fontstream) {
+ if ((*assoc)[i]._fontSize == 0) {
+ warning("MacFontManager: Detected possible TrueType FontID %d, but no TrueType support detected", (*assoc)[i]._fontID);
+ } else {
+ warning("MacFontManager: Unknown FontId: %d", (*assoc)[i]._fontID);
+ }
continue;
}
@@ -279,7 +293,7 @@ void MacFontManager::loadFonts(Common::MacResManager *fontFile) {
macfont = new MacFont(_fontIds.getVal(familyName, kMacFontNonStandard), (*assoc)[i]._fontSize, (*assoc)[i]._fontStyle | familySlant);
FontMan.assignFontToName(fontName, font);
- macfont->setFont(font);
+ macfont->setFont(font, false);
_fontRegistry.setVal(fontName, macfont);
debug(2, " %s", fontName.c_str());
@@ -416,10 +430,18 @@ int MacFontManager::getFontIdByName(Common::String name) {
void MacFontManager::generateFontSubstitute(MacFont &macFont) {
Common::String name;
+#ifdef USE_FREETYPE2
+ // First check if it's a TTF font
+ if (_ttfData.contains(macFont.getId())) {
+ generateTTFFont(macFont, _ttfData[macFont.getId()]);
+ return;
+ }
+#endif
+
// First we try twice size
name = getFontName(macFont.getId(), macFont.getSize() * 2, macFont.getSlant());
if (_fontRegistry.contains(name) && !_fontRegistry[name]->isGenerated()) {
- generateFont(macFont, *_fontRegistry[name]);
+ generateFONTFont(macFont, *_fontRegistry[name]);
return;
}
@@ -427,7 +449,7 @@ void MacFontManager::generateFontSubstitute(MacFont &macFont) {
// Now half size
name = getFontName(macFont.getId(), macFont.getSize() / 2, macFont.getSlant());
if (_fontRegistry.contains(name) && !_fontRegistry[name]->isGenerated()) {
- generateFont(macFont, *_fontRegistry[name]);
+ generateFONTFont(macFont, *_fontRegistry[name]);
return;
}
@@ -477,15 +499,43 @@ void MacFontManager::generateFontSubstitute(MacFont &macFont) {
}
if (candidate) {
- generateFont(macFont, *candidate);
+ generateFONTFont(macFont, *candidate);
return;
}
// Now next smaller font, which is the biggest we have
- generateFont(macFont, *maxSize);
+ generateFONTFont(macFont, *maxSize);
+}
+
+#ifdef USE_FREETYPE2
+void MacFontManager::generateTTFFont(MacFont &toFont, Common::SeekableReadStream *stream) {
+ debug("Generating TTF font '%s'", getFontName(toFont).c_str());
+
+ // TODO: Handle getSlant() flags
+
+ stream->seek(0);
+ Font *font = Graphics::loadTTFFont(*stream, toFont.getSize());
+
+ if (!font) {
+ warning("Failed to generate font '%s'", getFontName(toFont).c_str());
+ }
+
+ toFont.setGenerated(true);
+ toFont.setFont(font, true);
+
+ FontMan.assignFontToName(getFontName(toFont), font);
+ _fontRegistry.setVal(getFontName(toFont), new MacFont(toFont));
+
+ debug("Generated font '%s'", getFontName(toFont).c_str());
}
+#endif
+
+void MacFontManager::generateFONTFont(MacFont &toFont, MacFont &fromFont) {
+ if (fromFont.isTrueType()) {
+ warning("Cannot generate FONT font '%s' from TTF font '%s'", getFontName(toFont).c_str(), getFontName(fromFont).c_str());
+ return;
+ }
-void MacFontManager::generateFont(MacFont &toFont, MacFont &fromFont) {
debugN("Found font substitute for font '%s' ", getFontName(toFont).c_str());
debug("as '%s'", getFontName(fromFont).c_str());
@@ -497,14 +547,15 @@ void MacFontManager::generateFont(MacFont &toFont, MacFont &fromFont) {
outline = toFont.getSlant() & kMacFontOutline;
}
- MacFONTFont *font = Graphics::MacFONTFont::scaleFont(fromFont.getFont(), toFont.getSize(), bold, italic, outline);
+ MacFONTFont *fromFONTFont = static_cast<MacFONTFont *>(fromFont.getFont());
+ MacFONTFont *font = Graphics::MacFONTFont::scaleFont(fromFONTFont, toFont.getSize(), bold, italic, outline);
if (!font) {
warning("Failed to generate font '%s'", getFontName(toFont).c_str());
}
toFont.setGenerated(true);
- toFont.setFont(font);
+ toFont.setFont(font, false);
FontMan.assignFontToName(getFontName(toFont), font);
_fontRegistry.setVal(getFontName(toFont), new MacFont(toFont));
diff --git a/graphics/macgui/macfontmanager.h b/graphics/macgui/macfontmanager.h
index e33441bb5a..d0f9dcb1eb 100644
--- a/graphics/macgui/macfontmanager.h
+++ b/graphics/macgui/macfontmanager.h
@@ -74,6 +74,7 @@ public:
_slant = slant;
_fallback = fallback;
_generated = false;
+ _truetype = false;
_font = NULL;
}
@@ -86,18 +87,20 @@ public:
FontManager::FontUsage getFallback() { return _fallback; }
bool isGenerated() { return _generated; }
void setGenerated(bool gen) { _generated = gen; }
- MacFONTFont *getFont() { return _font; }
- void setFont(MacFONTFont *font) { _font = font; }
+ bool isTrueType() { return _truetype; }
+ Font *getFont() { return _font; }
+ void setFont(Font *font, bool truetype) { _font = font; _truetype = truetype; }
private:
int _id;
int _size;
int _slant;
+ bool _truetype;
Common::String _name;
FontManager::FontUsage _fallback;
bool _generated;
- MacFONTFont *_font;
+ Font *_font;
};
class MacFontManager {
@@ -142,7 +145,11 @@ private:
void loadFonts();
void generateFontSubstitute(MacFont &macFont);
- void generateFont(MacFont &toFont, MacFont &fromFont);
+ void generateFONTFont(MacFont &toFont, MacFont &fromFont);
+
+#ifdef USE_FREETYPE2
+ void generateTTFFont(MacFont &toFront, Common::SeekableReadStream *stream);
+#endif
private:
bool _builtInFonts;
@@ -158,6 +165,8 @@ private:
/* Unicode font */
Common::HashMap<int, const Graphics::Font *> _uniFonts;
+
+ Common::HashMap<int, Common::SeekableReadStream *> _ttfData;
};
} // End of namespace Graphics
More information about the Scummvm-git-logs
mailing list