void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteID) { uint16 castID = _sprites[spriteID]->_castId; TextCast *textCast = static_cast<TextCast *>(_vm->_currentScore->_casts[castID]); Common::SeekableSubReadStreamEndian *textStream; if (_vm->_currentScore->_movieArchive->hasResource(MKTAG('S','T','X','T'), castID + 1024)) { textStream = _vm->_currentScore->_movieArchive->getResource(MKTAG('S','T','X','T'), castID + 1024); } else { textStream = _vm->getSharedSTXT()->getVal(spriteID + 1024); } /*uint32 unk1 = */ textStream->readUint32(); uint32 strLen = textStream->readUint32(); /*uin32 dataLen = */ textStream->readUint32(); Common::String text; for (uint32 i = 0; i < strLen; i++) { byte ch = textStream->readByte(); if (ch == 0x0d) { ch = '\n'; } text += ch; } uint32 rectLeft = static_cast<TextCast *>(_sprites[spriteID]->_cast)->initialRect.left; uint32 rectTop = static_cast<TextCast *>(_sprites[spriteID]->_cast)->initialRect.top; int x = _sprites[spriteID]->_startPoint.x + rectLeft; int y = _sprites[spriteID]->_startPoint.y + rectTop; int height = _sprites[spriteID]->_height; int width = _sprites[spriteID]->_width; const char *fontName; if (_vm->_currentScore->_fontMap.contains(textCast->fontId)) { fontName = _vm->_currentScore->_fontMap[textCast->fontId].c_str(); } else if ((fontName = _vm->_wm->getFontName(textCast->fontId, textCast->fontSize)) == NULL) { warning("Unknown font id %d, falling back to default", textCast->fontId); fontName = _vm->_wm->getFontName(0, 12); } const Graphics::Font *font = _vm->_wm->getFont(fontName, Graphics::FontManager::kBigGUIFont); font->drawString(&surface, text, x, y, width, 0); if (textCast->borderSize != kSizeNone) { uint16 size = textCast->borderSize; //Indent from borders, measured in d4 x -= 1; y -= 4; height += 4; width += 1; while (size) { surface.frameRect(Common::Rect(x, y, x + height, y + width), 0); x--; y--; height += 2; width += 2; size--; } } if (textCast->gutterSize != kSizeNone) { x -= 1; y -= 4; height += 4; width += 1; uint16 size = textCast->gutterSize; surface.frameRect(Common::Rect(x, y, x + height, y + width), 0); while (size) { surface.drawLine(x + width, y, x + width, y + height, 0); surface.drawLine(x, y + height, x + width, y + height, 0); x++; y++; size--; } } }