diff options
Diffstat (limited to 'saga')
-rw-r--r-- | saga/puzzle.cpp | 7 | ||||
-rw-r--r-- | saga/sprite.cpp | 33 | ||||
-rw-r--r-- | saga/sprite.h | 7 |
3 files changed, 36 insertions, 11 deletions
diff --git a/saga/puzzle.cpp b/saga/puzzle.cpp index 6fcfd815fd..addfdd65f8 100644 --- a/saga/puzzle.cpp +++ b/saga/puzzle.cpp @@ -275,9 +275,14 @@ void Puzzle::showPieces(void) { void Puzzle::drawCurrentPiece() { ActorData *puzzle = _vm->_actor->getActor(_vm->_actor->actorIndexToId(ITE_ACTOR_PUZZLE)); SURFACE *backBuffer = _vm->_gfx->getBackBuffer(); + SCENE_BGINFO bg_info; + + _vm->_scene->getBGInfo(&bg_info); + + Rect clip(bg_info.bg_x, bg_info.bg_y, bg_info.bg_x + bg_info.bg_w, bg_info.bg_y + bg_info.bg_h); _vm->_sprite->draw(backBuffer, puzzle->spriteList, _puzzlePiece, - Point(_pieceInfo[_puzzlePiece].curX, _pieceInfo[_puzzlePiece].curY), 256); + Point(_pieceInfo[_puzzlePiece].curX, _pieceInfo[_puzzlePiece].curY), 256, &clip); } void Puzzle::movePiece(Point mousePt) { diff --git a/saga/sprite.cpp b/saga/sprite.cpp index 6ceca6f12d..0392c699de 100644 --- a/saga/sprite.cpp +++ b/saga/sprite.cpp @@ -217,17 +217,29 @@ void Sprite::drawClip(SURFACE *ds, Rect clip, const Point &spritePointer, int wi } } -int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale) { +int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale, Rect *clipOverride) { const byte *spriteBuffer; int width; int height; int xAlign; int yAlign; Point spritePointer; - Rect clip(_vm->getDisplayWidth(),_vm->getDisplayHeight()); + Rect clip; assert(_initialized); + if (clipOverride) { + clip.left = clipOverride->left; + clip.right = clipOverride->right; + clip.top = clipOverride->top; + clip.bottom = clipOverride->bottom; + } else { + clip.left = 0; + clip.right = _vm->getDisplayWidth(); + clip.top = 0; + clip.bottom = _vm->getDisplayHeight(); + } + getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer); spritePointer.x = screenCoord.x + xAlign; @@ -237,17 +249,29 @@ int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const return SUCCESS; } -int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale) { +int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale, Rect *clipOverride) { const byte *spriteBuffer; int width; int height; int xAlign, spw; int yAlign, sph; Point spritePointer; - Rect clip(_vm->getDisplayWidth(),_vm->getDisplayHeight()); + Rect clip; assert(_initialized); + if (clipOverride) { + clip.left = clipOverride->left; + clip.right = clipOverride->right; + clip.top = clipOverride->top; + clip.bottom = clipOverride->bottom; + } else { + clip.left = 0; + clip.right = _vm->getDisplayWidth(); + clip.top = 0; + clip.bottom = _vm->getDisplayHeight(); + } + getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer); spw = (screenRect.width() - width) / 2; sph = (screenRect.height() - height) / 2; @@ -319,7 +343,6 @@ int Sprite::drawOccluded(SURFACE *ds, SpriteList &spriteList, int spriteNumber, byte *mask_row_p; int mask_z; - assert(_initialized); if (!_vm->_scene->isBGMaskPresent()) { diff --git a/saga/sprite.h b/saga/sprite.h index 80254c6807..0a1ba6bf44 100644 --- a/saga/sprite.h +++ b/saga/sprite.h @@ -60,18 +60,15 @@ struct SpriteList { } }; - class Sprite { public: SpriteList _mainSprites; - - Sprite(SagaEngine *vm); ~Sprite(void); int loadList(int resourceId, SpriteList &spriteList); // load or append spriteList - int draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale); - int draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale); + int draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale, Rect *clipOverride = NULL); + int draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale, Rect *clipOverride = NULL); int drawOccluded(SURFACE *ds, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth); bool hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint); void getScaledSpriteBuffer(SpriteList &spriteList, int spriteNumber, int scale, int &width, int &height, int &xAlign, int &yAlign, const byte *&buffer); |