diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp index bb53e8008fe..25e7fb5ed60 100644 --- a/engines/director/cast.cpp +++ b/engines/director/cast.cpp @@ -102,10 +102,7 @@ Cast::~Cast() { for (Common::HashMap::iterator it = _castsInfo.begin(); it != _castsInfo.end(); ++it) delete it->_value; - for (FontXPlatformMap::iterator it = _macFontsToWin.begin(); it != _macFontsToWin.end(); ++it) - delete it->_value; - - for (FontXPlatformMap::iterator it = _winFontsToMac.begin(); it != _winFontsToMac.end(); ++it) + for (Graphics::FontXPlatformMap::iterator it = _fontXPlatformMap.begin(); it != _fontXPlatformMap.end(); ++it) delete it->_value; delete _loadedStxts; diff --git a/engines/director/cast.h b/engines/director/cast.h index 32236bbf90d..d692558f9f0 100644 --- a/engines/director/cast.h +++ b/engines/director/cast.h @@ -31,6 +31,12 @@ namespace Common { class SeekableReadStreamEndian; } +namespace Graphics { + struct FontXPlatformInfo; + typedef Common::HashMap CharMap; + typedef Common::HashMap FontXPlatformMap; +} + namespace Director { class Archive; @@ -46,15 +52,6 @@ class ScriptCastMember; class ShapeCastMember; class TextCastMember; -typedef Common::HashMap CharMap; -typedef Common::HashMap FontSizeMap; -struct FontXPlatformInfo { - Common::String toFont; - bool remapChars; - FontSizeMap sizeMap; -}; -typedef Common::HashMap FontXPlatformMap; - class Cast { public: Cast(Movie *movie, uint16 castLibID, bool shared = false); @@ -104,10 +101,8 @@ public: uint16 _castLibID; Common::HashMap _fontMap; - CharMap _macCharsToWin; - CharMap _winCharsToMac; - FontXPlatformMap _macFontsToWin; - FontXPlatformMap _winFontsToMac; + Graphics::CharMap _charMap; + Graphics::FontXPlatformMap _fontXPlatformMap; Common::HashMap *_loadedCast; Common::HashMap *_loadedStxts; diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp index 68ec6ec93cb..2deba1142b5 100644 --- a/engines/director/castmember.cpp +++ b/engines/director/castmember.cpp @@ -701,7 +701,7 @@ Graphics::MacWidget *TextCastMember::createWidget(Common::Rect &bbox, Channel *c dims.right = MIN(dims.right, dims.left + _initialRect.width()); dims.bottom = MIN(dims.bottom, dims.top + _initialRect.height()); } - widget = new Graphics::MacText(g_director->getCurrentWindow(), bbox.left, bbox.top, dims.width(), dims.height(), g_director->_wm, _ftext, macFont, getForeColor(), getBackColor(), _initialRect.width(), getAlignment(), 0, _borderSize, _gutterSize, _boxShadow, _textShadow, Common::kMacCentralEurope, _textType == kTextTypeFixed); + widget = new Graphics::MacText(g_director->getCurrentWindow(), bbox.left, bbox.top, dims.width(), dims.height(), g_director->_wm, _ftext, macFont, getForeColor(), getBackColor(), _initialRect.width(), getAlignment(), 0, _borderSize, _gutterSize, _boxShadow, _textShadow, Common::kMacCentralEurope, _textType == kTextTypeFixed, &_cast->_charMap, &_cast->_fontXPlatformMap); ((Graphics::MacText *)widget)->setSelRange(g_director->getCurrentMovie()->_selStart, g_director->getCurrentMovie()->_selEnd); ((Graphics::MacText *)widget)->setEditable(_editable); ((Graphics::MacText *)widget)->draw(); diff --git a/engines/director/fonts.cpp b/engines/director/fonts.cpp index 8b43de1363b..0d9bfec1d35 100644 --- a/engines/director/fonts.cpp +++ b/engines/director/fonts.cpp @@ -276,9 +276,11 @@ bool Cast::readFXmpLine(Common::SeekableReadStreamEndian &stream) { } Common::String fromFont; + uint16 fromFontId; tok = readFXmpToken(stream); if (tok.type == FXMP_TOKEN_WORD || tok.type == FXMP_TOKEN_STRING) { fromFont = tok.str; + fromFontId = _vm->_wm->_fontMan->registerFontName(fromFont); tok = readFXmpToken(stream); } @@ -332,11 +334,12 @@ bool Cast::readFXmpLine(Common::SeekableReadStreamEndian &stream) { } byte toChar = atoi(tok.str.c_str()); + // TODO: We should fill _charMap with mappings matching the current platform. + // We only have Mac fonts right now, though, so we'll always use the Win => Mac mappings. if (fromPlatform == Common::kPlatformMacintosh) { - _macCharsToWin[fromChar] = toChar; debugC(3, kDebugLoading, "Cast::readFXmpLine: Mapping Mac char %d to Win char %d", fromChar, toChar); } else { - _winCharsToMac[fromChar] = toChar; + _charMap[fromChar] = toChar; debugC(3, kDebugLoading, "Cast::readFXmpLine: Mapping Win char %d to Mac char %d", fromChar, toChar); } @@ -344,7 +347,7 @@ bool Cast::readFXmpLine(Common::SeekableReadStreamEndian &stream) { } } else { // font mapping - FontXPlatformInfo *info = new FontXPlatformInfo; + Graphics::FontXPlatformInfo *info = new Graphics::FontXPlatformInfo; // to font tok = readFXmpToken(stream); @@ -353,7 +356,9 @@ bool Cast::readFXmpLine(Common::SeekableReadStreamEndian &stream) { delete info; return false; } - info->toFont = tok.str; + Common::String toFont = tok.str; + uint16 toFontId = _vm->_wm->_fontMan->registerFontName(toFont); + info->toFont = toFontId; tok = readFXmpToken(stream); @@ -409,15 +414,16 @@ bool Cast::readFXmpLine(Common::SeekableReadStreamEndian &stream) { tok = readFXmpToken(stream); } + // TODO: We should fill _fontXPlatformMap with mappings matching the current platform. + // We only have Mac fonts right now, though, so we'll always use the Win => Mac mappings. if (fromPlatform == Common::kPlatformMacintosh) { - _macFontsToWin[fromFont] = info; - debugC(3, kDebugLoading, "Cast::readFXmpLine: Mapping Mac font '%s' to Win font '%s'", fromFont.c_str(), info->toFont.c_str()); + debugC(3, kDebugLoading, "Cast::readFXmpLine: Mapping Mac font '%s' (%d) to Win font '%s' (%d)", fromFont.c_str(), fromFontId, toFont.c_str(), toFontId); } else { - _winFontsToMac[fromFont] = info; - debugC(3, kDebugLoading, "Cast::readFXmpLine: Mapping Win font '%s' to Mac font '%s'", fromFont.c_str(), info->toFont.c_str()); + _fontXPlatformMap[fromFontId] = info; + debugC(3, kDebugLoading, "Cast::readFXmpLine: Mapping Win font '%s' (%d) to Mac font '%s' (%d)", fromFont.c_str(), fromFontId, toFont.c_str(), toFontId); } debugC(4, kDebugLoading, " Remap characters: %d", info->remapChars); - for (FontSizeMap::iterator it = info->sizeMap.begin(); it != info->sizeMap.end(); ++it) { + for (Graphics::FontSizeMap::iterator it = info->sizeMap.begin(); it != info->sizeMap.end(); ++it) { debugC(4, kDebugLoading, " Mapping size %d to %d", it->_key, it->_value); } } diff --git a/graphics/macgui/macfontmanager.h b/graphics/macgui/macfontmanager.h index 0eac4ee4f0a..6ebf6f03832 100644 --- a/graphics/macgui/macfontmanager.h +++ b/graphics/macgui/macfontmanager.h @@ -66,6 +66,15 @@ enum { class Font; +typedef Common::HashMap CharMap; +typedef Common::HashMap FontSizeMap; +struct FontXPlatformInfo { + uint16 toFont; + bool remapChars; + FontSizeMap sizeMap; +}; +typedef Common::HashMap FontXPlatformMap; + class MacFont { public: MacFont(int id = kMacFontChicago, int size = 12, int slant = kMacFontRegular, FontManager::FontUsage fallback = Graphics::FontManager::kBigGUIFont) { diff --git a/graphics/macgui/mactext.cpp b/graphics/macgui/mactext.cpp index 581c7ad2f63..2c1fcbd99d4 100644 --- a/graphics/macgui/mactext.cpp +++ b/graphics/macgui/mactext.cpp @@ -94,7 +94,7 @@ uint MacTextLine::getChunkNum(int *col) { } -MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager *wm, const Common::U32String &s, const MacFont *macFont, int fgcolor, int bgcolor, int maxWidth, TextAlign textAlignment, int interlinear, uint16 border, uint16 gutter, uint16 boxShadow, uint16 textShadow, bool fixedDims) : +MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager *wm, const Common::U32String &s, const MacFont *macFont, int fgcolor, int bgcolor, int maxWidth, TextAlign textAlignment, int interlinear, uint16 border, uint16 gutter, uint16 boxShadow, uint16 textShadow, bool fixedDims, CharMap *charMap, FontXPlatformMap *fontXPlatformMap) : MacWidget(parent, x, y, w, h, wm, true, border, gutter, boxShadow), _macFont(macFont), _maxWidth(maxWidth), _textAlignment(textAlignment), _interLinear(interlinear) { @@ -110,6 +110,9 @@ MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager _encodeType = Common::kUtf8; _plainByteMode = false; + _charMap = charMap; + _fontXPlatformMap = fontXPlatformMap; + if (macFont) { _defaultFormatting = MacFontRun(this, _wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0); _defaultFormatting.font = wm->_fontMan->getFont(*macFont); @@ -120,7 +123,7 @@ MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager init(); } -MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager *wm, const Common::String &s, const MacFont *macFont, int fgcolor, int bgcolor, int maxWidth, TextAlign textAlignment, int interlinear, uint16 border, uint16 gutter, uint16 boxShadow, uint16 textShadow, Common::CodePage encodeType, bool fixedDims) : +MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager *wm, const Common::String &s, const MacFont *macFont, int fgcolor, int bgcolor, int maxWidth, TextAlign textAlignment, int interlinear, uint16 border, uint16 gutter, uint16 boxShadow, uint16 textShadow, Common::CodePage encodeType, bool fixedDims, CharMap *charMap, FontXPlatformMap *fontXPlatformMap) : MacWidget(parent, x, y, w, h, wm, true, border, gutter, boxShadow), _macFont(macFont), _maxWidth(maxWidth), _textAlignment(textAlignment), _interLinear(interlinear) { @@ -135,6 +138,9 @@ MacText::MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager _encodeType = encodeType; _plainByteMode = true; + _charMap = charMap; + _fontXPlatformMap = fontXPlatformMap; + if (macFont) { _defaultFormatting = MacFontRun(this, _wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0); _defaultFormatting.font = wm->_fontMan->getFont(*macFont); @@ -161,6 +167,9 @@ MacText::MacText(const Common::U32String &s, MacWindowManager *wm, const MacFont _encodeType = Common::kUtf8; _plainByteMode = false; + _charMap = nullptr; + _fontXPlatformMap = nullptr; + if (macFont) { _defaultFormatting = MacFontRun(this, _wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0); _defaultFormatting.font = wm->_fontMan->getFont(*macFont); @@ -186,6 +195,9 @@ MacText::MacText(const Common::String &s, MacWindowManager *wm, const MacFont *m _encodeType = encodeType; _plainByteMode = true; + _charMap = nullptr; + _fontXPlatformMap = nullptr; + if (macFont) { _defaultFormatting = MacFontRun(this, _wm, macFont->getId(), macFont->getSlant(), macFont->getSize(), 0, 0, 0); _defaultFormatting.font = wm->_fontMan->getFont(*macFont); @@ -212,6 +224,9 @@ MacText::MacText(const Common::U32String &s, MacWindowManager *wm, const Font *f _encodeType = Common::kUtf8; _plainByteMode = false; + _charMap = nullptr; + _fontXPlatformMap = nullptr; + if (font) { _defaultFormatting = MacFontRun(this, _wm, font, 0, font->getFontHeight(), 0, 0, 0); _defaultFormatting.font = font; diff --git a/graphics/macgui/mactext.h b/graphics/macgui/mactext.h index d34cdce6886..e92c998294f 100644 --- a/graphics/macgui/mactext.h +++ b/graphics/macgui/mactext.h @@ -39,6 +39,10 @@ class MacText; class MacWidget; class MacWindow; class MacWindowManager; +struct FontXPlatformInfo; + +typedef Common::HashMap CharMap; +typedef Common::HashMap FontXPlatformMap; struct MacFontRun { Common::U32String text; @@ -148,8 +152,8 @@ struct SelectedText { class MacText : public MacWidget { public: - MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager *wm, const Common::U32String &s, const MacFont *font, int fgcolor, int bgcolor, int maxWidth, TextAlign textAlignment = kTextAlignLeft, int interlinear = 0, uint16 border = 0, uint16 gutter = 0, uint16 boxShadow = 0, uint16 textShadow = 0, bool fixedDims = true); - MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager *wm, const Common::String &s, const MacFont *font, int fgcolor, int bgcolor, int maxWidth, TextAlign textAlignment = kTextAlignLeft, int interlinear = 0, uint16 border = 0, uint16 gutter = 0, uint16 boxShadow = 0, uint16 textShadow = 0, Common::CodePage encodeType = Common::kMacCentralEurope, bool fixedDims = true); + MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager *wm, const Common::U32String &s, const MacFont *font, int fgcolor, int bgcolor, int maxWidth, TextAlign textAlignment = kTextAlignLeft, int interlinear = 0, uint16 border = 0, uint16 gutter = 0, uint16 boxShadow = 0, uint16 textShadow = 0, bool fixedDims = true, CharMap *charMap = nullptr, FontXPlatformMap *fontXPlatformMap = nullptr); + MacText(MacWidget *parent, int x, int y, int w, int h, MacWindowManager *wm, const Common::String &s, const MacFont *font, int fgcolor, int bgcolor, int maxWidth, TextAlign textAlignment = kTextAlignLeft, int interlinear = 0, uint16 border = 0, uint16 gutter = 0, uint16 boxShadow = 0, uint16 textShadow = 0, Common::CodePage encodeType = Common::kMacCentralEurope, bool fixedDims = true, CharMap *charMap = nullptr, FontXPlatformMap *fontXPlatformMap = nullptr); // 0 pixels between the lines by default MacText(const Common::U32String &s, MacWindowManager *wm, const MacFont *font, int fgcolor, int bgcolor, int maxWidth, TextAlign textAlignment, int interlinear = 0, bool fixedDims = true); @@ -300,6 +304,9 @@ public: bool _fullRefresh; + CharMap *_charMap; + FontXPlatformMap *_fontXPlatformMap; + protected: Common::U32String _str; const MacFont *_macFont;