aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sword2/animation.cpp71
-rw-r--r--engines/sword2/animation.h18
2 files changed, 37 insertions, 52 deletions
diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp
index 44eb8dd813..0097d008c1 100644
--- a/engines/sword2/animation.cpp
+++ b/engines/sword2/animation.cpp
@@ -143,9 +143,8 @@ void MoviePlayer::restorePalette() {
_vm->_screen->setPalette(0, 256, _originalPalette, RDPAL_INSTANT);
}
-void MoviePlayer::clearScreen() {
- _vm->_screen->clearScene();
- _system->copyRectToScreen(_vm->_screen->getScreen(), _vm->_screen->getScreenWide(), 0, 0, _vm->_screen->getScreenWide(), _vm->_screen->getScreenDeep());
+void MoviePlayer::clearFrame() {
+ memset(_frameBuffer, 0, _vm->_screen->getScreenWide() * _vm->_screen->getScreenDeep());
}
void MoviePlayer::updateScreen() {
@@ -176,7 +175,14 @@ bool MoviePlayer::checkSkipFrame() {
return true;
}
-void MoviePlayer::waitForFrame() {
+void MoviePlayer::syncFrame() {
+ _ticks += 83;
+
+ if (checkSkipFrame()) {
+ warning("Skipped frame %d", _currentFrame);
+ return;
+ }
+
if (_bgSoundStream) {
while (_mixer->isSoundHandleActive(_bgSoundHandle) && (_mixer->getSoundElapsedTime(_bgSoundHandle) * 12) / 1000 < _currentFrame) {
_system->delayMillis(10);
@@ -195,19 +201,9 @@ void MoviePlayer::waitForFrame() {
}
void MoviePlayer::drawFrame() {
- _ticks += 83;
-
- if (checkSkipFrame()) {
- warning("Skipped frame %d", _currentFrame);
- return;
- }
-
- waitForFrame();
-
int screenWidth = _vm->_screen->getScreenWide();
_system->copyRectToScreen(_frameBuffer + _frameY * screenWidth + _frameX, screenWidth, _frameX, _frameY, _frameWidth, _frameHeight);
- _vm->_screen->setNeedFullRedraw();
}
void MoviePlayer::openTextObject(MovieTextObject *t) {
@@ -360,6 +356,7 @@ void MoviePlayer::play(int32 leadIn, int32 leadOut) {
_vm->_sound->playFx(&leadOutHandle, data, len, Audio::Mixer::kMaxChannelVolume, 0, false, Audio::Mixer::kMusicSoundType);
}
+ syncFrame();
drawFrame();
updateScreen();
@@ -388,7 +385,7 @@ void MoviePlayer::play(int32 leadIn, int32 leadOut) {
// Most cutscenes fade to black on their own, but not all of
// them. I think it looks better if they do.
- clearScreen();
+ clearFrame();
// If the sound is still playing, draw the subtitles one final
// time. This happens in the "carib" cutscene.
@@ -397,6 +394,7 @@ void MoviePlayer::play(int32 leadIn, int32 leadOut) {
drawTextObject(_textList[_currentText]);
}
+ drawFrame();
updateScreen();
}
@@ -406,16 +404,12 @@ void MoviePlayer::play(int32 leadIn, int32 leadOut) {
}
if (!terminate) {
- // Wait for the voice to stop playing. This is to make sure
- // that we don't cut off the speech in mid-sentence, and - even
- // more importantly - that we don't free the sound buffer while
- // it's still in use.
+ // Wait for the voice and sound track to stop playing. This is
+ // to make sure that we don't cut off the speech in
+ // mid-sentence, and - even more importantly - that we don't
+ // free the sound buffer while it's still in use.
- while (_mixer->isSoundHandleActive(_speechHandle)) {
- _system->delayMillis(100);
- }
-
- while (_mixer->isSoundHandleActive(_bgSoundHandle)) {
+ while (_mixer->isSoundHandleActive(_speechHandle) || _mixer->isSoundHandleActive(_bgSoundHandle)) {
_system->delayMillis(100);
}
} else {
@@ -424,7 +418,8 @@ void MoviePlayer::play(int32 leadIn, int32 leadOut) {
}
if (!_seamless) {
- clearScreen();
+ clearFrame();
+ drawFrame();
updateScreen();
}
@@ -525,13 +520,6 @@ bool MoviePlayerMPEG::load(const char *name, MovieTextObject *text[]) {
return true;
}
-bool MoviePlayerMPEG::checkSkipFrame() {
- return false;
-}
-
-void MoviePlayerMPEG::waitForFrame() {
-}
-
bool MoviePlayerMPEG::decodeFrame() {
bool result = _anim->decodeFrame();
@@ -546,6 +534,9 @@ bool MoviePlayerMPEG::decodeFrame() {
return result;
}
+void MoviePlayerMPEG::syncFrame() {
+}
+
AnimationState::AnimationState(Sword2Engine *vm, MoviePlayer *player)
: BaseAnimationState(vm->_mixer, vm->_system, 640, 480) {
_vm = vm;
@@ -567,8 +558,8 @@ void MoviePlayerMPEG::handleScreenChanged() {
_anim->handleScreenChanged();
}
-void MoviePlayerMPEG::clearScreen() {
- _anim->clearScreen();
+void MoviePlayerMPEG::clearFrame() {
+ _anim->clearFrame();
}
void MoviePlayerMPEG::drawFrame() {
@@ -635,7 +626,7 @@ void AnimationState::drawTextObject(SpriteInfo *s, byte *src) {
}
#endif
-void AnimationState::clearScreen() {
+void AnimationState::clearFrame() {
#ifdef BACKEND_8BIT
memset(_vm->_screen->getScreen(), 0, _movieWidth * _movieHeight);
#else
@@ -768,22 +759,16 @@ bool MoviePlayerDummy::decodeFrame() {
return true;
}
-bool MoviePlayerDummy::checkSkipFrame() {
- return false;
-}
-
-void MoviePlayerDummy::waitForFrame() {
+void MoviePlayerDummy::syncFrame() {
if (!_textList || _currentFrame < _textList[0]->startFrame) {
_ticks = _system->getMillis();
return;
}
- MoviePlayer::waitForFrame();
+ MoviePlayer::syncFrame();
}
void MoviePlayerDummy::drawFrame() {
- _ticks += 83;
- waitForFrame();
}
void MoviePlayerDummy::drawTextObject(MovieTextObject *t) {
diff --git a/engines/sword2/animation.h b/engines/sword2/animation.h
index 6e95a5a4d4..57393c6521 100644
--- a/engines/sword2/animation.h
+++ b/engines/sword2/animation.h
@@ -49,6 +49,9 @@ struct MovieInfo {
};
class MoviePlayer {
+private:
+ bool checkSkipFrame();
+
protected:
Sword2Engine *_vm;
Audio::Mixer *_mixer;
@@ -91,11 +94,10 @@ protected:
virtual void handleScreenChanged() {}
- virtual void clearScreen();
+ virtual void clearFrame();
virtual void updateScreen();
virtual bool decodeFrame() = 0;
- virtual bool checkSkipFrame();
- virtual void waitForFrame();
+ virtual void syncFrame();
virtual void drawFrame();
virtual void drawTextObject(MovieTextObject *t);
virtual void undrawTextObject(MovieTextObject *t);
@@ -112,8 +114,7 @@ public:
class MoviePlayerDummy : public MoviePlayer {
protected:
virtual bool decodeFrame();
- virtual bool checkSkipFrame();
- virtual void waitForFrame();
+ virtual void syncFrame();
virtual void drawFrame();
virtual void drawTextObject(MovieTextObject *t);
virtual void undrawTextObject(MovieTextObject *t);
@@ -139,7 +140,7 @@ public:
void drawTextObject(SpriteInfo *s, byte *src);
#endif
- void clearScreen();
+ void clearFrame();
private:
void drawYUV(int width, int height, byte *const *dat);
@@ -153,13 +154,12 @@ class MoviePlayerMPEG : public MoviePlayer {
protected:
AnimationState *_anim;
- virtual bool checkSkipFrame();
- virtual void waitForFrame();
virtual bool decodeFrame();
+ virtual void syncFrame();
#ifndef BACKEND_8BIT
virtual void handleScreenChanged();
- virtual void clearScreen();
+ virtual void clearFrame();
virtual void drawFrame();
virtual void updateScreen();
virtual void drawTextObject(MovieTextObject *t);