[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