aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/draw.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob/draw.cpp')
-rw-r--r--engines/gob/draw.cpp768
1 files changed, 0 insertions, 768 deletions
diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp
index 0f5c5d83b2..62b9a5e630 100644
--- a/engines/gob/draw.cpp
+++ b/engines/gob/draw.cpp
@@ -530,774 +530,6 @@ void Draw::oPlaytoons_sub_F_1B(uint16 id, int16 left, int16 top, int16 right, in
return;
}
-void Draw::activeWin(int16 id) {
- bool found = false;
- int16 t[10], t2[10];
- int nextId = -1;
- int oldId = -1;
- SurfaceDescPtr tempSrf;
- SurfaceDescPtr oldSrf[10];
-
- if (_fascinWin[id].id == -1)
- return;
-
- blitInvalidated();
-
- for (int i = 0; i < 10; i++) {
- t[i] = -1;
- t2[i] = -1;
- oldSrf[i].reset();
- }
-
- for (int i = 0; i < 10; i++)
- if ((i != id) && (_fascinWin[i].id > _fascinWin[id].id) && (winOverlap(i, id))) {
- t[_fascinWin[i].id] = i;
- found = true;
- }
-
- if (found) {
- for (int i = 9; i >= 0; i--) {
- if (t[i] != -1) {
- if (nextId != -1)
- _vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
- _fascinWin[t[i]].left, _fascinWin[t[i]].top,
- _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
- _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1,
- _fascinWin[t[i]].left & 7, 0, 0);
- t2[i] = nextId;
- restoreWin(t[i]);
- nextId = t[i];
- }
- }
-
- oldId = nextId;
- _vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
- _fascinWin[id].left, _fascinWin[id].top,
- _fascinWin[id].left + _fascinWin[id].width - 1,
- _fascinWin[id].top + _fascinWin[id].height - 1,
- _fascinWin[id].left & 7, 0, 0);
- restoreWin(id);
- nextId = id;
-
- for (int i = 0; i < 10; i++) {
- if (t[i] != -1) {
- _vm->_video->drawSprite(*_backSurface, *_fascinWin[nextId].savedSurface,
- _fascinWin[t[i]].left, _fascinWin[t[i]].top,
- _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
- _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1,
- _fascinWin[t[i]].left & 7, 0, 0);
- oldSrf[t[i]] = _fascinWin[nextId].savedSurface;
- if (t2[i] != -1)
- _vm->_video->drawSprite(*_fascinWin[t2[i]].savedSurface, *_backSurface,
- _fascinWin[t[i]].left & 7, 0,
- (_fascinWin[t[i]].left & 7) + _fascinWin[t[i]].width - 1,
- _fascinWin[t[i]].height - 1, _fascinWin[t[i]].left,
- _fascinWin[t[i]].top, 0);
- else {
- // Shift skipped as always set to zero (?)
- _vm->_video->drawSprite(*_frontSurface, *_backSurface,
- _fascinWin[t[i]].left, _fascinWin[t[i]].top,
- _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
- _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1,
- _fascinWin[t[i]].left, _fascinWin[t[i]].top, 0);
- }
- invalidateRect(_fascinWin[t[i]].left, _fascinWin[t[i]].top,
- _fascinWin[t[i]].left + _fascinWin[t[i]].width - 1,
- _fascinWin[t[i]].top + _fascinWin[t[i]].height - 1);
- nextId = t2[i];
- }
- }
-
- tempSrf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _winMaxWidth + 7, _winMaxHeight, 0);
- _vm->_video->drawSprite(*_backSurface, *tempSrf,
- _fascinWin[id].left, _fascinWin[id].top,
- _fascinWin[id].left + _fascinWin[id].width - 1,
- _fascinWin[id].top + _fascinWin[id].height - 1,
- _fascinWin[id].left & 7, 0, 0);
- _vm->_video->drawSprite(*_fascinWin[oldId].savedSurface, *_backSurface,
- _fascinWin[id].left & 7, 0,
- (_fascinWin[id].left & 7) + _fascinWin[id].width - 1,
- _fascinWin[id].height - 1,
- _fascinWin[id].left, _fascinWin[id].top, 0);
-
- _fascinWin[oldId].savedSurface.reset();
- _fascinWin[oldId].savedSurface = tempSrf;
- oldSrf[id] = _fascinWin[oldId].savedSurface;
-
- invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
- _fascinWin[id].left + _fascinWin[id].width - 1,
- _fascinWin[id].top + _fascinWin[id].height - 1);
- nextId = id;
-
- for (int j = 0; j < 10; j++) {
- if (oldSrf[j]!=0)
- _fascinWin[j].savedSurface = oldSrf[j];
- }
- }
-
- for (int i = 0; i < 10; i++) {
- if ((i != id) && (_fascinWin[i].id > _fascinWin[id].id))
- _fascinWin[i].id--;
- }
-
- _fascinWin[id].id = _winCount - 1;
-}
-
-bool Draw::winOverlap(int16 idWin1, int16 idWin2) {
- if ((_fascinWin[idWin1].left + _fascinWin[idWin1].width <= _fascinWin[idWin2].left) ||
- (_fascinWin[idWin2].left + _fascinWin[idWin2].width <= _fascinWin[idWin1].left) ||
- (_fascinWin[idWin1].top + _fascinWin[idWin1].height <= _fascinWin[idWin2].top ) ||
- (_fascinWin[idWin2].top + _fascinWin[idWin2].height <= _fascinWin[idWin1].top ))
- return false;
-
- return true;
-}
-
-void Draw::closeWin(int16 i) {
- if (_fascinWin[i].id == -1)
- return;
-
- WRITE_VAR((_winVarArrayStatus / 4) + i, VAR((_winVarArrayStatus / 4) + i) | 1);
- restoreWin(i);
- _fascinWin[i].id = -1;
- _fascinWin[i].savedSurface.reset();
- _winCount--;
-}
-
-void Draw::closeAllWin() {
- for (int i = 0; i < 10; i++){
- activeWin(i);
- closeWin(i);
- }
-}
-
-int16 Draw::openWin(int16 id) {
- if (_fascinWin[id].id != -1)
- return 0;
-
- _fascinWin[id].id = _winCount++;
- _fascinWin[id].left = VAR((_winVarArrayLeft / 4) + id);
- _fascinWin[id].top = VAR((_winVarArrayTop / 4) + id);
- _fascinWin[id].width = VAR((_winVarArrayWidth / 4) + id);
- _fascinWin[id].height = VAR((_winVarArrayHeight / 4) + id);
-
- _fascinWin[id].savedSurface = _vm->_video->initSurfDesc(_vm->_global->_videoMode, _winMaxWidth + 7, _winMaxHeight, 0);
-
- saveWin(id);
- WRITE_VAR((_winVarArrayStatus / 4) + id, VAR((_winVarArrayStatus / 4) + id) & 0xFFFFFFFE);
-
- return 1;
-}
-
-void Draw::restoreWin(int16 i) {
- _vm->_video->drawSprite(*_fascinWin[i].savedSurface, *_backSurface,
- _fascinWin[i].left & 7, 0,
- (_fascinWin[i].left & 7) + _fascinWin[i].width - 1, _fascinWin[i].height - 1,
- _fascinWin[i].left, _fascinWin[i].top, 0);
- invalidateRect(_fascinWin[i].left, _fascinWin[i].top,
- _fascinWin[i].left + _fascinWin[i].width - 1,
- _fascinWin[i].top + _fascinWin[i].height - 1);
-}
-
-void Draw::saveWin(int16 id) {
- _vm->_video->drawSprite(*_backSurface, *_fascinWin[id].savedSurface,
- _fascinWin[id].left, _fascinWin[id].top,
- _fascinWin[id].left + _fascinWin[id].width - 1,
- _fascinWin[id].top + _fascinWin[id].height - 1,
- _fascinWin[id].left & 7, 0, 0);
-}
-
-void Draw::winMove(int16 id) {
- int oldLeft = _fascinWin[id].left;
- int oldTop = _fascinWin[id].top;
-
- restoreWin(id);
-
- _fascinWin[id].left = _vm->_global->_inter_mouseX;
- _fascinWin[id].top = _vm->_global->_inter_mouseY;
-
- WRITE_VAR((_winVarArrayLeft / 4) + id, _fascinWin[id].left);
- WRITE_VAR((_winVarArrayTop / 4) + id, _fascinWin[id].top);
-
- saveWin(id);
-
- // Shift skipped as always set to zero (?)
- _vm->_video->drawSprite(*_frontSurface, *_backSurface,
- oldLeft, oldTop,
- oldLeft + _fascinWin[id].width - 1,
- oldTop + _fascinWin[id].height - 1,
- _fascinWin[id].left, _fascinWin[id].top, 0);
- invalidateRect(_fascinWin[id].left, _fascinWin[id].top,
- _fascinWin[id].left + _fascinWin[id].width - 1,
- _fascinWin[id].top + _fascinWin[id].height - 1);
-}
-
-void Draw::winTrace(int16 left, int16 top, int16 width, int16 height) {
- int16 right, bottom;
-
- right = left + width - 1;
- bottom = top + height - 1;
-
-
- for(int32 x = left; x < right; x++ ) {
- _frontSurface->getVidMem()[_frontSurface->getWidth() * top + x] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * top + x]) & 0xff;
- _frontSurface->getVidMem()[_frontSurface->getWidth() * bottom + x] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * bottom + x]) & 0xff;
- }
-
- for(int32 y = top; y < bottom; y++ ) {
- _frontSurface->getVidMem()[_frontSurface->getWidth() * y + left] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * y + left]) & 0xff;
- _frontSurface->getVidMem()[_frontSurface->getWidth() * y + right] = (128 + _frontSurface->getVidMem()[_frontSurface->getWidth() * y + right]) & 0xff;
- }
-
- _vm->_video->dirtyRectsAll();
- _vm->_video->retrace(true);
-}
-
-void Draw::handleWinBorder(int16 id) {
- int16 minX = 0;
- int16 maxX = 320;
- int16 minY = 0;
- int16 maxY = 200;
-
- if (VAR((_winVarArrayStatus / 4) + id) & 8)
- minX = (int16)(VAR((_winVarArrayLimitsX / 4) + id) >> 16L);
- if (VAR((_winVarArrayStatus / 4) + id) & 16)
- maxX = (int16)(VAR((_winVarArrayLimitsX / 4) + id) & 0xFFFFL);
- if (VAR((_winVarArrayStatus / 4) + id) & 32)
- minY = (int16)(VAR((_winVarArrayLimitsY / 4) + id) >> 16L);
- if (VAR((_winVarArrayStatus / 4) + id) & 64)
- maxY = (int16)(VAR((_winVarArrayLimitsY / 4) + id) & 0xFFFFL);
-
- _vm->_global->_inter_mouseX = _fascinWin[id].left;
- _vm->_global->_inter_mouseY = _fascinWin[id].top;
-
- if (_vm->_global->_mousePresent)
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
-
- winTrace(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY, _fascinWin[id].width, _fascinWin[id].height);
- _cursorX = _vm->_global->_inter_mouseX;
- _cursorY = _vm->_global->_inter_mouseY;
-
- do {
- _vm->_game->checkKeys(&_vm->_global->_inter_mouseX, &_vm->_global->_inter_mouseY, &_vm->_game->_mouseButtons, 1);
-
- if (_vm->_global->_inter_mouseX != _cursorX || _vm->_global->_inter_mouseY != _cursorY) {
- if (_vm->_global->_inter_mouseX < minX) {
- _vm->_global->_inter_mouseX = minX;
- if (_vm->_global->_mousePresent)
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
- }
-
- if (_vm->_global->_inter_mouseY < minY) {
- _vm->_global->_inter_mouseY = minY;
- if (_vm->_global->_mousePresent)
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
- }
-
- if (_vm->_global->_inter_mouseX + _fascinWin[id].width > maxX) {
- _vm->_global->_inter_mouseX = maxX - _fascinWin[id].width;
- if (_vm->_global->_mousePresent)
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
- }
-
- if (_vm->_global->_inter_mouseY + _fascinWin[id].height > maxY) {
- _vm->_global->_inter_mouseY = maxY - _fascinWin[id].height;
- if (_vm->_global->_mousePresent)
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
- }
-
- winTrace(_cursorX, _cursorY, _fascinWin[id].width, _fascinWin[id].height);
- winTrace(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY, _fascinWin[id].width, _fascinWin[id].height);
- _cursorX = _vm->_global->_inter_mouseX;
- _cursorY = _vm->_global->_inter_mouseY;
- }
- } while (_vm->_game->_mouseButtons);
- winTrace(_cursorX, _cursorY, _fascinWin[id].width, _fascinWin[id].height);
- _cursorX = _vm->_global->_inter_mouseX;
- _cursorY = _vm->_global->_inter_mouseY;
-}
-
-int16 Draw::handleCurWin() {
- int8 matchNum = 0;
- int16 bestMatch = -1;
-
- if ((_vm->_game->_mouseButtons != 1) || ((_renderFlags & 128) == 0))
- return 0;
-
- for (int i = 0; i < 10; i++)
- if (_fascinWin[i].id != -1) {
- if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left) &&
- (_vm->_global->_inter_mouseX < _fascinWin[i].left + _fascinWin[i].width) &&
- (_vm->_global->_inter_mouseY >= _fascinWin[i].top) &&
- (_vm->_global->_inter_mouseY < _fascinWin[i].top + _fascinWin[i].height)) {
-
- if (_fascinWin[i].id == _winCount - 1) {
- if ((_vm->_global->_inter_mouseX < _fascinWin[i].left + 12) &&
- (_vm->_global->_inter_mouseY < _fascinWin[i].top + 12) &&
- (VAR(_winVarArrayStatus / 4 + i) & 2)) {
-
- blitCursor();
- activeWin(i);
- closeWin(i);
- _vm->_util->waitMouseRelease(1);
- return i;
- }
-
- if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left + _fascinWin[i].width - 12) &&
- (_vm->_global->_inter_mouseY < _fascinWin[i].top + 12) &&
- (VAR(_winVarArrayStatus / 4 + i) & 4) &&
- (_vm->_global->_mousePresent) &&
- (_vm->_global->_videoMode != 0x07)) {
-
- blitCursor();
- handleWinBorder(i);
- winMove(i);
- _vm->_global->_inter_mouseX = _fascinWin[i].left + _fascinWin[i].width - 11;
- _vm->_util->setMousePos(_vm->_global->_inter_mouseX, _vm->_global->_inter_mouseY);
- return -i;
- }
-
- return 0;
-
- } else
- if (_fascinWin[i].id > bestMatch) {
- bestMatch = _fascinWin[i].id;
- matchNum = i;
- }
- }
- }
- if (bestMatch != -1) {
- blitCursor();
- activeWin(matchNum);
- }
-
- return 0;
-}
-
-void Draw::winDecomp(int16 x, int16 y, SurfaceDescPtr destPtr) {
- Resource *resource;
- resource = _vm->_game->_resources->getResource((uint16) _spriteLeft,
- &_spriteRight, &_spriteBottom);
-
- if (!resource)
- return;
-
- _vm->_video->drawPackedSprite(resource->getData(),
- _spriteRight, _spriteBottom, x, y, _transparency, *destPtr);
-
- delete resource;
- return;
-}
-
-void Draw::winDraw(int16 fct) {
- int16 left;
- int16 top;
- int16 width;
- int16 height;
-
- bool found = false;
- int len;
- Resource *resource;
- int table[10];
- SurfaceDescPtr tempSrf;
-
- if (_destSurface == kBackSurface) {
-
- if (_vm->_global->_curWinId) {
- if (_fascinWin[_vm->_global->_curWinId].id == -1)
- return;
-
- else {
- _destSpriteX += _fascinWin[_vm->_global->_curWinId].left;
- _destSpriteY += _fascinWin[_vm->_global->_curWinId].top;
- if (fct == 3 || (fct >= 7 && fct <= 9)) {
- _spriteRight += _fascinWin[_vm->_global->_curWinId].left;
- _spriteBottom += _fascinWin[_vm->_global->_curWinId].top;
- }
- }
- }
-
- left = _destSpriteX;
- top = _destSpriteY;
-
- } else {
- if (_vm->_global->_curWinId) {
- if (_fascinWin[_vm->_global->_curWinId].id == -1)
- return;
- else {
- _spriteLeft += _fascinWin[_vm->_global->_curWinId].left;
- _spriteTop += _fascinWin[_vm->_global->_curWinId].top;
- }
- }
-
- left = _spriteLeft;
- top = _spriteTop;
- }
-
- for (int i = 0; i < 10; i++)
- table[i] = 0;
-
- switch (fct) {
- case DRAW_BLITSURF: // 0 - move
- case DRAW_FILLRECT: // 2 - fill rectangle
- width = left + _spriteRight - 1;
- height = top + _spriteBottom - 1;
- break;
-
- case DRAW_PUTPIXEL: // 1 - put a pixel
- width = _destSpriteX;
- height = _destSpriteY;
- break;
-
- case DRAW_DRAWLINE: // 3 - draw line
- case DRAW_DRAWBAR: // 7 - draw border
- case DRAW_CLEARRECT: // 8 - clear rectangle
- case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
- width = _spriteRight;
- height = _spriteBottom;
- break;
-
- case DRAW_INVALIDATE: // 4 - Draw a circle
- left = _destSpriteX - _spriteRight;
- top = _destSpriteY - _spriteRight;
- width = _destSpriteX + _spriteRight;
- height = _destSpriteY + _spriteBottom;
- break;
-
- case DRAW_LOADSPRITE: // 5 - Uncompress and load a sprite
- // TODO: check the implementation, currently dirty cut and paste of DRAW_SPRITE code
- resource = _vm->_game->_resources->getResource((_spriteLeft & 0x3FFF),
- &_spriteRight, &_spriteBottom);
-
- if (!resource) {
- width = 0;
- height = 0;
- break;
- }
-
- _vm->_video->drawPackedSprite(resource->getData(),
- _spriteRight, _spriteBottom, _destSpriteX, _destSpriteY,
- _transparency, *_spritesArray[_destSurface]);
-
- dirtiedRect(_destSurface, _destSpriteX, _destSpriteY,
- _destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1);
-
- delete resource;
-
- width = _destSpriteX + _spriteRight - 1;
- height = _destSpriteY + _spriteBottom - 1;
- break;
-
- case DRAW_PRINTTEXT: // 6 - Display string
- width = _destSpriteX - 1 + strlen(_textToPrint) * _fonts[_fontIndex]->getCharWidth();
- height = _destSpriteY - 1 + _fonts[_fontIndex]->getCharHeight();
- break;
-
- case DRAW_DRAWLETTER: // 10 - Display a character
- if (_fontToSprite[_fontIndex].sprite == -1) {
- width = _destSpriteX - 1 + _fonts[_fontIndex]->getCharWidth();
- height = _destSpriteY - 1 + _fonts[_fontIndex]->getCharHeight();
- } else {
- width = _destSpriteX + _fontToSprite[_fontIndex].width - 1;
- height = _destSpriteY + _fontToSprite[_fontIndex].height - 1;
- }
- break;
-
- default:
-// width = 0;
-// height = 0;
- error("winDraw - Unexpected fct value %d", fct);
- break;
- }
-
- for (int i = 0; i < 10; i++)
- if ((i != _vm->_global->_curWinId) && (_fascinWin[i].id != -1))
- if (!_vm->_global->_curWinId || _fascinWin[i].id>_fascinWin[_vm->_global->_curWinId].id)
- if ((_fascinWin[i].left + _fascinWin[i].width > left) && (width >= _fascinWin[i].left) &&
- (_fascinWin[i].top + _fascinWin[i].height > top ) && (height >= _fascinWin[i].top)) {
- found = true;
- table[_fascinWin[i].id] = i;
- }
-
- if ((_sourceSurface == kBackSurface) && (fct == 0)) {
- _vm->_video->drawSprite(*_spritesArray[_sourceSurface], *_spritesArray[_destSurface],
- _spriteLeft, _spriteTop, _spriteLeft + _spriteRight - 1,
- _spriteTop + _spriteBottom - 1, _destSpriteX, _destSpriteY, _transparency);
- if (!found)
- return;
-
- int j = 0;
- if (_vm->_global->_curWinId != 0)
- j = _fascinWin[_vm->_global->_curWinId].id + 1;
-
- for (int i = 9; i >= j; i--) {
- if (table[i])
- _vm->_video->drawSprite(*_fascinWin[table[i]].savedSurface, *_spritesArray[_destSurface],
- _fascinWin[table[i]].left & 7, 0,
- (_fascinWin[table[i]].left & 7) + _fascinWin[table[i]].width - 1,
- _fascinWin[table[i]].height - 1, _fascinWin[table[i]].left - _spriteLeft + _destSpriteX,
- _fascinWin[table[i]].top - _spriteTop + _destSpriteY, 0);
- }
- return;
- }
-
- if (found) {
- tempSrf = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width - left + 1, height - top + 1, 0);
- _vm->_video->drawSprite(*_backSurface, *tempSrf, left, top, width, height, 0, 0, 0);
-
- int max = 0;
- if (_vm->_global->_curWinId != 0)
- max = _fascinWin[_vm->_global->_curWinId].id + 1;
-
- for (int i = 9; i >= max; i--) {
- if (table[i])
- _vm->_video->drawSprite(*_fascinWin[table[i]].savedSurface, *tempSrf,
- _fascinWin[table[i]].left & 7, 0,
- (_fascinWin[table[i]].left & 7) + _fascinWin[table[i]].width - 1,
- _fascinWin[table[i]].height - 1,
- _fascinWin[table[i]].left - left,
- _fascinWin[table[i]].top - top , 0);
- }
-
- invalidateRect(left, top, width, height);
-
- switch (fct) {
- case DRAW_BLITSURF: // 0 - move
- _vm->_video->drawSprite(*_spritesArray[_sourceSurface], *tempSrf,
- _spriteLeft, _spriteTop, _spriteLeft + _spriteRight - 1,
- _spriteTop + _spriteBottom - 1, 0, 0, _transparency);
- break;
-
- case DRAW_PUTPIXEL: // 1 - put a pixel
- _vm->_video->putPixel(0, 0, _frontColor, *tempSrf);
- break;
-
- case DRAW_FILLRECT: // 2 - fill rectangle
- _vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - 1, _spriteBottom - 1, _backColor);
- break;
-
- case DRAW_DRAWLINE: // 3 - draw line
- _vm->_video->drawLine(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
- break;
-
- case DRAW_INVALIDATE: // 4 - Draw a circle
- _vm->_video->drawCircle(*tempSrf, _spriteRight, _spriteRight, _spriteRight, _frontColor);
- break;
-
- case DRAW_LOADSPRITE: // 5 - Uncompress and load a sprite
- winDecomp(0, 0, tempSrf);
- break;
-
- case DRAW_PRINTTEXT: // 6 - Display string
- len = strlen(_textToPrint);
- for (int j = 0; j < len; j++)
- _vm->_video->drawLetter(_textToPrint[j], j * _fonts[_fontIndex]->getCharWidth(), 0,
- *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *tempSrf);
- _destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
- break;
-
- case DRAW_DRAWBAR: // 7 - draw border
- _vm->_video->drawLine(*tempSrf, 0, _spriteBottom - _destSpriteY, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
- _vm->_video->drawLine(*tempSrf, 0, 0, 0, _spriteBottom - _destSpriteY, _frontColor);
- _vm->_video->drawLine(*tempSrf, _spriteRight - _destSpriteX, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _frontColor);
- _vm->_video->drawLine(*tempSrf, 0, 0, _spriteRight - _destSpriteX, 0, _frontColor);
- break;
-
- case DRAW_CLEARRECT: // 8 - clear rectangle
- if (_backColor < 16)
- _vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _backColor);
- break;
-
- case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
- _vm->_video->fillRect(*tempSrf, 0, 0, _spriteRight - _destSpriteX, _spriteBottom - _destSpriteY, _backColor);
- break;
-
- case DRAW_DRAWLETTER: // 10 - Display a character
- if (_fontToSprite[_fontIndex].sprite == -1) {
-
- if (_letterToPrint)
- _vm->_video->drawLetter(_letterToPrint, 0, 0, *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *tempSrf);
- } else {
- int xx, yy, nn;
- nn = _spritesArray[_fontToSprite[_fontIndex].sprite]->getWidth() / _fontToSprite[_fontIndex].width;
- yy = ((_letterToPrint - _fontToSprite[_fontIndex].base) / nn) * _fontToSprite[_fontIndex].height;
- xx = ((_letterToPrint - _fontToSprite[_fontIndex].base) % nn) * _fontToSprite[_fontIndex].width;
- _vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite], *tempSrf,
- xx, yy, xx + _fontToSprite[_fontIndex].width - 1,
- yy + _fontToSprite[_fontIndex].height - 1, 0, 0, _transparency);
- }
- break;
-
- default:
- error("winDraw - Unexpected fct value %d", fct);
- break;
- }
-
- int i = 0;
- if (_vm->_global->_curWinId != 0)
- i = _fascinWin[_vm->_global->_curWinId].id + 1;
-
- for (; i < 10; i++) {
- if (table[i]) {
- int k = table[i];
- _vm->_video->drawSprite(*tempSrf, *_fascinWin[k].savedSurface,
- 0, 0, width - left, height - top,
- left - _fascinWin[k].left + (_fascinWin[k].left & 7),
- top - _fascinWin[k].top, 0);
- // Shift skipped as always set to zero (?)
- _vm->_video->drawSprite(*_frontSurface, *tempSrf,
- MAX(left , _fascinWin[k].left),
- MAX(top , _fascinWin[k].top),
- MIN(width , (int16) (_fascinWin[k].left + _fascinWin[k].width - 1)),
- MIN(height, (int16) (_fascinWin[k].top + _fascinWin[k].height - 1)),
- MAX(left , _fascinWin[k].left) - left,
- MAX(top , _fascinWin[k].top) - top, 0);
- if (_cursorIndex != -1)
- _vm->_video->drawSprite(*_cursorSpritesBack, *tempSrf,
- 0, 0, _cursorWidth - 1, _cursorHeight - 1,
- _cursorX - left, _cursorY - top, 0);
- for (int j = 9; j > i; j--) {
- if (table[j] && winOverlap(k, table[j])) {
- int l = table[j];
- _vm->_video->drawSprite(*_fascinWin[l].savedSurface, *tempSrf,
- MAX(_fascinWin[l].left, _fascinWin[k].left)
- - _fascinWin[l].left + (_fascinWin[l].left & 7),
- MAX(_fascinWin[l].top , _fascinWin[k].top ) - _fascinWin[l].top,
- MIN(_fascinWin[l].left + _fascinWin[l].width - 1, _fascinWin[k].left + _fascinWin[k].width - 1)
- - _fascinWin[l].left + (_fascinWin[l].left & 7),
- MIN(_fascinWin[l].top + _fascinWin[l].height - 1, _fascinWin[k].top + _fascinWin[k].height - 1)
- - _fascinWin[l].top,
- MAX(_fascinWin[l].left, _fascinWin[k].left) - left,
- MAX(_fascinWin[l].top , _fascinWin[k].top ) - top, 0);
- }
- }
- }
- }
- _vm->_video->drawSprite(*tempSrf, *_backSurface, 0, 0, width - left, height - top, left, top, 0);
- tempSrf.reset();
- } else {
- invalidateRect(left, top, width, height);
- switch (fct) {
- case DRAW_BLITSURF: // 0 - move
- _vm->_video->drawSprite(*_spritesArray[_sourceSurface], *_backSurface,
- _spriteLeft, _spriteTop,
- _spriteLeft + _spriteRight - 1,
- _spriteTop + _spriteBottom - 1,
- _destSpriteX, _destSpriteY, _transparency);
- break;
- case DRAW_PUTPIXEL: // 1 - put a pixel
- _vm->_video->putPixel(_destSpriteX, _destSpriteY, _frontColor, *_backSurface);
- break;
-
- case DRAW_FILLRECT: // 2 - fill rectangle
- _vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _destSpriteX + _spriteRight - 1, _destSpriteY + _spriteBottom - 1, _backColor);
- break;
-
- case DRAW_DRAWLINE: // 3 - draw line
- _vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _frontColor);
- break;
-
- case DRAW_INVALIDATE: // 4 - Draw a circle
- _vm->_video->drawCircle(*_backSurface, _spriteRight, _spriteRight, _spriteRight, _frontColor);
- break;
-
- case DRAW_LOADSPRITE: // 5 - Uncompress and load a sprite
- winDecomp(_destSpriteX, _destSpriteY, _backSurface);
- break;
-
- case DRAW_PRINTTEXT: // 6 - Display string
- len = strlen(_textToPrint);
- for (int j = 0; j < len; j++)
- _vm->_video->drawLetter(_textToPrint[j], _destSpriteX + j * _fonts[_fontIndex]->getCharWidth(),
- _destSpriteY, *_fonts[_fontIndex], _transparency, _frontColor, _backColor, *_backSurface);
- _destSpriteX += len * _fonts[_fontIndex]->getCharWidth();
- break;
-
- case DRAW_DRAWBAR: // 7 - draw border
- _vm->_video->drawLine(*_backSurface, _destSpriteX, _spriteBottom, _spriteRight, _spriteBottom, _frontColor);
- _vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _destSpriteX, _spriteBottom, _frontColor);
- _vm->_video->drawLine(*_backSurface, _spriteRight, _destSpriteY, _spriteRight, _spriteBottom, _frontColor);
- _vm->_video->drawLine(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _destSpriteY, _frontColor);
- break;
-
- case DRAW_CLEARRECT: // 8 - clear rectangle
- if (_backColor < 16)
- _vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _backColor);
- break;
-
- case DRAW_FILLRECTABS: // 9 - fill rectangle, with other coordinates
- _vm->_video->fillRect(*_backSurface, _destSpriteX, _destSpriteY, _spriteRight, _spriteBottom, _backColor);
- break;
-
- case DRAW_DRAWLETTER: // 10 - Display a character
- if (_fontToSprite[_fontIndex].sprite == -1) {
- if (_letterToPrint)
- _vm->_video->drawLetter(_letterToPrint, _destSpriteX, _destSpriteY, *_fonts[_fontIndex], _transparency,
- _frontColor, _backColor, *_spritesArray[_destSurface]);
- } else {
- int xx, yy, nn;
- nn = _spritesArray[_fontToSprite[_fontIndex].sprite]->getWidth() / _fontToSprite[_fontIndex].width;
- yy = ((_letterToPrint - _fontToSprite[_fontIndex].base) / nn) * _fontToSprite[_fontIndex].height;
- xx = ((_letterToPrint - _fontToSprite[_fontIndex].base) % nn) * _fontToSprite[_fontIndex].width;
- _vm->_video->drawSprite(*_spritesArray[_fontToSprite[_fontIndex].sprite], *_spritesArray[_destSurface],
- xx, yy,
- xx + _fontToSprite[_fontIndex].width - 1,
- yy + _fontToSprite[_fontIndex].height - 1,
- _destSpriteX, _destSpriteY, _transparency);
- }
- break;
-
- default:
- error("winDraw - Unexpected fct value");
- break;
- }
- }
-
- if (_renderFlags & 16) {
- if (_sourceSurface == kBackSurface) {
- _spriteLeft -= _backDeltaX;
- _spriteTop -= _backDeltaY;
- }
- if (_destSurface == kBackSurface) {
- _destSpriteX -= _backDeltaX;
- _destSpriteY -= _backDeltaY;
- }
- }
-
- if (_vm->_global->_curWinId) {
- _destSpriteX -= _fascinWin[_vm->_global->_curWinId].left;
- _destSpriteY -= _fascinWin[_vm->_global->_curWinId].top;
- }
-}
-
-int16 Draw::isOverWin(int16 &dx, int16 &dy) {
- int16 bestMatch = -1;
-
- if ((_renderFlags & 128) == 0)
- return -1;
-
- for (int i = 0; i < 10; i++)
- if (_fascinWin[i].id != -1) {
- if ((_vm->_global->_inter_mouseX >= _fascinWin[i].left) &&
- (_vm->_global->_inter_mouseX < _fascinWin[i].left + _fascinWin[i].width) &&
- (_vm->_global->_inter_mouseY >= _fascinWin[i].top) &&
- (_vm->_global->_inter_mouseY < _fascinWin[i].top + _fascinWin[i].height)) {
-
- if (_fascinWin[i].id == _winCount - 1) {
- dx = _fascinWin[i].left;
- dy = _fascinWin[i].top;
- return(i);
- } else
- if (_fascinWin[i].id > bestMatch)
- bestMatch = _fascinWin[i].id;
- }
- }
-
- if (bestMatch != -1)
- return(0);
- else
- return(-1);
-}
int32 Draw::getSpriteRectSize(int16 index) {
if (!_spritesArray[index])
return 0;