aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorbjörn Andersson2006-05-18 13:18:02 +0000
committerTorbjörn Andersson2006-05-18 13:18:02 +0000
commit5c1f91eed42aab58f022ca82066c91e5a672131c (patch)
tree9af4ffe72d4549432d0847db1237837632bc1ea8
parentc65d45146cf6ccaea20218c030b3a11dbcfd1f02 (diff)
downloadscummvm-rg350-5c1f91eed42aab58f022ca82066c91e5a672131c.tar.gz
scummvm-rg350-5c1f91eed42aab58f022ca82066c91e5a672131c.tar.bz2
scummvm-rg350-5c1f91eed42aab58f022ca82066c91e5a672131c.zip
Allow changing scaler while playing MPEG cutscenes.
svn-id: r22515
-rw-r--r--engines/sword1/animation.cpp17
-rw-r--r--engines/sword1/animation.h4
-rw-r--r--engines/sword2/animation.cpp27
-rw-r--r--engines/sword2/animation.h4
-rw-r--r--graphics/animation.cpp55
-rw-r--r--graphics/animation.h5
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();