mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-05 09:49:14 +00:00
LAB: Implement the scroll buffer of doScrollWipe() and doScrollBounce()
This was left out from previous refactoring. Also, simplify doScrollBounce()
This commit is contained in:
parent
c9049f2329
commit
9dae9eb811
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user