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 --- graphics/animation.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++----- graphics/animation.h | 5 +++++ 2 files changed, 55 insertions(+), 5 deletions(-) (limited to 'graphics') 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