Fixed crash after using cutscene subtitles. (Now I *know* no one has used that
feature before. :-) svn-id: r34796
This commit is contained in:
parent
ffdbb474c4
commit
c2066b9c20
3 changed files with 13 additions and 7 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue