From 5c1f91eed42aab58f022ca82066c91e5a672131c Mon Sep 17 00:00:00 2001 From: Torbjörn Andersson Date: Thu, 18 May 2006 13:18:02 +0000 Subject: Allow changing scaler while playing MPEG cutscenes. svn-id: r22515 --- engines/sword1/animation.cpp | 17 +------------- engines/sword1/animation.h | 4 ---- engines/sword2/animation.cpp | 27 +--------------------- engines/sword2/animation.h | 4 ---- graphics/animation.cpp | 55 ++++++++++++++++++++++++++++++++++++++++---- graphics/animation.h | 5 ++++ 6 files changed, 57 insertions(+), 55 deletions(-) diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index 9d0fbb7788..1697590e17 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -58,19 +58,6 @@ void AnimationState::drawYUV(int width, int height, byte *const *dat) { #endif } -void AnimationState::updateScreen(void) { -#ifndef BACKEND_8BIT - int width = _movieScale * _frameWidth; - int height = _movieScale * _frameHeight; - int pitch = _movieScale * _movieWidth; - int x = _movieScale * ((_movieWidth - _frameWidth) / 2); - int y = _movieScale * ((_movieHeight - _frameHeight) / 2); - - _sys->copyRectToOverlay(_overlay + y * pitch + x, pitch, x, y + _movieScale * 40, width, height); -#endif - _sys->updateScreen(); -} - OverlayColor *AnimationState::giveRgbBuffer(void) { #ifdef BACKEND_8BIT return NULL; @@ -153,11 +140,9 @@ void MoviePlayer::play(uint32 id) { OSystem::Event event; while (_sys->pollEvent(event)) { switch (event.type) { -#ifndef BACKEND_8BIT case OSystem::EVENT_SCREEN_CHANGED: - anim->buildLookup(); + anim->screenChanged(); break; -#endif case OSystem::EVENT_KEYDOWN: if (event.kbd.keycode == 27) { delete anim; diff --git a/engines/sword1/animation.h b/engines/sword1/animation.h index 6e1fa11c3d..f49245153b 100644 --- a/engines/sword1/animation.h +++ b/engines/sword1/animation.h @@ -61,13 +61,9 @@ class AnimationState : public Graphics::BaseAnimationState { private: Screen *_scr; - int _frameWidth; - int _frameHeight; - public: AnimationState(Screen *scr, Audio::Mixer *snd, OSystem *sys); ~AnimationState(); - void updateScreen(); OverlayColor *giveRgbBuffer(void); bool soundFinished(); diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index e8d17e88b0..b1ad009a86 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -114,29 +114,6 @@ void AnimationState::clearScreen() { #endif } -void AnimationState::updateScreen() { - int x, y; - - x = (_movieWidth - _frameWidth) / 2; - y = (_movieHeight - _frameHeight) / 2; - -#ifdef BACKEND_8BIT - byte *buf = _vm->_screen->getScreen() + y * RENDERWIDE + x; - - _vm->_system->copyRectToScreen(buf, _movieWidth, (640 - _movieWidth) / 2, (480 - _movieHeight) / 2, _movieWidth, _movieHeight); -#else - int width = _movieScale * _frameWidth; - int height = _movieScale * _frameHeight; - int pitch = _movieScale * _movieWidth; - - x *= _movieScale; - y *= _movieScale; - - _sys->copyRectToOverlay(_overlay + y * pitch + x, pitch, x, y, width, height); -#endif - _vm->_system->updateScreen(); -} - void AnimationState::drawYUV(int width, int height, byte *const *dat) { _frameWidth = width; _frameHeight = height; @@ -350,11 +327,9 @@ void MoviePlayer::playMPEG(const char *filename, MovieTextObject *text[], byte * OSystem::Event event; while (_sys->pollEvent(event)) { switch (event.type) { -#ifndef BACKEND_8BIT case OSystem::EVENT_SCREEN_CHANGED: - anim->buildLookup(); + anim->screenChanged(); break; -#endif case OSystem::EVENT_KEYDOWN: if (event.kbd.keycode == 27) skipCutscene = true; diff --git a/engines/sword2/animation.h b/engines/sword2/animation.h index 960721b8a1..32598c013d 100644 --- a/engines/sword2/animation.h +++ b/engines/sword2/animation.h @@ -45,9 +45,6 @@ class AnimationState : public ::Graphics::BaseAnimationState { private: Sword2Engine *_vm; - int _frameWidth; - int _frameHeight; - public: AnimationState(Sword2Engine *vm); ~AnimationState(); @@ -57,7 +54,6 @@ public: #endif void clearScreen(); - void updateScreen(); private: void drawYUV(int width, int height, byte *const *dat); diff --git a/graphics/animation.cpp b/graphics/animation.cpp index 731fe595e7..dcf39609f4 100644 --- a/graphics/animation.cpp +++ b/graphics/animation.cpp @@ -39,7 +39,7 @@ BaseAnimationState::BaseAnimationState(Audio::Mixer *snd, OSystem *sys, int widt _movieScale = MIN(screenW / _movieWidth, screenH / _movieHeight); - assert (_movieScale >= 1); + assert(_movieScale >= 1); if (_movieScale > 3) _movieScale = 3; @@ -125,7 +125,7 @@ bool BaseAnimationState::init(const char *name, void *audioArg) { _lutCalcNum = (BITDEPTH + _palettes[_palNum].end + 2) / (_palettes[_palNum].end + 2); #else buildLookup(); - _overlay = (OverlayColor*)calloc(_movieScale * _movieWidth * _movieScale * _movieHeight, sizeof(OverlayColor)); + _overlay = (OverlayColor *)calloc(_movieScale * _movieWidth * _movieScale * _movieHeight, sizeof(OverlayColor)); _sys->showOverlay(); #endif @@ -255,6 +255,34 @@ bool BaseAnimationState::checkPaletteSwitch() { return false; } +void BaseAnimationState::screenChanged() { +#ifndef BACKEND_8BIT + const int screenW = _sys->getOverlayWidth(); + const int screenH = _sys->getOverlayHeight(); + + int newScale = MIN(screenW / _movieWidth, screenH / _movieHeight); + + assert(newScale >= 1); + if (newScale > 3) + newScale = 3; + + if (newScale != _movieScale) { + // HACK: Since frames generally do not cover the entire screen, + // We need to undraw the old frame. This is a very hacky + // way of doing that. + OverlayColor *buf = (OverlayColor *)calloc(screenW * screenH, sizeof(OverlayColor)); + _sys->copyRectToOverlay(buf, screenW, 0, 0, screenW, screenH); + free(buf); + + free(_overlay); + _movieScale = newScale; + _overlay = (OverlayColor *)calloc(_movieScale * _movieWidth * _movieScale * _movieHeight, sizeof(OverlayColor)); + } + + buildLookup(); +#endif +} + #ifdef BACKEND_8BIT /** @@ -445,7 +473,7 @@ void BaseAnimationState::plotYUV(int width, int height, byte *const *dat) { } void BaseAnimationState::plotYUV1x(int width, int height, byte *const *dat) { - OverlayColor *ptr = _overlay + _movieWidth * (_movieHeight - height) / 2 + (_movieWidth - width) / 2; + OverlayColor *ptr = _overlay; byte *lum = dat[0]; byte *cr = dat[2]; @@ -498,7 +526,7 @@ void BaseAnimationState::plotYUV1x(int width, int height, byte *const *dat) { } void BaseAnimationState::plotYUV2x(int width, int height, byte *const *dat) { - OverlayColor *ptr = _overlay + 2 * _movieWidth * (_movieHeight - height) + _movieWidth - width; + OverlayColor *ptr = _overlay; byte *lum = dat[0]; byte *cr = dat[2]; @@ -563,7 +591,7 @@ void BaseAnimationState::plotYUV2x(int width, int height, byte *const *dat) { } void BaseAnimationState::plotYUV3x(int width, int height, byte *const *dat) { - OverlayColor *ptr = _overlay + (3 * (_movieHeight - height) / 2) * 3 * _movieWidth + 3 * (_movieWidth - width ) / 2; + OverlayColor *ptr = _overlay; byte *lum = dat[0]; byte *cr = dat[2]; @@ -633,6 +661,23 @@ void BaseAnimationState::plotYUV3x(int width, int height, byte *const *dat) { } } +void BaseAnimationState::updateScreen() { +#ifndef BACKEND_8BIT + int width = _movieScale * _frameWidth; + int height = _movieScale * _frameHeight; + int pitch = _movieScale * _movieWidth; + + const int screenW = _sys->getOverlayWidth(); + const int screenH = _sys->getOverlayHeight(); + + int x = (screenW - _movieScale * _frameWidth) / 2; + int y = (screenH - _movieScale * _frameHeight) / 2; + + _sys->copyRectToOverlay(_overlay, pitch, x, y, width, height); +#endif + _sys->updateScreen(); +} + #endif } // End of namespace Graphics diff --git a/graphics/animation.h b/graphics/animation.h index 42c1c899f3..aa36369974 100644 --- a/graphics/animation.h +++ b/graphics/animation.h @@ -78,6 +78,9 @@ protected: const int _movieWidth; const int _movieHeight; + int _frameWidth; + int _frameHeight; + #ifndef BACKEND_8BIT int _movieScale; #endif @@ -130,6 +133,8 @@ public: bool init(const char *name, void *audioArg = NULL); bool decodeFrame(); + void screenChanged(); + void updateScreen(); #ifndef BACKEND_8BIT void buildLookup(); -- cgit v1.2.3