diff --git a/graphics/macgui/macfontmanager.cpp b/graphics/macgui/macfontmanager.cpp index 57979db3e34..20f50551662 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::iterator it = _uniFonts.begin(); it != _uniFonts.end(); it++) + for (Common::HashMap::iterator it = _uniFonts.begin(); it != _uniFonts.end(); it++) + delete it->_value; + for (Common::HashMap::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); } -void MacFontManager::generateFont(MacFont &toFont, MacFont &fromFont) { +#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; + } + 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(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 e33441bb5a6..d0f9dcb1eb6 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 _uniFonts; + + Common::HashMap _ttfData; }; } // End of namespace Graphics