diff options
author | Matthew Hoops | 2011-08-08 21:36:50 -0400 |
---|---|---|
committer | Matthew Hoops | 2011-08-08 21:36:50 -0400 |
commit | 677aa783707c566feea50608e2f0ba669037888b (patch) | |
tree | 8bed08790a96c7c25a5355a20fe00e7be30aed69 | |
parent | 9c52724ce56c16c7fe1e9fdd3532d7e14b53c238 (diff) | |
parent | dbceb0a77d64d6e16b0186417ab92c425eddb173 (diff) | |
download | scummvm-rg350-677aa783707c566feea50608e2f0ba669037888b.tar.gz scummvm-rg350-677aa783707c566feea50608e2f0ba669037888b.tar.bz2 scummvm-rg350-677aa783707c566feea50608e2f0ba669037888b.zip |
Merge remote branch 'upstream/master' into soccer
46 files changed, 565 insertions, 339 deletions
diff --git a/backends/events/dinguxsdl/dinguxsdl-events.cpp b/backends/events/dinguxsdl/dinguxsdl-events.cpp index 946507ccfd..64d8fbeb62 100644 --- a/backends/events/dinguxsdl/dinguxsdl-events.cpp +++ b/backends/events/dinguxsdl/dinguxsdl-events.cpp @@ -50,7 +50,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == PAD_DOWN) { @@ -63,7 +63,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == PAD_LEFT) { @@ -76,7 +76,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == PAD_RIGHT) { @@ -89,7 +89,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == BUT_Y) { // left mouse button @@ -99,7 +99,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_LBUTTONUP; } - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == BUT_B) { // right mouse button @@ -109,7 +109,7 @@ bool DINGUXSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_RBUTTONUP; } - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == BUT_X) { // '.' skip dialogue diff --git a/backends/events/gph/gph-events.cpp b/backends/events/gph/gph-events.cpp index b461f85fbb..ce5d892957 100644 --- a/backends/events/gph/gph-events.cpp +++ b/backends/events/gph/gph-events.cpp @@ -165,7 +165,7 @@ GPHEventSource::GPHEventSource() : _buttonStateL(false){ } -//void GPHEventSource::fillMouseEvent(Common::Event &event, int x, int y) { +//void GPHEventSource::processMouseEvent(Common::Event &event, int x, int y) { // if (GPHGraphicsManager::_videoMode.mode == GFX_HALF && !GPHGraphicsManager::_overlayVisible){ // event.mouse.x = x*2; // event.mouse.y = y*2; @@ -260,7 +260,7 @@ bool GPHEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) else return false; - fillMouseEvent(event, ev.button.x, ev.button.y); + processMouseEvent(event, ev.button.x, ev.button.y); return true; } @@ -287,7 +287,7 @@ bool GPHEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) { else return false; - fillMouseEvent(event, ev.button.x, ev.button.y); + processMouseEvent(event, ev.button.x, ev.button.y); return true; } @@ -310,16 +310,16 @@ bool GPHEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { case BUTTON_UPRIGHT: moveStick(); event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); break; case BUTTON_B: case BUTTON_CLICK: event.type = Common::EVENT_LBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); break; case BUTTON_X: event.type = Common::EVENT_RBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); break; case BUTTON_L: BUTTON_STATE_L = true; @@ -433,16 +433,16 @@ bool GPHEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { case BUTTON_UPRIGHT: moveStick(); event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); break; case BUTTON_B: case BUTTON_CLICK: event.type = Common::EVENT_LBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); break; case BUTTON_X: event.type = Common::EVENT_RBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); break; case BUTTON_L: BUTTON_STATE_L = false; diff --git a/backends/events/linuxmotosdl/linuxmotosdl-events.cpp b/backends/events/linuxmotosdl/linuxmotosdl-events.cpp index e859c5291b..5d9f032e19 100644 --- a/backends/events/linuxmotosdl/linuxmotosdl-events.cpp +++ b/backends/events/linuxmotosdl/linuxmotosdl-events.cpp @@ -132,7 +132,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == SDLK_RIGHT) { if (ev.type == SDL_KEYDOWN) { @@ -144,7 +144,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == SDLK_DOWN) { @@ -157,7 +157,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == SDLK_UP) { @@ -170,7 +170,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == SDLK_RETURN) { @@ -181,7 +181,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_LBUTTONUP; } - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == SDLK_PLUS) { @@ -191,7 +191,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { } else { event.type = Common::EVENT_RBUTTONUP; } - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else if (ev.key.keysym.sym == SDLK_MINUS) { @@ -202,7 +202,7 @@ bool LinuxmotoSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_LBUTTONUP; } - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } else { diff --git a/backends/events/openpandora/op-events.cpp b/backends/events/openpandora/op-events.cpp index 72bc56c95d..56915f96fe 100644 --- a/backends/events/openpandora/op-events.cpp +++ b/backends/events/openpandora/op-events.cpp @@ -81,7 +81,7 @@ bool OPEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) { else return false; - fillMouseEvent(event, ev.button.x, ev.button.y); + processMouseEvent(event, ev.button.x, ev.button.y); return true; } @@ -108,7 +108,7 @@ bool OPEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) { else return false; - fillMouseEvent(event, ev.button.x, ev.button.y); + processMouseEvent(event, ev.button.x, ev.button.y); return true; } @@ -123,12 +123,12 @@ bool OPEventSource::remapKey(SDL_Event &ev, Common::Event &event) { switch (ev.key.keysym.sym) { case SDLK_HOME: event.type = Common::EVENT_LBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; break; case SDLK_END: event.type = Common::EVENT_RBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; break; case SDLK_PAGEDOWN: @@ -159,12 +159,12 @@ bool OPEventSource::remapKey(SDL_Event &ev, Common::Event &event) { switch (ev.key.keysym.sym) { case SDLK_HOME: event.type = Common::EVENT_LBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; break; case SDLK_END: event.type = Common::EVENT_RBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; break; case SDLK_PAGEDOWN: diff --git a/backends/events/ps3sdl/ps3sdl-events.cpp b/backends/events/ps3sdl/ps3sdl-events.cpp index eefc641844..723942af11 100644 --- a/backends/events/ps3sdl/ps3sdl-events.cpp +++ b/backends/events/ps3sdl/ps3sdl-events.cpp @@ -60,11 +60,11 @@ bool PS3SdlEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) switch (ev.jbutton.button) { case BTN_CROSS: // Left mouse button event.type = Common::EVENT_LBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); break; case BTN_CIRCLE: // Right mouse button event.type = Common::EVENT_RBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); break; case BTN_TRIANGLE: // Game menu event.type = Common::EVENT_KEYDOWN; @@ -98,11 +98,11 @@ bool PS3SdlEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { switch (ev.jbutton.button) { case BTN_CROSS: // Left mouse button event.type = Common::EVENT_LBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); break; case BTN_CIRCLE: // Right mouse button event.type = Common::EVENT_RBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); break; case BTN_TRIANGLE: // Game menu event.type = Common::EVENT_KEYUP; diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp index d4f40958fe..9d235e9044 100644 --- a/backends/events/sdl/sdl-events.cpp +++ b/backends/events/sdl/sdl-events.cpp @@ -50,7 +50,7 @@ #define JOY_BUT_F5 5 SdlEventSource::SdlEventSource() - : _scrollLock(false), _joystick(0), _lastScreenID(0), EventSource() { + : EventSource(), _scrollLock(false), _joystick(0), _lastScreenID(0), _graphicsManager(0) { // Reset mouse state memset(&_km, 0, sizeof(_km)); @@ -91,10 +91,15 @@ int SdlEventSource::mapKey(SDLKey key, SDLMod mod, Uint16 unicode) { return key; } -void SdlEventSource::fillMouseEvent(Common::Event &event, int x, int y) { +void SdlEventSource::processMouseEvent(Common::Event &event, int x, int y) { event.mouse.x = x; event.mouse.y = y; + if (_graphicsManager) { + _graphicsManager->notifyMousePos(Common::Point(x, y)); + _graphicsManager->transformMouseCoordinates(event.mouse); + } + // Update the "keyboard mouse" coords _km.x = x; _km.y = y; @@ -377,16 +382,14 @@ bool SdlEventSource::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) { return handleJoyAxisMotion(ev, event); case SDL_VIDEOEXPOSE: - // HACK: Send a fake event, handled by SdlGraphicsManager - event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose; - return true; + if (_graphicsManager) + _graphicsManager->notifyVideoExpose(); + return false; case SDL_VIDEORESIZE: - // HACK: Send a fake event, handled by OpenGLSdlGraphicsManager - event.type = (Common::EventType)OSystem_SDL::kSdlEventResize; - event.mouse.x = ev.resize.w; - event.mouse.y = ev.resize.h; - return true; + if (_graphicsManager) + _graphicsManager->notifyResize(ev.resize.w, ev.resize.h); + return false; case SDL_QUIT: event.type = Common::EVENT_QUIT; @@ -504,7 +507,7 @@ bool SdlEventSource::handleKeyUp(SDL_Event &ev, Common::Event &event) { bool SdlEventSource::handleMouseMotion(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, ev.motion.x, ev.motion.y); + processMouseEvent(event, ev.motion.x, ev.motion.y); return true; } @@ -527,7 +530,7 @@ bool SdlEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) else return false; - fillMouseEvent(event, ev.button.x, ev.button.y); + processMouseEvent(event, ev.button.x, ev.button.y); return true; } @@ -543,7 +546,7 @@ bool SdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) { #endif else return false; - fillMouseEvent(event, ev.button.x, ev.button.y); + processMouseEvent(event, ev.button.x, ev.button.y); return true; } @@ -551,10 +554,10 @@ bool SdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) { bool SdlEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { if (ev.jbutton.button == JOY_BUT_LMOUSE) { event.type = Common::EVENT_LBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); } else if (ev.jbutton.button == JOY_BUT_RMOUSE) { event.type = Common::EVENT_RBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); } else { event.type = Common::EVENT_KEYDOWN; switch (ev.jbutton.button) { @@ -582,10 +585,10 @@ bool SdlEventSource::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { bool SdlEventSource::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { if (ev.jbutton.button == JOY_BUT_LMOUSE) { event.type = Common::EVENT_LBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); } else if (ev.jbutton.button == JOY_BUT_RMOUSE) { event.type = Common::EVENT_RBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); } else { event.type = Common::EVENT_KEYUP; switch (ev.jbutton.button) { @@ -653,7 +656,7 @@ bool SdlEventSource::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) { #endif } - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; } diff --git a/backends/events/sdl/sdl-events.h b/backends/events/sdl/sdl-events.h index 9122692a8e..2ba88c702b 100644 --- a/backends/events/sdl/sdl-events.h +++ b/backends/events/sdl/sdl-events.h @@ -24,6 +24,7 @@ #define BACKEND_EVENTS_SDL_H #include "backends/platform/sdl/sdl-sys.h" +#include "backends/graphics/sdl/sdl-graphics.h" #include "common/events.h" @@ -36,6 +37,8 @@ public: SdlEventSource(); virtual ~SdlEventSource(); + void setGraphicsManager(SdlGraphicsManager *gMan) { _graphicsManager = gMan; } + /** * Gets and processes SDL events. */ @@ -77,6 +80,11 @@ protected: int _lastScreenID; /** + * The associated graphics manager. + */ + SdlGraphicsManager *_graphicsManager; + + /** * Pre process an event before it is dispatched. */ virtual void preprocessEvents(SDL_Event *event) {} @@ -108,9 +116,10 @@ protected: //@} /** - * Assigns the mouse coords to the mouse event + * Assigns the mouse coords to the mouse event. Furthermore notify the + * graphics manager about the position change. */ - virtual void fillMouseEvent(Common::Event &event, int x, int y); + virtual void processMouseEvent(Common::Event &event, int x, int y); /** * Remaps key events. This allows platforms to configure diff --git a/backends/events/symbiansdl/symbiansdl-events.cpp b/backends/events/symbiansdl/symbiansdl-events.cpp index 1ffaae2ba0..308621e697 100644 --- a/backends/events/symbiansdl/symbiansdl-events.cpp +++ b/backends/events/symbiansdl/symbiansdl-events.cpp @@ -63,7 +63,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { _km.y_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; @@ -76,7 +76,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { _km.y_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; @@ -89,7 +89,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { _km.x_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; @@ -102,19 +102,19 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { _km.x_down_count = 0; } event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; case GUI::ACTION_LEFTCLICK: event.type = (ev.type == SDL_KEYDOWN ? Common::EVENT_LBUTTONDOWN : Common::EVENT_LBUTTONUP); - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; case GUI::ACTION_RIGHTCLICK: event.type = (ev.type == SDL_KEYDOWN ? Common::EVENT_RBUTTONDOWN : Common::EVENT_RBUTTONUP); - fillMouseEvent(event, _km.x, _km.y); + processMouseEvent(event, _km.x, _km.y); return true; @@ -132,7 +132,7 @@ bool SymbianSdlEventSource::remapKey(SDL_Event &ev, Common::Event &event) { if (_currentZone >= TOTAL_ZONES) _currentZone = 0; event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, _mouseXZone[_currentZone], _mouseYZone[_currentZone]); + processMouseEvent(event, _mouseXZone[_currentZone], _mouseYZone[_currentZone]); SDL_WarpMouse(event.mouse.x, event.mouse.y); } diff --git a/backends/events/webossdl/webossdl-events.cpp b/backends/events/webossdl/webossdl-events.cpp index 102eb5802e..a6a2ed3644 100644 --- a/backends/events/webossdl/webossdl-events.cpp +++ b/backends/events/webossdl/webossdl-events.cpp @@ -159,7 +159,7 @@ bool WebOSSdlEventSource::handleMouseButtonDown(SDL_Event &ev, Common::Event &ev if (getMillis() - dragStartTime < 250) { dragging = true; event.type = Common::EVENT_LBUTTONDOWN; - fillMouseEvent(event, curX, curY); + processMouseEvent(event, curX, curY); } } return true; @@ -180,7 +180,7 @@ bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &even if (dragging) { event.type = Common::EVENT_LBUTTONUP; - fillMouseEvent(event, curX, curY); + processMouseEvent(event, curX, curY); dragging = false; return true; } @@ -195,7 +195,7 @@ bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &even // left mouse click. if (duration < 500) { event.type = Common::EVENT_LBUTTONUP; - fillMouseEvent(event, curX, curY); + processMouseEvent(event, curX, curY); g_system->getEventManager()->pushEvent(event); event.type = Common::EVENT_LBUTTONDOWN; dragStartTime = getMillis(); @@ -205,7 +205,7 @@ bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &even // right mouse click. else if (duration < 1000) { event.type = Common::EVENT_RBUTTONUP; - fillMouseEvent(event, curX, curY); + processMouseEvent(event, curX, curY); g_system->getEventManager()->pushEvent(event); event.type = Common::EVENT_RBUTTONDOWN; } @@ -214,7 +214,7 @@ bool WebOSSdlEventSource::handleMouseButtonUp(SDL_Event &ev, Common::Event &even // middle mouse click. else { event.type = Common::EVENT_MBUTTONUP; - fillMouseEvent(event, curX, curY); + processMouseEvent(event, curX, curY); g_system->getEventManager()->pushEvent(event); event.type = Common::EVENT_MBUTTONDOWN; } @@ -240,7 +240,7 @@ bool WebOSSdlEventSource::handleMouseMotion(SDL_Event &ev, Common::Event &event) dragDiffX += ev.motion.xrel; dragDiffY += ev.motion.yrel; event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, curX, curY); + processMouseEvent(event, curX, curY); } return true; } diff --git a/backends/events/wincesdl/wincesdl-events.cpp b/backends/events/wincesdl/wincesdl-events.cpp index 1116cbbb8d..e73a4e66dd 100644 --- a/backends/events/wincesdl/wincesdl-events.cpp +++ b/backends/events/wincesdl/wincesdl-events.cpp @@ -43,7 +43,7 @@ void WINCESdlEventSource::init(WINCESdlGraphicsManager *graphicsMan) { _graphicsMan = graphicsMan; } -void WINCESdlEventSource::fillMouseEvent(Common::Event &event, int x, int y) { +void WINCESdlEventSource::processMouseEvent(Common::Event &event, int x, int y) { event.mouse.x = x; event.mouse.y = y; @@ -153,7 +153,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) { case SDL_MOUSEMOTION: event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, ev.motion.x, ev.motion.y); + processMouseEvent(event, ev.motion.x, ev.motion.y); _graphicsMan->setMousePos(event.mouse.x, event.mouse.y); return true; @@ -165,7 +165,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) { event.type = Common::EVENT_RBUTTONDOWN; else break; - fillMouseEvent(event, ev.button.x, ev.button.y); + processMouseEvent(event, ev.button.x, ev.button.y); if (event.mouse.x > _tapX) @@ -241,7 +241,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) { _rbutton = false; } - fillMouseEvent(event, ev.button.x, ev.button.y); + processMouseEvent(event, ev.button.x, ev.button.y); if (freeLookActive && !_closeClick) { _tapX = event.mouse.x; @@ -261,8 +261,7 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) { return true; case SDL_VIDEOEXPOSE: - // HACK: Send a fake event, handled by SdlGraphicsManager - event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose; + _graphicsMan->notifyVideoExpose(); break; case SDL_QUIT: @@ -279,9 +278,8 @@ bool WINCESdlEventSource::pollEvent(Common::Event &event) { if (ev.active.state & SDL_APPINPUTFOCUS) { _graphicsMan->_hasfocus = ev.active.gain; SDL_PauseAudio(!_graphicsMan->_hasfocus); - if (_graphicsMan->_hasfocus) { - event.type = (Common::EventType)OSystem_SDL::kSdlEventExpose; - } + if (_graphicsMan->_hasfocus) + _graphicsMan->notifyVideoExpose(); } break; } diff --git a/backends/events/wincesdl/wincesdl-events.h b/backends/events/wincesdl/wincesdl-events.h index deeee6196c..5eff630c2a 100644 --- a/backends/events/wincesdl/wincesdl-events.h +++ b/backends/events/wincesdl/wincesdl-events.h @@ -43,7 +43,7 @@ public: // Overloaded from SDL backend (toolbar handling) bool pollEvent(Common::Event &event); // Overloaded from SDL backend (mouse and new scaler handling) - void fillMouseEvent(Common::Event &event, int x, int y); + void processMouseEvent(Common::Event &event, int x, int y); protected: diff --git a/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp b/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp index 8075d0d45b..2fd22c4e80 100644 --- a/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp +++ b/backends/graphics/dinguxsdl/dinguxsdl-graphics.cpp @@ -510,21 +510,17 @@ void DINGUXSdlGraphicsManager::warpMouse(int x, int y) { SurfaceSdlGraphicsManager::warpMouse(x, y); } -void DINGUXSdlGraphicsManager::adjustMouseEvent(const Common::Event &event) { - if (!event.synthetic) { - Common::Event newEvent(event); - newEvent.synthetic = true; - if (!_overlayVisible) { - if (_videoMode.mode == GFX_HALF) { - newEvent.mouse.x *= 2; - newEvent.mouse.y *= 2; - } - newEvent.mouse.x /= _videoMode.scaleFactor; - newEvent.mouse.y /= _videoMode.scaleFactor; - if (_videoMode.aspectRatioCorrection) - newEvent.mouse.y = aspect2Real(newEvent.mouse.y); +void DINGUXSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) { + if (!_overlayVisible) { + if (_videoMode.mode == GFX_HALF) { + point.x *= 2; + point.y *= 2; } g_system->getEventManager()->pushEvent(newEvent); + point.x /= _videoMode.scaleFactor; + point.y /= _videoMode.scaleFactor; + if (_videoMode.aspectRatioCorrection) + point.y = aspect2Real(point.y); } } diff --git a/backends/graphics/dinguxsdl/dinguxsdl-graphics.h b/backends/graphics/dinguxsdl/dinguxsdl-graphics.h index 84a784b771..ecdd01d166 100644 --- a/backends/graphics/dinguxsdl/dinguxsdl-graphics.h +++ b/backends/graphics/dinguxsdl/dinguxsdl-graphics.h @@ -57,7 +57,7 @@ public: SurfaceSdlGraphicsManager::MousePos *getMouseCurState(); SurfaceSdlGraphicsManager::VideoState *getVideoMode(); - virtual void adjustMouseEvent(const Common::Event &event); + virtual void transformMouseCoordinates(Common::Point &point); }; #endif /* BACKENDS_GRAPHICS_SDL_DINGUX_H */ diff --git a/backends/graphics/gph/gph-graphics.cpp b/backends/graphics/gph/gph-graphics.cpp index 82a32203fb..2e8bfa668e 100644 --- a/backends/graphics/gph/gph-graphics.cpp +++ b/backends/graphics/gph/gph-graphics.cpp @@ -579,21 +579,17 @@ void GPHGraphicsManager::warpMouse(int x, int y) { SurfaceSdlGraphicsManager::warpMouse(x, y); } -void GPHGraphicsManager::adjustMouseEvent(const Common::Event &event) { - if (!event.synthetic) { - Common::Event newEvent(event); - newEvent.synthetic = true; - if (!_overlayVisible) { - if (_videoMode.mode == GFX_HALF) { - newEvent.mouse.x *= 2; - newEvent.mouse.y *= 2; - } - newEvent.mouse.x /= _videoMode.scaleFactor; - newEvent.mouse.y /= _videoMode.scaleFactor; - if (_videoMode.aspectRatioCorrection) - newEvent.mouse.y = aspect2Real(newEvent.mouse.y); +void GPHGraphicsManager::transformMouseCoordinates(Common::Point &point) { + if (!_overlayVisible) { + if (_videoMode.mode == GFX_HALF) { + point.x *= 2; + point.y *= 2; } g_system->getEventManager()->pushEvent(newEvent); + point.x /= _videoMode.scaleFactor; + point.y /= _videoMode.scaleFactor; + if (_videoMode.aspectRatioCorrection) + point.y = aspect2Real(point.y); } } diff --git a/backends/graphics/gph/gph-graphics.h b/backends/graphics/gph/gph-graphics.h index 45b8618569..0118fc7ecd 100644 --- a/backends/graphics/gph/gph-graphics.h +++ b/backends/graphics/gph/gph-graphics.h @@ -56,7 +56,7 @@ public: SurfaceSdlGraphicsManager::MousePos *getMouseCurState(); SurfaceSdlGraphicsManager::VideoState *getVideoMode(); - virtual void adjustMouseEvent(const Common::Event &event); + virtual void transformMouseCoordinates(Common::Point &point); }; #endif /* BACKENDS_GRAPHICS_GPH_H */ diff --git a/backends/graphics/graphics.h b/backends/graphics/graphics.h index 20924ed581..3f282df587 100644 --- a/backends/graphics/graphics.h +++ b/backends/graphics/graphics.h @@ -84,6 +84,10 @@ public: virtual void setCursorPalette(const byte *colors, uint start, uint num) = 0; virtual void displayMessageOnOSD(const char *msg) {} + + // Graphics::PaletteManager interface + //virtual void setPalette(const byte *colors, uint start, uint num) = 0; + //virtual void grabPalette(byte *colors, uint start, uint num) = 0; }; #endif diff --git a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp index 732074b7e2..e59d3f975b 100644 --- a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp +++ b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.cpp @@ -478,21 +478,17 @@ void LinuxmotoSdlGraphicsManager::warpMouse(int x, int y) { SurfaceSdlGraphicsManager::warpMouse(x, y); } -void LinuxmotoSdlGraphicsManager::adjustMouseEvent(const Common::Event &event) { - if (!event.synthetic) { - Common::Event newEvent(event); - newEvent.synthetic = true; - if (!_overlayVisible) { - if (_videoMode.mode == GFX_HALF) { - newEvent.mouse.x *= 2; - newEvent.mouse.y *= 2; - } - newEvent.mouse.x /= _videoMode.scaleFactor; - newEvent.mouse.y /= _videoMode.scaleFactor; - if (_videoMode.aspectRatioCorrection) - newEvent.mouse.y = aspect2Real(newEvent.mouse.y); +void LinuxmotoSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) { + if (!_overlayVisible) { + if (_videoMode.mode == GFX_HALF) { + point.x *= 2; + point.y *= 2; } g_system->getEventManager()->pushEvent(newEvent); + point.x /= _videoMode.scaleFactor; + point.y /= _videoMode.scaleFactor; + if (_videoMode.aspectRatioCorrection) + point.y = aspect2Real(point.y); } } diff --git a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h index 938512f323..ee2a566d71 100644 --- a/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h +++ b/backends/graphics/linuxmotosdl/linuxmotosdl-graphics.h @@ -42,8 +42,7 @@ public: virtual void hideOverlay(); virtual void warpMouse(int x, int y); -protected: - virtual void adjustMouseEvent(const Common::Event &event); + virtual void transformMouseCoordinates(Common::Point &point); }; #endif diff --git a/backends/graphics/opengl/gltexture.h b/backends/graphics/opengl/gltexture.h index f0cd7aed56..2f0bef2bbf 100644 --- a/backends/graphics/opengl/gltexture.h +++ b/backends/graphics/opengl/gltexture.h @@ -20,6 +20,9 @@ * */ +#ifndef BACKENDS_GRAPHICS_OPENGL_GLTEXTURE_H +#define BACKENDS_GRAPHICS_OPENGL_GLTEXTURE_H + #include "common/scummsys.h" #ifdef WIN32 @@ -31,6 +34,16 @@ #undef ARRAYSIZE #endif +// HACK: At this point in Windows platforms, common/util.h has been included +// via common/rect.h (from backends/graphics/sdl/sdl-graphics.h), via +// backends/graphics/openglsdl/openglsdl-graphics.h. Thus, we end up with +// COMMON_UTIL_H defined, and ARRAYSIZE undefined (bad!). Therefore, +// ARRAYSIZE is undefined in openglsdl-graphics.cpp. This is a temporary +// hackish solution fo fix compilation under Windows. +#if !defined(ARRAYSIZE) && defined(COMMON_UTIL_H) +#define ARRAYSIZE(x) ((int)(sizeof(x) / sizeof(x[0]))) +#endif + #if defined(USE_GLES) #include <GLES/gl.h> #elif defined(SDL_BACKEND) @@ -106,3 +119,5 @@ protected: GLint _filter; bool _refresh; }; + +#endif diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp index 046be4c669..57c2378649 100644 --- a/backends/graphics/opengl/opengl-graphics.cpp +++ b/backends/graphics/opengl/opengl-graphics.cpp @@ -67,10 +67,6 @@ OpenGLGraphicsManager::OpenGLGraphicsManager() } OpenGLGraphicsManager::~OpenGLGraphicsManager() { - // Unregister the event observer - if (g_system->getEventManager()->getEventDispatcher() != NULL) - g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this); - free(_gamePalette); free(_cursorPalette); @@ -79,11 +75,6 @@ OpenGLGraphicsManager::~OpenGLGraphicsManager() { delete _cursorTexture; } -void OpenGLGraphicsManager::initEventObserver() { - // Register the graphics manager as a event observer - g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 10, false); -} - // // Feature // @@ -1282,36 +1273,6 @@ void OpenGLGraphicsManager::adjustMousePosition(int16 &x, int16 &y) { } } -bool OpenGLGraphicsManager::notifyEvent(const Common::Event &event) { - switch (event.type) { - case Common::EVENT_MOUSEMOVE: - if (!event.synthetic) { - _cursorState.x = event.mouse.x; - _cursorState.y = event.mouse.y; - } - case Common::EVENT_LBUTTONDOWN: - case Common::EVENT_RBUTTONDOWN: - case Common::EVENT_WHEELUP: - case Common::EVENT_WHEELDOWN: - case Common::EVENT_MBUTTONDOWN: - case Common::EVENT_LBUTTONUP: - case Common::EVENT_RBUTTONUP: - case Common::EVENT_MBUTTONUP: - if (!event.synthetic) { - Common::Event newEvent(event); - newEvent.synthetic = true; - adjustMousePosition(newEvent.mouse.x, newEvent.mouse.y); - g_system->getEventManager()->pushEvent(newEvent); - } - return !event.synthetic; - - default: - break; - } - - return false; -} - bool OpenGLGraphicsManager::saveScreenshot(const char *filename) { int width = _videoMode.hardwareWidth; int height = _videoMode.hardwareHeight; diff --git a/backends/graphics/opengl/opengl-graphics.h b/backends/graphics/opengl/opengl-graphics.h index 56f7d92a12..8a110b2d5f 100644 --- a/backends/graphics/opengl/opengl-graphics.h +++ b/backends/graphics/opengl/opengl-graphics.h @@ -26,7 +26,7 @@ #include "backends/graphics/opengl/gltexture.h" #include "backends/graphics/graphics.h" #include "common/array.h" -#include "common/events.h" +#include "common/rect.h" #include "graphics/pixelformat.h" // Uncomment this to enable the 'on screen display' code. @@ -50,13 +50,11 @@ enum { * the buffers swap, and implement loadGFXMode for handling the window/context if * needed. If USE_RGB_COLOR is enabled, getSupportedFormats must be implemented. */ -class OpenGLGraphicsManager : public GraphicsManager, public Common::EventObserver { +class OpenGLGraphicsManager : public GraphicsManager { public: OpenGLGraphicsManager(); virtual ~OpenGLGraphicsManager(); - virtual void initEventObserver(); - virtual bool hasFeature(OSystem::Feature f); virtual void setFeatureState(OSystem::Feature f, bool enable); virtual bool getFeatureState(OSystem::Feature f); @@ -109,10 +107,6 @@ public: virtual void setCursorPalette(const byte *colors, uint start, uint num); virtual void displayMessageOnOSD(const char *msg); - - // Override from Common::EventObserver - bool notifyEvent(const Common::Event &event); - protected: /** * Setup OpenGL settings diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp index bd7dd32e3b..8ea95768df 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.cpp +++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp @@ -30,8 +30,9 @@ #include "common/textconsole.h" #include "common/translation.h" -OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager() +OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager(SdlEventSource *eventSource) : + SdlGraphicsManager(eventSource), _hwscreen(0), _screenResized(false), _activeFullscreenMode(-2), @@ -71,6 +72,14 @@ OpenGLSdlGraphicsManager::OpenGLSdlGraphicsManager() } OpenGLSdlGraphicsManager::~OpenGLSdlGraphicsManager() { + // Unregister the event observer + if (g_system->getEventManager()->getEventDispatcher() != NULL) + g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this); +} + +void OpenGLSdlGraphicsManager::initEventObserver() { + // Register the graphics manager as a event observer + g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 10, false); } bool OpenGLSdlGraphicsManager::hasFeature(OSystem::Feature f) { @@ -609,50 +618,61 @@ bool OpenGLSdlGraphicsManager::notifyEvent(const Common::Event &event) { } } break; + case Common::EVENT_KEYUP: return isHotkey(event); - // HACK: Handle special SDL event - // The new screen size is saved on the mouse event as part of HACK, - // there is no common resize event. - case OSystem_SDL::kSdlEventResize: - // Do not resize if ignoring resize events. - if (!_ignoreResizeFrames && !getFullscreenMode()) { - bool scaleChanged = false; - beginGFXTransaction(); - _videoMode.hardwareWidth = event.mouse.x; - _videoMode.hardwareHeight = event.mouse.y; - - if (_videoMode.mode != OpenGL::GFX_ORIGINAL) { - _screenResized = true; - calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight); - } - int scale = MIN(_videoMode.hardwareWidth / _videoMode.screenWidth, - _videoMode.hardwareHeight / _videoMode.screenHeight); + default: + break; + } - if (getScale() != scale) { - scaleChanged = true; - setScale(MAX(MIN(scale, 3), 1)); - } + return false; +} - if (_videoMode.mode == OpenGL::GFX_ORIGINAL) { - calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight); - } +void OpenGLSdlGraphicsManager::notifyVideoExpose() { +} + +void OpenGLSdlGraphicsManager::notifyResize(const uint width, const uint height) { + // Do not resize if ignoring resize events. + if (!_ignoreResizeFrames && !getFullscreenMode()) { + bool scaleChanged = false; + beginGFXTransaction(); + _videoMode.hardwareWidth = width; + _videoMode.hardwareHeight = height; + + if (_videoMode.mode != OpenGL::GFX_ORIGINAL) { + _screenResized = true; + calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight); + } + + int scale = MIN(_videoMode.hardwareWidth / _videoMode.screenWidth, + _videoMode.hardwareHeight / _videoMode.screenHeight); + + if (getScale() != scale) { + scaleChanged = true; + setScale(MAX(MIN(scale, 3), 1)); + } - _transactionDetails.sizeChanged = true; - endGFXTransaction(); + if (_videoMode.mode == OpenGL::GFX_ORIGINAL) { + calculateDisplaySize(_videoMode.hardwareWidth, _videoMode.hardwareHeight); + } + + _transactionDetails.sizeChanged = true; + endGFXTransaction(); #ifdef USE_OSD - if (scaleChanged) - displayScaleChangedMsg(); + if (scaleChanged) + displayScaleChangedMsg(); #endif - } - return true; - - default: - break; } +} - return OpenGLGraphicsManager::notifyEvent(event); +void OpenGLSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) { + adjustMousePosition(point.x, point.y); +} + +void OpenGLSdlGraphicsManager::notifyMousePos(Common::Point mouse) { + _cursorState.x = mouse.x; + _cursorState.y = mouse.y; } #endif diff --git a/backends/graphics/openglsdl/openglsdl-graphics.h b/backends/graphics/openglsdl/openglsdl-graphics.h index ba9f94db2d..1587183328 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.h +++ b/backends/graphics/openglsdl/openglsdl-graphics.h @@ -27,15 +27,17 @@ #if defined(ARRAYSIZE) && !defined(_WINDOWS_) #undef ARRAYSIZE #endif - +#include "backends/graphics/sdl/sdl-graphics.h" #include "backends/graphics/opengl/opengl-graphics.h" +#include "common/events.h" + /** * SDL OpenGL graphics manager */ -class OpenGLSdlGraphicsManager : public OpenGLGraphicsManager { +class OpenGLSdlGraphicsManager : public OpenGLGraphicsManager, public SdlGraphicsManager, public Common::EventObserver { public: - OpenGLSdlGraphicsManager(); + OpenGLSdlGraphicsManager(SdlEventSource *eventSource); virtual ~OpenGLSdlGraphicsManager(); virtual bool hasFeature(OSystem::Feature f); @@ -45,10 +47,17 @@ public: virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const; #endif + virtual void initEventObserver(); virtual bool notifyEvent(const Common::Event &event); virtual void updateScreen(); + // SdlGraphicsManager interface + virtual void notifyVideoExpose(); + virtual void notifyResize(const uint width, const uint height); + virtual void transformMouseCoordinates(Common::Point &point); + virtual void notifyMousePos(Common::Point mouse); + protected: virtual void internUpdateScreen(); diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp new file mode 100644 index 0000000000..2eca4b8aab --- /dev/null +++ b/backends/graphics/sdl/sdl-graphics.cpp @@ -0,0 +1,35 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "backends/graphics/sdl/sdl-graphics.h" + +#include "backends/events/sdl/sdl-events.h" + +SdlGraphicsManager::SdlGraphicsManager(SdlEventSource *source) + : _eventSource(source) { + _eventSource->setGraphicsManager(this); +} + +SdlGraphicsManager::~SdlGraphicsManager() { + _eventSource->setGraphicsManager(0); +} + diff --git a/backends/graphics/sdl/sdl-graphics.h b/backends/graphics/sdl/sdl-graphics.h new file mode 100644 index 0000000000..b42eafdaa5 --- /dev/null +++ b/backends/graphics/sdl/sdl-graphics.h @@ -0,0 +1,86 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef BACKENDS_GRAPHICS_SDL_SDLGRAPHICS_H +#define BACKENDS_GRAPHICS_SDL_SDLGRAPHICS_H + +#include "common/rect.h" + +class SdlEventSource; + +/** + * Base class for a SDL based graphics manager. + * + * It features a few extra a few extra features required by SdlEventSource. + * FIXME/HACK: + * Note it does not inherit from GraphicsManager to avoid a diamon inheritance + * in the current OpenGLSdlGraphicsManager. + */ +class SdlGraphicsManager { +public: + SdlGraphicsManager(SdlEventSource *source); + virtual ~SdlGraphicsManager(); + + /** + * Notify the graphics manager that the graphics needs to be redrawn, since + * the application window was modified. + * + * This is basically called when SDL_VIDEOEXPOSE was received. + */ + virtual void notifyVideoExpose() = 0; + + /** + * Notify the graphics manager about an resize event. + * + * It is noteworthy that the requested width/height should actually be set + * up as is and not changed by the graphics manager, since else it might + * lead to odd behavior for certain window managers. + * + * It is only required to overwrite this method in case you want a + * resizable window. The default implementation just does nothing. + * + * @param width Requested window width. + * @param height Requested window height. + */ + virtual void notifyResize(const uint width, const uint height) {} + + /** + * Transforms real screen coordinates into the current active screen + * coordinates (may be either game screen or overlay). + * + * @param point Mouse coordinates to transform. + */ + virtual void transformMouseCoordinates(Common::Point &point) = 0; + + /** + * Notifies the graphics manager about a position change according to the + * real screen coordinates. + * + * @param mouse Mouse position. + */ + virtual void notifyMousePos(Common::Point mouse) = 0; + +protected: + SdlEventSource *_eventSource; +}; + +#endif diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index 2d41ecead4..81c439e7e2 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -122,7 +122,7 @@ static AspectRatio getDesiredAspectRatio() { SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource) : - _sdlEventSource(sdlEventSource), + SdlGraphicsManager(sdlEventSource), #ifdef USE_OSD _osdSurface(0), _osdAlpha(SDL_ALPHA_TRANSPARENT), _osdFadeStartTime(0), #endif @@ -846,7 +846,7 @@ bool SurfaceSdlGraphicsManager::loadGFXMode() { SDL_SetColorKey(_osdSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, kOSDColorKey); #endif - _sdlEventSource->resetKeyboadEmulation( + _eventSource->resetKeyboadEmulation( _videoMode.screenWidth * _videoMode.scaleFactor - 1, effectiveScreenHeight() - 1); @@ -2235,20 +2235,6 @@ bool SurfaceSdlGraphicsManager::isScalerHotkey(const Common::Event &event) { return false; } -void SurfaceSdlGraphicsManager::adjustMouseEvent(const Common::Event &event) { - if (!event.synthetic) { - Common::Event newEvent(event); - newEvent.synthetic = true; - if (!_overlayVisible) { - newEvent.mouse.x /= _videoMode.scaleFactor; - newEvent.mouse.y /= _videoMode.scaleFactor; - if (_videoMode.aspectRatioCorrection) - newEvent.mouse.y = aspect2Real(newEvent.mouse.y); - } - g_system->getEventManager()->pushEvent(newEvent); - } -} - void SurfaceSdlGraphicsManager::toggleFullScreen() { beginGFXTransaction(); setFullscreenMode(!_videoMode.fullscreen); @@ -2297,26 +2283,10 @@ bool SurfaceSdlGraphicsManager::notifyEvent(const Common::Event &event) { if (handleScalerHotkeys(event.kbd.keycode)) return true; } + case Common::EVENT_KEYUP: return isScalerHotkey(event); - case Common::EVENT_MOUSEMOVE: - if (event.synthetic) - setMousePos(event.mouse.x, event.mouse.y); - case Common::EVENT_LBUTTONDOWN: - case Common::EVENT_RBUTTONDOWN: - case Common::EVENT_WHEELUP: - case Common::EVENT_WHEELDOWN: - case Common::EVENT_MBUTTONDOWN: - case Common::EVENT_LBUTTONUP: - case Common::EVENT_RBUTTONUP: - case Common::EVENT_MBUTTONUP: - adjustMouseEvent(event); - return !event.synthetic; - - // HACK: Handle special SDL event - case OSystem_SDL::kSdlEventExpose: - _forceFull = true; - return false; + default: break; } @@ -2324,4 +2294,22 @@ bool SurfaceSdlGraphicsManager::notifyEvent(const Common::Event &event) { return false; } +void SurfaceSdlGraphicsManager::notifyVideoExpose() { + _forceFull = true; +} + +void SurfaceSdlGraphicsManager::transformMouseCoordinates(Common::Point &point) { + if (!_overlayVisible) { + point.x /= _videoMode.scaleFactor; + point.y /= _videoMode.scaleFactor; + if (_videoMode.aspectRatioCorrection) + point.y = aspect2Real(point.y); + } +} + +void SurfaceSdlGraphicsManager::notifyMousePos(Common::Point mouse) { + transformMouseCoordinates(mouse); + setMousePos(mouse.x, mouse.y); +} + #endif diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.h b/backends/graphics/surfacesdl/surfacesdl-graphics.h index cd8710d443..f71096d43e 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.h +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.h @@ -24,6 +24,7 @@ #define BACKENDS_GRAPHICS_SURFACESDL_GRAPHICS_H #include "backends/graphics/graphics.h" +#include "backends/graphics/sdl/sdl-graphics.h" #include "graphics/pixelformat.h" #include "graphics/scaler.h" #include "common/events.h" @@ -74,7 +75,7 @@ public: /** * SDL graphics manager */ -class SurfaceSdlGraphicsManager : public GraphicsManager, public Common::EventObserver { +class SurfaceSdlGraphicsManager : public GraphicsManager, public SdlGraphicsManager, public Common::EventObserver { public: SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSource); virtual ~SurfaceSdlGraphicsManager(); @@ -140,9 +141,12 @@ public: // Override from Common::EventObserver bool notifyEvent(const Common::Event &event); -protected: - SdlEventSource *_sdlEventSource; + // SdlGraphicsManager interface + virtual void notifyVideoExpose(); + virtual void transformMouseCoordinates(Common::Point &point); + virtual void notifyMousePos(Common::Point mouse); +protected: #ifdef USE_OSD /** Surface containing the OSD message */ SDL_Surface *_osdSurface; @@ -329,7 +333,6 @@ protected: virtual bool handleScalerHotkeys(Common::KeyCode key); virtual bool isScalerHotkey(const Common::Event &event); - virtual void adjustMouseEvent(const Common::Event &event); virtual void setMousePos(int x, int y); virtual void toggleFullScreen(); virtual bool saveScreenshot(const char *filename); diff --git a/backends/graphics/wincesdl/wincesdl-graphics.cpp b/backends/graphics/wincesdl/wincesdl-graphics.cpp index b1b4d4cbe7..b0cbb872b0 100644 --- a/backends/graphics/wincesdl/wincesdl-graphics.cpp +++ b/backends/graphics/wincesdl/wincesdl-graphics.cpp @@ -1158,22 +1158,17 @@ void WINCESdlGraphicsManager::setMouseCursor(const byte *buf, uint w, uint h, in } } -void WINCESdlGraphicsManager::adjustMouseEvent(const Common::Event &event) { - if (!event.synthetic) { - Common::Event newEvent(event); - newEvent.synthetic = true; - /* - if (!_overlayVisible) { - newEvent.mouse.x = newEvent.mouse.x * _scaleFactorXd / _scaleFactorXm; - newEvent.mouse.y = newEvent.mouse.y * _scaleFactorYd / _scaleFactorYm; - newEvent.mouse.x /= _videoMode.scaleFactor; - newEvent.mouse.y /= _videoMode.scaleFactor; - if (_videoMode.aspectRatioCorrection) - newEvent.mouse.y = aspect2Real(newEvent.mouse.y); - } - */ - g_system->getEventManager()->pushEvent(newEvent); +void WINCESdlGraphicsManager::transformMouseCoordinates(Common::Point &point) { + /* + if (!_overlayVisible) { + point.x = point.x * _scaleFactorXd / _scaleFactorXm; + point.y = point.y * _scaleFactorYd / _scaleFactorYm; + point.x /= _videoMode.scaleFactor; + point.y /= _videoMode.scaleFactor; + if (_videoMode.aspectRatioCorrection) + point.y = aspect2Real(point.y); } + */ } void WINCESdlGraphicsManager::setMousePos(int x, int y) { diff --git a/backends/graphics/wincesdl/wincesdl-graphics.h b/backends/graphics/wincesdl/wincesdl-graphics.h index c9fc145194..edf3cc5769 100644 --- a/backends/graphics/wincesdl/wincesdl-graphics.h +++ b/backends/graphics/wincesdl/wincesdl-graphics.h @@ -158,8 +158,9 @@ public: static zoneDesc _zones[TOTAL_ZONES]; -protected: - virtual void adjustMouseEvent(const Common::Event &event); + virtual void transformMouseCoordinates(Common::Point &point); + + virtual void transformMouseCoordinates(Common::Point &point); private: bool update_scalers(); diff --git a/backends/module.mk b/backends/module.mk index 0e944262f5..7a8aab8b6a 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -61,6 +61,7 @@ endif ifdef SDL_BACKEND MODULE_OBJS += \ events/sdl/sdl-events.o \ + graphics/sdl/sdl-graphics.o \ graphics/surfacesdl/surfacesdl-graphics.o \ mixer/doublebuffersdl/doublebuffersdl-mixer.o \ mixer/sdl/sdl-mixer.o \ diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index e72b95bdc1..63871f5034 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -174,7 +174,7 @@ void OSystem_SDL::initBackend() { // If the gfx_mode is from OpenGL, create the OpenGL graphics manager if (use_opengl) { - _graphicsManager = new OpenGLSdlGraphicsManager(); + _graphicsManager = new OpenGLSdlGraphicsManager(_eventSource); graphicsManagerType = 1; } } @@ -538,7 +538,7 @@ bool OSystem_SDL::setGraphicsMode(int mode) { } else if (_graphicsMode < _sdlModesCount && mode >= _sdlModesCount) { debug(1, "switching to OpenGL graphics"); delete _graphicsManager; - _graphicsManager = new OpenGLSdlGraphicsManager(); + _graphicsManager = new OpenGLSdlGraphicsManager(_eventSource); ((OpenGLSdlGraphicsManager *)_graphicsManager)->initEventObserver(); _graphicsManager->beginGFXTransaction(); } diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 395b2b3aac..22d79dbfe7 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -74,12 +74,6 @@ public: virtual void getTimeAndDate(TimeDate &td) const; virtual Audio::Mixer *getMixer(); - // HACK: Special SDL events types - enum SdlEvent { - kSdlEventExpose = 100, - kSdlEventResize = 101 - }; - protected: bool _inited; bool _initedSDL; diff --git a/base/main.cpp b/base/main.cpp index 717ccb3344..780015d307 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -419,6 +419,10 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) { // Try to run the game Common::Error result = runGame(plugin, system, specialDebug); + // Flush Event recorder file. The recorder does not get reinitialized for next game + // which is intentional. Only single game per session is allowed. + g_eventRec.deinit(); + #if defined(UNCACHED_PLUGINS) && defined(DYNAMIC_MODULES) // do our best to prevent fragmentation by unloading as soon as we can PluginManager::instance().unloadPluginsExcept(PLUGIN_TYPE_ENGINE, NULL, false); diff --git a/common/EventDispatcher.cpp b/common/EventDispatcher.cpp index ce1ef0c1c8..4e3f671cfd 100644 --- a/common/EventDispatcher.cpp +++ b/common/EventDispatcher.cpp @@ -45,6 +45,8 @@ EventDispatcher::~EventDispatcher() { void EventDispatcher::dispatch() { Event event; + dispatchPoll(); + for (List<SourceEntry>::iterator i = _sources.begin(); i != _sources.end(); ++i) { const bool allowMapping = i->source->allowMapping(); @@ -94,12 +96,13 @@ void EventDispatcher::unregisterSource(EventSource *source) { } } -void EventDispatcher::registerObserver(EventObserver *obs, uint priority, bool autoFree) { +void EventDispatcher::registerObserver(EventObserver *obs, uint priority, bool autoFree, bool notifyPoll) { ObserverEntry newEntry; newEntry.observer = obs; newEntry.priority = priority; newEntry.autoFree = autoFree; + newEntry.poll = notifyPoll; for (List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) { if (i->priority < priority) { @@ -130,4 +133,12 @@ void EventDispatcher::dispatchEvent(const Event &event) { } } +void EventDispatcher::dispatchPoll() { + for (List<ObserverEntry>::iterator i = _observers.begin(); i != _observers.end(); ++i) { + if (i->poll == true) + if (i->observer->notifyPoll()) + break; + } +} + } // End of namespace Common diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp index 201043f52e..cf3c8b391f 100644 --- a/common/EventRecorder.cpp +++ b/common/EventRecorder.cpp @@ -34,7 +34,28 @@ DECLARE_SINGLETON(EventRecorder); #define RECORD_SIGNATURE 0x54455354 #define RECORD_VERSION 1 -void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) { +uint32 readTime(ReadStream *inFile) { + uint32 d = inFile->readByte(); + if (d == 0xff) { + d = inFile->readUint32LE(); + } + + return d; +} + +void writeTime(WriteStream *outFile, uint32 d) { + //Simple RLE compression + if (d >= 0xff) { + outFile->writeByte(0xff); + outFile->writeUint32LE(d); + } else { + outFile->writeByte(d); + } +} + +void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event, uint32 &millis) { + millis = readTime(inFile); + diff = inFile->readUint32LE(); event.type = (EventType)inFile->readUint32LE(); @@ -53,6 +74,8 @@ void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) { case EVENT_RBUTTONUP: case EVENT_WHEELUP: case EVENT_WHEELDOWN: + case EVENT_MBUTTONDOWN: + case EVENT_MBUTTONUP: event.mouse.x = inFile->readSint16LE(); event.mouse.y = inFile->readSint16LE(); break; @@ -61,7 +84,9 @@ void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) { } } -void writeRecord(WriteStream *outFile, uint32 diff, const Event &event) { +void writeRecord(WriteStream *outFile, uint32 diff, const Event &event, uint32 millis) { + writeTime(outFile, millis); + outFile->writeUint32LE(diff); outFile->writeUint32LE((uint32)event.type); @@ -80,6 +105,8 @@ void writeRecord(WriteStream *outFile, uint32 diff, const Event &event) { case EVENT_RBUTTONUP: case EVENT_WHEELUP: case EVENT_WHEELDOWN: + case EVENT_MBUTTONDOWN: + case EVENT_MBUTTONUP: outFile->writeSint16LE(event.mouse.x); outFile->writeSint16LE(event.mouse.y); break; @@ -99,6 +126,7 @@ EventRecorder::EventRecorder() { _eventCount = 0; _lastEventCount = 0; _lastMillis = 0; + _lastEventMillis = 0; _recordMode = kPassthrough; } @@ -111,11 +139,15 @@ void EventRecorder::init() { String recordModeString = ConfMan.get("record_mode"); if (recordModeString.compareToIgnoreCase("record") == 0) { _recordMode = kRecorderRecord; + + debug(3, "EventRecorder: record"); } else { if (recordModeString.compareToIgnoreCase("playback") == 0) { _recordMode = kRecorderPlayback; + debug(3, "EventRecorder: playback"); } else { _recordMode = kPassthrough; + debug(3, "EventRecorder: passthrough"); } } @@ -173,6 +205,7 @@ void EventRecorder::init() { _recordCount = _playbackFile->readUint32LE(); _recordTimeCount = _playbackFile->readUint32LE(); + randomSourceCount = _playbackFile->readUint32LE(); for (uint i = 0; i < randomSourceCount; ++i) { RandomSourceRecord rec; @@ -190,10 +223,12 @@ void EventRecorder::init() { } g_system->getEventManager()->getEventDispatcher()->registerSource(this, false); - g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 1, false); + g_system->getEventManager()->getEventDispatcher()->registerObserver(this, EventManager::kEventRecorderPriority, false, true); } void EventRecorder::deinit() { + debug(3, "EventRecorder: deinit"); + g_system->getEventManager()->getEventDispatcher()->unregisterSource(this); g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this); @@ -236,8 +271,9 @@ void EventRecorder::deinit() { for (uint i = 0; i < _recordCount; ++i) { uint32 tempDiff; Event tempEvent; - readRecord(_playbackFile, tempDiff, tempEvent); - writeRecord(_recordFile, tempDiff, tempEvent); + uint32 millis; + readRecord(_playbackFile, tempDiff, tempEvent, millis); + writeRecord(_recordFile, tempDiff, tempEvent, millis); } _recordFile->finalize(); @@ -278,23 +314,16 @@ void EventRecorder::processMillis(uint32 &millis) { g_system->lockMutex(_timeMutex); if (_recordMode == kRecorderRecord) { - //Simple RLE compression d = millis - _lastMillis; - if (d >= 0xff) { - _recordTimeFile->writeByte(0xff); - _recordTimeFile->writeUint32LE(d); - } else { - _recordTimeFile->writeByte(d); - } + writeTime(_recordTimeFile, d); + _recordTimeCount++; } if (_recordMode == kRecorderPlayback) { if (_recordTimeCount > _playbackTimeCount) { - d = _playbackTimeFile->readByte(); - if (d == 0xff) { - d = _playbackTimeFile->readUint32LE(); - } + d = readTime(_playbackTimeFile); + millis = _lastMillis + d; _playbackTimeCount++; } @@ -315,15 +344,27 @@ bool EventRecorder::notifyEvent(const Event &ev) { StackLock lock(_recorderMutex); ++_eventCount; - writeRecord(_recordFile, _eventCount - _lastEventCount, ev); + writeRecord(_recordFile, _eventCount - _lastEventCount, ev, _lastMillis - _lastEventMillis); _recordCount++; _lastEventCount = _eventCount; + _lastEventMillis = _lastMillis; + + return false; +} + +bool EventRecorder::notifyPoll() { + if (_recordMode != kRecorderRecord) + return false; + + ++_eventCount; return false; } bool EventRecorder::pollEvent(Event &ev) { + uint32 millis; + if (_recordMode != kRecorderPlayback) return false; @@ -332,7 +373,7 @@ bool EventRecorder::pollEvent(Event &ev) { if (!_hasPlaybackEvent) { if (_recordCount > _playbackCount) { - readRecord(_playbackFile, const_cast<uint32&>(_playbackDiff), _playbackEvent); + readRecord(_playbackFile, const_cast<uint32&>(_playbackDiff), _playbackEvent, millis); _playbackCount++; _hasPlaybackEvent = true; } diff --git a/common/EventRecorder.h b/common/EventRecorder.h index e20419695a..43a08b08cd 100644 --- a/common/EventRecorder.h +++ b/common/EventRecorder.h @@ -61,6 +61,7 @@ public: private: bool notifyEvent(const Event &ev); + bool notifyPoll(); bool pollEvent(Event &ev); bool allowMapping() const { return false; } @@ -75,6 +76,7 @@ private: volatile uint32 _recordCount; volatile uint32 _lastRecordEvent; volatile uint32 _recordTimeCount; + volatile uint32 _lastEventMillis; WriteStream *_recordFile; WriteStream *_recordTimeFile; MutexRef _timeMutex; diff --git a/common/events.h b/common/events.h index 7df2731687..f5ace7481b 100644 --- a/common/events.h +++ b/common/events.h @@ -184,6 +184,14 @@ public: * false otherwise. */ virtual bool notifyEvent(const Event &event) = 0; + + /** + * Notifies the observer of pollEvent() query. + * + * @return true if the event should not be passed to other observers, + * false otherwise. + */ + virtual bool notifyPoll() { return false; } }; /** @@ -255,8 +263,11 @@ public: /** * Registers a new EventObserver with the Dispatcher. + * + * @param listenPools if set, then all pollEvent() calls are passed to observer + * currently it is used by keyMapper */ - void registerObserver(EventObserver *obs, uint priority, bool autoFree); + void registerObserver(EventObserver *obs, uint priority, bool autoFree, bool listenPolls = false); /** * Unregisters a EventObserver. @@ -280,11 +291,13 @@ private: struct ObserverEntry : public Entry { uint priority; EventObserver *observer; + bool poll; }; List<ObserverEntry> _observers; void dispatchEvent(const Event &event); + void dispatchPoll(); }; class Keymapper; @@ -370,7 +383,12 @@ public: * Priority of the event manager, for now it's lowest since it eats * *all* events, we might to change that in the future though. */ - kEventManPriority = 0 + kEventManPriority = 0, + /** + * Priority of the event recorder. It has to go after event manager + * in order to record events generated by it + */ + kEventRecorderPriority = 1 }; /** @@ -193,7 +193,6 @@ _posix=no _endian=unknown _need_memalign=yes _have_x86=no -_arm_asm=no @@ -1157,12 +1156,12 @@ ps3) _host_os=ps3 _host_cpu=ppc _host_alias=powerpc64-ps3-elf - + # The prefix is always the same on PS3 so we hardcode the default # here. It is still possible to define a custom prefix which is # needed when packaging the app with a user-specific app ID. test "x$prefix" = xNONE && prefix=/dev_hdd0/game/SCUM12000/USRDIR - # PS3 apps are installed into app-specific directories. The + # PS3 apps are installed into app-specific directories. The # default directory structure of ScummVM makes no sense here so we # hardcode PS3 specific directories here. datarootdir='${prefix}/data' @@ -1187,7 +1186,7 @@ webos) # here. It is still possible to define a custom prefix which is # needed when packaging the app with a user-specific app ID. test "x$prefix" = xNONE && prefix=/media/cryptofs/apps/usr/palm/applications/org.scummvm.scummvm - # WebOS apps are installed into app-specific directories. The + # WebOS apps are installed into app-specific directories. The # default directory structure of ScummVM makes no sense here so we # hardcode WebOS specific directories here. datarootdir='${prefix}/data' @@ -1686,38 +1685,40 @@ echo "$_need_memalign" define_in_config_h_if_yes $_need_memalign 'SCUMM_NEED_ALIGNMENT' # -# Check whether we can use x86 asm routines +# Check the CPU architecture # -echo_n "Compiling for x86... " +echo_n "Checking host CPU architecture... " case $_host_cpu in - i386|i486|i586|i686) + arm*) + echo "ARM" + define_in_config_if_yes yes 'USE_ARM_SCALER_ASM' + define_in_config_if_yes yes 'USE_ARM_SOUND_ASM' + define_in_config_if_yes yes 'USE_ARM_SMUSH_ASM' + define_in_config_if_yes yes 'USE_ARM_GFX_ASM' + define_in_config_if_yes yes 'USE_ARM_COSTUME_ASM' + + DEFINES="$DEFINES -DARM_TARGET" + ;; + i[3-6]86) + echo "x86" _have_x86=yes + define_in_config_h_if_yes $_have_x86 'HAVE_X86' ;; - *) - _have_x86=no + mips*) + echo "MIPS" + DEFINES="$DEFINES -DMIPS_TARGET" ;; -esac -echo "$_have_x86" -define_in_config_h_if_yes $_have_x86 'HAVE_X86' - -# -# Check whether to use optimized ARM asm -# -echo_n "Compiling for ARM... " -case $_host_cpu in - arm*) - _arm_asm=yes + ppc*) + echo "PowerPC" + DEFINES="$DEFINES -DPPC_TARGET" + ;; + x86_64) + echo "x86_64" ;; *) - _arm_asm=no + echo "unknown ($_host_cpu)" ;; esac -echo "$_arm_asm" -define_in_config_if_yes "$_arm_asm" 'USE_ARM_SCALER_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_SOUND_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_SMUSH_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_GFX_ASM' -define_in_config_if_yes "$_arm_asm" 'USE_ARM_COSTUME_ASM' # @@ -1901,7 +1902,7 @@ case $_host_os in ps3) # Force use of SDL from the ps3 toolchain _sdlpath="$PS3DEV/portlibs/ppu:$PS3DEV/portlibs/ppu/bin" - + DEFINES="$DEFINES -DPLAYSTATION3" CXXFLAGS="$CXXFLAGS -mcpu=cell -mminimal-toc -I$PS3DEV/psl1ght/ppu/include -I$PS3DEV/portlibs/ppu/include" LDFLAGS="$LDFLAGS -L$PS3DEV/psl1ght/ppu/lib -L$PS3DEV/portlibs/ppu/lib" @@ -2097,7 +2098,7 @@ if test -n "$_host"; then ;; gp2x) # This uses the GPH backend. - DEFINES="$DEFINES -DGPH_DEVICE" + DEFINES="$DEFINES -DGPH_DEVICE" DEFINES="$DEFINES -DGP2X" DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE" if test "$_debug_build" = yes; then @@ -2580,7 +2581,9 @@ POST_OBJS_FLAGS := -Wl,--no-whole-archive ;; ds) _elf_loader=yes - DEFINES="$DEFINES -DARM_TARGET -DELF_LOADER_CXA_ATEXIT -DUNCACHED_PLUGINS -DELF_NO_MEM_MANAGER" + DEFINES="$DEFINES -DELF_LOADER_CXA_ATEXIT" + DEFINES="$DEFINES -DUNCACHED_PLUGINS" + DEFINES="$DEFINES -DELF_NO_MEM_MANAGER" _mak_plugins=' PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/ds/plugin.ld -mthumb-interwork -mno-fpu ' @@ -2598,7 +2601,8 @@ POST_OBJS_FLAGS := -Wl,-no-whole-archive ;; gamecube | wii) _elf_loader=yes - DEFINES="$DEFINES -DPPC_TARGET -DELF_LOADER_CXA_ATEXIT -DUNCACHED_PLUGINS" + DEFINES="$DEFINES -DELF_LOADER_CXA_ATEXIT" + DEFINES="$DEFINES -DUNCACHED_PLUGINS" _mak_plugins=' PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/wii/plugin.ld ' @@ -2651,7 +2655,6 @@ POST_OBJS_FLAGS := -Wl,--export-all-symbols -Wl,--no-whole-archive -Wl,--out-im ;; ps2) _elf_loader=yes - DEFINES="$DEFINES -DMIPS_TARGET" _mak_plugins=' LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/main_prog.ld PLUGIN_LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backends/plugins/ps2/plugin.ld -lstdc++ -lc @@ -2659,7 +2662,7 @@ PLUGIN_LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -Wl,-T$(srcdir)/backend ;; psp) _elf_loader=yes - DEFINES="$DEFINES -DMIPS_TARGET -DUNCACHED_PLUGINS" + DEFINES="$DEFINES -DUNCACHED_PLUGINS" _mak_plugins=' LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/psp/main_prog.ld PLUGIN_LDFLAGS += -Wl,-T$(srcdir)/backends/plugins/psp/plugin.ld -lstdc++ -lc @@ -3437,7 +3440,7 @@ case $_backend in LIBS="-Wl,-Bstatic $static_libs -Wl,-Bdynamic -lgcc $system_libs -llog -lGLESv1_CM" ;; n64) - # Move some libs down here, otherwise some symbols requires by libvorbis aren't found + # Move some libs down here, otherwise some symbols requires by libvorbis aren't found # during linking stage LIBS="$LIBS -lc -lgcc -lnosys" ;; @@ -3451,6 +3454,15 @@ _engines_built_static="" _engines_built_dynamic="" _engines_skipped="" +# Show a message if looping over engines takes longer than 5 secs +sh -c " + touch config.gnomes + sleep 5 + if test -f config.gnomes; then + printf 'Employing little gnomes...' + rm -f config.gnomes + fi" 2>/dev/null & + for engine in $_engines; do if test "`get_engine_sub $engine`" = "no" ; then # It's a main engine @@ -3515,6 +3527,14 @@ done add_to_config_h_if_yes `get_var _tainted_build` '#define TAINTED_BUILD' +# Complete the message on slow systems +if test -f config.gnomes ; then + # Kill does not work well here as it produces nasty 'Killed' message + rm -rf config.gnomes +else + echo " work is done" +fi + # # Show which engines ("frontends") are to be built # diff --git a/engines/agos/agos.h b/engines/agos/agos.h index b1d2e6d735..359dfd5ff1 100644 --- a/engines/agos/agos.h +++ b/engines/agos/agos.h @@ -56,7 +56,7 @@ class SeekableReadStream; } namespace Graphics { -class Surface; +struct Surface; } namespace AGOS { diff --git a/engines/sci/engine/seg_manager.cpp b/engines/sci/engine/seg_manager.cpp index ab67da32db..1510af8508 100644 --- a/engines/sci/engine/seg_manager.cpp +++ b/engines/sci/engine/seg_manager.cpp @@ -28,12 +28,6 @@ namespace Sci { -enum { - DEFAULT_SCRIPTS = 32, - DEFAULT_OBJECTS = 8, ///< default number of objects per script - DEFAULT_OBJECTS_INCREMENT = 4 ///< Number of additional objects to instantiate if we're running out of them -}; - SegManager::SegManager(ResourceManager *resMan) { _heap.push_back(0); diff --git a/engines/scumm/he/script_v100he.cpp b/engines/scumm/he/script_v100he.cpp index 5a9172ff8a..56ea10f507 100644 --- a/engines/scumm/he/script_v100he.cpp +++ b/engines/scumm/he/script_v100he.cpp @@ -542,7 +542,7 @@ void ScummEngine_v100he::o100_arrayOps() { int dim1end, dim1start, dim2end, dim2start; int id, len, b, c, list[128]; int offs, tmp, tmp2; - uint tmp3; + uint tmp3, type; byte subOp = fetchScriptByte(); int array = fetchScriptWord(); @@ -625,11 +625,10 @@ void ScummEngine_v100he::o100_arrayOps() { } break; case 132: - debug(0, "o100_arrayOps: case 132"); - // TODO: Used by Moonbase Commander + // TODO: Used by room 2 script 2180 in Moonbase Commander fetchScriptWord(); fetchScriptWord(); - pop(); + type = pop(); pop(); pop(); pop(); @@ -646,6 +645,21 @@ void ScummEngine_v100he::o100_arrayOps() { if (id == 0) { defineArray(array, kDwordArray, dim2start, dim2end, dim1start, dim1end); } + switch (type) { + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + default: + error("o100_arrayOps: case 132 unknown type %d)", type); + } + debug(0, "o100_arrayOps: case 132 type %d", type); break; case 133: b = pop(); diff --git a/engines/scumm/he/script_v80he.cpp b/engines/scumm/he/script_v80he.cpp index 7970d7806f..9711f6415b 100644 --- a/engines/scumm/he/script_v80he.cpp +++ b/engines/scumm/he/script_v80he.cpp @@ -171,7 +171,10 @@ void ScummEngine_v80he::o80_readConfigFile() { case 6: // number ConfFile.getKey((const char *)option, (const char *)section, entry); - push(atoi(entry.c_str())); + if (!strcmp((char *)option, "Benchmark")) + push(2); + else + push(atoi(entry.c_str())); break; case 77: // HE 100 case 7: // string diff --git a/engines/scumm/he/sprite_he.cpp b/engines/scumm/he/sprite_he.cpp index 0b37673e4a..081110c7cd 100644 --- a/engines/scumm/he/sprite_he.cpp +++ b/engines/scumm/he/sprite_he.cpp @@ -804,12 +804,18 @@ void Sprite::setSpriteImage(int spriteId, int imageNum) { if (_spriteTable[spriteId].image) { _spriteTable[spriteId].imageStateCount = _vm->_wiz->getWizImageStates(_spriteTable[spriteId].image); - _spriteTable[spriteId].flags |= kSFActive | kSFAutoAnim | kSFMarkDirty | kSFBlitDirectly; + + if (_vm->VAR(139)) + _spriteTable[spriteId].flags |= kSFActive; + else + _spriteTable[spriteId].flags |= kSFActive | kSFAutoAnim | kSFMarkDirty | kSFBlitDirectly; if (_spriteTable[spriteId].image != origResId || _spriteTable[spriteId].imageStateCount != origResWizStates) _spriteTable[spriteId].flags |= kSFChanged | kSFNeedRedraw; } else { - if (_spriteTable[spriteId].flags & kSFImageless) + if (_vm->VAR(139)) + _spriteTable[spriteId].flags &= ~kSFActive; + else if (_spriteTable[spriteId].flags & kSFImageless) _spriteTable[spriteId].flags = 0; else _spriteTable[spriteId].flags = kSFChanged | kSFBlitDirectly; diff --git a/engines/scumm/input.cpp b/engines/scumm/input.cpp index 5eea7acc6b..6d9e1f3f72 100644 --- a/engines/scumm/input.cpp +++ b/engines/scumm/input.cpp @@ -324,7 +324,17 @@ void ScummEngine::processInput() { VAR(VAR_LEFTBTN_HOLD) = (_leftBtnPressed & msDown) != 0; VAR(VAR_RIGHTBTN_HOLD) = (_rightBtnPressed & msDown) != 0; - if (_game.version >= 7) { + if (_game.heversion >= 72) { + // HE72 introduced a flag for whether or not this is a click + // or the player is continuing to hold the button down. + // 0x80 signifies that the button is continuing to be held down + // Backyard Soccer needs this in order to function + if (VAR(VAR_LEFTBTN_HOLD) && !(_leftBtnPressed & msClicked)) + VAR(VAR_LEFTBTN_HOLD) |= 0x80; + + if (VAR(VAR_RIGHTBTN_HOLD) && !(_rightBtnPressed & msClicked)) + VAR(VAR_RIGHTBTN_HOLD) |= 0x80; + } else if (_game.version >= 7) { VAR(VAR_LEFTBTN_DOWN) = (_leftBtnPressed & msClicked) != 0; VAR(VAR_RIGHTBTN_DOWN) = (_rightBtnPressed & msClicked) != 0; } diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp index 33db70985d..50ae045052 100644 --- a/engines/scumm/sound.cpp +++ b/engines/scumm/sound.cpp @@ -1144,10 +1144,10 @@ int ScummEngine::readSoundResource(ResId idx) { break; } - // We only allow SPK resources for PC Speaker, PCJr and CMS here + // We only allow SPK resources for PC Speaker and PCJr here // since other resource would sound horribly with their output // drivers. - if ((_sound->_musicType == MDT_PCSPK || _sound->_musicType == MDT_PCJR || _sound->_musicType == MDT_CMS) && pri != 11) + if ((_sound->_musicType == MDT_PCSPK || _sound->_musicType == MDT_PCJR) && pri != 11) pri = -1; // We only allow ADL resources when AdLib or FM-Towns is used as diff --git a/engines/tinsel/adpcm.cpp b/engines/tinsel/adpcm.cpp index 4ea835586b..ca3150ca3d 100644 --- a/engines/tinsel/adpcm.cpp +++ b/engines/tinsel/adpcm.cpp @@ -61,7 +61,7 @@ void Tinsel_ADPCMStream::readBufferTinselHeader() { int16 Tinsel_ADPCMStream::decodeTinsel(int16 code, double eVal) { double sample; - sample = (double) code; + sample = (double)code; sample *= eVal * _status.predictor; sample += (_status.d0 * _status.K0) + (_status.d1 * _status.K1); |