aboutsummaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
authorsluicebox2019-11-20 10:50:37 -0800
committersluicebox2019-11-20 11:13:03 -0800
commitbe0304d9d618a48acaeff3ef8ecb2f73a510e926 (patch)
tree57971d23b2a61b9f480059043187bdf474d2be16 /backends
parent0d56515a7095d2ea4390926a5c235eeb1ec17407 (diff)
downloadscummvm-rg350-be0304d9d618a48acaeff3ef8ecb2f73a510e926.tar.gz
scummvm-rg350-be0304d9d618a48acaeff3ef8ecb2f73a510e926.tar.bz2
scummvm-rg350-be0304d9d618a48acaeff3ef8ecb2f73a510e926.zip
GPH: Implement horizontal shake
Diffstat (limited to 'backends')
-rw-r--r--backends/graphics/gph/gph-graphics.cpp32
1 files changed, 26 insertions, 6 deletions
diff --git a/backends/graphics/gph/gph-graphics.cpp b/backends/graphics/gph/gph-graphics.cpp
index 1a81cf142c..cc8ef38f98 100644
--- a/backends/graphics/gph/gph-graphics.cpp
+++ b/backends/graphics/gph/gph-graphics.cpp
@@ -167,6 +167,7 @@ void GPHGraphicsManager::drawMouse() {
// scaling, shake position and aspect ratio correction manually.
if (!_overlayVisible) {
+ dst.x += _currentShakeXOffset;
dst.y += _currentShakeYOffset;
}
@@ -219,6 +220,19 @@ void GPHGraphicsManager::internUpdateScreen() {
#endif
// If the shake position changed, fill the dirty area with blackness
+ if (_currentShakeXOffset != _gameScreenShakeXOffset ||
+ (_cursorNeedsRedraw && _mouseBackup.x <= _currentShakeXOffset)) {
+ SDL_Rect blackrect = {0, 0, (Uint16)(_gameScreenShakeXOffset * _videoMode.scaleFactor), (Uint16)(_videoMode.screenHeight * _videoMode.scaleFactor)};
+
+ if (_videoMode.aspectRatioCorrection && !_overlayVisible)
+ blackrect.h = real2Aspect(blackrect.h - 1) + 1;
+
+ SDL_FillRect(_hwScreen, &blackrect, 0);
+
+ _currentShakeXOffset = _gameScreenShakeXOffset;
+
+ _forceRedraw = true;
+ }
if (_currentShakeYOffset != _gameScreenShakeYOffset ||
(_cursorNeedsRedraw && _mouseBackup.y <= _currentShakeYOffset)) {
SDL_Rect blackrect = {0, 0, (Uint16)(_videoMode.screenWidth * _videoMode.scaleFactor), (Uint16)(_gameScreenShakeYOffset * _videoMode.scaleFactor)};
@@ -308,13 +322,17 @@ void GPHGraphicsManager::internUpdateScreen() {
for (r = _dirtyRectList; r != lastRect; ++r) {
int dst_y = r->y + _currentShakeYOffset;
int dst_h = 0;
- int dst_w = r->w;
+ int dst_w = 0;
int orig_dst_y = 0;
- int dst_x = r->x;
+ int dst_x = r->x + _currentShakeXOffset;
int src_y;
int src_x;
- if (dst_y < height) {
+ if (dst_x < width && dst_y < height) {
+ dst_w = r->w;
+ if (dst_w > width - dst_x)
+ dst_w = width - dst_x;
+
dst_h = r->h;
if (dst_h > height - dst_y)
dst_h = height - dst_y;
@@ -346,15 +364,15 @@ void GPHGraphicsManager::internUpdateScreen() {
(byte *)_hwScreen->pixels + dst_x * 2 + dst_y * dstPitch, dstPitch, dst_w, dst_h);
} else {
scalerProc((byte *)srcSurf->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch,
- (byte *)_hwScreen->pixels + r->x * 2 + dst_y * dstPitch, dstPitch, r->w, dst_h);
+ (byte *)_hwScreen->pixels + dst_x * 2 + dst_y * dstPitch, dstPitch, dst_w, dst_h);
}
}
if (_videoMode.mode == GFX_HALF && scalerProc == DownscaleAllByHalf) {
- r->w = r->w / 2;
+ r->w = dst_w / 2;
r->h = dst_h / 2;
} else {
- r->w = r->w;
+ r->w = dst_w;
r->h = dst_h;
}
@@ -373,7 +391,9 @@ void GPHGraphicsManager::internUpdateScreen() {
// Readjust the dirty rect list in case we are doing a full update.
// This is necessary if shaking is active.
if (_forceRedraw) {
+ _dirtyRectList[0].x = 0;
_dirtyRectList[0].y = 0;
+ _dirtyRectList[0].w = (_videoMode.mode == GFX_HALF) ? _videoMode.hardwareWidth / 2 : _videoMode.hardwareWidth;
_dirtyRectList[0].h = (_videoMode.mode == GFX_HALF) ? _videoMode.hardwareHeight / 2 : _videoMode.hardwareHeight;
}