diff options
author | Filippos Karapetis | 2015-12-09 01:41:51 +0200 |
---|---|---|
committer | Willem Jan Palenstijn | 2015-12-23 21:33:58 +0100 |
commit | f137e1af151e0c3838bd5182022e5293468da03f (patch) | |
tree | 97399a650f5fc2b19e6d779d3a5c133ff93a8115 | |
parent | 23bbd70aac37e36f6863da3326704e10fdcfb1a9 (diff) | |
download | scummvm-rg350-f137e1af151e0c3838bd5182022e5293468da03f.tar.gz scummvm-rg350-f137e1af151e0c3838bd5182022e5293468da03f.tar.bz2 scummvm-rg350-f137e1af151e0c3838bd5182022e5293468da03f.zip |
LAB: Use a local buffer for moving tiles in the tile puzzle
This fixes the crash when a tile is moved
-rw-r--r-- | engines/lab/dispman.cpp | 1 | ||||
-rw-r--r-- | engines/lab/dispman.h | 5 | ||||
-rw-r--r-- | engines/lab/lab.h | 2 | ||||
-rw-r--r-- | engines/lab/tilepuzzle.cpp | 20 | ||||
-rw-r--r-- | engines/lab/transitions.cpp | 8 |
5 files changed, 21 insertions, 15 deletions
diff --git a/engines/lab/dispman.cpp b/engines/lab/dispman.cpp index df42f173ef..199c9e04c8 100644 --- a/engines/lab/dispman.cpp +++ b/engines/lab/dispman.cpp @@ -53,7 +53,6 @@ DisplayMan::DisplayMan(LabEngine *vm) : _vm(vm) { _curBitmap = nullptr; _displayBuffer = nullptr; _currentDisplayBuffer = nullptr; - _tempScrollData = nullptr; FadePalette = nullptr; _screenWidth = 0; diff --git a/engines/lab/dispman.h b/engines/lab/dispman.h index 5ce4923ec4..dbeeefc1c1 100644 --- a/engines/lab/dispman.h +++ b/engines/lab/dispman.h @@ -66,7 +66,6 @@ private: byte _curapen; byte *_curBitmap; byte _curvgapal[256 * 3]; - byte *_tempScrollData; public: DisplayMan(LabEngine *lab); @@ -141,8 +140,8 @@ public: void setPalette(void *cmap, uint16 numcolors); void overlayRect(uint16 pencolor, uint16 x1, uint16 y1, uint16 x2, uint16 y2); byte *getCurrentDrawingBuffer(); - void scrollDisplayX(int16 dx, uint16 x1, uint16 y1, uint16 x2, uint16 y2); - void scrollDisplayY(int16 dy, uint16 x1, uint16 y1, uint16 x2, uint16 y2); + void scrollDisplayX(int16 dx, uint16 x1, uint16 y1, uint16 x2, uint16 y2, byte *buffer); + void scrollDisplayY(int16 dy, uint16 x1, uint16 y1, uint16 x2, uint16 y2, byte *buffer); void fade(bool fadein, uint16 res); void closeFont(TextFont *tf); uint16 textLength(TextFont *tf, const char *text, uint16 numchars); diff --git a/engines/lab/lab.h b/engines/lab/lab.h index a1a5bb0617..ac27c94d93 100644 --- a/engines/lab/lab.h +++ b/engines/lab/lab.h @@ -219,7 +219,7 @@ private: void showTile(const char *filename, bool showsolution); void doTileScroll(uint16 col, uint16 row, uint16 scrolltype); void changeCombination(uint16 number); - void scrollRaster(int16 dx, int16 dy, uint16 x1, uint16 y1, uint16 x2, uint16 y2); + void scrollRaster(int16 dx, int16 dy, uint16 x1, uint16 y1, uint16 x2, uint16 y2, byte *buffer); void doCombination(); void showCombination(const char *filename); void initTilePuzzle(); diff --git a/engines/lab/tilepuzzle.cpp b/engines/lab/tilepuzzle.cpp index db3027765b..652c633c61 100644 --- a/engines/lab/tilepuzzle.cpp +++ b/engines/lab/tilepuzzle.cpp @@ -281,19 +281,23 @@ void LabEngine::doTileScroll(uint16 col, uint16 row, uint16 scrolltype) { uint16 x1 = _utils->vgaScaleX(100) + (col * _utils->vgaScaleX(30)) + dx; uint16 y1 = _utils->vgaScaleY(25) + (row * _utils->vgaScaleY(25)) + dy; + byte *buffer = new byte[_tiles[1]->_width * _tiles[1]->_height * 2L]; + for (uint16 i = 0; i < last; i++) { waitTOF(); - scrollRaster(dX, dY, x1, y1, x1 + _utils->vgaScaleX(28) + sx, y1 + _utils->vgaScaleY(23) + sy); + scrollRaster(dX, dY, x1, y1, x1 + _utils->vgaScaleX(28) + sx, y1 + _utils->vgaScaleY(23) + sy, buffer); x1 += dX; y1 += dY; } + + delete[] buffer; } /** * Changes the combination number of one of the slots */ void LabEngine::changeCombination(uint16 number) { - static const int solution[6] = { 0, 4, 0, 8, 7, 2 }; + const int solution[6] = { 0, 4, 0, 8, 7, 2 }; Image display; uint16 combnum; @@ -310,6 +314,8 @@ void LabEngine::changeCombination(uint16 number) { display._width = _graphics->_screenWidth; display._height = _graphics->_screenHeight; + byte *buffer = new byte[_tiles[1]->_width * _tiles[1]->_height * 2L]; + for (uint16 i = 1; i <= (_numberImages[combnum]->_height / 2); i++) { if (_isHiRes) { if (i & 1) @@ -318,10 +324,12 @@ void LabEngine::changeCombination(uint16 number) { waitTOF(); display._imageData = _graphics->getCurrentDrawingBuffer(); - _graphics->scrollDisplayY(2, _utils->vgaScaleX(COMBINATION_X[number]), _utils->vgaScaleY(65), _utils->vgaScaleX(COMBINATION_X[number]) + (_numberImages[combnum])->_width - 1, _utils->vgaScaleY(65) + (_numberImages[combnum])->_height); + _graphics->scrollDisplayY(2, _utils->vgaScaleX(COMBINATION_X[number]), _utils->vgaScaleY(65), _utils->vgaScaleX(COMBINATION_X[number]) + (_numberImages[combnum])->_width - 1, _utils->vgaScaleY(65) + (_numberImages[combnum])->_height, buffer); _numberImages[combnum]->blitBitmap(0, (_numberImages[combnum])->_height - (2 * i), &(display), _utils->vgaScaleX(COMBINATION_X[number]), _utils->vgaScaleY(65), (_numberImages[combnum])->_width, 2, false); } + delete[] buffer; + for (uint16 i = 0; i < 6; i++) unlocked &= (_combination[i] == solution[i]); @@ -331,12 +339,12 @@ void LabEngine::changeCombination(uint16 number) { _conditions->exclElement(COMBINATIONUNLOCKED); } -void LabEngine::scrollRaster(int16 dx, int16 dy, uint16 x1, uint16 y1, uint16 x2, uint16 y2) { +void LabEngine::scrollRaster(int16 dx, int16 dy, uint16 x1, uint16 y1, uint16 x2, uint16 y2, byte *buffer) { if (dx) - _graphics->scrollDisplayX(dx, x1, y1, x2, y2); + _graphics->scrollDisplayX(dx, x1, y1, x2, y2, buffer); if (dy) - _graphics->scrollDisplayY(dy, x1, y1, x2, y2); + _graphics->scrollDisplayY(dy, x1, y1, x2, y2, buffer); } /** diff --git a/engines/lab/transitions.cpp b/engines/lab/transitions.cpp index b2f07fc60b..7c0b99dc53 100644 --- a/engines/lab/transitions.cpp +++ b/engines/lab/transitions.cpp @@ -387,10 +387,10 @@ void DisplayMan::blackAllScreen() { * The _tempScrollData variable must be initialized to some memory, or this * function will fail. */ -void DisplayMan::scrollDisplayX(int16 dx, uint16 x1, uint16 y1, uint16 x2, uint16 y2) { +void DisplayMan::scrollDisplayX(int16 dx, uint16 x1, uint16 y1, uint16 x2, uint16 y2, byte *buffer) { Image im; - im._imageData = _tempScrollData; + im._imageData = buffer; if (x1 > x2) SWAP<uint16>(x1, x2); @@ -411,10 +411,10 @@ void DisplayMan::scrollDisplayX(int16 dx, uint16 x1, uint16 y1, uint16 x2, uint1 /** * Scrolls the display in the y direction by blitting. */ -void DisplayMan::scrollDisplayY(int16 dy, uint16 x1, uint16 y1, uint16 x2, uint16 y2) { +void DisplayMan::scrollDisplayY(int16 dy, uint16 x1, uint16 y1, uint16 x2, uint16 y2, byte *buffer) { Image im; - im._imageData = _tempScrollData; + im._imageData = buffer; if (x1 > x2) SWAP<uint16>(x1, x2); |