Skip to content

Commit

Permalink
ZVISION: Fix rlf backward seek and rename class field
Browse files Browse the repository at this point in the history
  • Loading branch information
Marisa-Chan committed Nov 12, 2014
1 parent be5860b commit d0f2e20
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 20 deletions.
45 changes: 27 additions & 18 deletions engines/zvision/animation/rlf_animation.cpp
Expand Up @@ -44,7 +44,7 @@ RlfAnimation::RlfAnimation(const Common::String &fileName, bool stream)
_height(0),
_frameTime(0),
_frames(0),
_currentFrame(0),
_nextFrame(0),
_frameBufferByteSize(0) {

Common::File *_file = new Common::File;
Expand Down Expand Up @@ -82,7 +82,7 @@ RlfAnimation::RlfAnimation(Common::SeekableReadStream *rstream, bool stream)
_height(0),
_frameTime(0),
_frames(0),
_currentFrame(0),
_nextFrame(0),
_frameBufferByteSize(0) {

if (!readHeader()) {
Expand Down Expand Up @@ -193,31 +193,40 @@ void RlfAnimation::seekToFrame(int frameNumber) {
assert(!_stream);
assert(frameNumber < (int)_frameCount || frameNumber >= -1);

if (_currentFrame == frameNumber)
if (_nextFrame == frameNumber)
return;

if (frameNumber < 0) {
_currentFrame = 0;
_nextFrame = 0;
return;
}

int closestFrame = _currentFrame;
int distance = (int)frameNumber - _currentFrame;
for (uint i = 0; i < _completeFrames.size(); ++i) {
int newDistance = (int)frameNumber - (int)(_completeFrames[i]);
if (newDistance < 0)
break;
if (newDistance > 0 && newDistance < distance) {
int closestFrame = _nextFrame;
int distance = (int)frameNumber - _nextFrame;

if (distance < 0) {
for (uint i = 0; i < _completeFrames.size(); ++i) {
if ((int)_completeFrames[i] > frameNumber)
break;
closestFrame = _completeFrames[i];
distance = newDistance;
}
} else {
for (uint i = 0; i < _completeFrames.size(); ++i) {
int newDistance = (int)frameNumber - (int)(_completeFrames[i]);
if (newDistance < 0)
break;
if (newDistance < distance) {
closestFrame = _completeFrames[i];
distance = newDistance;
}
}
}

for (int i = closestFrame; i < frameNumber; ++i) {
applyFrameToCurrent(i);
}

_currentFrame = frameNumber;
_nextFrame = frameNumber;
}

const Graphics::Surface *RlfAnimation::getFrameData(uint frameNumber) {
Expand All @@ -226,9 +235,9 @@ const Graphics::Surface *RlfAnimation::getFrameData(uint frameNumber) {

// Since this method is so expensive, first check to see if we can use
// decodeNextFrame() it's cheap.
if ((int)frameNumber == _currentFrame - 1) {
if ((int)frameNumber == _nextFrame - 1) {
return &_currentFrameBuffer;
} else if (_currentFrame == (int)frameNumber) {
} else if (_nextFrame == (int)frameNumber) {
return decodeNextFrame();
}

Expand All @@ -237,15 +246,15 @@ const Graphics::Surface *RlfAnimation::getFrameData(uint frameNumber) {
}

const Graphics::Surface *RlfAnimation::decodeNextFrame() {
assert(_currentFrame < (int)_frameCount);
assert(_nextFrame < (int)_frameCount);

if (_stream) {
applyFrameToCurrent(readNextFrame());
} else {
applyFrameToCurrent(_currentFrame);
applyFrameToCurrent(_nextFrame);
}

_currentFrame++;
_nextFrame++;
return &_currentFrameBuffer;
}

Expand Down
4 changes: 2 additions & 2 deletions engines/zvision/animation/rlf_animation.h
Expand Up @@ -64,7 +64,7 @@ class RlfAnimation {
Frame *_frames;
Common::Array<uint> _completeFrames;

int _currentFrame;
int _nextFrame;
Graphics::Surface _currentFrameBuffer;
uint32 _frameBufferByteSize;

Expand Down Expand Up @@ -113,7 +113,7 @@ class RlfAnimation {
* @return Is the currentFrame is the last frame in the animation?
*/
bool endOfAnimation() {
return _currentFrame == (int)_frameCount;
return _nextFrame == (int)_frameCount;
}

private:
Expand Down

0 comments on commit d0f2e20

Please sign in to comment.