aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/inter_v7.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob/inter_v7.cpp')
-rw-r--r--engines/gob/inter_v7.cpp133
1 files changed, 76 insertions, 57 deletions
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();