aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippos Karapetis2015-12-09 01:41:51 +0200
committerWillem Jan Palenstijn2015-12-23 21:33:58 +0100
commitf137e1af151e0c3838bd5182022e5293468da03f (patch)
tree97399a650f5fc2b19e6d779d3a5c133ff93a8115
parent23bbd70aac37e36f6863da3326704e10fdcfb1a9 (diff)
downloadscummvm-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.cpp1
-rw-r--r--engines/lab/dispman.h5
-rw-r--r--engines/lab/lab.h2
-rw-r--r--engines/lab/tilepuzzle.cpp20
-rw-r--r--engines/lab/transitions.cpp8
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);