aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--saga/puzzle.cpp7
-rw-r--r--saga/sprite.cpp33
-rw-r--r--saga/sprite.h7
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);