aboutsummaryrefslogtreecommitdiff
path: root/graphics
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 /graphics
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
Diffstat (limited to 'graphics')
-rw-r--r--graphics/animation.cpp55
-rw-r--r--graphics/animation.h5
2 files changed, 55 insertions, 5 deletions
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();