aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2010-06-13 10:50:54 +0000
committerPaul Gilbert2010-06-13 10:50:54 +0000
commit4c6d276ce914cafc170732fb7203145c8a763b37 (patch)
tree13b246a31575ae165289681ea40ab188b59d2e02
parent466479eb77dfd04c7116f97f93e2f8013442307b (diff)
downloadscummvm-rg350-4c6d276ce914cafc170732fb7203145c8a763b37.tar.gz
scummvm-rg350-4c6d276ce914cafc170732fb7203145c8a763b37.tar.bz2
scummvm-rg350-4c6d276ce914cafc170732fb7203145c8a763b37.zip
Bugfixes for correct moving of the screen viewport within an animation
svn-id: r49629
-rw-r--r--engines/m4/animation.cpp6
-rw-r--r--engines/m4/mads_scene.cpp1
-rw-r--r--engines/m4/mads_views.cpp11
-rw-r--r--engines/m4/mads_views.h2
4 files changed, 13 insertions, 7 deletions
diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp
index cf2d201b81..9b6d5d1a6f 100644
--- a/engines/m4/animation.cpp
+++ b/engines/m4/animation.cpp
@@ -333,13 +333,15 @@ void MadsAnimation::update() {
// Handle any offset adjustment for sprites as of this frame
if (_view->_posAdjust.x != misc.posAdjust.x) {
- misc.posAdjust.x = _view->_posAdjust.x;
+ _view->_posAdjust.x = misc.posAdjust.x;
screenChanged = true;
}
if (_view->_posAdjust.y != misc.posAdjust.y) {
- misc.posAdjust.y = _view->_posAdjust.y;
+ _view->_posAdjust.y = misc.posAdjust.y;
screenChanged = true;
}
+
+
if (screenChanged) {
// Signal the entire screen needs refreshing
_view->_spriteSlots.fullRefresh();
diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp
index f98684de6a..d910340930 100644
--- a/engines/m4/mads_scene.cpp
+++ b/engines/m4/mads_scene.cpp
@@ -655,7 +655,6 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su
drawStyle = stream->readUint16LE();
width = stream->readUint16LE();
height = stream->readUint16LE();
- assert((width == 320) && (height == 156));
stream->skip(24);
diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp
index 98b04e9f2d..178fd90fd3 100644
--- a/engines/m4/mads_views.cpp
+++ b/engines/m4/mads_views.cpp
@@ -855,10 +855,15 @@ void MadsDirtyAreas::mergeAreas(int idx1, int idx2) {
da1.textActive = true;
}
-void MadsDirtyAreas::copy(M4Surface *dest, M4Surface *src, int yOffset) {
+void MadsDirtyAreas::copy(M4Surface *dest, M4Surface *src, int yOffset, const Common::Point &posAdjust) {
for (uint i = 0; i < _entries.size(); ++i) {
+ const Common::Rect &srcBounds = _entries[i].bounds;
+
+ Common::Rect bounds(srcBounds.left + posAdjust.x, srcBounds.top + posAdjust.y,
+ srcBounds.right + posAdjust.x, srcBounds.bottom + posAdjust.y);
+
if (_entries[i].active && _entries[i].bounds.isValidRect())
- src->copyTo(dest, _entries[i].bounds, _entries[i].bounds.left, _entries[i].bounds.top + yOffset);
+ src->copyTo(dest, bounds, _entries[i].bounds.left, _entries[i].bounds.top + yOffset);
}
}
@@ -1202,7 +1207,7 @@ void MadsView::refresh() {
_dirtyAreas.merge(1, DIRTY_AREAS_SIZE);
// Copy dirty areas to the main display surface
- _dirtyAreas.copy(_view, _bgSurface, _yOffset);
+ _dirtyAreas.copy(_view, _bgSurface, _yOffset, _posAdjust);
// Handle dirty areas for foreground objects
_spriteSlots.setDirtyAreas();
diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h
index c0f3790a23..f0ded634b1 100644
--- a/engines/m4/mads_views.h
+++ b/engines/m4/mads_views.h
@@ -289,7 +289,7 @@ public:
void merge(int startIndex, int count);
bool intersects(int idx1, int idx2);
void mergeAreas(int idx1, int idx2);
- void copy(M4Surface *dest, M4Surface *src, int yOffset);
+ void copy(M4Surface *dest, M4Surface *src, int yOffset, const Common::Point &posAdjust);
};
enum SpriteAnimType {ANIMTYPE_CYCLED = 1, ANIMTYPE_REVERSIBLE = 2};