Fixed crash after using cutscene subtitles. (Now I *know* no one has used that

feature before. :-)

svn-id: r34796
This commit is contained in:
Torbjörn Andersson 2008-10-13 18:41:12 +00:00
parent ffdbb474c4
commit c2066b9c20
3 changed files with 13 additions and 7 deletions

View file

@ -278,7 +278,7 @@ void MoviePlayer::play(void) {
_textSpriteBuf = (byte *)calloc(_textHeight, _textWidth); _textSpriteBuf = (byte *)calloc(_textHeight, _textWidth);
} }
if (_currentFrame == _movieTexts[0]->_endFrame) { if (_currentFrame == _movieTexts[0]->_endFrame) {
_textMan->releaseText(2); _textMan->releaseText(2, false);
free(_textSpriteBuf); free(_textSpriteBuf);
_textSpriteBuf = NULL; _textSpriteBuf = NULL;
delete _movieTexts.remove_at(0); delete _movieTexts.remove_at(0);
@ -309,10 +309,15 @@ void MoviePlayer::play(void) {
if (terminated) if (terminated)
_snd->stopHandle(_bgSoundHandle); _snd->stopHandle(_bgSoundHandle);
while (!_movieTexts.empty()) { if (_textSpriteBuf) {
delete _movieTexts.remove_at(_movieTexts.size() - 1); _textMan->releaseText(2, false);
free(_textSpriteBuf);
_textSpriteBuf = NULL;
} }
while (!_movieTexts.empty())
delete _movieTexts.remove_at(_movieTexts.size() - 1);
while (_snd->isSoundHandleActive(_bgSoundHandle)) while (_snd->isSoundHandleActive(_bgSoundHandle))
_system->delayMillis(100); _system->delayMillis(100);

View file

@ -89,7 +89,7 @@ void Text::makeTextSprite(uint8 slot, uint8 *text, uint16 maxWidth, uint8 pen) {
assert(!_textBlocks[slot]); // if this triggers, the speechDriver failed to call Text::releaseText. assert(!_textBlocks[slot]); // if this triggers, the speechDriver failed to call Text::releaseText.
_textBlocks[slot] = (FrameHeader*)malloc(sprSize + sizeof(FrameHeader)); _textBlocks[slot] = (FrameHeader*)malloc(sprSize + sizeof(FrameHeader));
memcpy( _textBlocks[slot]->runTimeComp, "Nu ", 4); memcpy(_textBlocks[slot]->runTimeComp, "Nu ", 4);
_textBlocks[slot]->compSize = 0; _textBlocks[slot]->compSize = 0;
_textBlocks[slot]->width = _resMan->toUint16(sprWidth); _textBlocks[slot]->width = _resMan->toUint16(sprWidth);
_textBlocks[slot]->height = _resMan->toUint16(sprHeight); _textBlocks[slot]->height = _resMan->toUint16(sprHeight);
@ -179,13 +179,14 @@ FrameHeader *Text::giveSpriteData(uint32 textTarget) {
return _textBlocks[textTarget]; return _textBlocks[textTarget];
} }
void Text::releaseText(uint32 id) { void Text::releaseText(uint32 id, bool updateCount) {
id &= ITM_ID; id &= ITM_ID;
assert(id < MAX_TEXT_OBS); assert(id < MAX_TEXT_OBS);
if (_textBlocks[id]) { if (_textBlocks[id]) {
free(_textBlocks[id]); free(_textBlocks[id]);
_textBlocks[id] = NULL; _textBlocks[id] = NULL;
_textCount--; if (updateCount)
_textCount--;
} }
} }

View file

@ -52,7 +52,7 @@ public:
FrameHeader *giveSpriteData(uint32 textTarget); FrameHeader *giveSpriteData(uint32 textTarget);
uint32 lowTextManager(uint8 *text, int32 width, uint8 pen); uint32 lowTextManager(uint8 *text, int32 width, uint8 pen);
void makeTextSprite(uint8 slot, uint8 *text, uint16 maxWidth, uint8 pen); void makeTextSprite(uint8 slot, uint8 *text, uint16 maxWidth, uint8 pen);
void releaseText(uint32 id); void releaseText(uint32 id, bool updateCount = true);
private: private:
uint16 analyzeSentence(uint8 *text, uint16 maxWidth, LineInfo *info); uint16 analyzeSentence(uint8 *text, uint16 maxWidth, LineInfo *info);