diff options
author | Johannes Schickel | 2010-10-13 03:57:44 +0000 |
---|---|---|
committer | Johannes Schickel | 2010-10-13 03:57:44 +0000 |
commit | 75e8452b6e6a2bf4fb2f588aa00b428a60d873b5 (patch) | |
tree | f29541d55309487a94bd1d38e8b53bb3dde9aec6 /engines/gob/draw.cpp | |
parent | 48ee83b88957dab86bc763e9ef21a70179fa8679 (diff) | |
parent | e9f50882ea5b6beeefa994040be9d3bab6a1f107 (diff) | |
download | scummvm-rg350-75e8452b6e6a2bf4fb2f588aa00b428a60d873b5.tar.gz scummvm-rg350-75e8452b6e6a2bf4fb2f588aa00b428a60d873b5.tar.bz2 scummvm-rg350-75e8452b6e6a2bf4fb2f588aa00b428a60d873b5.zip |
OPENGL: Merged from trunk, from rev 52105 to 53396.
This includes an rather hacky attempt to merge all the recent gp2x backend
changes into the branch. I suppose the gp2x backend and probably all new
backends, i.e. gph, dingux etc., might not compile anymore.
Since I have no way of testing those it would be nice if porters could look
into getting those up to speed in this branch.
svn-id: r53399
Diffstat (limited to 'engines/gob/draw.cpp')
-rw-r--r-- | engines/gob/draw.cpp | 799 |
1 files changed, 11 insertions, 788 deletions
diff --git a/engines/gob/draw.cpp b/engines/gob/draw.cpp index b572ccb566..960f4e9e34 100644 --- a/engines/gob/draw.cpp +++ b/engines/gob/draw.cpp @@ -263,10 +263,10 @@ void Draw::blitInvalidated() { _vm->_video->_doRangeClamp = false; for (int i = 0; i < _invalidatedCount; i++) { - _vm->_video->drawSprite(*_backSurface, *_frontSurface, + _frontSurface->blit(*_backSurface, _invalidatedLefts[i], _invalidatedTops[i], _invalidatedRights[i], _invalidatedBottoms[i], - _invalidatedLefts[i], _invalidatedTops[i], 0); + _invalidatedLefts[i], _invalidatedTops[i]); _vm->_video->dirtyRectsAdd(_invalidatedLefts[i], _invalidatedTops[i], _invalidatedRights[i], _invalidatedBottoms[i]); } @@ -300,7 +300,7 @@ void Draw::dirtiedRect(int16 surface, dirtiedRect(_spritesArray[surface], left, top, right, bottom); } -void Draw::dirtiedRect(SurfaceDescPtr surface, +void Draw::dirtiedRect(SurfacePtr surface, int16 left, int16 top, int16 right, int16 bottom) { if (surface == _backSurface) @@ -316,7 +316,7 @@ void Draw::initSpriteSurf(int16 index, int16 width, int16 height, _spritesArray[index] = _vm->_video->initSurfDesc(_vm->_global->_videoMode, width, height, flags); - _vm->_video->clearSurf(*_spritesArray[index]); + _spritesArray[index]->clear(); } void Draw::adjustCoords(char adjust, int16 *coord1, int16 *coord2) { @@ -381,14 +381,14 @@ int Draw::stringLength(const char *str, int16 fontIndex) { } void Draw::drawString(const char *str, int16 x, int16 y, int16 color1, int16 color2, - int16 transp, SurfaceDesc &dest, const Font &font) { + int16 transp, Surface &dest, const Font &font) { while (*str != '\0') { const int16 charRight = x + font.getCharWidth(*str); const int16 charBottom = y + font.getCharHeight(); if ((charRight <= dest.getWidth()) && (charBottom <= dest.getHeight())) - _vm->_video->drawLetter(*str, x, y, font, transp, color1, color2, dest); + font.drawLetter(dest, *str, x, y, color1, color2, transp); x += font.getCharWidth(*str); str++; @@ -530,777 +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) { - // TODO: Implement proper behavior for the trace of the Window. In short, - // - drawline currently use the wrong surface, to be fixed - // - dirtiedRect should be put after the 4 drawlines when the surface is fixed <- Not in 256 col version - // - drawline should be replaced by a drawline with palette inversion - // - Shift skipped as always set to zero (?) - - int16 right, bottom; - - right = left + width - 1; - bottom = top + height - 1; - -// To be fixed : either wrong surface, or anything else, but crappy look. -// _vm->_video->drawLine(*_frontSurface, left, top, right, top, 0); -// _vm->_video->drawLine(*_frontSurface, left, top, left, bottom, 0); -// _vm->_video->drawLine(*_frontSurface, left, bottom, right, bottom, 0); -// _vm->_video->drawLine(*_frontSurface, right, top, right, bottom, 0); - -// Not in 256 col version - _vm->_video->dirtyRectsAll(); - -} - -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) { - warning("handleCurWin - activeWin %d", matchNum); - 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; - warning("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: - warning("Unexpected fct value"); - 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: - warning("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; @@ -1319,14 +548,10 @@ void Draw::forceBlit(bool backwards) { return; if (!backwards) { - _vm->_video->drawSprite(*_backSurface, *_frontSurface, 0, 0, - _backSurface->getWidth() - 1, _backSurface->getHeight() - 1, - 0, 0, 0); + _frontSurface->blit(*_backSurface); _vm->_video->dirtyRectsAll(); } else - _vm->_video->drawSprite(*_frontSurface, *_backSurface, 0, 0, - _frontSurface->getWidth() - 1, _frontSurface->getHeight() - 1, - 0, 0, 0); + _backSurface->blit(*_frontSurface); } @@ -1373,7 +598,7 @@ const int16 Draw::_wobbleTable[360] = { -0x0A03, -0x08E8, -0x07CC, -0x06B0, -0x0593, -0x0476, -0x0359, -0x023B, -0x011D }; -void Draw::wobble(SurfaceDesc &surfDesc) { +void Draw::wobble(Surface &surfDesc) { int16 amplitude = 32; uint16 curFrame = 0; uint16 frameWobble = 0; @@ -1397,16 +622,14 @@ void Draw::wobble(SurfaceDesc &surfDesc) { amplitude--; for (uint16 y = 0; y < _vm->_height; y++) - _vm->_video->drawSprite(surfDesc, *_frontSurface, - 0, y, _vm->_width - 1, y, offsets[y], y, 0); + _frontSurface->blit(surfDesc, 0, y, _vm->_width - 1, y, offsets[y], y); _vm->_palAnim->fadeStep(0); _vm->_video->dirtyRectsAll(); _vm->_video->waitRetrace(); } - _vm->_video->drawSprite(surfDesc, *_frontSurface, - 0, 0, _vm->_width - 1, _vm->_height - 1, 0, 0, 0); + _frontSurface->blit(surfDesc); _applyPal = false; _invalidatedCount = 0; |