From b460a7c03601952e4e60c565893bdaf90ae92f33 Mon Sep 17 00:00:00 2001 From: Dmitry Iskrich Date: Thu, 30 Jun 2016 23:15:23 +0300 Subject: [PATCH] DIRECTOR: Calculate values for text rendering --- engines/director/director.cpp | 5 +++-- engines/director/score.cpp | 30 +++++++++++++++++++++++++++++- engines/director/score.h | 3 ++- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/engines/director/director.cpp b/engines/director/director.cpp index c7ae940873c1..a6422df51915 100644 --- a/engines/director/director.cpp +++ b/engines/director/director.cpp @@ -201,7 +201,6 @@ end repeat\n\ //FIXME _mainArchive = new RIFFArchive(); _mainArchive->openFile("bookshelf_example.mmm"); - _currentScore = new Score(this); debug(0, "Score name %s", _currentScore->getMacName().c_str()); @@ -415,15 +414,17 @@ void DirectorEngine::loadSharedCastsFrom(Common::String filename) { if (dib.size() != 0) { Common::Array::iterator iterator; for (iterator = dib.begin(); iterator != dib.end(); ++iterator) { + debug(3, "Shared DIB %d", *iterator); _sharedDIB->setVal(*iterator, shardcst->getResource(MKTAG('D','I','B',' '), *iterator)); } } - Common::Array stxt = shardcst->getResourceIDList(MKTAG('D','I','B',' ')); + Common::Array stxt = shardcst->getResourceIDList(MKTAG('S','T','X','T')); if (stxt.size() != 0) { Common::Array::iterator iterator; for (iterator = stxt.begin(); iterator != stxt.end(); ++iterator) { + debug(3, "Shared STXT %d", *iterator); _sharedSTXT->setVal(*iterator, shardcst->getResource(MKTAG('S','T','X','T'), *iterator)); } } diff --git a/engines/director/score.cpp b/engines/director/score.cpp index 6b9cdb293a2a..c799eef6d801 100644 --- a/engines/director/score.cpp +++ b/engines/director/score.cpp @@ -1240,7 +1240,35 @@ Image::ImageDecoder *Frame::getImageFrom(uint16 spriteId) { void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteID) { - warning("STUB: renderText()"); + Cast *textCast = _vm->_currentScore->_casts[_sprites[spriteID]->_castId]; + Common::SeekableSubReadStreamEndian *textStream; + + if (_vm->_currentScore->_movieArchive->hasResource(MKTAG('S','T','X','T'), spriteID + 1024)) { + textStream = _vm->_currentScore->_movieArchive->getResource(MKTAG('S','T','X','T'), spriteID + 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(_sprites[spriteID]->_cast)->initialRect.left; + uint32 rectTop = static_cast(_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; + //TODO render text } void Frame::drawBackgndTransSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect) { diff --git a/engines/director/score.h b/engines/director/score.h index 9f13df77f6f6..b616e11ff00c 100644 --- a/engines/director/score.h +++ b/engines/director/score.h @@ -30,6 +30,7 @@ #include "graphics/managed_surface.h" #include "common/str.h" #include "image/image_decoder.h" +#include "graphics/font.h" namespace Director { @@ -290,7 +291,6 @@ class Frame { Frame(DirectorEngine *vm); Frame(const Frame &frame); ~Frame(); - void readChannel(Common::SeekableSubReadStreamEndian &stream, uint16 offset, uint16 size); void prepareFrame(Score *score); uint16 getSpriteIDFromPos(Common::Point pos); @@ -378,6 +378,7 @@ class Score { Common::HashMap _fontMap; Graphics::ManagedSurface *_surface; Graphics::ManagedSurface *_trailSurface; + Graphics::Font *_font; Archive *_movieArchive; Common::Rect _movieRect;