aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/gob/draw.cpp3
-rw-r--r--engines/gob/draw.h2
-rw-r--r--engines/gob/draw_v2.cpp4
-rw-r--r--engines/gob/inter.h1
-rw-r--r--engines/gob/inter_v7.cpp133
5 files changed, 84 insertions, 59 deletions
diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp
index 545c790fb8..fe59b11f76 100644
--- a/engines/gob/draw.cpp
+++ b/engines/gob/draw.cpp
@@ -117,6 +117,8 @@ Draw::Draw(GobEngine *vm) : _vm(vm) {
_cursorAnimDelays[i] = 0;
}
+ _cursorCount = 0;
+ _doCursorPalettes = 0;
_cursorPalettes = 0;
_cursorKeyColors = 0;
_cursorPaletteStarts = 0;
@@ -142,6 +144,7 @@ Draw::Draw(GobEngine *vm) : _vm(vm) {
Draw::~Draw() {
delete[] _cursorPalettes;
+ delete[] _doCursorPalettes;
delete[] _cursorKeyColors;
delete[] _cursorPaletteStarts;
delete[] _cursorPaletteCounts;
diff --git a/engines/gob/draw.h b/engines/gob/draw.h
index 2d2c7fd0e7..24c5550ea5 100644
--- a/engines/gob/draw.h
+++ b/engines/gob/draw.h
@@ -145,6 +145,8 @@ public:
int8 _cursorAnimHigh[40];
int8 _cursorAnimDelays[40];
+ int32 _cursorCount;
+ bool *_doCursorPalettes;
byte *_cursorPalettes;
byte *_cursorKeyColors;
uint16 *_cursorPaletteStarts;
diff --git a/engines/gob/draw_v2.cpp b/engines/gob/draw_v2.cpp
index cf82df9c71..ab9a90de8f 100644
--- a/engines/gob/draw_v2.cpp
+++ b/engines/gob/draw_v2.cpp
@@ -157,13 +157,13 @@ void Draw_v2::animateCursor(int16 cursor) {
_cursorHeight - 1, 0, 0);
uint32 keyColor = 0;
- if (_cursorKeyColors)
+ if (_doCursorPalettes && _cursorKeyColors && _doCursorPalettes[cursorIndex])
keyColor = _cursorKeyColors[cursorIndex];
CursorMan.replaceCursor(_scummvmCursor->getData(),
_cursorWidth, _cursorHeight, hotspotX, hotspotY, keyColor, 1, &_vm->getPixelFormat());
- if (_cursorPalettes) {
+ if (_doCursorPalettes && _doCursorPalettes[cursorIndex]) {
CursorMan.replaceCursorPalette(_cursorPalettes + (cursorIndex * 256 * 3),
_cursorPaletteStarts[cursorIndex], _cursorPaletteCounts[cursorIndex]);
CursorMan.disableCursorPalette(false);
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index ded016543e..1e6f74db4e 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -693,6 +693,7 @@ private:
Common::String findFile(const Common::String &mask);
bool loadCursorFile();
+ void resizeCursors(int16 width, int16 height, int16 count, bool transparency);
};
} // End of namespace Gob
diff --git a/engines/gob/inter_v7.cpp b/engines/gob/inter_v7.cpp
index 71e4ac07ad..6cf69ed9df 100644
--- a/engines/gob/inter_v7.cpp
+++ b/engines/gob/inter_v7.cpp
@@ -93,6 +93,70 @@ void Inter_v7::o7_draw0x0C() {
WRITE_VAR(17, 0);
}
+void Inter_v7::resizeCursors(int16 width, int16 height, int16 count, bool transparency) {
+ if (width <= 0)
+ width = _vm->_draw->_cursorWidth;
+ if (height <= 0)
+ height = _vm->_draw->_cursorHeight;
+
+ width = MAX<uint16>(width , _vm->_draw->_cursorWidth);
+ height = MAX<uint16>(height, _vm->_draw->_cursorHeight);
+
+ _vm->_draw->_transparentCursor = transparency;
+
+ // Cursors sprite already big enough
+ if ((_vm->_draw->_cursorWidth >= width) && (_vm->_draw->_cursorHeight >= height) &&
+ (_vm->_draw->_cursorCount >= count))
+ return;
+
+ _vm->_draw->_cursorCount = count;
+ _vm->_draw->_cursorWidth = width;
+ _vm->_draw->_cursorHeight = height;
+
+ _vm->_draw->freeSprite(Draw::kCursorSurface);
+ _vm->_draw->_cursorSprites.reset();
+ _vm->_draw->_cursorSpritesBack.reset();
+ _vm->_draw->_scummvmCursor.reset();
+
+ _vm->_draw->initSpriteSurf(Draw::kCursorSurface, width * count, height, 2);
+
+ _vm->_draw->_cursorSpritesBack = _vm->_draw->_spritesArray[Draw::kCursorSurface];
+ _vm->_draw->_cursorSprites = _vm->_draw->_cursorSpritesBack;
+
+ _vm->_draw->_scummvmCursor = _vm->_video->initSurfDesc(width, height, SCUMMVM_CURSOR);
+
+ for (int i = 0; i < 40; i++) {
+ _vm->_draw->_cursorAnimLow[i] = -1;
+ _vm->_draw->_cursorAnimDelays[i] = 0;
+ _vm->_draw->_cursorAnimHigh[i] = 0;
+ }
+ _vm->_draw->_cursorAnimLow[1] = 0;
+
+ delete[] _vm->_draw->_doCursorPalettes;
+ delete[] _vm->_draw->_cursorPalettes;
+ delete[] _vm->_draw->_cursorKeyColors;
+ delete[] _vm->_draw->_cursorPaletteStarts;
+ delete[] _vm->_draw->_cursorPaletteCounts;
+ delete[] _vm->_draw->_cursorHotspotsX;
+ delete[] _vm->_draw->_cursorHotspotsY;
+
+ _vm->_draw->_cursorPalettes = new byte[256 * 3 * count];
+ _vm->_draw->_doCursorPalettes = new bool[count];
+ _vm->_draw->_cursorKeyColors = new byte[count];
+ _vm->_draw->_cursorPaletteStarts = new uint16[count];
+ _vm->_draw->_cursorPaletteCounts = new uint16[count];
+ _vm->_draw->_cursorHotspotsX = new int32[count];
+ _vm->_draw->_cursorHotspotsY = new int32[count];
+
+ memset(_vm->_draw->_cursorPalettes , 0, count * 256 * 3);
+ memset(_vm->_draw->_doCursorPalettes , 0, count * sizeof(bool));
+ memset(_vm->_draw->_cursorKeyColors , 0, count * sizeof(byte));
+ memset(_vm->_draw->_cursorPaletteStarts, 0, count * sizeof(uint16));
+ memset(_vm->_draw->_cursorPaletteCounts, 0, count * sizeof(uint16));
+ memset(_vm->_draw->_cursorHotspotsX , 0, count * sizeof(int32));
+ memset(_vm->_draw->_cursorHotspotsY , 0, count * sizeof(int32));
+}
+
void Inter_v7::o7_loadCursor() {
int16 cursorIndex = _vm->_game->_script->readValExpr();
Common::String cursorName = _vm->_game->_script->evalString();
@@ -102,6 +166,14 @@ void Inter_v7::o7_loadCursor() {
cursorIndex * _vm->_draw->_cursorWidth + _vm->_draw->_cursorWidth - 1,
_vm->_draw->_cursorHeight - 1, 0);
+ // If the cursor name is empty, that cursor will be drawn by the scripts
+ if (cursorName.empty()) {
+ // Make sure the cursors sprite is big enough and set to non-extern palette
+ resizeCursors(-1, -1, cursorIndex + 1, true);
+ _vm->_draw->_doCursorPalettes[cursorIndex] = false;
+ return;
+ }
+
Graphics::WinCursorGroup *cursorGroup = 0;
Graphics::Cursor *defaultCursor = 0;
@@ -118,69 +190,16 @@ void Inter_v7::o7_loadCursor() {
} else
cursor = cursorGroup->cursors[0].cursor;
- // Cursor sprite dimensions mismatch, recreate the cursor sprites
- if ((cursor->getWidth() > _vm->_draw->_cursorWidth ) ||
- (cursor->getHeight() > _vm->_draw->_cursorHeight) ||
- (_vm->_draw->_cursorSprites->getWidth() < ((cursorIndex + 1) * _vm->_draw->_cursorWidth)) ||
- !_vm->_draw->_cursorPalettes) {
-
- const int count = cursorIndex + 1;
-
- _vm->_draw->freeSprite(Draw::kCursorSurface);
- _vm->_draw->_cursorSprites.reset();
- _vm->_draw->_cursorSpritesBack.reset();
- _vm->_draw->_scummvmCursor.reset();
-
- _vm->_draw->_cursorWidth = MAX<uint16>(cursor->getWidth() , _vm->_draw->_cursorWidth);
- _vm->_draw->_cursorHeight = MAX<uint16>(cursor->getHeight(), _vm->_draw->_cursorHeight);
-
- _vm->_draw->_transparentCursor = 1;
-
- _vm->_draw->initSpriteSurf(Draw::kCursorSurface, _vm->_draw->_cursorWidth * count,
- _vm->_draw->_cursorHeight, 2);
-
- _vm->_draw->_cursorSpritesBack = _vm->_draw->_spritesArray[Draw::kCursorSurface];
- _vm->_draw->_cursorSprites = _vm->_draw->_cursorSpritesBack;
-
- _vm->_draw->_scummvmCursor =
- _vm->_video->initSurfDesc(_vm->_draw->_cursorWidth, _vm->_draw->_cursorHeight, SCUMMVM_CURSOR);
-
- for (int i = 0; i < 40; i++) {
- _vm->_draw->_cursorAnimLow[i] = -1;
- _vm->_draw->_cursorAnimDelays[i] = 0;
- _vm->_draw->_cursorAnimHigh[i] = 0;
- }
- _vm->_draw->_cursorAnimLow[1] = 0;
-
- delete[] _vm->_draw->_cursorPalettes;
- delete[] _vm->_draw->_cursorKeyColors;
- delete[] _vm->_draw->_cursorPaletteStarts;
- delete[] _vm->_draw->_cursorPaletteCounts;
- delete[] _vm->_draw->_cursorHotspotsX;
- delete[] _vm->_draw->_cursorHotspotsY;
-
- _vm->_draw->_cursorPalettes = new byte[256 * 3 * count];
- _vm->_draw->_cursorKeyColors = new byte[count];
- _vm->_draw->_cursorPaletteStarts = new uint16[count];
- _vm->_draw->_cursorPaletteCounts = new uint16[count];
- _vm->_draw->_cursorHotspotsX = new int32[count];
- _vm->_draw->_cursorHotspotsY = new int32[count];
-
- memset(_vm->_draw->_cursorPalettes , 0, count * 256 * 3);
- memset(_vm->_draw->_cursorKeyColors , 0, count * sizeof(byte));
- memset(_vm->_draw->_cursorPaletteStarts, 0, count * sizeof(uint16));
- memset(_vm->_draw->_cursorPaletteCounts, 0, count * sizeof(uint16));
- memset(_vm->_draw->_cursorHotspotsX , 0, count * sizeof(int32));
- memset(_vm->_draw->_cursorHotspotsY , 0, count * sizeof(int32));
- }
+ // Make sure the cursors sprite it big enough
+ resizeCursors(cursor->getWidth(), cursor->getHeight(), cursorIndex + 1, true);
Surface cursorSurf(cursor->getWidth(), cursor->getHeight(), 1, cursor->getSurface());
- _vm->_draw->_cursorSprites->blit(cursorSurf, 0, 0, cursor->getWidth() - 1, cursor->getHeight() - 1,
- cursorIndex * _vm->_draw->_cursorWidth, 0, 0);
+ _vm->_draw->_cursorSprites->blit(cursorSurf, cursorIndex * _vm->_draw->_cursorWidth, 0);
memcpy(_vm->_draw->_cursorPalettes + cursorIndex * 256 * 3, cursor->getPalette(), cursor->getPaletteCount() * 3);
+ _vm->_draw->_doCursorPalettes [cursorIndex] = true;
_vm->_draw->_cursorKeyColors [cursorIndex] = cursor->getKeyColor();
_vm->_draw->_cursorPaletteStarts[cursorIndex] = cursor->getPaletteStartIndex();
_vm->_draw->_cursorPaletteCounts[cursorIndex] = cursor->getPaletteCount();