aboutsummaryrefslogtreecommitdiff
path: root/engines/startrek/graphics.cpp
diff options
context:
space:
mode:
authorMatthew Stewart2018-05-16 19:52:44 -0400
committerEugene Sandulenko2018-08-09 08:37:30 +0200
commit02485484c31bee3101ecd3ac7ccb86e2db7b029b (patch)
tree368019c8328f6e21dd4941a6dcf3fa47e58d3da6 /engines/startrek/graphics.cpp
parentedcc80393ab6be8dc946b99d7fdc5132cdbfaaa9 (diff)
downloadscummvm-rg350-02485484c31bee3101ecd3ac7ccb86e2db7b029b.tar.gz
scummvm-rg350-02485484c31bee3101ecd3ac7ccb86e2db7b029b.tar.bz2
scummvm-rg350-02485484c31bee3101ecd3ac7ccb86e2db7b029b.zip
STARTREK: Buffer all changes to the mouse bitmap
Diffstat (limited to 'engines/startrek/graphics.cpp')
-rw-r--r--engines/startrek/graphics.cpp58
1 files changed, 48 insertions, 10 deletions
diff --git a/engines/startrek/graphics.cpp b/engines/startrek/graphics.cpp
index 8142c4d187..a51999e4d3 100644
--- a/engines/startrek/graphics.cpp
+++ b/engines/startrek/graphics.cpp
@@ -52,6 +52,10 @@ Graphics::Graphics(StarTrekEngine *vm) : _vm(vm), _egaMode(false) {
_paletteFadeLevel = 0;
_mouseLocked = false;
+ _mouseToBeShown = false;
+ _mouseToBeHidden = false;
+ _mouseWarpX = -1;
+ _mouseWarpY = -1;
setMouseBitmap(loadBitmap("pushbtn"));
CursorMan.showMouse(true);
@@ -180,17 +184,21 @@ SharedPtr<Bitmap> Graphics::loadBitmap(Common::String basename) {
}
Common::Point Graphics::getMousePos() {
+ if (_mouseWarpX != -1)
+ return Common::Point(_mouseWarpX, _mouseWarpY);
+
return _vm->_system->getEventManager()->getMousePos();
}
+/**
+ * The change to the mouse's bitmap won't take effect until drawAllSprites is called
+ * again.
+ */
void Graphics::setMouseBitmap(SharedPtr<Bitmap> bitmap) {
_mouseBitmap = bitmap;
- _vm->_system->setMouseCursor(bitmap->pixels, bitmap->width, bitmap->height, bitmap->xoffset, bitmap->yoffset, 0);
- if (_mouseLocked) {
+ if (_mouseLocked)
_lockedMouseSprite.setBitmap(_mouseBitmap);
- drawAllSprites(false);
- }
}
/**
@@ -206,13 +214,13 @@ void Graphics::lockMousePosition(int16 x, int16 y) {
_lockedMouseSprite.pos.x = x;
_lockedMouseSprite.pos.y = y;
_lockedMouseSprite.bitmapChanged = true;
- drawAllSprites(false);
}
return;
}
- CursorMan.showMouse(false);
_mouseLocked = true;
+ _mouseToBeHidden = true;
+ _mouseToBeShown = false;
_lockedMouseSprite = Sprite();
_lockedMouseSprite.setBitmap(_mouseBitmap);
@@ -222,7 +230,6 @@ void Graphics::lockMousePosition(int16 x, int16 y) {
_lockedMouseSprite.pos.y = y;
addSprite(&_lockedMouseSprite);
- drawAllSprites(false);
}
void Graphics::unlockMousePosition() {
@@ -230,13 +237,23 @@ void Graphics::unlockMousePosition() {
return;
_mouseLocked = false;
- CursorMan.showMouse(true);
+ _mouseToBeShown = true;
+ _mouseToBeHidden = false;
_lockedMouseSprite.dontDrawNextFrame();
- drawAllSprites();
+ drawAllSprites(false);
delSprite(&_lockedMouseSprite);
}
+SharedPtr<Bitmap> Graphics::getMouseBitmap() {
+ return _mouseBitmap;
+}
+
+void Graphics::warpMouse(int16 x, int16 y) {
+ _mouseWarpX = x;
+ _mouseWarpY = y;
+}
+
void Graphics::drawSprite(const Sprite &sprite) {
int left = sprite.drawX;
int top = sprite.drawY;
@@ -510,8 +527,29 @@ void Graphics::drawAllSprites(bool updateScreen) {
spr->lastDrawRect = spr->drawRect;
}
- if (updateScreen)
+ if (updateScreen) {
+ // Check if there are any pending updates to the mouse.
+ if (_mouseBitmap != _mouseBitmapLastFrame) {
+ _mouseBitmapLastFrame = _mouseBitmap;
+ _vm->_system->setMouseCursor(_mouseBitmap->pixels, _mouseBitmap->width, _mouseBitmap->height, _mouseBitmap->xoffset, _mouseBitmap->yoffset, 0);
+ }
+ if (_mouseToBeShown) {
+ CursorMan.showMouse(true);
+ _mouseToBeShown = false;
+ }
+ else if (_mouseToBeHidden) {
+ CursorMan.showMouse(false);
+ _mouseToBeHidden = false;
+ }
+
+ if (_mouseWarpX != -1) {
+ _vm->_system->warpMouse(_mouseWarpX, _mouseWarpY);
+ _mouseWarpX = -1;
+ _mouseWarpY = -1;
+ }
+
_vm->_system->updateScreen();
+ }
}
void Graphics::addSprite(Sprite *sprite) {