SCI: remaining cursor functions now also directly called

svn-id: r47914
This commit is contained in:
Martin Kiewitz 2010-02-05 21:09:36 +00:00
parent 16efee3c0d
commit f967318225
9 changed files with 62 additions and 88 deletions

View File

@ -101,7 +101,7 @@ static reg_t kSetCursorSci0(EngineState *s, int argc, reg_t *argv) {
if (argc >= 4) {
pos.y = argv[3].toSint16();
pos.x = argv[2].toSint16();
s->_gui->setCursorPos(pos);
s->_gfxCursor->kernelSetPos(pos);
}
if ((argc >= 2) && (argv[1].toSint16() == 0)) {
@ -136,12 +136,7 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) {
pos.y = argv[1].toSint16();
pos.x = argv[0].toSint16();
#ifdef ENABLE_SCI32
if (s->_gui32)
s->_gui32->setCursorPos(pos);
else
#endif
s->_gui->setCursorPos(pos);
s->_gfxCursor->kernelSetPos(pos);
break;
case 4: {
int16 top = argv[0].toSint16();
@ -151,12 +146,7 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) {
if ((right >= left) && (bottom >= top)) {
Common::Rect rect = Common::Rect(left, top, right, bottom);
#ifdef ENABLE_SCI32
if (s->_gui32)
s->_gui32->setCursorZone(rect);
else
#endif
s->_gui->setCursorZone(rect);
s->_gfxCursor->kernelSetMoveZone(rect);
} else {
warning("kSetCursor: Ignoring invalid mouse zone (%i, %i)-(%i, %i)", left, top, right, bottom);
}
@ -193,7 +183,7 @@ reg_t kMoveCursor(EngineState *s, int argc, reg_t *argv) {
if (argc == 2) {
pos.y = argv[1].toSint16();
pos.x = argv[0].toSint16();
s->_gui->setCursorPos(pos);
s->_gfxCursor->kernelSetPos(pos);
}
return s->r_acc;
}

View File

@ -65,6 +65,19 @@ Common::Rect GfxCoordAdjuster16::onControl(Common::Rect rect) {
return adjustedRect;
}
void GfxCoordAdjuster16::setCursorPos(Common::Point &pos) {
pos.y += _ports->getPort()->top;
pos.x += _ports->getPort()->left;
}
void GfxCoordAdjuster16::moveCursor(Common::Point &pos) {
pos.y += _ports->_picWind->rect.top;
pos.x += _ports->_picWind->rect.left;
pos.y = CLIP<int16>(pos.y, _ports->_picWind->rect.top, _ports->_picWind->rect.bottom - 1);
pos.x = CLIP<int16>(pos.x, _ports->_picWind->rect.left, _ports->_picWind->rect.right - 1);
}
#ifdef ENABLE_SCI32
GfxCoordAdjuster32::GfxCoordAdjuster32(SegManager *segMan)
: _segMan(segMan) {

View File

@ -47,7 +47,8 @@ public:
virtual void kernelLocalToGlobal(int16 &x, int16 &y, reg_t planeObject = NULL_REG) { };
virtual Common::Rect onControl(Common::Rect rect) { return rect; };
virtual void setCursorPos(Common::Point &pos) { };
virtual void moveCursor(Common::Point &pos) { };
private:
};
@ -60,6 +61,8 @@ public:
void kernelLocalToGlobal(int16 &x, int16 &y, reg_t planeObject = NULL_REG);
Common::Rect onControl(Common::Rect rect);
void setCursorPos(Common::Point &pos);
void moveCursor(Common::Point &pos);
private:
GfxPorts *_ports;

View File

@ -28,9 +28,11 @@
#include "common/events.h"
#include "sci/sci.h"
#include "sci/event.h"
#include "sci/engine/state.h"
#include "sci/graphics/palette.h"
#include "sci/graphics/screen.h"
#include "sci/graphics/coordadjuster.h"
#include "sci/graphics/view.h"
#include "sci/graphics/cursor.h"
@ -42,7 +44,7 @@ GfxCursor::GfxCursor(ResourceManager *resMan, GfxPalette *palette, GfxScreen *sc
_upscaledHires = _screen->getUpscaledHires();
// center mouse cursor
setPosition(Common::Point(_screen->getDisplayWidth() / 2, _screen->getDisplayHeight() / 2));
setMoveZone(Common::Rect(0, 0, _screen->getDisplayWidth(), _screen->getDisplayHeight()));
kernelSetMoveZone(Common::Rect(0, 0, _screen->getDisplayWidth(), _screen->getDisplayHeight()));
_isVisible = true;
}
@ -51,6 +53,11 @@ GfxCursor::~GfxCursor() {
purgeCache();
}
void GfxCursor::init(GfxCoordAdjuster *coordAdjuster, SciEvent *event) {
_coordAdjuster = coordAdjuster;
_event = event;
}
void GfxCursor::kernelShow() {
CursorMan.showMouse(true);
_isVisible = true;
@ -224,4 +231,27 @@ void GfxCursor::refreshPosition() {
setPosition(mousePoint);
}
void GfxCursor::kernelSetMoveZone(Common::Rect zone) {
_moveZone = zone;
}
void GfxCursor::kernelSetPos(Common::Point pos) {
_coordAdjuster->setCursorPos(pos);
kernelMoveCursor(pos);
}
void GfxCursor::kernelMoveCursor(Common::Point pos) {
_coordAdjuster->moveCursor(pos);
if (pos.x > _screen->getWidth() || pos.y > _screen->getHeight()) {
warning("attempt to place cursor at invalid coordinates (%d, %d)", pos.y, pos.x);
return;
}
setPosition(pos);
// Trigger event reading to make sure the mouse coordinates will
// actually have changed the next time we read them.
_event->get(SCI_EVENT_PEEK);
}
} // End of namespace Sci

View File

@ -45,6 +45,8 @@ public:
GfxCursor(ResourceManager *resMan, GfxPalette *palette, GfxScreen *screen);
~GfxCursor();
void init(GfxCoordAdjuster *coordAdjuster, SciEvent *event);
void kernelShow();
void kernelHide();
bool isVisible();
@ -59,7 +61,10 @@ public:
*
* @param[in] rect The rectangle
*/
void setMoveZone(Common::Rect zone) { _moveZone = zone; }
void kernelSetMoveZone(Common::Rect zone);
void kernelSetPos(Common::Point pos);
void kernelMoveCursor(Common::Point pos);
private:
void purgeCache();
@ -67,6 +72,8 @@ private:
ResourceManager *_resMan;
GfxScreen *_screen;
GfxPalette *_palette;
GfxCoordAdjuster *_coordAdjuster;
SciEvent *_event;
bool _upscaledHires;

View File

@ -56,6 +56,7 @@ SciGui::SciGui(EngineState *state, GfxScreen *screen, GfxPalette *palette, GfxCa
_coordAdjuster = new GfxCoordAdjuster16(_ports);
_s->_gfxCoordAdjuster = _coordAdjuster;
_cursor->init(_coordAdjuster, _s->_event);
_compare = new GfxCompare(_s->_segMan, _s->_kernel, _cache, _screen, _coordAdjuster);
_s->_gfxCompare = _compare;
_transitions = new GfxTransitions(this, _screen, _palette, _s->resMan->isVGA());
@ -269,35 +270,6 @@ void SciGui::shakeScreen(uint16 shakeCount, uint16 directions) {
}
}
void SciGui::setCursorPos(Common::Point pos) {
pos.y += _ports->getPort()->top;
pos.x += _ports->getPort()->left;
moveCursor(pos);
}
void SciGui::moveCursor(Common::Point pos) {
pos.y += _ports->_picWind->rect.top;
pos.x += _ports->_picWind->rect.left;
pos.y = CLIP<int16>(pos.y, _ports->_picWind->rect.top, _ports->_picWind->rect.bottom - 1);
pos.x = CLIP<int16>(pos.x, _ports->_picWind->rect.left, _ports->_picWind->rect.right - 1);
if (pos.x > _screen->getWidth() || pos.y > _screen->getHeight()) {
warning("attempt to place cursor at invalid coordinates (%d, %d)", pos.y, pos.x);
return;
}
_cursor->setPosition(pos);
// Trigger event reading to make sure the mouse coordinates will
// actually have changed the next time we read them.
_s->_event->get(SCI_EVENT_PEEK);
}
void SciGui::setCursorZone(Common::Rect zone) {
_cursor->setMoveZone(zone);
}
reg_t SciGui::portraitLoad(Common::String resourceName) {
//Portrait *myPortrait = new Portrait(_s->resMan, _screen, _palette, resourceName);
return NULL_REG;

View File

@ -76,10 +76,6 @@ public:
virtual void shakeScreen(uint16 shakeCount, uint16 directions);
virtual void setCursorPos(Common::Point pos);
virtual void moveCursor(Common::Point pos);
void setCursorZone(Common::Rect zone);
virtual reg_t portraitLoad(Common::String resourceName);
virtual void portraitShow(Common::String resourceName, Common::Point position, uint16 resourceNum, uint16 noun, uint16 verb, uint16 cond, uint16 seq);
virtual void portraitUnload(uint16 portraitId);

View File

@ -51,6 +51,7 @@ SciGui32::SciGui32(EngineState *state, GfxScreen *screen, GfxPalette *palette, G
_coordAdjuster = new GfxCoordAdjuster32(_s->_segMan);
_s->_gfxCoordAdjuster = _coordAdjuster;
_cursor->init(_coordAdjuster, _s->_event);
_compare = new GfxCompare(_s->_segMan, _s->_kernel, _cache, _screen, _coordAdjuster);
_s->_gfxCompare = _compare;
_paint32 = new GfxPaint32(_s->resMan, _s->_segMan, _s->_kernel, _cache, _screen, _palette);
@ -92,35 +93,6 @@ void SciGui32::shakeScreen(uint16 shakeCount, uint16 directions) {
}
}
void SciGui32::setCursorPos(Common::Point pos) {
//pos.y += _gfx->GetPort()->top;
//pos.x += _gfx->GetPort()->left;
moveCursor(pos);
}
void SciGui32::moveCursor(Common::Point pos) {
// pos.y += _windowMgr->_picWind->rect.top;
// pos.x += _windowMgr->_picWind->rect.left;
// pos.y = CLIP<int16>(pos.y, _windowMgr->_picWind->rect.top, _windowMgr->_picWind->rect.bottom - 1);
// pos.x = CLIP<int16>(pos.x, _windowMgr->_picWind->rect.left, _windowMgr->_picWind->rect.right - 1);
if (pos.x > _screen->getWidth() || pos.y > _screen->getHeight()) {
warning("attempt to place cursor at invalid coordinates (%d, %d)", pos.y, pos.x);
return;
}
_cursor->setPosition(pos);
// Trigger event reading to make sure the mouse coordinates will
// actually have changed the next time we read them.
_s->_event->get(SCI_EVENT_PEEK);
}
void SciGui32::setCursorZone(Common::Rect zone) {
_cursor->setMoveZone(zone);
}
void SciGui32::drawRobot(GuiResourceId robotId) {
Robot *test = new Robot(_s->resMan, _screen, robotId);
test->draw();

View File

@ -50,15 +50,6 @@ public:
void shakeScreen(uint16 shakeCount, uint16 directions);
void setNowSeen(reg_t objectReference);
bool canBeHere(reg_t curObject, reg_t listReference);
bool isItSkip(GuiResourceId viewId, int16 loopNo, int16 celNo, Common::Point position);
void baseSetter(reg_t object);
void setCursorPos(Common::Point pos);
void moveCursor(Common::Point pos);
void setCursorZone(Common::Rect zone);
void drawRobot(GuiResourceId robotId);
// FIXME: Don't store EngineState