Bugfixes for correct moving of the screen viewport within an animation

svn-id: r49629
This commit is contained in:
Paul Gilbert 2010-06-13 10:50:54 +00:00
parent 466479eb77
commit 4c6d276ce9
4 changed files with 13 additions and 7 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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();

View File

@ -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};