LAB: Implement the scroll buffer of doScrollWipe() and doScrollBounce()

This was left out from previous refactoring. Also, simplify
doScrollBounce()
This commit is contained in:
Filippos Karapetis 2015-12-23 21:29:58 +02:00 committed by Willem Jan Palenstijn
parent c9049f2329
commit 9dae9eb811
3 changed files with 25 additions and 30 deletions

View File

@ -58,10 +58,7 @@ Anim::Anim(LabEngine *vm) : _vm(vm) {
_diffFile = nullptr;
_diffFileStart = 0;
_size = 0;
_rawDiffBM._bytesPerRow = 0;
_rawDiffBM._drawOnScreen = false;
for (int i = 0; i < 16; i++)
_rawDiffBM._planes[i] = nullptr;
_scrollScreenBuffer = nullptr;
_waitForEffect = false;
_stopPlayingEnd = false;
_sampleSpeed = 0;
@ -73,6 +70,11 @@ Anim::Anim(LabEngine *vm) : _vm(vm) {
_diffPalette[i] = 0;
}
Anim::~Anim() {
delete[] _vm->_anim->_scrollScreenBuffer;
_vm->_anim->_scrollScreenBuffer = nullptr;
}
void Anim::diffNextFrame(bool onlyDiffData) {
if (_lastBlockHeader == 65535)
// Already done.
@ -143,9 +145,15 @@ void Anim::diffNextFrame(bool onlyDiffData) {
break;
case 10:
if (onlyDiffData)
warning("Boom");
_diffFile->read(disp->_planes[_curBit], _size);
if (onlyDiffData) {
if (_curBit > 0)
error("diffNextFrame: attempt to read screen to non-zero plane (%d)", _curBit);
delete[] _scrollScreenBuffer;
_scrollScreenBuffer = new byte[_headerdata._width * _headerdata._height];
_diffFile->read(_scrollScreenBuffer, _size);
} else {
_diffFile->read(disp->_planes[_curBit], _size);
}
_curBit++;
break;
@ -325,8 +333,8 @@ void Anim::readDiff(Common::File *diffFile, bool playOnce, bool onlyDiffData) {
assert(_numChunks < 16);
for (int i = 0; i < 8; i++)
_rawDiffBM._planes[i] = nullptr;
delete[] _scrollScreenBuffer;
_scrollScreenBuffer = nullptr;
if (_headerdata._fps)
_delayMicros = 1000 / _headerdata._fps;

View File

@ -74,13 +74,14 @@ private:
public:
Anim(LabEngine *vm);
virtual ~Anim();
DIFFHeader _headerdata;
char _diffPalette[256 * 3];
bool _waitForEffect; // Wait for each sound effect to finish before continuing.
bool _doBlack; // Black the screen before new picture
bool _noPalChange; // Don't change the palette.
BitMap _rawDiffBM;
byte *_scrollScreenBuffer;
/**
* Reads in a DIFF file.

View File

@ -704,7 +704,7 @@ void DisplayMan::doScrollWipe(const Common::String filename) {
readPict(filename, true, true);
setPalette(_vm->_anim->_diffPalette, 256);
byte *mem = _vm->_anim->_rawDiffBM._planes[0];
byte *mem = _vm->_anim->_scrollScreenBuffer;
_vm->updateMusicAndEvents();
uint16 by = _vm->_utils->vgaScaleX(3);
@ -744,42 +744,28 @@ void DisplayMan::doScrollWipe(const Common::String filename) {
}
void DisplayMan::doScrollBounce() {
const uint16 *newby, *newby1;
const uint16 newbyd[5] = {5, 4, 3, 2, 1}, newby1d[8] = {3, 3, 2, 2, 2, 1, 1, 1};
const uint16 newbyw[5] = {10, 8, 6, 4, 2}, newby1w[8] = {6, 6, 4, 4, 4, 2, 2, 2};
if (_vm->getPlatform() != Common::kPlatformWindows) {
newby = newbyd;
newby1 = newby1d;
} else {
newby = newbyw;
newby1 = newby1w;
}
const uint16 offsets[8] = { 3, 3, 2, 2, 2, 1, 1, 1 };
const int multiplier = (_vm->_isHiRes) ? 2 : 1;
_vm->_event->mouseHide();
int width = _vm->_utils->vgaScaleX(320);
int height = _vm->_utils->vgaScaleY(149) + _vm->_utils->svgaCord(2);
byte *mem = _vm->_anim->_rawDiffBM._planes[0];
byte *mem = _vm->_anim->_scrollScreenBuffer;
_vm->updateMusicAndEvents();
int startLine = _vm->_anim->_headerdata._height - height - 1;
for (int i = 0; i < 5; i++) {
_vm->updateMusicAndEvents();
startLine -= newby[i];
startLine -= (5 - i) * multiplier;
copyPage(width, height, 0, startLine, mem);
screenUpdate();
_vm->waitTOF();
}
for (int i = 8; i > 0; i--) {
_vm->updateMusicAndEvents();
startLine += newby1[i - 1];
startLine += offsets[i - 1] * multiplier;
copyPage(width, height, 0, startLine, mem);
screenUpdate();
_vm->waitTOF();
}