From f59512c47ea21c851535eeabf822aabdfde9167f Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Fri, 17 May 2013 00:18:09 +0300 Subject: RECORDER: Implement Events Recorder --- backends/events/default/default-events.cpp | 3 +- backends/events/sdl/sdl-events.cpp | 4 +- .../graphics/surfacesdl/surfacesdl-graphics.cpp | 30 +++++++-- backends/graphics/surfacesdl/surfacesdl-graphics.h | 3 + backends/mixer/nullmixer/nullsdl-mixer.cpp | 75 ++++++++++++++++++++++ backends/mixer/nullmixer/nullsdl-mixer.h | 62 ++++++++++++++++++ backends/modular-backend.cpp | 3 + backends/module.mk | 8 ++- backends/mutex/sdl/sdl-mutex.cpp | 6 +- backends/platform/android/android.cpp | 2 +- backends/platform/android/android.h | 2 +- backends/platform/bada/system.cpp | 2 +- backends/platform/bada/system.h | 2 +- backends/platform/dc/dc.h | 2 +- backends/platform/dc/time.cpp | 2 +- backends/platform/ds/arm9/source/dsmain.cpp | 2 +- backends/platform/ds/arm9/source/dsmain.h | 2 +- backends/platform/ds/arm9/source/osystem_ds.cpp | 2 +- backends/platform/ds/arm9/source/osystem_ds.h | 2 +- backends/platform/iphone/osys_main.cpp | 2 +- backends/platform/iphone/osys_main.h | 2 +- backends/platform/n64/osys_n64.h | 2 +- backends/platform/n64/osys_n64_base.cpp | 2 +- backends/platform/null/null.cpp | 2 +- backends/platform/ps2/systemps2.cpp | 2 +- backends/platform/ps2/systemps2.h | 2 +- backends/platform/psp/osys_psp.cpp | 2 +- backends/platform/psp/osys_psp.h | 2 +- backends/platform/psp/rtc.cpp | 2 +- backends/platform/psp/rtc.h | 2 +- backends/platform/sdl/sdl.cpp | 28 ++++---- backends/platform/sdl/sdl.h | 3 +- backends/platform/wii/osystem.cpp | 2 +- backends/platform/wii/osystem.h | 2 +- backends/saves/recorder/recorder-saves.cpp | 35 ++++++++++ backends/saves/recorder/recorder-saves.h | 36 +++++++++++ backends/timer/default/default-timer.cpp | 2 +- 37 files changed, 297 insertions(+), 47 deletions(-) create mode 100644 backends/mixer/nullmixer/nullsdl-mixer.cpp create mode 100644 backends/mixer/nullmixer/nullsdl-mixer.h create mode 100644 backends/saves/recorder/recorder-saves.cpp create mode 100644 backends/saves/recorder/recorder-saves.h (limited to 'backends') diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp index 38a0c8d46f..bf76bbc1cb 100644 --- a/backends/events/default/default-events.cpp +++ b/backends/events/default/default-events.cpp @@ -84,7 +84,8 @@ void DefaultEventManager::init() { } bool DefaultEventManager::pollEvent(Common::Event &event) { - uint32 time = g_system->getMillis(); + // Skip recording of these events + uint32 time = g_system->getMillis(true); bool result = false; _dispatcher.dispatch(); diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp index 0ca5bbb059..e2ef7f6bf6 100644 --- a/backends/events/sdl/sdl-events.cpp +++ b/backends/events/sdl/sdl-events.cpp @@ -106,7 +106,9 @@ void SdlEventSource::processMouseEvent(Common::Event &event, int x, int y) { } void SdlEventSource::handleKbdMouse() { - uint32 curTime = g_system->getMillis(); + // Skip recording of these events + uint32 curTime = g_system->getMillis(true); + if (curTime >= _km.last_time + _km.delay_time) { _km.last_time = curTime; if (_km.x_down_count == 1) { diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index 02e58ab319..e174a6e807 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -40,6 +40,7 @@ #include "graphics/scaler.h" #include "graphics/scaler/aspect.h" #include "graphics/surface.h" +#include "gui/EventRecorder.h" static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { {"1x", _s("Normal (no scaling)"), GFX_NORMAL}, @@ -135,6 +136,7 @@ SurfaceSdlGraphicsManager::SurfaceSdlGraphicsManager(SdlEventSource *sdlEventSou _paletteDirtyStart(0), _paletteDirtyEnd(0), _screenIsLocked(false), _graphicsMutex(0), + _displayDisabled(false), #ifdef USE_SDL_DEBUG_FOCUSRECT _enableFocusRectDebugCode(false), _enableFocusRect(false), _focusRect(), #endif @@ -765,9 +767,20 @@ bool SurfaceSdlGraphicsManager::loadGFXMode() { fixupResolutionForAspectRatio(_videoMode.desiredAspectRatio, _videoMode.hardwareWidth, _videoMode.hardwareHeight); } - _hwscreen = SDL_SetVideoMode(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 16, - _videoMode.fullscreen ? (SDL_FULLSCREEN|SDL_SWSURFACE) : SDL_SWSURFACE - ); + +#ifdef ENABLE_KEYMAPPER + _displayDisabled = ConfMan.getBool("disable_display"); + + if (_displayDisabled) { + _hwscreen = g_eventRec.getSurface(_videoMode.hardwareWidth, _videoMode.hardwareHeight); + } else +#endif + { + _hwscreen = SDL_SetVideoMode(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 16, + _videoMode.fullscreen ? (SDL_FULLSCREEN|SDL_SWSURFACE) : SDL_SWSURFACE + ); + } + #ifdef USE_RGB_COLOR detectSupportedFormats(); #endif @@ -865,7 +878,12 @@ void SurfaceSdlGraphicsManager::unloadGFXMode() { } if (_hwscreen) { - SDL_FreeSurface(_hwscreen); + if (_displayDisabled) { + delete _hwscreen; + } else { + SDL_FreeSurface(_hwscreen); + } + _hwscreen = NULL; } @@ -1188,7 +1206,9 @@ void SurfaceSdlGraphicsManager::internUpdateScreen() { #endif // Finally, blit all our changes to the screen - SDL_UpdateRects(_hwscreen, _numDirtyRects, _dirtyRectList); + if (!_displayDisabled) { + SDL_UpdateRects(_hwscreen, _numDirtyRects, _dirtyRectList); + } } _numDirtyRects = 0; diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.h b/backends/graphics/surfacesdl/surfacesdl-graphics.h index 21444cc25d..97de0f9c97 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.h +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.h @@ -232,6 +232,9 @@ protected: int _scalerType; int _transactionMode; + // Indicates whether it is needed to free _hwsurface in destructor + bool _displayDisabled; + bool _screenIsLocked; Graphics::Surface _framebuffer; diff --git a/backends/mixer/nullmixer/nullsdl-mixer.cpp b/backends/mixer/nullmixer/nullsdl-mixer.cpp new file mode 100644 index 0000000000..2fd652e19f --- /dev/null +++ b/backends/mixer/nullmixer/nullsdl-mixer.cpp @@ -0,0 +1,75 @@ +/* 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/mixer/nullmixer/nullsdl-mixer.h" +#include "common/savefile.h" + +NullSdlMixerManager::NullSdlMixerManager() : SdlMixerManager() { + _outputRate = 22050; + _callsCounter = 0; + _callbackPeriod = 10; + _samples = 8192; + while (_samples * 16 > _outputRate * 2) + _samples >>= 1; + _samplesBuf = new uint8[_samples * 4]; +} + +NullSdlMixerManager::~NullSdlMixerManager() { + delete _samplesBuf; +} + +void NullSdlMixerManager::init() { + _mixer = new Audio::MixerImpl(g_system, _outputRate); + assert(_mixer); + _mixer->setReady(true); +} + +void NullSdlMixerManager::suspendAudio() { + _audioSuspended = true; +} + +int NullSdlMixerManager::resumeAudio() { + if (!_audioSuspended) { + return -2; + } + _audioSuspended = false; + return 0; +} + + +void NullSdlMixerManager::startAudio() { +} + +void NullSdlMixerManager::callbackHandler(byte *samples, int len) { + assert(_mixer); + _mixer->mixCallback(samples, len); +} + +void NullSdlMixerManager::update() { + if (_audioSuspended) { + return; + } + _callsCounter++; + if ((_callsCounter % _callbackPeriod) == 0) { + callbackHandler(_samplesBuf, _samples); + } +} diff --git a/backends/mixer/nullmixer/nullsdl-mixer.h b/backends/mixer/nullmixer/nullsdl-mixer.h new file mode 100644 index 0000000000..94248ced66 --- /dev/null +++ b/backends/mixer/nullmixer/nullsdl-mixer.h @@ -0,0 +1,62 @@ +/* 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_MIXER_NULLSDL_H +#define BACKENDS_MIXER_NULLSDL_H + +#include "backends/mixer/sdl/sdl-mixer.h" +#include "common/str.h" + +/** Audio mixer which in fact does not output audio. + * + * It is used by events recorder since the recorder is intentionally + * turning sound off to avoid stuttering. + * + * It returns correct output and shoots callbacks, so all OSystem + * users could work without modifications. + */ + +class NullSdlMixerManager : public SdlMixerManager { +public: + NullSdlMixerManager(); + virtual ~NullSdlMixerManager(); + + virtual void init(); + void update(); + + virtual void suspendAudio(); + virtual int resumeAudio(); + +protected: + + virtual void startAudio(); + virtual void callbackHandler(byte *samples, int len); + +private: + uint32 _outputRate; + uint32 _callsCounter; + uint8 _callbackPeriod; + uint32 _samples; + uint8 *_samplesBuf; +}; + +#endif diff --git a/backends/modular-backend.cpp b/backends/modular-backend.cpp index b46f33a2bc..94d0595fea 100644 --- a/backends/modular-backend.cpp +++ b/backends/modular-backend.cpp @@ -26,6 +26,7 @@ #include "backends/graphics/graphics.h" #include "backends/mutex/mutex.h" +#include "gui/EventRecorder.h" #include "audio/mixer.h" #include "graphics/pixelformat.h" @@ -141,7 +142,9 @@ void ModularBackend::fillScreen(uint32 col) { } void ModularBackend::updateScreen() { + g_eventRec.preDrawOverlayGui(); _graphicsManager->updateScreen(); + g_eventRec.postDrawOverlayGui(); } void ModularBackend::setShakePos(int shakeOffset) { diff --git a/backends/module.mk b/backends/module.mk index a4f525d21d..12cdc3d029 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -70,7 +70,7 @@ MODULE_OBJS += \ mutex/sdl/sdl-mutex.o \ plugins/sdl/sdl-provider.o \ timer/sdl/sdl-timer.o - + # SDL 1.3 removed audio CD support ifndef USE_SDL13 MODULE_OBJS += \ @@ -214,5 +214,11 @@ MODULE_OBJS += \ plugins/wii/wii-provider.o endif +ifdef ENABLE_EVENTRECORDER +MODULE_OBJS += \ + mixer/nullmixer/nullsdl-mixer.o \ + saves/recorder/recorder-saves.o +endif + # Include common rules include $(srcdir)/rules.mk diff --git a/backends/mutex/sdl/sdl-mutex.cpp b/backends/mutex/sdl/sdl-mutex.cpp index 8491ae468c..a51e6f0e38 100644 --- a/backends/mutex/sdl/sdl-mutex.cpp +++ b/backends/mutex/sdl/sdl-mutex.cpp @@ -33,15 +33,15 @@ OSystem::MutexRef SdlMutexManager::createMutex() { } void SdlMutexManager::lockMutex(OSystem::MutexRef mutex) { - SDL_mutexP((SDL_mutex *) mutex); + SDL_mutexP((SDL_mutex *)mutex); } void SdlMutexManager::unlockMutex(OSystem::MutexRef mutex) { - SDL_mutexV((SDL_mutex *) mutex); + SDL_mutexV((SDL_mutex *)mutex); } void SdlMutexManager::deleteMutex(OSystem::MutexRef mutex) { - SDL_DestroyMutex((SDL_mutex *) mutex); + SDL_DestroyMutex((SDL_mutex *)mutex); } #endif diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index 0b31ee717c..e066ea0239 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -450,7 +450,7 @@ bool OSystem_Android::getFeatureState(Feature f) { } } -uint32 OSystem_Android::getMillis() { +uint32 OSystem_Android::getMillis(bool skipRecord) { timeval curTime; gettimeofday(&curTime, 0); diff --git a/backends/platform/android/android.h b/backends/platform/android/android.h index 5f2f40b726..b4813b3bdf 100644 --- a/backends/platform/android/android.h +++ b/backends/platform/android/android.h @@ -274,7 +274,7 @@ public: virtual void setCursorPalette(const byte *colors, uint start, uint num); virtual bool pollEvent(Common::Event &event); - virtual uint32 getMillis(); + virtual uint32 getMillis(bool skipRecord = false); virtual void delayMillis(uint msecs); virtual MutexRef createMutex(void); diff --git a/backends/platform/bada/system.cpp b/backends/platform/bada/system.cpp index 3f862c2571..5c3c25c63d 100644 --- a/backends/platform/bada/system.cpp +++ b/backends/platform/bada/system.cpp @@ -373,7 +373,7 @@ bool BadaSystem::pollEvent(Common::Event &event) { return _appForm->pollEvent(event); } -uint32 BadaSystem::getMillis() { +uint32 BadaSystem::getMillis(bool skipRecord) { long long result, ticks = 0; SystemTime::GetTicks(ticks); result = ticks - _epoch; diff --git a/backends/platform/bada/system.h b/backends/platform/bada/system.h index c28686cb3d..89394c58ec 100644 --- a/backends/platform/bada/system.h +++ b/backends/platform/bada/system.h @@ -83,7 +83,7 @@ private: void updateScreen(); bool pollEvent(Common::Event &event); - uint32 getMillis(); + uint32 getMillis(bool skipRecord = false); void delayMillis(uint msecs); void getTimeAndDate(TimeDate &t) const; void fatalError(); diff --git a/backends/platform/dc/dc.h b/backends/platform/dc/dc.h index d41839d961..d62ced02e1 100644 --- a/backends/platform/dc/dc.h +++ b/backends/platform/dc/dc.h @@ -151,7 +151,7 @@ public: void setShakePos(int shake_pos); // Get the number of milliseconds since the program was started. - uint32 getMillis(); + uint32 getMillis(bool skipRecord = false); // Delay for a specified amount of milliseconds void delayMillis(uint msecs); diff --git a/backends/platform/dc/time.cpp b/backends/platform/dc/time.cpp index 8cc3a71e8d..1e5f44ec85 100644 --- a/backends/platform/dc/time.cpp +++ b/backends/platform/dc/time.cpp @@ -26,7 +26,7 @@ #include "dc.h" -uint32 OSystem_Dreamcast::getMillis() +uint32 OSystem_Dreamcast::getMillis(bool skipRecord) { static uint32 msecs=0; static unsigned int t0=0; diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 830c782b90..9dc66e80d7 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -2280,7 +2280,7 @@ void VBlankHandler(void) { //REG_IF = IRQ_VBLANK; } -int getMillis() { +int getMillis(bool skipRecord) { return currentTimeMillis; // return frameCount * FRAME_TIME; } diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h index ad49ae276d..5e91fae13a 100644 --- a/backends/platform/ds/arm9/source/dsmain.h +++ b/backends/platform/ds/arm9/source/dsmain.h @@ -88,7 +88,7 @@ void setGamma(int gamma); // Timers void setTimerCallback(OSystem_DS::TimerProc proc, int interval); // Setup a callback function at a regular interval -int getMillis(); // Return the current runtime in milliseconds +int getMillis(bool skipRecord = false); // Return the current runtime in milliseconds void doTimerCallback(); // Call callback function if required // Sound diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index a4b9c842fc..2f6358d8ee 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -656,7 +656,7 @@ bool OSystem_DS::pollEvent(Common::Event &event) { return false; } -uint32 OSystem_DS::getMillis() { +uint32 OSystem_DS::getMillis(bool skipRecord) { return DS::getMillis(); } diff --git a/backends/platform/ds/arm9/source/osystem_ds.h b/backends/platform/ds/arm9/source/osystem_ds.h index a6001da764..4550e22b2c 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.h +++ b/backends/platform/ds/arm9/source/osystem_ds.h @@ -117,7 +117,7 @@ public: virtual void setMouseCursor(const void *buf, uint w, uint h, int hotspotX, int hotspotY, u32 keycolor, bool dontScale, const Graphics::PixelFormat *format); virtual bool pollEvent(Common::Event &event); - virtual uint32 getMillis(); + virtual uint32 getMillis(bool skipRecord = false); virtual void delayMillis(uint msecs); virtual void getTimeAndDate(TimeDate &t) const; diff --git a/backends/platform/iphone/osys_main.cpp b/backends/platform/iphone/osys_main.cpp index ed2c886213..460d3fd2ac 100644 --- a/backends/platform/iphone/osys_main.cpp +++ b/backends/platform/iphone/osys_main.cpp @@ -166,7 +166,7 @@ void OSystem_IPHONE::suspendLoop() { _timeSuspended += getMillis() - startTime; } -uint32 OSystem_IPHONE::getMillis() { +uint32 OSystem_IPHONE::getMillis(bool skipRecord) { //printf("getMillis()\n"); struct timeval currentTime; diff --git a/backends/platform/iphone/osys_main.h b/backends/platform/iphone/osys_main.h index 037125490d..811a8ddb2e 100644 --- a/backends/platform/iphone/osys_main.h +++ b/backends/platform/iphone/osys_main.h @@ -165,7 +165,7 @@ public: virtual void setCursorPalette(const byte *colors, uint start, uint num); virtual bool pollEvent(Common::Event &event); - virtual uint32 getMillis(); + virtual uint32 getMillis(bool skipRecord = false); virtual void delayMillis(uint msecs); virtual MutexRef createMutex(void); diff --git a/backends/platform/n64/osys_n64.h b/backends/platform/n64/osys_n64.h index bc6b3cb1a5..10138b230a 100644 --- a/backends/platform/n64/osys_n64.h +++ b/backends/platform/n64/osys_n64.h @@ -184,7 +184,7 @@ public: virtual void setCursorPalette(const byte *colors, uint start, uint num); virtual bool pollEvent(Common::Event &event); - virtual uint32 getMillis(); + virtual uint32 getMillis(bool skipRecord = false); virtual void delayMillis(uint msecs); virtual MutexRef createMutex(void); diff --git a/backends/platform/n64/osys_n64_base.cpp b/backends/platform/n64/osys_n64_base.cpp index 1e2aca9e51..afd93f5e09 100644 --- a/backends/platform/n64/osys_n64_base.cpp +++ b/backends/platform/n64/osys_n64_base.cpp @@ -810,7 +810,7 @@ void OSystem_N64::setMouseCursor(const void *buf, uint w, uint h, int hotspotX, return; } -uint32 OSystem_N64::getMillis() { +uint32 OSystem_N64::getMillis(bool skipRecord) { return getMilliTick(); } diff --git a/backends/platform/null/null.cpp b/backends/platform/null/null.cpp index 4690a67c55..9e05539799 100644 --- a/backends/platform/null/null.cpp +++ b/backends/platform/null/null.cpp @@ -49,7 +49,7 @@ public: virtual bool pollEvent(Common::Event &event); - virtual uint32 getMillis(); + virtual uint32 getMillis(bool skipRecord = false); virtual void delayMillis(uint msecs); virtual void getTimeAndDate(TimeDate &t) const {} diff --git a/backends/platform/ps2/systemps2.cpp b/backends/platform/ps2/systemps2.cpp index 5628658381..a7d782b07c 100644 --- a/backends/platform/ps2/systemps2.cpp +++ b/backends/platform/ps2/systemps2.cpp @@ -571,7 +571,7 @@ void OSystem_PS2::displayMessageOnOSD(const char *msg) { printf("displayMessageOnOSD: %s\n", msg); } -uint32 OSystem_PS2::getMillis(void) { +uint32 OSystem_PS2::getMillis(bool skipRecord) { return msecCount; } diff --git a/backends/platform/ps2/systemps2.h b/backends/platform/ps2/systemps2.h index 99482d4da4..3ba40a70f9 100644 --- a/backends/platform/ps2/systemps2.h +++ b/backends/platform/ps2/systemps2.h @@ -82,7 +82,7 @@ public: virtual void warpMouse(int x, int y); virtual void setMouseCursor(const void *buf, uint w, uint h, int hotspot_x, int hotspot_y, uint32 keycolor, bool dontScale = false, const Graphics::PixelFormat *format = 0); - virtual uint32 getMillis(); + virtual uint32 getMillis(bool skipRecord = false); virtual void delayMillis(uint msecs); virtual bool pollEvent(Common::Event &event); diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp index fb8c1c60bf..8559066e53 100644 --- a/backends/platform/psp/osys_psp.cpp +++ b/backends/platform/psp/osys_psp.cpp @@ -349,7 +349,7 @@ bool OSystem_PSP::pollEvent(Common::Event &event) { return _inputHandler.getAllInputs(event); } -uint32 OSystem_PSP::getMillis() { +uint32 OSystem_PSP::getMillis(bool skipRecord) { return PspRtc::instance().getMillis(); } diff --git a/backends/platform/psp/osys_psp.h b/backends/platform/psp/osys_psp.h index 2afdabd0fc..f4591e476d 100644 --- a/backends/platform/psp/osys_psp.h +++ b/backends/platform/psp/osys_psp.h @@ -125,7 +125,7 @@ public: bool processInput(Common::Event &event); // Time - uint32 getMillis(); + uint32 getMillis(bool skipRecord = false); void delayMillis(uint msecs); // Timer diff --git a/backends/platform/psp/rtc.cpp b/backends/platform/psp/rtc.cpp index cbbb7d3f80..4f15e45535 100644 --- a/backends/platform/psp/rtc.cpp +++ b/backends/platform/psp/rtc.cpp @@ -52,7 +52,7 @@ void PspRtc::init() { // init our starting ticks // Note that after we fill up 32 bits ie 50 days we'll loop back to 0, which may cause // unpredictable results -uint32 PspRtc::getMillis() { +uint32 PspRtc::getMillis(bool skipRecord) { uint32 ticks[2]; sceRtcGetCurrentTick((u64 *)ticks); // can introduce weird thread delays diff --git a/backends/platform/psp/rtc.h b/backends/platform/psp/rtc.h index 45885c3e66..d2689681dd 100644 --- a/backends/platform/psp/rtc.h +++ b/backends/platform/psp/rtc.h @@ -40,7 +40,7 @@ public: init(); } void init(); - uint32 getMillis(); + uint32 getMillis(bool skipRecord = false); uint32 getMicros(); }; diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index d54854352d..77e6f73d48 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -30,7 +30,7 @@ #include "backends/platform/sdl/sdl.h" #include "common/config-manager.h" -#include "common/EventRecorder.h" +#include "gui/EventRecorder.h" #include "common/taskbar.h" #include "common/textconsole.h" @@ -97,7 +97,9 @@ OSystem_SDL::~OSystem_SDL() { _audiocdManager = 0; delete _mixerManager; _mixerManager = 0; - delete _timerManager; + + delete g_eventRec.getTimerManager(); + _timerManager = 0; delete _mutexManager; _mutexManager = 0; @@ -131,9 +133,6 @@ void OSystem_SDL::init() { if (_mutexManager == 0) _mutexManager = new SdlMutexManager(); - if (_timerManager == 0) - _timerManager = new SdlTimerManager(); - #if defined(USE_TASKBAR) if (_taskbarManager == 0) _taskbarManager = new Common::TaskbarManager(); @@ -191,10 +190,12 @@ void OSystem_SDL::initBackend() { if (_mixerManager == 0) { _mixerManager = new SdlMixerManager(); - // Setup and start mixer _mixerManager->init(); } + g_eventRec.registerMixerManager(_mixerManager); + + g_eventRec.registerTimerManager(new SdlTimerManager()); if (_audiocdManager == 0) { // Audio CD support was removed with SDL 1.3 @@ -466,14 +467,15 @@ void OSystem_SDL::setupIcon() { free(icon); } -uint32 OSystem_SDL::getMillis() { + +uint32 OSystem_SDL::getMillis(bool skipRecord) { uint32 millis = SDL_GetTicks(); - g_eventRec.processMillis(millis); + g_eventRec.processMillis(millis, skipRecord); return millis; } void OSystem_SDL::delayMillis(uint msecs) { - if (!g_eventRec.processDelayMillis(msecs)) + if (!g_eventRec.processDelayMillis()) SDL_Delay(msecs); } @@ -491,12 +493,12 @@ void OSystem_SDL::getTimeAndDate(TimeDate &td) const { Audio::Mixer *OSystem_SDL::getMixer() { assert(_mixerManager); - return _mixerManager->getMixer(); + return getMixerManager()->getMixer(); } SdlMixerManager *OSystem_SDL::getMixerManager() { assert(_mixerManager); - return _mixerManager; + return g_eventRec.getMixerManager(); } #ifdef USE_OPENGL @@ -654,4 +656,8 @@ void OSystem_SDL::setupGraphicsModes() { } } +Common::TimerManager *OSystem_SDL::getTimerManager() { + return g_eventRec.getTimerManager(); +} + #endif diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index f05207b482..840e73ff09 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -68,10 +68,11 @@ public: virtual void setWindowCaption(const char *caption); virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); - virtual uint32 getMillis(); + virtual uint32 getMillis(bool skipRecord = false); virtual void delayMillis(uint msecs); virtual void getTimeAndDate(TimeDate &td) const; virtual Audio::Mixer *getMixer(); + virtual Common::TimerManager *getTimerManager(); protected: bool _inited; diff --git a/backends/platform/wii/osystem.cpp b/backends/platform/wii/osystem.cpp index 22a6495f8f..9d3a7473e3 100644 --- a/backends/platform/wii/osystem.cpp +++ b/backends/platform/wii/osystem.cpp @@ -203,7 +203,7 @@ bool OSystem_Wii::getFeatureState(Feature f) { } } -uint32 OSystem_Wii::getMillis() { +uint32 OSystem_Wii::getMillis(bool skipRecord) { return ticks_to_millisecs(diff_ticks(_startup_time, gettime())); } diff --git a/backends/platform/wii/osystem.h b/backends/platform/wii/osystem.h index 5d6998d0b6..287c70ad6b 100644 --- a/backends/platform/wii/osystem.h +++ b/backends/platform/wii/osystem.h @@ -193,7 +193,7 @@ public: const Graphics::PixelFormat *format); virtual bool pollEvent(Common::Event &event); - virtual uint32 getMillis(); + virtual uint32 getMillis(bool skipRecord = false); virtual void delayMillis(uint msecs); virtual MutexRef createMutex(); diff --git a/backends/saves/recorder/recorder-saves.cpp b/backends/saves/recorder/recorder-saves.cpp new file mode 100644 index 0000000000..49b4672913 --- /dev/null +++ b/backends/saves/recorder/recorder-saves.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/saves/recorder/recorder-saves.h" +#include "gui/EventRecorder.h" +#include "common/savefile.h" + +Common::InSaveFile *RecorderSaveFileManager::openForLoading(const Common::String &filename) { + Common::InSaveFile *result = g_eventRec.processSaveStream(filename); + return result; +} + +Common::StringArray RecorderSaveFileManager::listSaveFiles(const Common::String &pattern) { + return g_eventRec.listSaveFiles(pattern); +} + diff --git a/backends/saves/recorder/recorder-saves.h b/backends/saves/recorder/recorder-saves.h new file mode 100644 index 0000000000..692aeca329 --- /dev/null +++ b/backends/saves/recorder/recorder-saves.h @@ -0,0 +1,36 @@ +/* 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 BACKEND_SAVES_RECORDER_H +#define BACKEND_SAVES_RECORDER_H + +#include "backends/saves/default/default-saves.h" + +/** + * Provides a savefile manager implementation for event recorder. + */ +class RecorderSaveFileManager : public DefaultSaveFileManager { + virtual Common::StringArray listSaveFiles(const Common::String &pattern); + virtual Common::InSaveFile *openForLoading(const Common::String &filename); +}; + +#endif diff --git a/backends/timer/default/default-timer.cpp b/backends/timer/default/default-timer.cpp index 9f56d58b12..ce93320f3d 100644 --- a/backends/timer/default/default-timer.cpp +++ b/backends/timer/default/default-timer.cpp @@ -80,7 +80,7 @@ DefaultTimerManager::~DefaultTimerManager() { void DefaultTimerManager::handler() { Common::StackLock lock(_mutex); - const uint32 curTime = g_system->getMillis(); + uint32 curTime = g_system->getMillis(true); // Repeat as long as there is a TimerSlot that is scheduled to fire. TimerSlot *slot = _head->next; -- cgit v1.2.3 From 61b4981b120ae0c75d05f6f2c5012e269abb9f57 Mon Sep 17 00:00:00 2001 From: Dmitry Smirnov Date: Fri, 7 Jun 2013 18:23:59 +1000 Subject: BACKENDS: fix FTBFS on GNU Hurd by replacing MAXHOSTNAMELEN with NI_MAXHOST Bug-ScummVM: https://sourceforge.net/tracker/?func=detail&atid=418820&aid=3614268&group_id=37116 See more in similar http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=387665 --- backends/midi/timidity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends') diff --git a/backends/midi/timidity.cpp b/backends/midi/timidity.cpp index 5cefe668cd..d2c60bec9d 100644 --- a/backends/midi/timidity.cpp +++ b/backends/midi/timidity.cpp @@ -148,7 +148,7 @@ MidiDriver_TIMIDITY::MidiDriver_TIMIDITY() { int MidiDriver_TIMIDITY::open() { char *res; - char timidity_host[MAXHOSTNAMELEN]; + char timidity_host[NI_MAXHOST]; int timidity_port, data_port, i; /* count ourselves open */ -- cgit v1.2.3 From be399188c4ec25463c4a777a5e96fd69a4b0b1e3 Mon Sep 17 00:00:00 2001 From: Chris Warren-Smith Date: Tue, 25 Jun 2013 21:08:55 +1000 Subject: TIZEN: bada port updated to tizen --- backends/graphics/opengl/gltexture.h | 4 +- backends/modular-backend.cpp | 2 +- backends/module.mk | 4 +- backends/platform/bada/README.TXT | 92 ------ backends/platform/bada/application.cpp | 111 ------- backends/platform/bada/application.h | 54 ---- backends/platform/bada/audio.cpp | 260 --------------- backends/platform/bada/audio.h | 73 ----- backends/platform/bada/bada.mk | 5 - backends/platform/bada/form.cpp | 464 --------------------------- backends/platform/bada/form.h | 108 ------- backends/platform/bada/fs.cpp | 435 ------------------------- backends/platform/bada/fs.h | 82 ----- backends/platform/bada/graphics.cpp | 261 --------------- backends/platform/bada/graphics.h | 72 ----- backends/platform/bada/main.cpp | 67 ---- backends/platform/bada/missing.cpp | 113 ------- backends/platform/bada/portdefs.h | 85 ----- backends/platform/bada/sscanf.cpp | 213 ------------- backends/platform/bada/system.cpp | 514 ------------------------------ backends/platform/bada/system.h | 102 ------ backends/platform/tizen/README.TXT | 108 +++++++ backends/platform/tizen/application.cpp | 140 ++++++++ backends/platform/tizen/application.h | 69 ++++ backends/platform/tizen/audio.cpp | 181 +++++++++++ backends/platform/tizen/audio.h | 74 +++++ backends/platform/tizen/form.cpp | 419 ++++++++++++++++++++++++ backends/platform/tizen/form.h | 113 +++++++ backends/platform/tizen/fs.cpp | 441 +++++++++++++++++++++++++ backends/platform/tizen/fs.h | 98 ++++++ backends/platform/tizen/graphics.cpp | 237 ++++++++++++++ backends/platform/tizen/graphics.h | 73 +++++ backends/platform/tizen/main.cpp | 51 +++ backends/platform/tizen/missing.cpp | 82 +++++ backends/platform/tizen/portdefs.h | 85 +++++ backends/platform/tizen/sscanf.cpp | 213 +++++++++++++ backends/platform/tizen/system.cpp | 547 ++++++++++++++++++++++++++++++++ backends/platform/tizen/system.h | 102 ++++++ backends/platform/tizen/tizen.mk | 7 + backends/timer/bada/timer.cpp | 115 ------- backends/timer/bada/timer.h | 62 ---- backends/timer/tizen/timer.cpp | 117 +++++++ backends/timer/tizen/timer.h | 59 ++++ 43 files changed, 3221 insertions(+), 3293 deletions(-) delete mode 100644 backends/platform/bada/README.TXT delete mode 100644 backends/platform/bada/application.cpp delete mode 100644 backends/platform/bada/application.h delete mode 100644 backends/platform/bada/audio.cpp delete mode 100644 backends/platform/bada/audio.h delete mode 100644 backends/platform/bada/bada.mk delete mode 100644 backends/platform/bada/form.cpp delete mode 100644 backends/platform/bada/form.h delete mode 100644 backends/platform/bada/fs.cpp delete mode 100644 backends/platform/bada/fs.h delete mode 100644 backends/platform/bada/graphics.cpp delete mode 100644 backends/platform/bada/graphics.h delete mode 100644 backends/platform/bada/main.cpp delete mode 100644 backends/platform/bada/missing.cpp delete mode 100644 backends/platform/bada/portdefs.h delete mode 100644 backends/platform/bada/sscanf.cpp delete mode 100644 backends/platform/bada/system.cpp delete mode 100644 backends/platform/bada/system.h create mode 100644 backends/platform/tizen/README.TXT create mode 100644 backends/platform/tizen/application.cpp create mode 100644 backends/platform/tizen/application.h create mode 100644 backends/platform/tizen/audio.cpp create mode 100644 backends/platform/tizen/audio.h create mode 100644 backends/platform/tizen/form.cpp create mode 100644 backends/platform/tizen/form.h create mode 100644 backends/platform/tizen/fs.cpp create mode 100644 backends/platform/tizen/fs.h create mode 100644 backends/platform/tizen/graphics.cpp create mode 100644 backends/platform/tizen/graphics.h create mode 100644 backends/platform/tizen/main.cpp create mode 100644 backends/platform/tizen/missing.cpp create mode 100644 backends/platform/tizen/portdefs.h create mode 100644 backends/platform/tizen/sscanf.cpp create mode 100644 backends/platform/tizen/system.cpp create mode 100644 backends/platform/tizen/system.h create mode 100644 backends/platform/tizen/tizen.mk delete mode 100644 backends/timer/bada/timer.cpp delete mode 100644 backends/timer/bada/timer.h create mode 100644 backends/timer/tizen/timer.cpp create mode 100644 backends/timer/tizen/timer.h (limited to 'backends') diff --git a/backends/graphics/opengl/gltexture.h b/backends/graphics/opengl/gltexture.h index 8ff9838ff7..6ef80923ae 100644 --- a/backends/graphics/opengl/gltexture.h +++ b/backends/graphics/opengl/gltexture.h @@ -44,9 +44,9 @@ #define ARRAYSIZE(x) ((int)(sizeof(x) / sizeof(x[0]))) #endif -#if defined(BADA) +#if defined(TIZEN) #include -using namespace Osp::Graphics::Opengl; +using namespace Tizen::Graphics::Opengl; #elif defined(USE_GLES) #include #elif defined(SDL_BACKEND) diff --git a/backends/modular-backend.cpp b/backends/modular-backend.cpp index b46f33a2bc..72a6699a06 100644 --- a/backends/modular-backend.cpp +++ b/backends/modular-backend.cpp @@ -52,7 +52,7 @@ bool ModularBackend::hasFeature(Feature f) { } void ModularBackend::setFeatureState(Feature f, bool enable) { - return _graphicsManager->setFeatureState(f, enable); + _graphicsManager->setFeatureState(f, enable); } bool ModularBackend::getFeatureState(Feature f) { diff --git a/backends/module.mk b/backends/module.mk index a4f525d21d..092b369ab0 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -120,9 +120,9 @@ MODULE_OBJS += \ mixer/sdl13/sdl13-mixer.o endif -ifeq ($(BACKEND),bada) +ifeq ($(BACKEND),tizen) MODULE_OBJS += \ - timer/bada/timer.o + timer/tizen/timer.o endif ifeq ($(BACKEND),ds) diff --git a/backends/platform/bada/README.TXT b/backends/platform/bada/README.TXT deleted file mode 100644 index c4a04d5450..0000000000 --- a/backends/platform/bada/README.TXT +++ /dev/null @@ -1,92 +0,0 @@ -Build instructions: - -1. Install BADA SDK (requires free registration): - - http://developer.bada.com/apis/index.do - -2. Install Cygwin: - - http://www.cygwin.com/ - - Add the following to your cygwin .bash_profile: - - alias mmake=/cygdrive/c/MinGW/bin/mingw32-make.exe - export BADA_SDK=/cygdrive/c/bada/1.2.1 - export ARM_BIN=c:/bada/1.2.1/Tools/Toolchains/ARM/bin - export CPPFLAGS="-fpic -fshort-wchar -mcpu=cortex-a8 -mfpu=vfpv3 \ - -mfloat-abi=hard -mlittle-endian -mthumb-interwork -Wno-psabi \ - -fno-strict-aliasing -fno-short-enums" - export LDFLAGS="-nostdlib -lc-newlib -lm-newlib -LC:/bada/1.2.1/Model/Wave_LP1/Target" - #export PATH=${BADA_SDK}/Tools/Toolchains/Win32/bin:${PATH} - export PATH=${BADA_SDK}/Tools/Toolchains/ARM/bin:~/utils:${PATH} - alias gcc=${ARM_BIN}/arm-samsung-nucleuseabi-gcc.exe - alias ar=${ARM_BIN}/arm-samsung-nucleuseabi-ar.exe - - The following were added to ~/utils for zlib: - - ar: - #!/bin/sh - ${ARM_BIN}/arm-samsung-nucleuseabi-ar.exe $* - - gcc: - #!/bin/sh - ${ARM_BIN}/arm-samsung-nucleuseabi-gcc.exe $* - -3. Build dependencies - - zlib, libogg, libvorbis, libmad, FLAC - - see: "Building the libraries" under: - http://wiki.scummvm.org/index.php/Compiling_ScummVM/MinGW#Building_the_libraries - for instructions on how to obtain these modules - - 3.1 For Target-Release configure ogg and mad with: - - ./configure --host=arm-samsung-nucleuseabi --disable-shared - - when building vorbis and flac: - - ./configure --host=arm-samsung-nucleuseabi --disable-shared --with-ogg=c:/cygwin/usr/local - - 3.2 for each module, after a successful configure, add the following - to the generated config.h (gzguts.h for zlib) - - #undef __MINGW32__ - #undef _WIN32 - #include "c:/src/scummvm/backends/platform/bada/portdefs.h" - - 3.3 Additional post configure edits: - - - removed -fforce-mem from the libMAD Makefile - - in libvorbis/lib/Makefile comment lines with vorbis_selftests - - edit libFLAC/Makefile ... CFLAGS = $(OGG_CFLAGS) - - Note: you can ignore the ranlib errors when doing make install. - -4. Build the ScummVM base library: - - ./configure --host=bada --enable-release - - To target the Win32 simulator: - - ./configure --host=bada --enable-debug - -5. Build the front end application using BADA-Ide: - - Copy the scummvm/dists/bada folder into a clean directory - outside of the scummvm package. Start the BADA IDE then - choose this folder as the eclipse workspace. Click - Project / Build. - -Links: - -A short turorial on implementing OpenGL ES 1.1 in BADA: - http://forums.badadev.com/viewtopic.php?f=7&t=208 - -HelvB14 font files: - http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html - http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts-75dpi100dpi.tar.gz - - Then run the following command: - $ ./ucs2any.pl 100dpi/helvB14.bdf MAPPINGS/8859-1.TXT iso8859-1 \ - MAPPINGS/8859-2.TXT iso8859-2 MAPPINGS/8859-3.TXT iso8859-3 diff --git a/backends/platform/bada/application.cpp b/backends/platform/bada/application.cpp deleted file mode 100644 index e761649245..0000000000 --- a/backends/platform/bada/application.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* 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 "engines/engine.h" - -#include "backends/platform/bada/form.h" -#include "backends/platform/bada/system.h" -#include "backends/platform/bada/application.h" - -using namespace Osp::System; -using namespace Osp::Ui::Controls; - -Application *BadaScummVM::createInstance() { - return new BadaScummVM(); -} - -BadaScummVM::BadaScummVM() : _appForm(0) { -} - -BadaScummVM::~BadaScummVM() { - logEntered(); - if (g_system) { - BadaSystem *system = (BadaSystem *)g_system; - system->destroyBackend(); - delete system; - g_system = 0; - } -} - -bool BadaScummVM::OnAppInitializing(AppRegistry &appRegistry) { - _appForm = systemStart(this); - return (_appForm != NULL); -} - -bool BadaScummVM::OnAppTerminating(AppRegistry &appRegistry, - bool forcedTermination) { - logEntered(); - return true; -} - -void BadaScummVM::OnUserEventReceivedN(RequestId requestId, - Osp::Base::Collection::IList *args) { - logEntered(); - - if (requestId == USER_MESSAGE_EXIT) { - // normal program termination - Terminate(); - } else if (requestId == USER_MESSAGE_EXIT_ERR) { - // assertion failure termination - String *message = NULL; - if (args) { - message = (String *)args->GetAt(0); - } - if (!message) { - message = new String("Unknown error"); - } - - MessageBox messageBox; - messageBox.Construct(L"Oops...", *message, MSGBOX_STYLE_OK); - int modalResult; - messageBox.ShowAndWait(modalResult); - Terminate(); - } -} - -void BadaScummVM::OnForeground(void) { - logEntered(); - pauseGame(false); -} - -void BadaScummVM::OnBackground(void) { - logEntered(); - pauseGame(true); -} - -void BadaScummVM::OnBatteryLevelChanged(BatteryLevel batteryLevel) { -} - -void BadaScummVM::OnLowMemory(void) { -} - -void BadaScummVM::pauseGame(bool pause) { - if (_appForm) { - if (pause && g_engine && !g_engine->isPaused()) { - _appForm->pushKey(Common::KEYCODE_SPACE); - } - - if (g_system) { - ((BadaSystem *)g_system)->setMute(pause); - } - } -} diff --git a/backends/platform/bada/application.h b/backends/platform/bada/application.h deleted file mode 100644 index 2b0d37f1ef..0000000000 --- a/backends/platform/bada/application.h +++ /dev/null @@ -1,54 +0,0 @@ -/* 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 BADA_APPLICATION_H -#define BADA_APPLICATION_H - -#include -#include -#include -#include -#include - -#include "backends/platform/bada/system.h" - -class BadaScummVM : public Osp::App::Application { -public: - BadaScummVM(); - ~BadaScummVM(); - - static Osp::App::Application *createInstance(void); - - bool OnAppInitializing(Osp::App::AppRegistry &appRegistry); - bool OnAppTerminating(Osp::App::AppRegistry &appRegistry, bool forcedTermination = false); - void OnForeground(void); - void OnBackground(void); - void OnLowMemory(void); - void OnBatteryLevelChanged(Osp::System::BatteryLevel batteryLevel); - void OnUserEventReceivedN(RequestId requestId, Osp::Base::Collection::IList *pArgs); - -private: - void pauseGame(bool pause); - BadaAppForm *_appForm; -}; - -#endif diff --git a/backends/platform/bada/audio.cpp b/backends/platform/bada/audio.cpp deleted file mode 100644 index 65a5a80fa5..0000000000 --- a/backends/platform/bada/audio.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* 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 -#include - -#include "backends/platform/bada/audio.h" -#include "backends/platform/bada/system.h" - -#define TIMER_INCREMENT 10 -#define TIMER_INTERVAL 40 -#define MIN_TIMER_INTERVAL 10 -#define MAX_TIMER_INTERVAL 160 -#define INIT_LEVEL 3 -#define CONFIG_KEY L"audiovol" - -// sound level pre-sets -const int levels[] = {0, 1, 10, 45, 70, 99}; - -AudioThread::AudioThread() : - _mixer(0), - _timer(0), - _audioOut(0), - _head(0), - _tail(0), - _ready(0), - _interval(TIMER_INTERVAL), - _playing(-1), - _muted(true) { -} - -Audio::MixerImpl *AudioThread::Construct(OSystem *system) { - logEntered(); - - if (IsFailed(Thread::Construct(THREAD_TYPE_EVENT_DRIVEN, - DEFAULT_STACK_SIZE, - THREAD_PRIORITY_HIGH))) { - AppLog("Failed to create AudioThread"); - return NULL; - } - - _mixer = new Audio::MixerImpl(system, 44100); - return _mixer; -} - -AudioThread::~AudioThread() { - logEntered(); -} - -bool AudioThread::isSilentMode() { - bool silentMode; - String key(L"SilentMode"); - Osp::System::SettingInfo::GetValue(key, silentMode); - return silentMode; -} - -void AudioThread::setMute(bool on) { - if (_audioOut && _timer) { - _muted = on; - if (on) { - _timer->Cancel(); - } else { - _timer->Start(_interval); - } - } -} - -int AudioThread::setVolume(bool up, bool minMax) { - int level = -1; - int numLevels = sizeof(levels) / sizeof(levels[0]); - - if (_audioOut) { - int volume = _audioOut->GetVolume(); - if (minMax) { - level = up ? numLevels - 1 : 0; - volume = levels[level]; - } else { - // adjust volume to be one of the preset values - for (int i = 0; i < numLevels && level == -1; i++) { - if (volume == levels[i]) { - level = i; - if (up) { - if (i + 1 < numLevels) { - level = i + 1; - } - } else if (i > 0) { - level = i - 1; - } - } - } - - // default to INIT_LEVEL when current not preset value - if (level == -1) { - level = INIT_LEVEL; - } - volume = levels[level]; - } - - _audioOut->SetVolume(volume); - - // remember the chosen setting - AppRegistry *registry = Application::GetInstance()->GetAppRegistry(); - if (registry) { - registry->Set(CONFIG_KEY, volume); - } - } - return level; -} - -bool AudioThread::OnStart(void) { - logEntered(); - - _audioOut = new Osp::Media::AudioOut(); - if (!_audioOut || - IsFailed(_audioOut->Construct(*this))) { - AppLog("Failed to create AudioOut"); - return false; - } - - int sampleRate = _mixer->getOutputRate(); - - // ideally we would update _mixer with GetOptimizedSampleRate here - if (_audioOut->GetOptimizedSampleRate() != sampleRate) { - AppLog("Non optimal sample rate %d", _audioOut->GetOptimizedSampleRate()); - } - - if (IsFailed(_audioOut->Prepare(AUDIO_TYPE_PCM_S16_LE, - AUDIO_CHANNEL_TYPE_STEREO, - sampleRate))) { - AppLog("Failed to prepare AudioOut %d", sampleRate); - return false; - } - - int bufferSize = _audioOut->GetMinBufferSize(); - for (int i = 0; i < NUM_AUDIO_BUFFERS; i++) { - if (IsFailed(_audioBuffer[i].Construct(bufferSize))) { - AppLog("Failed to create audio buffer"); - return false; - } - } - - _timer = new Timer(); - if (!_timer || IsFailed(_timer->Construct(*this))) { - AppLog("Failed to create audio timer"); - return false; - } - - if (IsFailed(_timer->Start(_interval))) { - AppLog("failed to start audio timer"); - return false; - } - - // get the volume from the app-registry - int volume = levels[INIT_LEVEL]; - AppRegistry *registry = Application::GetInstance()->GetAppRegistry(); - if (registry) { - if (E_KEY_NOT_FOUND == registry->Get(CONFIG_KEY, volume)) { - registry->Add(CONFIG_KEY, volume); - volume = levels[INIT_LEVEL]; - } else { - AppLog("Setting volume: %d", volume); - } - } - - _muted = false; - _mixer->setReady(true); - _audioOut->SetVolume(isSilentMode() ? 0 : volume); - _audioOut->Start(); - return true; -} - -void AudioThread::OnStop(void) { - logEntered(); - - _mixer->setReady(false); - - if (_timer) { - if (!_muted) { - _timer->Cancel(); - } - delete _timer; - } - - if (_audioOut) { - _audioOut->Reset(); - delete _audioOut; - } -} - -void AudioThread::OnAudioOutErrorOccurred(Osp::Media::AudioOut &src, result r) { - logEntered(); -} - -void AudioThread::OnAudioOutInterrupted(Osp::Media::AudioOut &src) { - logEntered(); -} - -void AudioThread::OnAudioOutReleased(Osp::Media::AudioOut &src) { - logEntered(); - _audioOut->Start(); -} - -void AudioThread::OnAudioOutBufferEndReached(Osp::Media::AudioOut &src) { - if (_ready > 0) { - _playing = _tail; - _audioOut->WriteBuffer(_audioBuffer[_tail]); - _tail = (_tail + 1) % NUM_AUDIO_BUFFERS; - _ready--; - } else { - // audio buffer empty: decrease timer inverval - _playing = -1; - _interval -= TIMER_INCREMENT; - if (_interval < MIN_TIMER_INTERVAL) { - _interval = MIN_TIMER_INTERVAL; - } - } -} - -void AudioThread::OnTimerExpired(Timer &timer) { - if (_ready < NUM_AUDIO_BUFFERS) { - uint len = _audioBuffer[_head].GetCapacity(); - int samples = _mixer->mixCallback((byte *)_audioBuffer[_head].GetPointer(), len); - if (samples) { - _head = (_head + 1) % NUM_AUDIO_BUFFERS; - _ready++; - } - } else { - // audio buffer full: increase timer inverval - _interval += TIMER_INCREMENT; - if (_interval > MAX_TIMER_INTERVAL) { - _interval = MAX_TIMER_INTERVAL; - } - } - - if (_ready && _playing == -1) { - OnAudioOutBufferEndReached(*_audioOut); - } - - _timer->Start(_interval); -} - diff --git a/backends/platform/bada/audio.h b/backends/platform/bada/audio.h deleted file mode 100644 index 72c537a942..0000000000 --- a/backends/platform/bada/audio.h +++ /dev/null @@ -1,73 +0,0 @@ -/* 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 BADA_AUDIO_H -#define BADA_AUDIO_H - -#include -#include -#include -#include - -#include "config.h" -#include "common/scummsys.h" -#include "common/system.h" -#include "audio/mixer_intern.h" - -using namespace Osp::Base; -using namespace Osp::Base::Collection; -using namespace Osp::Base::Runtime; -using namespace Osp::Media; -using namespace Osp::Io; - -#define NUM_AUDIO_BUFFERS 2 - -class AudioThread: public Osp::Media::IAudioOutEventListener, - public Osp::Base::Runtime::ITimerEventListener, - public Osp::Base::Runtime::Thread { -public: - AudioThread(void); - ~AudioThread(void); - - Audio::MixerImpl *Construct(OSystem *system); - bool isSilentMode(); - void setMute(bool on); - int setVolume(bool up, bool minMax); - - bool OnStart(void); - void OnStop(void); - void OnAudioOutErrorOccurred(Osp::Media::AudioOut &src, result r); - void OnAudioOutInterrupted(Osp::Media::AudioOut &src); - void OnAudioOutReleased(Osp::Media::AudioOut &src); - void OnAudioOutBufferEndReached(Osp::Media::AudioOut &src); - void OnTimerExpired(Timer &timer); - -private: - Audio::MixerImpl *_mixer; - Osp::Base::Runtime::Timer *_timer; - Osp::Media::AudioOut *_audioOut; - Osp::Base::ByteBuffer _audioBuffer[NUM_AUDIO_BUFFERS]; - int _head, _tail, _ready, _interval, _playing; - bool _muted; -}; - -#endif diff --git a/backends/platform/bada/bada.mk b/backends/platform/bada/bada.mk deleted file mode 100644 index 7c72d7752b..0000000000 --- a/backends/platform/bada/bada.mk +++ /dev/null @@ -1,5 +0,0 @@ -# Bada specific modules are built under eclipse - -$(EXECUTABLE): $(OBJS) - rm -f $@ - ar Tru $@ $(OBJS) diff --git a/backends/platform/bada/form.cpp b/backends/platform/bada/form.cpp deleted file mode 100644 index dfa72bce08..0000000000 --- a/backends/platform/bada/form.cpp +++ /dev/null @@ -1,464 +0,0 @@ -/* 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 - -#include "common/translation.h" -#include "base/main.h" - -#include "backends/platform/bada/form.h" -#include "backends/platform/bada/system.h" - -using namespace Osp::Base::Runtime; -using namespace Osp::Ui; -using namespace Osp::Ui::Controls; - -// number of volume levels -#define LEVEL_RANGE 5 - -// round down small Y touch values to 1 to allow the -// cursor to be positioned at the top of the screen -#define MIN_TOUCH_Y 10 - -// block for up to 2.5 seconds during shutdown to -// allow the game thread to exit gracefully. -#define EXIT_SLEEP_STEP 10 -#define EXIT_SLEEP 250 - -// -// BadaAppForm -// -BadaAppForm::BadaAppForm() : - _gameThread(0), - _state(kInitState), - _buttonState(kLeftButton), - _shortcut(kSetVolume) { - _eventQueueLock = new Mutex(); - _eventQueueLock->Create(); -} - -result BadaAppForm::Construct() { - result r = Form::Construct(Controls::FORM_STYLE_NORMAL); - if (IsFailed(r)) { - return r; - } - - BadaSystem *badaSystem = NULL; - _gameThread = NULL; - - badaSystem = new BadaSystem(this); - r = badaSystem != NULL ? E_SUCCESS : E_OUT_OF_MEMORY; - - if (!IsFailed(r)) { - r = badaSystem->Construct(); - } - - if (!IsFailed(r)) { - _gameThread = new Thread(); - r = _gameThread != NULL ? E_SUCCESS : E_OUT_OF_MEMORY; - } - - if (!IsFailed(r)) { - r = _gameThread->Construct(*this); - } - - if (IsFailed(r)) { - if (badaSystem != NULL) { - delete badaSystem; - } - if (_gameThread != NULL) { - delete _gameThread; - _gameThread = NULL; - } - } else { - g_system = badaSystem; - } - - return r; -} - -BadaAppForm::~BadaAppForm() { - logEntered(); - - if (_gameThread && _state != kErrorState) { - terminate(); - - _gameThread->Stop(); - if (_state != kErrorState) { - _gameThread->Join(); - } - - delete _gameThread; - _gameThread = NULL; - } - - if (_eventQueueLock) { - delete _eventQueueLock; - _eventQueueLock = NULL; - } - - logLeaving(); -} - -// -// abort the game thread -// -void BadaAppForm::terminate() { - if (_state == kActiveState) { - ((BadaSystem *)g_system)->setMute(true); - - _eventQueueLock->Acquire(); - - Common::Event e; - e.type = Common::EVENT_QUIT; - _eventQueue.push(e); - _state = kClosingState; - - _eventQueueLock->Release(); - - // block while thread ends - AppLog("waiting for shutdown"); - for (int i = 0; i < EXIT_SLEEP_STEP && _state == kClosingState; i++) { - Thread::Sleep(EXIT_SLEEP); - } - - if (_state == kClosingState) { - // failed to terminate - Join() will freeze - _state = kErrorState; - } - } -} - -void BadaAppForm::exitSystem() { - _state = kErrorState; - - if (_gameThread) { - _gameThread->Stop(); - delete _gameThread; - _gameThread = NULL; - } -} - -result BadaAppForm::OnInitializing(void) { - logEntered(); - - SetOrientation(ORIENTATION_LANDSCAPE); - AddOrientationEventListener(*this); - AddTouchEventListener(*this); - AddKeyEventListener(*this); - - // set focus to enable receiving key events - SetFocusable(true); - SetFocus(); - - return E_SUCCESS; -} - -result BadaAppForm::OnDraw(void) { - logEntered(); - - if (g_system) { - BadaSystem *system = (BadaSystem *)g_system; - BadaGraphicsManager *graphics = system->getGraphics(); - if (graphics && graphics->isReady()) { - g_system->updateScreen(); - } - } - - return E_SUCCESS; -} - -bool BadaAppForm::pollEvent(Common::Event &event) { - bool result = false; - - _eventQueueLock->Acquire(); - if (!_eventQueue.empty()) { - event = _eventQueue.pop(); - result = true; - } - _eventQueueLock->Release(); - - return result; -} - -void BadaAppForm::pushEvent(Common::EventType type, const Point ¤tPosition) { - BadaSystem *system = (BadaSystem *)g_system; - BadaGraphicsManager *graphics = system->getGraphics(); - if (graphics) { - // graphics could be NULL at startup or when - // displaying the system error screen - Common::Event e; - e.type = type; - e.mouse.x = currentPosition.x; - e.mouse.y = currentPosition.y > MIN_TOUCH_Y ? currentPosition.y : 1; - - bool moved = graphics->moveMouse(e.mouse.x, e.mouse.y); - - _eventQueueLock->Acquire(); - - if (moved && type != Common::EVENT_MOUSEMOVE) { - Common::Event moveEvent; - moveEvent.type = Common::EVENT_MOUSEMOVE; - moveEvent.mouse = e.mouse; - _eventQueue.push(moveEvent); - } - - _eventQueue.push(e); - _eventQueueLock->Release(); - } -} - -void BadaAppForm::pushKey(Common::KeyCode keycode) { - Common::Event e; - e.synthetic = false; - e.kbd.keycode = keycode; - e.kbd.ascii = keycode; - e.kbd.flags = 0; - - _eventQueueLock->Acquire(); - - e.type = Common::EVENT_KEYDOWN; - _eventQueue.push(e); - e.type = Common::EVENT_KEYUP; - _eventQueue.push(e); - - _eventQueueLock->Release(); -} - -void BadaAppForm::OnOrientationChanged(const Control &source, - OrientationStatus orientationStatus) { - logEntered(); - if (_state == kInitState) { - _state = kActiveState; - _gameThread->Start(); - } -} - -Object *BadaAppForm::Run(void) { - scummvm_main(0, 0); - - if (_state == kActiveState) { - Application::GetInstance()->SendUserEvent(USER_MESSAGE_EXIT, NULL); - } - _state = kDoneState; - return NULL; -} - -void BadaAppForm::setButtonShortcut() { - switch (_buttonState) { - case kLeftButton: - g_system->displayMessageOnOSD(_("Right Click Once")); - _buttonState = kRightButtonOnce; - break; - case kRightButtonOnce: - g_system->displayMessageOnOSD(_("Right Click")); - _buttonState = kRightButton; - break; - case kRightButton: - g_system->displayMessageOnOSD(_("Move Only")); - _buttonState = kMoveOnly; - break; - case kMoveOnly: - g_system->displayMessageOnOSD(_("Left Click")); - _buttonState = kLeftButton; - break; - } -} - -void BadaAppForm::setShortcut() { - // cycle to the next shortcut - switch (_shortcut) { - case kControlMouse: - g_system->displayMessageOnOSD(_("Escape Key")); - _shortcut = kEscapeKey; - break; - - case kEscapeKey: - g_system->displayMessageOnOSD(_("Game Menu")); - _shortcut = kGameMenu; - break; - - case kGameMenu: - g_system->displayMessageOnOSD(_("Show Keypad")); - _shortcut = kShowKeypad; - break; - - case kSetVolume: - // fallthru - - case kShowKeypad: - g_system->displayMessageOnOSD(_("Control Mouse")); - _shortcut = kControlMouse; - break; - } -} - -void BadaAppForm::setVolume(bool up, bool minMax) { - int level = ((BadaSystem *)g_system)->setVolume(up, minMax); - if (level != -1) { - char message[32]; - char ind[LEVEL_RANGE]; // 1..5 (0=off) - int j = LEVEL_RANGE - 1; // 0..4 - for (int i = 1; i <= LEVEL_RANGE; i++) { - ind[j--] = level >= i ? '|' : ' '; - } - snprintf(message, sizeof(message), "Volume: [ %c%c%c%c%c ]", - ind[0], ind[1], ind[2], ind[3], ind[4]); - g_system->displayMessageOnOSD(message); - } -} - -void BadaAppForm::showKeypad() { - // display the soft keyboard - _buttonState = kLeftButton; - pushKey(Common::KEYCODE_F7); -} - -void BadaAppForm::OnTouchDoublePressed(const Control &source, - const Point ¤tPosition, - const TouchEventInfo &touchInfo) { - if (_buttonState != kMoveOnly) { - pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN, - currentPosition); - pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN, - currentPosition); - } -} - -void BadaAppForm::OnTouchFocusIn(const Control &source, - const Point ¤tPosition, - const TouchEventInfo &touchInfo) { -} - -void BadaAppForm::OnTouchFocusOut(const Control &source, - const Point ¤tPosition, - const TouchEventInfo &touchInfo) { -} - -void BadaAppForm::OnTouchLongPressed(const Control &source, - const Point ¤tPosition, - const TouchEventInfo &touchInfo) { - if (_buttonState != kLeftButton) { - pushKey(Common::KEYCODE_RETURN); - } -} - -void BadaAppForm::OnTouchMoved(const Control &source, - const Point ¤tPosition, - const TouchEventInfo &touchInfo) { - pushEvent(Common::EVENT_MOUSEMOVE, currentPosition); -} - -void BadaAppForm::OnTouchPressed(const Control &source, - const Point ¤tPosition, - const TouchEventInfo &touchInfo) { - if (_buttonState != kMoveOnly) { - pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN, - currentPosition); - } -} - -void BadaAppForm::OnTouchReleased(const Control &source, - const Point ¤tPosition, - const TouchEventInfo &touchInfo) { - if (_buttonState != kMoveOnly) { - pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONUP : Common::EVENT_RBUTTONUP, - currentPosition); - if (_buttonState == kRightButtonOnce) { - _buttonState = kLeftButton; - } - // flick to skip dialog - if (touchInfo.IsFlicked()) { - pushKey(Common::KEYCODE_PERIOD); - } - } -} - -void BadaAppForm::OnKeyLongPressed(const Control &source, KeyCode keyCode) { - logEntered(); - switch (keyCode) { - case KEY_SIDE_UP: - _shortcut = kSetVolume; - setVolume(true, true); - return; - - case KEY_SIDE_DOWN: - _shortcut = kSetVolume; - setVolume(false, true); - return; - - case KEY_CAMERA: - _shortcut = kShowKeypad; - showKeypad(); - return; - - default: - break; - } -} - -void BadaAppForm::OnKeyPressed(const Control &source, KeyCode keyCode) { - switch (keyCode) { - case KEY_SIDE_UP: - if (_shortcut != kSetVolume) { - _shortcut = kSetVolume; - } else { - setVolume(true, false); - } - return; - - case KEY_SIDE_DOWN: - switch (_shortcut) { - case kControlMouse: - setButtonShortcut(); - break; - - case kEscapeKey: - pushKey(Common::KEYCODE_ESCAPE); - break; - - case kGameMenu: - _buttonState = kLeftButton; - pushKey(Common::KEYCODE_F5); - break; - - case kShowKeypad: - showKeypad(); - break; - - default: - setVolume(false, false); - break; - } - break; - - case KEY_CAMERA: - setShortcut(); - break; - - default: - break; - } -} - -void BadaAppForm::OnKeyReleased(const Control &source, KeyCode keyCode) { -} diff --git a/backends/platform/bada/form.h b/backends/platform/bada/form.h deleted file mode 100644 index 3340e2216b..0000000000 --- a/backends/platform/bada/form.h +++ /dev/null @@ -1,108 +0,0 @@ -/* 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 BADA_FORM_H -#define BADA_FORM_H - -#include -#include -#include -#include -#include -#include - -#include "config.h" -#include "common/scummsys.h" -#include "common/events.h" -#include "common/queue.h" -#include "common/mutex.h" - -// -// BadaAppForm -// -class BadaAppForm : public Osp::Ui::Controls::Form, - public Osp::Ui::IOrientationEventListener, - public Osp::Ui::ITouchEventListener, - public Osp::Ui::IKeyEventListener, - public Osp::Base::Runtime::IRunnable { -public: - BadaAppForm(); - ~BadaAppForm(); - - result Construct(); - bool pollEvent(Common::Event &event); - bool isClosing() { return _state == kClosingState; } - void pushKey(Common::KeyCode keycode); - void exitSystem(); - -private: - Object *Run(); - result OnInitializing(void); - result OnDraw(void); - void OnOrientationChanged(const Osp::Ui::Control &source, - Osp::Ui::OrientationStatus orientationStatus); - void OnTouchDoublePressed(const Osp::Ui::Control &source, - const Osp::Graphics::Point ¤tPosition, - const Osp::Ui::TouchEventInfo &touchInfo); - void OnTouchFocusIn(const Osp::Ui::Control &source, - const Osp::Graphics::Point ¤tPosition, - const Osp::Ui::TouchEventInfo &touchInfo); - void OnTouchFocusOut(const Osp::Ui::Control &source, - const Osp::Graphics::Point ¤tPosition, - const Osp::Ui::TouchEventInfo &touchInfo); - void OnTouchLongPressed(const Osp::Ui::Control &source, - const Osp::Graphics::Point ¤tPosition, - const Osp::Ui::TouchEventInfo &touchInfo); - void OnTouchMoved(const Osp::Ui::Control &source, - const Osp::Graphics::Point ¤tPosition, - const Osp::Ui::TouchEventInfo &touchInfo); - void OnTouchPressed(const Osp::Ui::Control &source, - const Osp::Graphics::Point ¤tPosition, - const Osp::Ui::TouchEventInfo &touchInfo); - void OnTouchReleased(const Osp::Ui::Control &source, - const Osp::Graphics::Point ¤tPosition, - const Osp::Ui::TouchEventInfo &touchInfo); - void OnKeyLongPressed(const Osp::Ui::Control &source, - Osp::Ui::KeyCode keyCode); - void OnKeyPressed(const Osp::Ui::Control &source, - Osp::Ui::KeyCode keyCode); - void OnKeyReleased(const Osp::Ui::Control &source, - Osp::Ui::KeyCode keyCode); - - void pushEvent(Common::EventType type, - const Osp::Graphics::Point ¤tPosition); - void terminate(); - void setButtonShortcut(); - void setShortcut(); - void setVolume(bool up, bool minMax); - void showKeypad(); - - // event handling - Osp::Base::Runtime::Thread *_gameThread; - Osp::Base::Runtime::Mutex *_eventQueueLock; - Common::Queue _eventQueue; - enum { kInitState, kActiveState, kClosingState, kDoneState, kErrorState } _state; - enum { kLeftButton, kRightButtonOnce, kRightButton, kMoveOnly } _buttonState; - enum { kControlMouse, kEscapeKey, kGameMenu, kShowKeypad, kSetVolume } _shortcut; -}; - -#endif diff --git a/backends/platform/bada/fs.cpp b/backends/platform/bada/fs.cpp deleted file mode 100644 index 37ca496d18..0000000000 --- a/backends/platform/bada/fs.cpp +++ /dev/null @@ -1,435 +0,0 @@ -/* 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 "config.h" -#include "backends/platform/bada/system.h" -#include "backends/platform/bada/fs.h" - -#define BUFFER_SIZE 1024 - -// internal BADA paths -#define PATH_ROOT "/" -#define PATH_HOME "/Home" -#define PATH_HOME_SHARE "/Home/Share" -#define PATH_HOME_SHARE2 "/Home/Share2" -#define PATH_HOME_X "/Home/" -#define PATH_HOME_EXT "/HomeExt" -#define PATH_MEDIA "/Media" -#define PATH_CARD "/Storagecard" -#define PATH_CARD_MEDIA "/Storagecard/Media" - -// -// BadaFileStream -// -class BadaFileStream : public Common::SeekableReadStream, - public Common::WriteStream, - public Common::NonCopyable { -public: - static BadaFileStream *makeFromPath(const String &path, bool writeMode); - - BadaFileStream(File *file, bool writeMode); - ~BadaFileStream(); - - bool err() const; - void clearErr(); - bool eos() const; - - uint32 write(const void *dataPtr, uint32 dataSize); - bool flush(); - - int32 pos() const; - int32 size() const; - bool seek(int32 offs, int whence = SEEK_SET); - uint32 read(void *dataPtr, uint32 dataSize); - -private: - byte buffer[BUFFER_SIZE]; - uint32 bufferIndex; - uint32 bufferLength; - bool writeMode; - File *file; -}; - -BadaFileStream::BadaFileStream(File *ioFile, bool writeMode) : - bufferIndex(0), - bufferLength(0), - writeMode(writeMode), - file(ioFile) { - AppAssert(ioFile != 0); -} - -BadaFileStream::~BadaFileStream() { - if (file) { - if (writeMode) { - flush(); - } - delete file; - } -} - -bool BadaFileStream::err() const { - result r = GetLastResult(); - return (r != E_SUCCESS && r != E_END_OF_FILE); -} - -void BadaFileStream::clearErr() { - SetLastResult(E_SUCCESS); -} - -bool BadaFileStream::eos() const { - return (bufferLength - bufferIndex == 0) && (GetLastResult() == E_END_OF_FILE); -} - -int32 BadaFileStream::pos() const { - return file->Tell() - (bufferLength - bufferIndex); -} - -int32 BadaFileStream::size() const { - int32 oldPos = file->Tell(); - file->Seek(FILESEEKPOSITION_END, 0); - - int32 length = file->Tell(); - SetLastResult(file->Seek(FILESEEKPOSITION_BEGIN, oldPos)); - - return length; -} - -bool BadaFileStream::seek(int32 offs, int whence) { - bool result = false; - switch (whence) { - case SEEK_SET: - // set from start of file - SetLastResult(file->Seek(FILESEEKPOSITION_BEGIN, offs)); - result = (E_SUCCESS == GetLastResult()); - break; - - case SEEK_CUR: - // set relative to offs - if (bufferIndex < bufferLength && bufferIndex > (uint32)-offs) { - // re-position within the buffer - SetLastResult(E_SUCCESS); - bufferIndex += offs; - return true; - } else { - offs -= (bufferLength - bufferIndex); - if (offs < 0 && file->Tell() + offs < 0) { - // avoid negative positioning - offs = 0; - } - if (offs != 0) { - SetLastResult(file->Seek(FILESEEKPOSITION_CURRENT, offs)); - result = (E_SUCCESS == GetLastResult()); - } else { - result = true; - } - } - break; - - case SEEK_END: - // set relative to end - positive will increase the file size - SetLastResult(file->Seek(FILESEEKPOSITION_END, offs)); - result = (E_SUCCESS == GetLastResult()); - break; - - default: - AppLog("Invalid whence %d", whence); - return false; - } - - if (!result) { - AppLog("seek failed"); - } - - bufferIndex = bufferLength = 0; - return result; -} - -uint32 BadaFileStream::read(void *ptr, uint32 len) { - uint32 result = 0; - if (!eos()) { - if (bufferIndex < bufferLength) { - // use existing buffer - uint32 available = bufferLength - bufferIndex; - if (len <= available) { - // use allocation - memcpy((byte *)ptr, &buffer[bufferIndex], len); - bufferIndex += len; - result = len; - } else { - // use remaining allocation - memcpy((byte *)ptr, &buffer[bufferIndex], available); - uint32 remaining = len - available; - result = available; - - if (remaining) { - result += file->Read(((byte *)ptr) + available, remaining); - } - bufferIndex = bufferLength = 0; - } - } else if (len < BUFFER_SIZE) { - // allocate and use buffer - bufferIndex = 0; - bufferLength = file->Read(buffer, BUFFER_SIZE); - if (bufferLength) { - if (bufferLength < len) { - len = bufferLength; - } - memcpy((byte *)ptr, buffer, len); - result = bufferIndex = len; - } - } else { - result = file->Read((byte *)ptr, len); - bufferIndex = bufferLength = 0; - } - } else { - AppLog("Attempted to read past EOS"); - } - return result; -} - -uint32 BadaFileStream::write(const void *ptr, uint32 len) { - result r = file->Write(ptr, len); - SetLastResult(r); - return (r == E_SUCCESS ? len : 0); -} - -bool BadaFileStream::flush() { - logEntered(); - SetLastResult(file->Flush()); - return (E_SUCCESS == GetLastResult()); -} - -BadaFileStream *BadaFileStream::makeFromPath(const String &path, bool writeMode) { - File *ioFile = new File(); - - String filePath = path; - if (writeMode && (path[0] != '.' && path[0] != '/')) { - filePath.Insert(PATH_HOME_X, 0); - } - - AppLog("Open file %S", filePath.GetPointer()); - - result r = ioFile->Construct(filePath, writeMode ? L"w" : L"r", writeMode); - if (r == E_SUCCESS) { - return new BadaFileStream(ioFile, writeMode); - } - - AppLog("Failed to open file"); - delete ioFile; - return 0; -} - -// -// converts a bada (wchar) String into a scummVM (char) string -// -Common::String fromString(const Osp::Base::String &in) { - ByteBuffer *buf = StringUtil::StringToUtf8N(in); - Common::String result((const char*)buf->GetPointer()); - delete buf; - - return result; -} - -// -// BadaFilesystemNode -// -BadaFilesystemNode::BadaFilesystemNode(const Common::String &nodePath) { - AppAssert(nodePath.size() > 0); - init(nodePath); -} - -BadaFilesystemNode::BadaFilesystemNode(const Common::String &root, - const Common::String &nodePath) { - // Make sure the string contains no slashes - AppAssert(!nodePath.contains('/')); - - // We assume here that path is already normalized (hence don't bother to - // call Common::normalizePath on the final path). - Common::String newPath(root); - if (root.lastChar() != '/') { - newPath += '/'; - } - newPath += nodePath; - - init(newPath); -} - -void BadaFilesystemNode::init(const Common::String &nodePath) { - // Normalize the path (that is, remove unneeded slashes etc.) - _path = Common::normalizePath(nodePath, '/'); - _displayName = Common::lastPathComponent(_path, '/'); - - StringUtil::Utf8ToString(_path.c_str(), _unicodePath); - _isVirtualDir = (_path == PATH_ROOT || - _path == PATH_HOME || - _path == PATH_HOME_SHARE || - _path == PATH_HOME_SHARE2 || - _path == PATH_CARD); - _isValid = _isVirtualDir || !IsFailed(File::GetAttributes(_unicodePath, _attr)); -} - -bool BadaFilesystemNode::exists() const { - return _isValid; -} - -bool BadaFilesystemNode::isReadable() const { - return _isVirtualDir || _isValid; -} - -bool BadaFilesystemNode::isDirectory() const { - return _isVirtualDir || (_isValid && _attr.IsDirectory()); -} - -bool BadaFilesystemNode::isWritable() const { - bool result = (_isValid && !_isVirtualDir && !_attr.IsDirectory() && !_attr.IsReadOnly()); - if (_path == PATH_HOME || - _path == PATH_HOME_EXT || - _path == PATH_HOME_SHARE || - _path == PATH_HOME_SHARE2) { - result = true; - } - return result; -} - -AbstractFSNode *BadaFilesystemNode::getChild(const Common::String &n) const { - AppAssert(!_path.empty()); - AppAssert(isDirectory()); - return new BadaFilesystemNode(_path, n); -} - -bool BadaFilesystemNode::getChildren(AbstractFSList &myList, - ListMode mode, bool hidden) const { - AppAssert(isDirectory()); - - bool result = false; - - if (_isVirtualDir && mode != Common::FSNode::kListFilesOnly) { - // present well known BADA file system areas - if (_path == PATH_ROOT) { - myList.push_back(new BadaFilesystemNode(PATH_HOME)); - myList.push_back(new BadaFilesystemNode(PATH_HOME_EXT)); - myList.push_back(new BadaFilesystemNode(PATH_MEDIA)); - myList.push_back(new BadaFilesystemNode(PATH_CARD)); - result = true; // no more entries - } else if (_path == PATH_CARD) { - myList.push_back(new BadaFilesystemNode(PATH_CARD_MEDIA)); - result = true; // no more entries - } else if (_path == PATH_HOME) { - // ensure share path is always included - myList.push_back(new BadaFilesystemNode(PATH_HOME_SHARE)); - myList.push_back(new BadaFilesystemNode(PATH_HOME_SHARE2)); - } - } - - if (!result) { - DirEnumerator *pDirEnum = 0; - Directory *pDir = new Directory(); - - // open directory - if (IsFailed(pDir->Construct(_unicodePath))) { - AppLog("Failed to open directory: %S", _unicodePath.GetPointer()); - } else { - // read all directory entries - pDirEnum = pDir->ReadN(); - if (pDirEnum) { - result = true; - } - - // loop through all directory entries - while (pDirEnum && pDirEnum->MoveNext() == E_SUCCESS) { - DirEntry dirEntry = pDirEnum->GetCurrentDirEntry(); - - // skip 'invisible' files if necessary - Osp::Base::String fileName = dirEntry.GetName(); - - if (fileName[0] == '.' && !hidden) { - continue; - } - - // skip '.' and '..' to avoid cycles - if (fileName == L"." || fileName == L"..") { - continue; - } - - // Honor the chosen mode - if ((mode == Common::FSNode::kListFilesOnly && dirEntry.IsDirectory()) || - (mode == Common::FSNode::kListDirectoriesOnly && !dirEntry.IsDirectory())) { - continue; - } - myList.push_back(new BadaFilesystemNode(_path, fromString(fileName))); - } - } - - // cleanup - if (pDirEnum) { - delete pDirEnum; - } - - // close the opened directory - if (pDir) { - delete pDir; - } - } - - return result; -} - -AbstractFSNode *BadaFilesystemNode::getParent() const { - logEntered(); - if (_path == PATH_ROOT) { - return 0; // The filesystem root has no parent - } - - const char *start = _path.c_str(); - const char *end = start + _path.size(); - - // Strip of the last component. We make use of the fact that at this - // point, path is guaranteed to be normalized - while (end > start && *(end-1) != '/') { - end--; - } - - if (end == start) { - // This only happens if we were called with a relative path, for which - // there simply is no parent. - // TODO: We could also resolve this by assuming that the parent is the - // current working directory, and returning a node referring to that. - return 0; - } - - return new BadaFilesystemNode(Common::String(start, end)); -} - -Common::SeekableReadStream *BadaFilesystemNode::createReadStream() { - Common::SeekableReadStream *result = BadaFileStream::makeFromPath(_unicodePath, false); - if (result != NULL) { - _isValid = !IsFailed(File::GetAttributes(_unicodePath, _attr)); - } - return result; -} - -Common::WriteStream *BadaFilesystemNode::createWriteStream() { - Common::WriteStream *result = BadaFileStream::makeFromPath(_unicodePath, true); - if (result != NULL) { - _isValid = !IsFailed(File::GetAttributes(_unicodePath, _attr)); - } - return result; -} diff --git a/backends/platform/bada/fs.h b/backends/platform/bada/fs.h deleted file mode 100644 index d7d368ac20..0000000000 --- a/backends/platform/bada/fs.h +++ /dev/null @@ -1,82 +0,0 @@ -/* 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 BADA_FILESYSTEM_H -#define BADA_FILESYSTEM_H - -#include -#include -#include -#include - -#include "config.h" -#include "common/scummsys.h" -#include "common/stream.h" -#include "backends/fs/abstract-fs.h" - -using namespace Osp::Io; -using namespace Osp::Base; -using namespace Osp::Base::Utility; - -/** - * Implementation of the ScummVM file system API based on BADA. - * - * Parts of this class are documented in the base interface class, AbstractFSNode. - */ -class BadaFilesystemNode : public AbstractFSNode { -public: - /** - * Creates a BadaFilesystemNode for a given path. - * - * @param path the path the new node should point to. - */ - BadaFilesystemNode(const Common::String &path); - - Common::String getDisplayName() const { return _displayName; } - Common::String getName() const { return _displayName; } - Common::String getPath() const { return _path; } - - bool exists() const; - bool isDirectory() const; - bool isReadable() const; - bool isWritable() const; - - AbstractFSNode *getChild(const Common::String &n) const; - bool getChildren(AbstractFSList &list, ListMode mode, bool hidden) const; - AbstractFSNode *getParent() const; - - Common::SeekableReadStream *createReadStream(); - Common::WriteStream *createWriteStream(); - -protected: - BadaFilesystemNode(const Common::String &root, - const Common::String &p); - void init(const Common::String &nodePath); - - Common::String _displayName; - Common::String _path; - String _unicodePath; - bool _isValid; - bool _isVirtualDir; - FileAttributes _attr; -}; - -#endif diff --git a/backends/platform/bada/graphics.cpp b/backends/platform/bada/graphics.cpp deleted file mode 100644 index bd65c597c6..0000000000 --- a/backends/platform/bada/graphics.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/* 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 "graphics/fontman.h" - -#include "backends/platform/bada/form.h" -#include "backends/platform/bada/system.h" -#include "backends/platform/bada/graphics.h" - -// -// BadaGraphicsManager -// -BadaGraphicsManager::BadaGraphicsManager(BadaAppForm *appForm) : - _appForm(appForm), - _eglDisplay(EGL_DEFAULT_DISPLAY), - _eglSurface(EGL_NO_SURFACE), - _eglConfig(0), - _eglContext(EGL_NO_CONTEXT), - _initState(true) { - assert(appForm != NULL); - _videoMode.fullscreen = true; -} - -const Graphics::Font *BadaGraphicsManager::getFontOSD() { - return FontMan.getFontByUsage(Graphics::FontManager::kBigGUIFont); -} - -bool BadaGraphicsManager::moveMouse(int16 &x, int16 &y) { - int16 currentX = _cursorState.x; - int16 currentY = _cursorState.y; - - // save the current hardware coordinates - _cursorState.x = x; - _cursorState.y = y; - - // return x/y as game coordinates - adjustMousePosition(x, y); - - // convert current x/y to game coordinates - adjustMousePosition(currentX, currentY); - - // return whether game coordinates have changed - return (currentX != x || currentY != y); -} - -Common::List BadaGraphicsManager::getSupportedFormats() const { - logEntered(); - - Common::List res; - res.push_back(Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0)); - res.push_back(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); - res.push_back(Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0)); - res.push_back(Graphics::PixelFormat::createFormatCLUT8()); - return res; -} - -bool BadaGraphicsManager::hasFeature(OSystem::Feature f) { - bool result = (f == OSystem::kFeatureFullscreenMode || - f == OSystem::kFeatureVirtualKeyboard || - OpenGLGraphicsManager::hasFeature(f)); - return result; -} - -void BadaGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) { - OpenGLGraphicsManager::setFeatureState(f, enable); -} - -void BadaGraphicsManager::setReady() { - _initState = false; -} - -void BadaGraphicsManager::updateScreen() { - if (_transactionMode == kTransactionNone) { - internUpdateScreen(); - } -} - -bool BadaGraphicsManager::loadEgl() { - logEntered(); - - EGLint numConfigs = 1; - EGLint eglConfigList[] = { - EGL_RED_SIZE, 5, - EGL_GREEN_SIZE, 6, - EGL_BLUE_SIZE, 5, - EGL_ALPHA_SIZE, 0, - EGL_DEPTH_SIZE, 8, - EGL_SURFACE_TYPE, EGL_WINDOW_BIT, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, - EGL_NONE - }; - - EGLint eglContextList[] = { - EGL_CONTEXT_CLIENT_VERSION, 1, - EGL_NONE - }; - - eglBindAPI(EGL_OPENGL_ES_API); - - if (_eglDisplay) { - unloadGFXMode(); - } - - _eglDisplay = eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY); - if (EGL_NO_DISPLAY == _eglDisplay) { - systemError("eglGetDisplay() failed"); - return false; - } - - if (EGL_FALSE == eglInitialize(_eglDisplay, NULL, NULL) || - EGL_SUCCESS != eglGetError()) { - systemError("eglInitialize() failed"); - return false; - } - - if (EGL_FALSE == eglChooseConfig(_eglDisplay, eglConfigList, - &_eglConfig, 1, &numConfigs) || - EGL_SUCCESS != eglGetError()) { - systemError("eglChooseConfig() failed"); - return false; - } - - if (!numConfigs) { - systemError("eglChooseConfig() failed. Matching config does not exist \n"); - return false; - } - - _eglSurface = eglCreateWindowSurface(_eglDisplay, _eglConfig, - (EGLNativeWindowType)_appForm, NULL); - if (EGL_NO_SURFACE == _eglSurface || EGL_SUCCESS != eglGetError()) { - systemError("eglCreateWindowSurface() failed. EGL_NO_SURFACE"); - return false; - } - - _eglContext = eglCreateContext(_eglDisplay, _eglConfig, - EGL_NO_CONTEXT, eglContextList); - if (EGL_NO_CONTEXT == _eglContext || - EGL_SUCCESS != eglGetError()) { - systemError("eglCreateContext() failed"); - return false; - } - - if (false == eglMakeCurrent(_eglDisplay, _eglSurface, _eglSurface, _eglContext) || - EGL_SUCCESS != eglGetError()) { - systemError("eglMakeCurrent() failed"); - return false; - } - - logLeaving(); - return true; -} - -bool BadaGraphicsManager::loadGFXMode() { - logEntered(); - - if (!loadEgl()) { - unloadGFXMode(); - return false; - } - - int x, y, width, height; - _appForm->GetBounds(x, y, width, height); - _videoMode.overlayWidth = _videoMode.hardwareWidth = width; - _videoMode.overlayHeight = _videoMode.hardwareHeight = height; - _videoMode.scaleFactor = 3; // for proportional sized cursor in the launcher - - AppLog("screen size: %dx%d", _videoMode.hardwareWidth, _videoMode.hardwareHeight); - return OpenGLGraphicsManager::loadGFXMode(); -} - -void BadaGraphicsManager::loadTextures() { - logEntered(); - - OpenGLGraphicsManager::loadTextures(); - - // prevent image skew in some games, see: - // http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); -} - -void BadaGraphicsManager::internUpdateScreen() { - if (!_initState) { - OpenGLGraphicsManager::internUpdateScreen(); - eglSwapBuffers(_eglDisplay, _eglSurface); - } else { - showSplash(); - } -} - -void BadaGraphicsManager::unloadGFXMode() { - logEntered(); - - if (EGL_NO_DISPLAY != _eglDisplay) { - eglMakeCurrent(_eglDisplay, NULL, NULL, NULL); - - if (_eglContext != EGL_NO_CONTEXT) { - eglDestroyContext(_eglDisplay, _eglContext); - _eglContext = EGL_NO_CONTEXT; - } - - if (_eglSurface != EGL_NO_SURFACE) { - eglDestroySurface(_eglDisplay, _eglSurface); - _eglSurface = EGL_NO_SURFACE; - } - - eglTerminate(_eglDisplay); - _eglDisplay = EGL_NO_DISPLAY; - } - - _eglConfig = NULL; - - OpenGLGraphicsManager::unloadGFXMode(); - logLeaving(); -} - -// display a simple splash screen until launcher is ready -void BadaGraphicsManager::showSplash() { - Canvas canvas; - canvas.Construct(); - canvas.SetBackgroundColor(Color::COLOR_BLACK); - canvas.Clear(); - - int x = _videoMode.hardwareWidth / 3; - int y = _videoMode.hardwareHeight / 3; - - Font *pFont = new Font(); - pFont->Construct(FONT_STYLE_ITALIC | FONT_STYLE_BOLD, 55); - canvas.SetFont(*pFont); - canvas.SetForegroundColor(Color::COLOR_GREEN); - canvas.DrawText(Point(x, y), L"ScummVM"); - delete pFont; - - pFont = new Font(); - pFont->Construct(FONT_STYLE_ITALIC | FONT_STYLE_BOLD, 35); - canvas.SetFont(*pFont); - canvas.SetForegroundColor(Color::COLOR_WHITE); - canvas.DrawText(Point(x + 70, y + 50), L"Loading ..."); - delete pFont; - - canvas.Show(); - -} diff --git a/backends/platform/bada/graphics.h b/backends/platform/bada/graphics.h deleted file mode 100644 index b2aaca43bc..0000000000 --- a/backends/platform/bada/graphics.h +++ /dev/null @@ -1,72 +0,0 @@ -/* 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 BADA_GRAPHICS_H -#define BADA_GRAPHICS_H - -#include -#include -#include -#include -#include -#include - -#include "config.h" -#include "backends/graphics/opengl/opengl-graphics.h" -#include "graphics/font.h" -#include "backends/platform/bada/form.h" - -using namespace Osp::Graphics; -using namespace Osp::Graphics::Opengl; -using namespace Osp::App; - -class BadaGraphicsManager : public OpenGLGraphicsManager { -public: - BadaGraphicsManager(BadaAppForm *appForm); - - Common::List getSupportedFormats() const; - bool hasFeature(OSystem::Feature f); - void updateScreen(); - void setFeatureState(OSystem::Feature f, bool enable); - void setReady(); - bool isReady() { return !_initState; } - const Graphics::Font *getFontOSD(); - bool moveMouse(int16 &x, int16 &y); - -private: - void internUpdateScreen(); - bool loadGFXMode(); - void loadTextures(); - void unloadGFXMode(); - void setInternalMousePosition(int x, int y) {} - void showSplash(); - - bool loadEgl(); - BadaAppForm *_appForm; - EGLDisplay _eglDisplay; - EGLSurface _eglSurface; - EGLConfig _eglConfig; - EGLContext _eglContext; - bool _initState; -}; - -#endif diff --git a/backends/platform/bada/main.cpp b/backends/platform/bada/main.cpp deleted file mode 100644 index 8c40f24dd1..0000000000 --- a/backends/platform/bada/main.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* 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 -#include -#include - -#include "backends/platform/bada/portdefs.h" -#include "backends/platform/bada/form.h" -#include "backends/platform/bada/system.h" -#include "backends/platform/bada/application.h" - -using namespace Osp::Base; -using namespace Osp::Base::Collection; - -C_LINKAGE_BEGIN - -_EXPORT_ int OspMain(int argc, char *pArgv[]); - -/** - * The entry function of bada application called by the operating system. - */ -int OspMain(int argc, char *pArgv[]) { - result r = E_SUCCESS; - - AppLog("Application started."); - ArrayList *pArgs = new ArrayList(); - pArgs->Construct(); - - for (int i = 0; i < argc; i++) { - pArgs->Add(*(new String(pArgv[i]))); - } - - r = Osp::App::Application::Execute(BadaScummVM::createInstance, pArgs); - if (IsFailed(r)) { - r &= 0x0000FFFF; - } - - pArgs->RemoveAll(true); - delete pArgs; - AppLog("Application finished."); - - return static_cast(r); -} - -C_LINKAGE_END - - diff --git a/backends/platform/bada/missing.cpp b/backends/platform/bada/missing.cpp deleted file mode 100644 index 10d45ca4b5..0000000000 --- a/backends/platform/bada/missing.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* 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 -#include -#include -#include -#include - -#include "backends/platform/bada/portdefs.h" - -#include -#include -#include -#include - -#define BUF_SIZE 255 - -void systemError(const char *message); - -C_LINKAGE_BEGIN - -int __errno; // for overridden method in saves/default/default-saves.cpp - -void __assert_func(const char *file, int line, - const char *func, const char *err) { - char buffer[BUF_SIZE]; - snprintf(buffer, sizeof(buffer), "%s %d %s %s", file, line, func, err); - systemError(buffer); -} - -void stderr_fprintf(void*, const char *format, ...) { - va_list ap; - char buffer[BUF_SIZE]; - - va_start(ap, format); - vsnprintf(buffer, sizeof(buffer), format, ap); - va_end(ap); - - AppLog(buffer); -} - -void stderr_vfprintf(void*, const char *format, va_list ap) { - char buffer[BUF_SIZE]; - vsnprintf(buffer, sizeof(buffer), format, ap); - AppLog(buffer); -} - -int printf(const char *format, ...) { - int result = 0; - va_list ap; - char buffer[BUF_SIZE]; - - va_start(ap, format); - result = vsnprintf(buffer, sizeof(buffer), format, ap); - va_end(ap); - - AppLog(buffer); - - return result; -} - -int sprintf(char *str, const char *format, ...) { - va_list ap; - int result; - char buffer[BUF_SIZE]; - - va_start(ap, format); - result = vsnprintf(buffer, sizeof(buffer), format, ap); - va_end(ap); - - strcpy(str, buffer); - - return result; -} - -char *strdup(const char *strSource) { - char *buffer; - int len = strlen(strSource) + 1; - buffer = (char *)malloc(len); - if (buffer) { - memcpy(buffer, strSource, len); - } - return buffer; -} - -int vsprintf(char *str, const char *format, va_list ap) { - char buffer[BUF_SIZE]; - int result = vsnprintf(buffer, sizeof(buffer), format, ap); - strcpy(str, buffer); - return result; -} - -C_LINKAGE_END diff --git a/backends/platform/bada/portdefs.h b/backends/platform/bada/portdefs.h deleted file mode 100644 index 813c5acde3..0000000000 --- a/backends/platform/bada/portdefs.h +++ /dev/null @@ -1,85 +0,0 @@ -/* 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 PORT_DEFS_H -#define PORT_DEFS_H - -#include -#include -#include -#include -#include -#include -#include -#include - -#define M_PI 3.14159265358979323846 - -#ifdef __cplusplus - #include // causes a link error when building c programs - #define C_LINKAGE_BEGIN extern "C" { - #define C_LINKAGE_END } -#else - #define C_LINKAGE_BEGIN - #define C_LINKAGE_END -#endif - -C_LINKAGE_BEGIN - -// for libFLAC -#undef fseeko -#undef ftello -#define fseeko fseek -#define ftello ftell - -// overcome use of fprintf since bada/newlib (1.2) does not -// support stderr/stdout (undefined reference to `_impure_ptr'). - -void stderr_fprintf(void*, const char *format, ...); -void stderr_vfprintf(void*, const char *format, va_list ap); - -#undef fprintf -#undef vfprintf -#undef stderr -#undef stdout -#undef stdin -#undef fputs -#undef fflush - -#define stderr (void *)0 -#define stdout (void *)1 -#define stdin (void *)2 -#define fputs(str, file) -#define fflush(file) -#define sscanf simple_sscanf -#define fprintf stderr_fprintf -#define vfprintf stderr_vfprintf - -int printf(const char *format, ...); -int sprintf(char *str, const char *format, ...); -int simple_sscanf(const char *buffer, const char *format, ...); -char *strdup(const char *s1); -int vsprintf(char *str, const char *format, va_list ap); - -C_LINKAGE_END - -#endif diff --git a/backends/platform/bada/sscanf.cpp b/backends/platform/bada/sscanf.cpp deleted file mode 100644 index aa846698f6..0000000000 --- a/backends/platform/bada/sscanf.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* 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 -#include -#include -#include -#include - -// -// simple sscanf replacement to match scummvm usage patterns -// - -bool scanInt(const char **in, va_list *ap, int max) { - // skip leading space characters - while (**in && **in == ' ') { - (*in)++; - } - - // number optionally preceeded with a + or - sign. - bool negate = false; - if (**in == '-') { - (*in)++; - negate = true; - } - - if (**in == '+') { - (*in)++; - } - - int *arg = va_arg(*ap, int*); - char *end; - long n = strtol(*in, &end, 10); - if (negate) { - n = -n; - } - - bool err = false; - if (end == *in || (max > 0 && (end - *in) > max)) { - err = true; - } else { - *arg = (int)n; - *in = end; - } - return err; -} - -bool scanHex(const char **in, va_list *ap) { - unsigned *arg = va_arg(*ap, unsigned*); - char *end; - long n = strtol(*in, &end, 16); - if (end == *in) { - return true; - } - - *in = end; - *arg = (unsigned) n; - return false; -} - -bool scanString(const char **in, va_list *ap) { - char *arg = va_arg(*ap, char*); - while (**in && **in != ' ' && **in != '\n' && **in != '\t') { - *arg = **in; - arg++; - (*in)++; - } - *arg = '\0'; - (*in)++; - return false; -} - -bool scanStringUntil(const char **in, va_list *ap, char c_end) { - char *arg = va_arg(*ap, char*); - while (**in && **in != c_end) { - *arg = **in; - *arg++; - (*in)++; - } - *arg = 0; - (*in)++; - return false; -} - -bool scanChar(const char **in, va_list *ap) { - char *arg = va_arg(*ap, char*); - if (**in) { - *arg = **in; - (*in)++; - } - return false; -} - -extern "C" int simple_sscanf(const char *input, const char *format, ...) { - va_list ap; - int result = 0; - const char *next = input; - - va_start(ap, format); - - while (*format) { - if (*format == '%') { - format++; - int max = 0; - while (isdigit(*format)) { - max = (max * 10) + (*format - '0'); - format++; - } - - bool err = false; - switch (*format++) { - case 'c': - err = scanChar(&next, &ap); - break; - case 'd': - case 'u': - err = scanInt(&next, &ap, max); - break; - case 'x': - err = scanHex(&next, &ap); - break; - case 's': - err = scanString(&next, &ap); - break; - case '[': - // assume %[^c] - if ('^' != *format) { - err = true; - } else { - format++; - if (*format && *(format+1) == ']') { - err = scanStringUntil(&next, &ap, *format); - format += 2; - } else { - err = true; - } - } - break; - default: - err = true; - break; - } - - if (err) { - break; - } else { - result++; - } - } else if (*format++ != *next++) { - // match input - break; - } - } - - va_end(ap); - return result; -} - -#if defined(TEST) -int main(int argc, char *pArgv[]) { - int x,y,xx,yy,h; - char buffer[100]; - unsigned u; - char c; - strcpy(buffer, "hello"); - char *b = buffer; - - if (simple_sscanf("BBX 00009 -1 +10 000", - "BBX %d %d %d %d", - &x, &y, &xx, &yy) != 4) { - printf("Failed\n"); - } else { - printf("Success %d %d %d %d\n", x, y, xx, yy); - } - - if (simple_sscanf("CAT 123x-10 0x100h 123456.AUD $ ", - "CAT %dx%d %xh %06u.AUD %c", - &x, &y, &h, &u, &c) != 5) { - printf("Failed\n"); - } else { - printf("Success %d %d %d %d '%c' \n", x, y, h, u, c); - } - - if (simple_sscanf("COPYRIGHT \"Copyright (c) 1984, 1987 Foo Systems Incorporated", - "COPYRIGHT \"%[^\"]", - b) != 1) { - printf("Failed\n"); - } else { - printf("Success %s\n", buffer); - } - - return 0; -} -#endif diff --git a/backends/platform/bada/system.cpp b/backends/platform/bada/system.cpp deleted file mode 100644 index 3f862c2571..0000000000 --- a/backends/platform/bada/system.cpp +++ /dev/null @@ -1,514 +0,0 @@ -/* 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 -#include - -#include "common/config-manager.h" -#include "common/file.h" -#include "engines/engine.h" -#include "graphics/font.h" -#include "graphics/fontman.h" -#include "graphics/fonts/bdf.h" -#include "backends/saves/default/default-saves.h" -#include "backends/events/default/default-events.h" -#include "backends/audiocd/default/default-audiocd.h" -#include "backends/mutex/mutex.h" -#include "backends/fs/fs-factory.h" -#include "backends/timer/bada/timer.h" - -#include "backends/platform/bada/form.h" -#include "backends/platform/bada/system.h" -#include "backends/platform/bada/graphics.h" -#include "backends/platform/bada/audio.h" - -using namespace Osp::Base; -using namespace Osp::Base::Runtime; -using namespace Osp::Locales; -using namespace Osp::Ui::Controls; -using namespace Osp::System; - -#define DEFAULT_CONFIG_FILE "/Home/scummvm.ini" -#define RESOURCE_PATH "/Res" -#define MUTEX_BUFFER_SIZE 5 - -// -// BadaFilesystemFactory -// -class BadaFilesystemFactory : public FilesystemFactory { - AbstractFSNode *makeRootFileNode() const; - AbstractFSNode *makeCurrentDirectoryFileNode() const; - AbstractFSNode *makeFileNodePath(const Common::String &path) const; -}; - -AbstractFSNode *BadaFilesystemFactory::makeRootFileNode() const { - return new BadaFilesystemNode("/"); -} - -AbstractFSNode *BadaFilesystemFactory::makeCurrentDirectoryFileNode() const { - return new BadaFilesystemNode("/Home"); -} - -AbstractFSNode *BadaFilesystemFactory::makeFileNodePath(const Common::String &path) const { - AppAssert(!path.empty()); - return new BadaFilesystemNode(path); -} - -// -// BadaSaveFileManager -// -struct BadaSaveFileManager : public DefaultSaveFileManager { - bool removeSavefile(const Common::String &filename); -}; - -bool BadaSaveFileManager::removeSavefile(const Common::String &filename) { - Common::String savePathName = getSavePath(); - - checkPath(Common::FSNode(savePathName)); - if (getError().getCode() != Common::kNoError) { - return false; - } - - // recreate FSNode since checkPath may have changed/created the directory - Common::FSNode savePath(savePathName); - Common::FSNode file = savePath.getChild(filename); - - String unicodeFileName; - StringUtil::Utf8ToString(file.getPath().c_str(), unicodeFileName); - - switch (Osp::Io::File::Remove(unicodeFileName)) { - case E_SUCCESS: - return true; - - case E_ILLEGAL_ACCESS: - setError(Common::kWritePermissionDenied, "Search or write permission denied: " + - file.getName()); - break; - - default: - setError(Common::kPathDoesNotExist, "removeSavefile: '" + file.getName() + - "' does not exist or path is invalid"); - break; - } - - return false; -} - -// -// BadaMutexManager -// -struct BadaMutexManager : public MutexManager { - BadaMutexManager(); - ~BadaMutexManager(); - OSystem::MutexRef createMutex(); - void lockMutex(OSystem::MutexRef mutex); - void unlockMutex(OSystem::MutexRef mutex); - void deleteMutex(OSystem::MutexRef mutex); -private: - Mutex *buffer[MUTEX_BUFFER_SIZE]; -}; - -BadaMutexManager::BadaMutexManager() { - for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) { - buffer[i] = NULL; - } -} - -BadaMutexManager::~BadaMutexManager() { - for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) { - if (buffer[i] != NULL) { - delete buffer[i]; - } - } -} - -OSystem::MutexRef BadaMutexManager::createMutex() { - Mutex *mutex = new Mutex(); - mutex->Create(); - - for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) { - if (buffer[i] == NULL) { - buffer[i] = mutex; - break; - } - } - - return (OSystem::MutexRef) mutex; -} - -void BadaMutexManager::lockMutex(OSystem::MutexRef mutex) { - Mutex *m = (Mutex *)mutex; - m->Acquire(); -} - -void BadaMutexManager::unlockMutex(OSystem::MutexRef mutex) { - Mutex *m = (Mutex *)mutex; - m->Release(); -} - -void BadaMutexManager::deleteMutex(OSystem::MutexRef mutex) { - Mutex *m = (Mutex *)mutex; - - for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) { - if (buffer[i] == m) { - buffer[i] = NULL; - } - } - - delete m; -} - -// -// BadaEventManager -// -struct BadaEventManager : public DefaultEventManager { - BadaEventManager(Common::EventSource *boss); - void init(); - int shouldQuit() const; -}; - -BadaEventManager::BadaEventManager(Common::EventSource *boss) : - DefaultEventManager(boss) { -} - -void BadaEventManager::init() { - DefaultEventManager::init(); - - // theme and vkbd should have now loaded - clear the splash screen - BadaSystem *system = (BadaSystem *)g_system; - BadaGraphicsManager *graphics = system->getGraphics(); - if (graphics) { - graphics->setReady(); - graphics->updateScreen(); - } -} - -int BadaEventManager::shouldQuit() const { - BadaSystem *system = (BadaSystem *)g_system; - return DefaultEventManager::shouldQuit() || system->isClosing(); -} - -// -// BadaSystem -// -BadaSystem::BadaSystem(BadaAppForm *appForm) : - _appForm(appForm), - _audioThread(0), - _epoch(0) { -} - -result BadaSystem::Construct(void) { - logEntered(); - - _fsFactory = new BadaFilesystemFactory(); - if (!_fsFactory) { - return E_OUT_OF_MEMORY; - } - - return E_SUCCESS; -} - -BadaSystem::~BadaSystem() { - logEntered(); -} - -result BadaSystem::initModules() { - logEntered(); - - _mutexManager = new BadaMutexManager(); - if (!_mutexManager) { - return E_OUT_OF_MEMORY; - } - - _timerManager = new BadaTimerManager(); - if (!_timerManager) { - return E_OUT_OF_MEMORY; - } - - _savefileManager = new BadaSaveFileManager(); - if (!_savefileManager) { - return E_OUT_OF_MEMORY; - } - - _graphicsManager = (GraphicsManager *)new BadaGraphicsManager(_appForm); - if (!_graphicsManager) { - return E_OUT_OF_MEMORY; - } - - // depends on _graphicsManager when ENABLE_VKEYBD enabled - _eventManager = new BadaEventManager(this); - if (!_eventManager) { - return E_OUT_OF_MEMORY; - } - - _audioThread = new AudioThread(); - if (!_audioThread) { - return E_OUT_OF_MEMORY; - } - - _mixer = _audioThread->Construct(this); - if (!_mixer) { - return E_OUT_OF_MEMORY; - } - - _audiocdManager = (AudioCDManager *)new DefaultAudioCDManager(); - if (!_audiocdManager) { - return E_OUT_OF_MEMORY; - } - - if (IsFailed(_audioThread->Start())) { - AppLog("Failed to start audio thread"); - return E_OUT_OF_MEMORY; - } - - logLeaving(); - return E_SUCCESS; -} - -void BadaSystem::initBackend() { - logEntered(); - - // use the mobile device theme - ConfMan.set("gui_theme", "/Res/scummmobile"); - - // allow bada virtual keypad pack to be found - ConfMan.set("vkeybdpath", "/Res/vkeybd_bada"); - ConfMan.set("vkeybd_pack_name", "vkeybd_bada"); - - // set default save path to writable area - if (!ConfMan.hasKey("savepath")) { - ConfMan.set("savepath", "/Home/Share"); - } - - // default to no auto-save - if (!ConfMan.hasKey("autosave_period")) { - ConfMan.setInt("autosave_period", 0); - } - - ConfMan.registerDefault("fullscreen", true); - ConfMan.registerDefault("aspect_ratio", false); - ConfMan.setBool("confirm_exit", false); - - SystemTime::GetTicks(_epoch); - - if (E_SUCCESS != initModules()) { - AppLog("initModules failed"); - } else { - OSystem::initBackend(); - } - - // replace kBigGUIFont using the large font from the scummmobile theme - Common::File fontFile; - Common::String fileName = "/Res/scummmobile/helvB14-iso-8859-1.fcc"; - BadaFilesystemNode file(fileName); - if (file.exists()) { - Common::SeekableReadStream *stream = file.createReadStream(); - if (stream) { - if (fontFile.open(stream, fileName)) { - Graphics::BdfFont *font = Graphics::BdfFont::loadFromCache(fontFile); - if (font) { - // use this font for the vkbd and on-screen messages - FontMan.setFont(Graphics::FontManager::kBigGUIFont, font); - } - } - } - } - - logLeaving(); -} - -void BadaSystem::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { - // allow translations.dat and game .DAT files to be found - s.addDirectory(RESOURCE_PATH, RESOURCE_PATH, priority); -} - -void BadaSystem::destroyBackend() { - closeAudio(); - - delete _graphicsManager; - _graphicsManager = 0; - - delete _savefileManager; - _savefileManager = 0; - - delete _fsFactory; - _fsFactory = 0; - - delete _mixer; - _mixer = 0; - - delete _audiocdManager; - _audiocdManager = 0; - - delete _timerManager; - _timerManager = 0; - - delete _eventManager; - _eventManager = 0; - - delete _mutexManager; - _mutexManager = 0; -} - -bool BadaSystem::pollEvent(Common::Event &event) { - return _appForm->pollEvent(event); -} - -uint32 BadaSystem::getMillis() { - long long result, ticks = 0; - SystemTime::GetTicks(ticks); - result = ticks - _epoch; - return result; -} - -void BadaSystem::delayMillis(uint msecs) { - if (!_appForm->isClosing()) { - Thread::Sleep(msecs); - } -} - -void BadaSystem::updateScreen() { - if (_graphicsManager != NULL) { - _graphicsManager->updateScreen(); - } -} - -void BadaSystem::getTimeAndDate(TimeDate &td) const { - DateTime currentTime; - - if (E_SUCCESS == SystemTime::GetCurrentTime(WALL_TIME, currentTime)) { - td.tm_sec = currentTime.GetSecond(); - td.tm_min = currentTime.GetMinute(); - td.tm_hour = currentTime.GetHour(); - td.tm_mday = currentTime.GetDay(); - td.tm_mon = currentTime.GetMonth(); - td.tm_year = currentTime.GetYear(); - - Calendar *calendar = Calendar::CreateInstanceN(CALENDAR_GREGORIAN); - calendar->SetTime(currentTime); - td.tm_wday = calendar->GetTimeField(TIME_FIELD_DAY_OF_WEEK) - 1; - delete calendar; - } -} - -void BadaSystem::fatalError() { - systemError("ScummVM: Fatal internal error."); -} - -void BadaSystem::exitSystem() { - if (_appForm) { - closeAudio(); - closeGraphics(); - _appForm->exitSystem(); - } -} - -void BadaSystem::logMessage(LogMessageType::Type type, const char *message) { - if (type == LogMessageType::kError) { - systemError(message); - } else { - AppLog(message); - } -} - -Common::SeekableReadStream *BadaSystem::createConfigReadStream() { - BadaFilesystemNode file(DEFAULT_CONFIG_FILE); - return file.createReadStream(); -} - -Common::WriteStream *BadaSystem::createConfigWriteStream() { - BadaFilesystemNode file(DEFAULT_CONFIG_FILE); - return file.createWriteStream(); -} - -void BadaSystem::closeAudio() { - if (_audioThread) { - _audioThread->Stop(); - _audioThread->Join(); - delete _audioThread; - _audioThread = 0; - } -} - -void BadaSystem::closeGraphics() { - if (_graphicsManager) { - delete _graphicsManager; - _graphicsManager = 0; - } -} - -void BadaSystem::setMute(bool on) { - // only change mute after eventManager init() has completed - if (_audioThread) { - BadaGraphicsManager *graphics = getGraphics(); - if (graphics && graphics->isReady()) { - _audioThread->setMute(on); - } - } -} - -int BadaSystem::setVolume(bool up, bool minMax) { - int level = -1; - if (_audioThread) { - level = _audioThread->setVolume(up, minMax); - } - return level; -} - -// -// create the ScummVM system -// -BadaAppForm *systemStart(Osp::App::Application *app) { - logEntered(); - - BadaAppForm *appForm = new BadaAppForm(); - if (!appForm) { - AppLog("Failed to create appForm"); - return NULL; - } - - if (E_SUCCESS != appForm->Construct() || - E_SUCCESS != app->GetAppFrame()->GetFrame()->AddControl(*appForm)) { - delete appForm; - AppLog("Failed to construct appForm"); - return NULL; - } - - return appForm; -} - -// -// display a fatal error notification -// -void systemError(const char *message) { - AppLog("Fatal system error: %s", message); - - ArrayList *args = new ArrayList(); - args->Construct(); - args->Add(*(new String(message))); - Application::GetInstance()->SendUserEvent(USER_MESSAGE_EXIT_ERR, args); - - if (g_system) { - BadaSystem *system = (BadaSystem *)g_system; - system->exitSystem(); - } -} diff --git a/backends/platform/bada/system.h b/backends/platform/bada/system.h deleted file mode 100644 index c28686cb3d..0000000000 --- a/backends/platform/bada/system.h +++ /dev/null @@ -1,102 +0,0 @@ -/* 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 BADA_SYSTEM_H -#define BADA_SYSTEM_H - -#include -#include -#include -#include -#include -#include - -#include "config.h" -#include "common/scummsys.h" -#include "backends/modular-backend.h" - -#include "backends/platform/bada/fs.h" -#include "backends/platform/bada/form.h" -#include "backends/platform/bada/audio.h" -#include "backends/platform/bada/graphics.h" - -#if defined(_DEBUG) -#define logEntered() AppLog("%s entered (%s %d)", \ - __FUNCTION__, __FILE__, __LINE__); -#define logLeaving() AppLog("%s leaving (%s %d)", \ - __FUNCTION__, __FILE__, __LINE__); -#else -#define logEntered() -#define logLeaving() -#endif - -BadaAppForm *systemStart(Osp::App::Application *app); -void systemError(const char *message); - -#define USER_MESSAGE_EXIT 1000 -#define USER_MESSAGE_EXIT_ERR 1001 - -// -// BadaSystem -// -class BadaSystem : public ModularBackend, - Common::EventSource { -public: - BadaSystem(BadaAppForm *appForm); - ~BadaSystem(); - - result Construct(); - void closeAudio(); - void closeGraphics(); - void destroyBackend(); - void setMute(bool on); - int setVolume(bool up, bool minMax); - void exitSystem(); - bool isClosing() { return _appForm->isClosing(); } - - BadaGraphicsManager *getGraphics() { - return (BadaGraphicsManager *)_graphicsManager; - } - -private: - void initBackend(); - result initModules(); - - void updateScreen(); - bool pollEvent(Common::Event &event); - uint32 getMillis(); - void delayMillis(uint msecs); - void getTimeAndDate(TimeDate &t) const; - void fatalError(); - void logMessage(LogMessageType::Type type, const char *message); - void addSysArchivesToSearchSet(Common::SearchSet &s, int priority); - - Common::EventSource *getDefaultEventSource() { return this; } - Common::SeekableReadStream *createConfigReadStream(); - Common::WriteStream *createConfigWriteStream(); - - BadaAppForm *_appForm; - AudioThread *_audioThread; - long long _epoch; -}; - -#endif diff --git a/backends/platform/tizen/README.TXT b/backends/platform/tizen/README.TXT new file mode 100644 index 0000000000..def3da2cce --- /dev/null +++ b/backends/platform/tizen/README.TXT @@ -0,0 +1,108 @@ +Build instructions (using linux) + +1. Install the Tizen SDK + +http://www.tizen.org + +To use an alternative Java SDK to run the Tizen IDE (eclipse), edit ~/.profile + +export JAVA_HOME=/opt/jdk1.6.0_45 +export PATH=${PATH}:${JAVA_HOME}/bin + +2. Add the following to your ~/.bashrc file + +export TIZEN_SDK=${HOME}/tizen-sdk +export TIZEN_ROOTSTRAP=${TIZEN_SDK}/platforms/tizen2.1/rootstraps/tizen-device-2.1.native +export TIZEN_BIN=${TIZEN_SDK}/tools/arm-linux-gnueabi-gcc-4.5/bin +export TIZEN_LIBS=${HOME}/tizen-lib +export PATH=${PATH}:${TIZEN_BIN}:~/bin +export CHOST=arm-linux-gnueabi +export LDFLAGS="--sysroot=${TIZEN_ROOTSTRAP} -L${TIZEN_LIBS}/lib" +export CPPFLAGS="--sysroot=${TIZEN_ROOTSTRAP} -fmessage-length=0 -fPIC\ + -I${TIZEN_ROOTSTRAP}/usr/include -I${TIZEN_LIBS}/include" +export CFLAGS=${CPPFLAGS} + +3. Build dependencies + + See: "Building the libraries" under: + http://wiki.scummvm.org/index.php/Compiling_ScummVM/MinGW#Building_the_libraries + for instructions on how to obtain these modules + + 3.1 zlib + + $ ./configure --static --prefix=${TIZEN_LIBS} + $ make && make install + + 3.2 freetype, libtheora, libogg, libvorbis, libmad, FLAC + + $ ./configure --host=arm-linux-gnueabi --prefix=${TIZEN_LIBS} --disable-shared + $ make && make install + + Note: you can ignore the ranlib errors when doing make install. + + Modify the resulting ~/tizen-lib/bin/freetype-config file to include -lz when printing libs + + 3.3 Linker ordering: scummvm, freetype, theoradec, vorbis, vorbisfile, mad, FLAC, ogg, z + +4. Build the ScummVM base library: + + ./configure --host=tizen --enable-release --with-freetype2-prefix=${TIZEN_LIBS}/bin + + For development: + + ./configure --host=tizen --enable-verbose-build --enable-debug + +5. Build the front end application using Tizen IDE + + Copy the scummvm/dists/bada folder into a clean directory + outside of the scummvm package. Start the BADA IDE then + choose this folder as the eclipse workspace. Click + Project / Build. + +Links: + +A short turorial on implementing OpenGL ES 1.1 in BADA: + http://forums.badadev.com/viewtopic.php?f=7&t=208 + +HelvB14 font files: + http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html + http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts-75dpi100dpi.tar.gz + + Then run the following command: + $ ./ucs2any.pl 100dpi/helvB14.bdf MAPPINGS/8859-1.TXT iso8859-1 \ + MAPPINGS/8859-2.TXT iso8859-2 MAPPINGS/8859-3.TXT iso8859-3 + +===================================================================== +Archived build instruction for BADA/cygwin + +1. Install BADA SDK (requires free registration): + + http://developer.bada.com/apis/index.do + +2. Install Cygwin: + + http://www.cygwin.com/ + + Add the following to your cygwin .bash_profile: + + alias mmake=/cygdrive/c/MinGW/bin/mingw32-make.exe + export BADA_SDK=/cygdrive/c/bada/1.2.1 + export ARM_BIN=c:/bada/1.2.1/Tools/Toolchains/ARM/bin + export CPPFLAGS="-fpic -fshort-wchar -mcpu=cortex-a8 -mfpu=vfpv3 \ + -mfloat-abi=hard -mlittle-endian -mthumb-interwork -Wno-psabi \ + -fno-strict-aliasing -fno-short-enums" + export LDFLAGS="-nostdlib -lc-newlib -lm-newlib -LC:/bada/1.2.1/Model/Wave_LP1/Target" + #export PATH=${BADA_SDK}/Tools/Toolchains/Win32/bin:${PATH} + export PATH=${BADA_SDK}/Tools/Toolchains/ARM/bin:~/utils:${PATH} + alias gcc=${ARM_BIN}/arm-samsung-nucleuseabi-gcc.exe + alias ar=${ARM_BIN}/arm-samsung-nucleuseabi-ar.exe + + The following were added to ~/utils for zlib: + + ar: + #!/bin/sh + ${ARM_BIN}/arm-samsung-nucleuseabi-ar.exe $* + + gcc: + #!/bin/sh + ${ARM_BIN}/arm-samsung-nucleuseabi-gcc.exe $* diff --git a/backends/platform/tizen/application.cpp b/backends/platform/tizen/application.cpp new file mode 100644 index 0000000000..8236ebef67 --- /dev/null +++ b/backends/platform/tizen/application.cpp @@ -0,0 +1,140 @@ +/* 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 "engines/engine.h" + +#include "backends/platform/tizen/form.h" +#include "backends/platform/tizen/system.h" +#include "backends/platform/tizen/application.h" + +Application *TizenScummVM::createInstance() { + logEntered(); + return new TizenScummVM(); +} + +TizenScummVM::TizenScummVM() : _appForm(0) { + logEntered(); +} + +TizenScummVM::~TizenScummVM() { + logEntered(); + if (g_system) { + TizenSystem *system = (TizenSystem *)g_system; + system->destroyBackend(); + delete system; + g_system = 0; + } +} + +bool TizenScummVM::OnAppInitialized(void) { + logEntered(); + _appForm->SetOrientation(Tizen::Ui::ORIENTATION_LANDSCAPE); + return true; +} + +bool TizenScummVM::OnAppWillTerminate(void) { + logEntered(); + return true; +} + +bool TizenScummVM::OnAppInitializing(AppRegistry &appRegistry) { + logEntered(); + _appForm = systemStart(this); + return (_appForm != NULL); +} + +bool TizenScummVM::OnAppTerminating(AppRegistry &appRegistry, bool forcedTermination) { + logEntered(); + return true; +} + +void TizenScummVM::OnUserEventReceivedN(RequestId requestId, IList *args) { + MessageBox messageBox; + int modalResult; + + logEntered(); + + if (requestId == USER_MESSAGE_EXIT) { + // normal program termination + Terminate(); + } else if (requestId == USER_MESSAGE_EXIT_ERR) { + // assertion failure termination + String *message = NULL; + if (args) { + message = (String *)args->GetAt(0); + } + if (!message) { + message = new String("Unknown error"); + } + messageBox.Construct(L"Oops...", *message, MSGBOX_STYLE_OK); + messageBox.ShowAndWait(modalResult); + Terminate(); + } else if (requestId == USER_MESSAGE_EXIT_ERR_CONFIG) { + // the config file was corrupted + messageBox.Construct(L"Config file corrupted", + L"Settings have been reverted, please restart.", MSGBOX_STYLE_OK); + messageBox.ShowAndWait(modalResult); + Terminate(); + } +} + +void TizenScummVM::OnForeground(void) { + logEntered(); + pauseGame(false); +} + +void TizenScummVM::OnBackground(void) { + logEntered(); + pauseGame(true); +} + +void TizenScummVM::OnBatteryLevelChanged(BatteryLevel batteryLevel) { + logEntered(); +} + +void TizenScummVM::OnLowMemory(void) { + logEntered(); +} + +void TizenScummVM::OnScreenOn(void) { + logEntered(); +} + +void TizenScummVM::OnScreenOff(void) { + logEntered(); +} + +void TizenScummVM::OnScreenBrightnessChanged(int brightness) { + logEntered(); +} + +void TizenScummVM::pauseGame(bool pause) { + if (_appForm) { + if (pause && g_engine && !g_engine->isPaused()) { + _appForm->pushKey(Common::KEYCODE_SPACE); + } + + if (g_system) { + ((TizenSystem *)g_system)->setMute(pause); + } + } +} diff --git a/backends/platform/tizen/application.h b/backends/platform/tizen/application.h new file mode 100644 index 0000000000..f18ccb175b --- /dev/null +++ b/backends/platform/tizen/application.h @@ -0,0 +1,69 @@ +/* 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 TIZEN_APPLICATION_H +#define TIZEN_APPLICATION_H + +#include +#include +#include +#include +#include + +#include "backends/platform/tizen/system.h" +#include "backends/platform/tizen/form.h" + +using namespace Tizen::App; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Base::Collection; + +class TizenScummVM : + public UiApp, + public IScreenEventListener { + +public: + TizenScummVM(); + virtual ~TizenScummVM(); + + static UiApp *createInstance(void); + + virtual bool OnAppInitializing(AppRegistry &appRegistry); + virtual bool OnAppInitialized(void); + virtual bool OnAppWillTerminate(void); + virtual bool OnAppTerminating(AppRegistry &appRegistry, bool forcedTermination = false); + virtual void OnLowMemory(void); + virtual void OnBatteryLevelChanged(BatteryLevel batteryLevel); + virtual void OnUserEventReceivedN(RequestId requestId, IList *pArgs); + virtual void OnForeground(void); + virtual void OnBackground(void); + virtual void OnScreenOn(void); + virtual void OnScreenOff(void); + virtual void OnScreenBrightnessChanged(int brightness); + +private: + void pauseGame(bool pause); + TizenAppForm *_appForm; +}; + +#endif diff --git a/backends/platform/tizen/audio.cpp b/backends/platform/tizen/audio.cpp new file mode 100644 index 0000000000..313a10eaa8 --- /dev/null +++ b/backends/platform/tizen/audio.cpp @@ -0,0 +1,181 @@ +/* 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 +#include + +#include "backends/platform/tizen/audio.h" +#include "backends/platform/tizen/system.h" + +#define TIMER_INTERVAL 10 +#define VOLUME 99 + +AudioThread::AudioThread() : + _mixer(0), + _timer(0), + _audioOut(0), + _head(0), + _tail(0), + _ready(0), + _interval(TIMER_INTERVAL), + _playing(-1), + _muted(true) { +} + +Audio::MixerImpl *AudioThread::Construct(OSystem *system) { + logEntered(); + + if (IsFailed(EventDrivenThread::Construct(DEFAULT_STACK_SIZE, THREAD_PRIORITY_HIGH))) { + AppLog("Failed to create AudioThread"); + return NULL; + } + + _mixer = new Audio::MixerImpl(system, 44100); + return _mixer; +} + +AudioThread::~AudioThread() { + logEntered(); +} + +bool AudioThread::isSilentMode() { + bool silentMode; + String key(L"SilentMode"); + Tizen::System::SettingInfo::GetValue(key, silentMode); + return silentMode; +} + +void AudioThread::setMute(bool on) { + if (_audioOut && _timer) { + _muted = on; + if (on) { + _timer->Cancel(); + } else { + _timer->StartAsRepeatable(_interval); + } + } +} + +bool AudioThread::OnStart(void) { + logEntered(); + + _audioOut = new Tizen::Media::AudioOut(); + if (!_audioOut || IsFailed(_audioOut->Construct(*this))) { + AppLog("Failed to create AudioOut"); + return false; + } + + int sampleRate = _mixer->getOutputRate(); + + // ideally we would update _mixer with GetOptimizedSampleRate here + if (_audioOut->GetOptimizedSampleRate() != sampleRate) { + AppLog("Non optimal sample rate %d", _audioOut->GetOptimizedSampleRate()); + } + + if (IsFailed(_audioOut->Prepare(AUDIO_TYPE_PCM_S16_LE, + AUDIO_CHANNEL_TYPE_STEREO, sampleRate))) { + AppLog("Failed to prepare AudioOut %d", sampleRate); + return false; + } + + int bufferSize = _audioOut->GetMinBufferSize(); + for (int i = 0; i < NUM_AUDIO_BUFFERS; i++) { + if (IsFailed(_audioBuffer[i].Construct(bufferSize))) { + AppLog("Failed to create audio buffer"); + return false; + } + } + + _timer = new Timer(); + if (!_timer || IsFailed(_timer->Construct(*this))) { + AppLog("Failed to create audio timer"); + return false; + } + + if (IsFailed(_timer->StartAsRepeatable(_interval))) { + AppLog("failed to start audio timer"); + return false; + } + + _muted = false; + _mixer->setReady(true); + _audioOut->SetVolume(isSilentMode() ? 0 : VOLUME); + _audioOut->Start(); + return true; +} + +void AudioThread::OnStop(void) { + logEntered(); + + _mixer->setReady(false); + + if (_timer) { + if (!_muted) { + _timer->Cancel(); + } + delete _timer; + } + + if (_audioOut) { + _audioOut->Reset(); + delete _audioOut; + } +} + +void AudioThread::OnAudioOutErrorOccurred(Tizen::Media::AudioOut &src, result r) { + logEntered(); +} + +void AudioThread::OnAudioOutInterrupted(Tizen::Media::AudioOut &src) { + logEntered(); +} + +void AudioThread::OnAudioOutReleased(Tizen::Media::AudioOut &src) { + logEntered(); + _audioOut->Start(); +} + +void AudioThread::OnAudioOutBufferEndReached(Tizen::Media::AudioOut &src) { + if (_ready > 0) { + _playing = _tail; + _audioOut->WriteBuffer(_audioBuffer[_tail]); + _tail = (_tail + 1) % NUM_AUDIO_BUFFERS; + _ready--; + } else { + // audio buffer empty: decrease timer inverval + _playing = -1; + } +} + +void AudioThread::OnTimerExpired(Timer &timer) { + if (_ready < NUM_AUDIO_BUFFERS) { + uint len = _audioBuffer[_head].GetCapacity(); + int samples = _mixer->mixCallback((byte *)_audioBuffer[_head].GetPointer(), len); + if (samples) { + _head = (_head + 1) % NUM_AUDIO_BUFFERS; + _ready++; + } + } + if (_ready && _playing == -1) { + OnAudioOutBufferEndReached(*_audioOut); + } +} diff --git a/backends/platform/tizen/audio.h b/backends/platform/tizen/audio.h new file mode 100644 index 0000000000..8d7835042d --- /dev/null +++ b/backends/platform/tizen/audio.h @@ -0,0 +1,74 @@ +/* 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 TIZEN_AUDIO_H +#define TIZEN_AUDIO_H + +#include +#include +#include +#include + +#include "config.h" +#include "common/scummsys.h" +#include "common/system.h" +#include "audio/mixer_intern.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Media; +using namespace Tizen::Io; + +#define NUM_AUDIO_BUFFERS 2 + +class AudioThread: + public Tizen::Media::IAudioOutEventListener, + public Tizen::Base::Runtime::ITimerEventListener, + public Tizen::Base::Runtime::EventDrivenThread { + +public: + AudioThread(void); + ~AudioThread(void); + + Audio::MixerImpl *Construct(OSystem *system); + bool isSilentMode(); + void setMute(bool on); + + bool OnStart(void); + void OnStop(void); + void OnAudioOutErrorOccurred(Tizen::Media::AudioOut &src, result r); + void OnAudioOutInterrupted(Tizen::Media::AudioOut &src); + void OnAudioOutReleased(Tizen::Media::AudioOut &src); + void OnAudioOutBufferEndReached(Tizen::Media::AudioOut &src); + void OnTimerExpired(Timer &timer); + +private: + Audio::MixerImpl *_mixer; + Tizen::Base::Runtime::Timer *_timer; + Tizen::Media::AudioOut *_audioOut; + Tizen::Base::ByteBuffer _audioBuffer[NUM_AUDIO_BUFFERS]; + int _head, _tail, _ready, _interval, _playing; + bool _muted; +}; + +#endif diff --git a/backends/platform/tizen/form.cpp b/backends/platform/tizen/form.cpp new file mode 100644 index 0000000000..cce4b99557 --- /dev/null +++ b/backends/platform/tizen/form.cpp @@ -0,0 +1,419 @@ +/* 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 +#include + +#include "common/translation.h" +#include "base/main.h" + +#include "backends/platform/tizen/form.h" +#include "backends/platform/tizen/system.h" + +using namespace Tizen::Base::Collection; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Ui::Controls; + +// round down small Y touch values to 1 to allow the +// cursor to be positioned at the top of the screen +#define MIN_TOUCH_Y 20 + +// block for up to 2.5 seconds during shutdown to +// allow the game thread to exit gracefully. +#define EXIT_SLEEP_STEP 10 +#define EXIT_SLEEP 250 + +// +// TizenAppForm +// +TizenAppForm::TizenAppForm() : + _gestureMode(false), + _osdMessage(NULL), + _gameThread(NULL), + _eventQueueLock(NULL), + _state(kInitState), + _buttonState(kLeftButton), + _shortcut(kShowKeypad) { +} + +result TizenAppForm::Construct() { + TizenSystem *tizenSystem = NULL; + result r = Form::Construct(FORM_STYLE_NORMAL); + if (!IsFailed(r)) { + tizenSystem = new TizenSystem(this); + r = tizenSystem != NULL ? E_SUCCESS : E_OUT_OF_MEMORY; + } + if (!IsFailed(r)) { + r = tizenSystem->Construct(); + } + if (!IsFailed(r)) { + _gameThread = new Thread(); + r = _gameThread != NULL ? E_SUCCESS : E_OUT_OF_MEMORY; + } + if (!IsFailed(r)) { + r = _gameThread->Construct(*this); + } + if (!IsFailed(r)) { + _eventQueueLock = new Mutex(); + r = _eventQueueLock != NULL ? E_SUCCESS : E_OUT_OF_MEMORY; + } + if (!IsFailed(r)) { + r = _eventQueueLock->Create(); + } + + if (!IsFailed(r)) { + g_system = tizenSystem; + } else { + AppLog("Form startup failed"); + delete tizenSystem; + delete _gameThread; + _gameThread = NULL; + } + return r; +} + +TizenAppForm::~TizenAppForm() { + logEntered(); + + if (_gameThread && _state != kErrorState) { + terminate(); + + _gameThread->Stop(); + if (_state != kErrorState) { + _gameThread->Join(); + } + + delete _gameThread; + _gameThread = NULL; + } + + delete _eventQueueLock; + _eventQueueLock = NULL; + + logLeaving(); +} + +// +// abort the game thread +// +void TizenAppForm::terminate() { + if (_state == kActiveState) { + ((TizenSystem *)g_system)->setMute(true); + + _eventQueueLock->Acquire(); + + Common::Event e; + e.type = Common::EVENT_QUIT; + _eventQueue.push(e); + _state = kClosingState; + + _eventQueueLock->Release(); + + // block while thread ends + AppLog("waiting for shutdown"); + for (int i = 0; i < EXIT_SLEEP_STEP && _state == kClosingState; i++) { + Thread::Sleep(EXIT_SLEEP); + } + + if (_state == kClosingState) { + // failed to terminate - Join() will freeze + _state = kErrorState; + } + } +} + +void TizenAppForm::exitSystem() { + _state = kErrorState; + + if (_gameThread) { + _gameThread->Stop(); + delete _gameThread; + _gameThread = NULL; + } +} + +result TizenAppForm::OnInitializing(void) { + logEntered(); + + AddOrientationEventListener(*this); + AddTouchEventListener(*this); + SetMultipointTouchEnabled(true); + + // set focus to enable receiving key events + SetEnabled(true); + SetFocusable(true); + SetFocus(); + + return E_SUCCESS; +} + +result TizenAppForm::OnDraw(void) { + logEntered(); + return E_SUCCESS; +} + +void TizenAppForm::OnOrientationChanged(const Control &source, OrientationStatus orientationStatus) { + logEntered(); + if (_state == kInitState) { + _state = kActiveState; + _gameThread->Start(); + } +} + +Tizen::Base::Object *TizenAppForm::Run() { + logEntered(); + + scummvm_main(0, 0); + if (_state == kActiveState) { + Tizen::App::Application::GetInstance()->SendUserEvent(USER_MESSAGE_EXIT, NULL); + } + _state = kDoneState; + return NULL; +} + +bool TizenAppForm::pollEvent(Common::Event &event) { + bool result = false; + + _eventQueueLock->Acquire(); + if (!_eventQueue.empty()) { + event = _eventQueue.pop(); + result = true; + } + if (_osdMessage) { + TizenSystem *system = (TizenSystem *)g_system; + TizenGraphicsManager *graphics = system->getGraphics(); + if (graphics) { + graphics->displayMessageOnOSD(_osdMessage); + _osdMessage = NULL; + } + } + _eventQueueLock->Release(); + + return result; +} + +void TizenAppForm::pushEvent(Common::EventType type, const Point ¤tPosition) { + TizenSystem *system = (TizenSystem *)g_system; + TizenGraphicsManager *graphics = system->getGraphics(); + if (graphics) { + // graphics could be NULL at startup or when + // displaying the system error screen + Common::Event e; + e.type = type; + e.mouse.x = currentPosition.x; + e.mouse.y = currentPosition.y > MIN_TOUCH_Y ? currentPosition.y : 1; + + bool moved = graphics->moveMouse(e.mouse.x, e.mouse.y); + + _eventQueueLock->Acquire(); + + if (moved && type != Common::EVENT_MOUSEMOVE) { + Common::Event moveEvent; + moveEvent.type = Common::EVENT_MOUSEMOVE; + moveEvent.mouse = e.mouse; + _eventQueue.push(moveEvent); + } + + _eventQueue.push(e); + _eventQueueLock->Release(); + } +} + +void TizenAppForm::pushKey(Common::KeyCode keycode) { + if (_eventQueueLock) { + Common::Event e; + e.synthetic = false; + e.kbd.keycode = keycode; + e.kbd.ascii = keycode; + e.kbd.flags = 0; + + _eventQueueLock->Acquire(); + e.type = Common::EVENT_KEYDOWN; + _eventQueue.push(e); + e.type = Common::EVENT_KEYUP; + _eventQueue.push(e); + _eventQueueLock->Release(); + } +} + +void TizenAppForm::setButtonShortcut() { + switch (_buttonState) { + case kLeftButton: + setMessage(_s("Right Click Once")); + _buttonState = kRightButtonOnce; + break; + case kRightButtonOnce: + setMessage(_s("Right Click")); + _buttonState = kRightButton; + break; + case kRightButton: + setMessage(_s("Move Only")); + _buttonState = kMoveOnly; + break; + case kMoveOnly: + setMessage(_s("Left Click")); + _buttonState = kLeftButton; + break; + } +} + +void TizenAppForm::setMessage(const char *message) { + if (_eventQueueLock) { + _eventQueueLock->Acquire(); + _osdMessage = message; + _eventQueueLock->Release(); + } +} + +void TizenAppForm::setShortcut() { + logEntered(); + // cycle to the next shortcut + switch (_shortcut) { + case kControlMouse: + setMessage(_s("Escape Key")); + _shortcut = kEscapeKey; + break; + + case kEscapeKey: + setMessage(_s("Game Menu")); + _shortcut = kGameMenu; + break; + + case kGameMenu: + setMessage(_s("Show Keypad")); + _shortcut = kShowKeypad; + break; + + case kShowKeypad: + setMessage(_s("Control Mouse")); + _shortcut = kControlMouse; + break; + } +} + +void TizenAppForm::invokeShortcut() { + logEntered(); + switch (_shortcut) { + case kControlMouse: + setButtonShortcut(); + break; + + case kEscapeKey: + pushKey(Common::KEYCODE_ESCAPE); + break; + + case kGameMenu: + _buttonState = kLeftButton; + pushKey(Common::KEYCODE_F5); + break; + + case kShowKeypad: + showKeypad(); + break; + } +} + +void TizenAppForm::showKeypad() { + // display the soft keyboard + if (_state == kActiveState) { + _buttonState = kLeftButton; + pushKey(Common::KEYCODE_F7); + } +} + +int TizenAppForm::getTouchCount() { + Tizen::Ui::TouchEventManager *touch = Tizen::Ui::TouchEventManager::GetInstance(); + IListT *touchList = touch->GetTouchInfoListN(); + int touchCount = touchList->GetCount(); + touchList->RemoveAll(); + delete touchList; + return touchCount; +} + +void TizenAppForm::OnTouchDoublePressed(const Control &source, + const Point ¤tPosition, const TouchEventInfo &touchInfo) { + if (_buttonState != kMoveOnly) { + pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN, + currentPosition); + pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN, + currentPosition); + } +} + +void TizenAppForm::OnTouchFocusIn(const Control &source, + const Point ¤tPosition, const TouchEventInfo &touchInfo) { +} + +void TizenAppForm::OnTouchFocusOut(const Control &source, + const Point ¤tPosition, const TouchEventInfo &touchInfo) { +} + +void TizenAppForm::OnTouchLongPressed(const Control &source, + const Point ¤tPosition, const TouchEventInfo &touchInfo) { + logEntered(); + if (_buttonState != kLeftButton) { + pushKey(Common::KEYCODE_RETURN); + } +} + +void TizenAppForm::OnTouchMoved(const Control &source, + const Point ¤tPosition, const TouchEventInfo &touchInfo) { + if (!_gestureMode) { + pushEvent(Common::EVENT_MOUSEMOVE, currentPosition); + } +} + +void TizenAppForm::OnTouchPressed(const Control &source, + const Point ¤tPosition, const TouchEventInfo &touchInfo) { + if (getTouchCount() > 1) { + _gestureMode = true; + } else if (_buttonState != kMoveOnly) { + pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN, + currentPosition); + } +} + +void TizenAppForm::OnTouchReleased(const Control &source, + const Point ¤tPosition, const TouchEventInfo &touchInfo) { + if (_gestureMode) { + int touchCount = getTouchCount(); + if (touchCount == 1) { + setShortcut(); + } else { + if (touchCount == 2) { + invokeShortcut(); + } + _gestureMode = false; + } + } else if (_buttonState != kMoveOnly) { + pushEvent(_buttonState == kLeftButton ? Common::EVENT_LBUTTONUP : Common::EVENT_RBUTTONUP, + currentPosition); + if (_buttonState == kRightButtonOnce) { + _buttonState = kLeftButton; + } + // flick to skip dialog + if (touchInfo.IsFlicked()) { + pushKey(Common::KEYCODE_PERIOD); + } + } +} + diff --git a/backends/platform/tizen/form.h b/backends/platform/tizen/form.h new file mode 100644 index 0000000000..64c447d409 --- /dev/null +++ b/backends/platform/tizen/form.h @@ -0,0 +1,113 @@ +/* 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 TIZEN_FORM_H +#define TIZEN_FORM_H + +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "common/scummsys.h" +#include "common/events.h" +#include "common/queue.h" +#include "common/mutex.h" +#include "engines/engine.h" + +using namespace Tizen::Ui; +using namespace Tizen::Graphics; +using namespace Tizen::Base::Runtime; + +// +// TizenAppForm +// +class TizenAppForm : + public Controls::Form, + public IRunnable, + public IOrientationEventListener, + public ITouchEventListener { + +public: + TizenAppForm(); + virtual ~TizenAppForm(); + + result Construct(); + bool pollEvent(Common::Event &event); + bool isClosing() { return _state == kClosingState; } + bool isStarting() { return _state == kInitState; } + void pushKey(Common::KeyCode keycode); + void exitSystem(); + void showKeypad(); + +private: + Tizen::Base::Object *Run(); + result OnInitializing(void); + result OnDraw(void); + void OnOrientationChanged(const Control &source, + OrientationStatus orientationStatus); + void OnTouchDoublePressed(const Control &source, + const Point ¤tPosition, + const TouchEventInfo &touchInfo); + void OnTouchFocusIn(const Control &source, + const Point ¤tPosition, + const TouchEventInfo &touchInfo); + void OnTouchFocusOut(const Control &source, + const Point ¤tPosition, + const TouchEventInfo &touchInfo); + void OnTouchLongPressed(const Control &source, + const Point ¤tPosition, + const TouchEventInfo &touchInfo); + void OnTouchMoved(const Control &source, + const Point ¤tPosition, + const TouchEventInfo &touchInfo); + void OnTouchPressed(const Control &source, + const Point ¤tPosition, + const TouchEventInfo &touchInfo); + void OnTouchReleased(const Control &source, + const Point ¤tPosition, + const TouchEventInfo &touchInfo); + + void pushEvent(Common::EventType type, const Point ¤tPosition); + void terminate(); + void setButtonShortcut(); + void setMessage(const char *message); + void setShortcut(); + void invokeShortcut(); + int getTouchCount(); + bool gameActive() { return _state == kActiveState && g_engine != NULL && !g_engine->isPaused(); } + + // event handling + bool _gestureMode; + const char *_osdMessage; + Tizen::Base::Runtime::Thread *_gameThread; + Tizen::Base::Runtime::Mutex *_eventQueueLock; + Common::Queue _eventQueue; + enum { kInitState, kActiveState, kClosingState, kDoneState, kErrorState } _state; + enum { kLeftButton, kRightButtonOnce, kRightButton, kMoveOnly } _buttonState; + enum { kControlMouse, kEscapeKey, kGameMenu, kShowKeypad } _shortcut; +}; + +#endif diff --git a/backends/platform/tizen/fs.cpp b/backends/platform/tizen/fs.cpp new file mode 100644 index 0000000000..f8b32f4239 --- /dev/null +++ b/backends/platform/tizen/fs.cpp @@ -0,0 +1,441 @@ +/* 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 "config.h" +#include "common/translation.h" +#include "backends/platform/tizen/system.h" +#include "backends/platform/tizen/fs.h" + +#include + +#define BUFFER_SIZE 1024 + +using namespace Tizen::App; + +// +// converts a Tizen (wchar) String into a scummVM (char) string +// +Common::String fromString(const Tizen::Base::String &in) { + ByteBuffer *buf = StringUtil::StringToUtf8N(in); + Common::String result((const char*)buf->GetPointer()); + delete buf; + return result; +} + +// +// TizenFileStream +// +class TizenFileStream : + public Common::SeekableReadStream, + public Common::WriteStream, + public Common::NonCopyable { +public: + static TizenFileStream *makeFromPath(const String &path, bool writeMode); + + TizenFileStream(File *file, bool writeMode); + ~TizenFileStream(); + + bool err() const; + void clearErr(); + bool eos() const; + + uint32 write(const void *dataPtr, uint32 dataSize); + bool flush(); + + int32 pos() const; + int32 size() const; + bool seek(int32 offs, int whence = SEEK_SET); + uint32 read(void *dataPtr, uint32 dataSize); + +private: + byte _buffer[BUFFER_SIZE]; + uint32 _bufferIndex; + uint32 _bufferLength; + bool _writeMode; + File *_file; +}; + +TizenFileStream::TizenFileStream(File *ioFile, bool writeMode) : + _bufferIndex(0), + _bufferLength(0), + _writeMode(writeMode), + _file(ioFile) { + AppAssert(ioFile != 0); +} + +TizenFileStream::~TizenFileStream() { + if (_file) { + if (_writeMode) { + flush(); + } + delete _file; + } +} + +bool TizenFileStream::err() const { + result r = GetLastResult(); + return (r != E_SUCCESS && r != E_END_OF_FILE); +} + +void TizenFileStream::clearErr() { + SetLastResult(E_SUCCESS); +} + +bool TizenFileStream::eos() const { + return (_bufferLength - _bufferIndex == 0) && (GetLastResult() == E_END_OF_FILE); +} + +int32 TizenFileStream::pos() const { + return _file->Tell() - (_bufferLength - _bufferIndex); +} + +int32 TizenFileStream::size() const { + int32 oldPos = _file->Tell(); + _file->Seek(FILESEEKPOSITION_END, 0); + + int32 length = _file->Tell(); + SetLastResult(_file->Seek(FILESEEKPOSITION_BEGIN, oldPos)); + + return length; +} + +bool TizenFileStream::seek(int32 offs, int whence) { + bool result = false; + switch (whence) { + case SEEK_SET: + // set from start of file + SetLastResult(_file->Seek(FILESEEKPOSITION_BEGIN, offs)); + result = (E_SUCCESS == GetLastResult()); + break; + + case SEEK_CUR: + // set relative to offs + if (_bufferIndex < _bufferLength && _bufferIndex > (uint32)-offs) { + // re-position within the buffer + SetLastResult(E_SUCCESS); + _bufferIndex += offs; + return true; + } else { + offs -= (_bufferLength - _bufferIndex); + if (offs < 0 && _file->Tell() + offs < 0) { + // avoid negative positioning + offs = 0; + } + if (offs != 0) { + SetLastResult(_file->Seek(FILESEEKPOSITION_CURRENT, offs)); + result = (E_SUCCESS == GetLastResult()); + } else { + result = true; + } + } + break; + + case SEEK_END: + // set relative to end - positive will increase the file size + SetLastResult(_file->Seek(FILESEEKPOSITION_END, offs)); + result = (E_SUCCESS == GetLastResult()); + break; + + default: + AppLog("Invalid whence %d", whence); + return false; + } + + if (!result) { + AppLog("seek failed"); + } + + _bufferIndex = _bufferLength = 0; + return result; +} + +uint32 TizenFileStream::read(void *ptr, uint32 len) { + uint32 result = 0; + if (!eos()) { + if (_bufferIndex < _bufferLength) { + // use existing buffer + uint32 available = _bufferLength - _bufferIndex; + if (len <= available) { + // use allocation + memcpy((byte *)ptr, &_buffer[_bufferIndex], len); + _bufferIndex += len; + result = len; + } else { + // use remaining allocation + memcpy((byte *)ptr, &_buffer[_bufferIndex], available); + uint32 remaining = len - available; + result = available; + + if (remaining) { + result += _file->Read(((byte *)ptr) + available, remaining); + } + _bufferIndex = _bufferLength = 0; + } + } else if (len < BUFFER_SIZE) { + // allocate and use buffer + _bufferIndex = 0; + _bufferLength = _file->Read(_buffer, BUFFER_SIZE); + if (_bufferLength) { + if (_bufferLength < len) { + len = _bufferLength; + } + memcpy((byte *)ptr, _buffer, len); + result = _bufferIndex = len; + } + } else { + result = _file->Read((byte *)ptr, len); + _bufferIndex = _bufferLength = 0; + } + } else { + AppLog("Attempted to read past EOS"); + } + return result; +} + +uint32 TizenFileStream::write(const void *ptr, uint32 len) { + result r = _file->Write(ptr, len); + SetLastResult(r); + return (r == E_SUCCESS ? len : 0); +} + +bool TizenFileStream::flush() { + logEntered(); + SetLastResult(_file->Flush()); + return (E_SUCCESS == GetLastResult()); +} + +TizenFileStream *TizenFileStream::makeFromPath(const String &path, bool writeMode) { + File *ioFile = new File(); + + String filePath = path; + if (writeMode && (path[0] != '.' && path[0] != '/')) { + filePath.Insert(App::GetInstance()->GetAppDataPath() + L"/", 0); + } + + AppLog("Open file %S", filePath.GetPointer()); + TizenFileStream *stream; + result r = ioFile->Construct(filePath, writeMode ? L"w" : L"r", writeMode); + if (r == E_SUCCESS) { + stream = new TizenFileStream(ioFile, writeMode); + } else { + AppLog("Failed to open file"); + delete ioFile; + stream = NULL; + } + return stream; +} + +// +// TizenFilesystemNode +// +TizenFilesystemNode::TizenFilesystemNode(const Common::String &nodePath) { + AppAssert(nodePath.size() > 0); + init(nodePath); +} + +TizenFilesystemNode::TizenFilesystemNode(SystemPath systemPath) { + switch (systemPath) { + case kData: + _unicodePath = App::GetInstance()->GetAppDataPath(); + _displayName = _s("[ Data ]"); + break; + case kResource: + _unicodePath = App::GetInstance()->GetAppResourcePath(); + _displayName = _s("[ Resources ]"); + break; + case kSdCard: + _unicodePath = Tizen::System::Environment::GetExternalStoragePath(); + _displayName = _s("[ SDCard ]"); + break; + case kMedia: + _unicodePath = Tizen::System::Environment::GetMediaPath(); + _displayName = _s("[ Media ]"); + break; + case kShared: + _unicodePath = App::GetInstance()->GetAppSharedPath(); + _displayName = _s("[ Shared ]"); + break; + } + _path = ::fromString(_unicodePath); + _isValid = _isVirtualDir = !IsFailed(File::GetAttributes(_unicodePath, _attr)); +} + +TizenFilesystemNode::TizenFilesystemNode(const Common::String &root, const Common::String &nodePath) { + AppLog("TizenFilesystemNode '%s' '%s'", root.c_str(), nodePath.c_str()); + + // Make sure the string contains no slashes + AppAssert(!nodePath.contains('/')); + + // We assume here that path is already normalized (hence don't bother to + // call Common::normalizePath on the final path). + Common::String newPath(root); + if (root.lastChar() != '/') { + newPath += '/'; + } + newPath += nodePath; + + init(newPath); +} + +void TizenFilesystemNode::init(const Common::String &nodePath) { + // Normalize the path (that is, remove unneeded slashes etc.) + _path = Common::normalizePath(nodePath, '/'); + _displayName = Common::lastPathComponent(_path, '/'); + + StringUtil::Utf8ToString(_path.c_str(), _unicodePath); + _isVirtualDir = (_path == "/"); + _isValid = _isVirtualDir || !IsFailed(File::GetAttributes(_unicodePath, _attr)); +} + +bool TizenFilesystemNode::exists() const { + return _isValid; +} + +bool TizenFilesystemNode::isReadable() const { + return _isVirtualDir || _isValid; +} + +bool TizenFilesystemNode::isDirectory() const { + return _isVirtualDir || (_isValid && _attr.IsDirectory()); +} + +bool TizenFilesystemNode::isWritable() const { + bool result = (_isValid && !_attr.IsReadOnly()); + if (_unicodePath == App::GetInstance()->GetAppResourcePath()) { + result = false; + } + return result; +} + +AbstractFSNode *TizenFilesystemNode::getChild(const Common::String &n) const { + AppAssert(!_path.empty()); + AppAssert(isDirectory()); + return new TizenFilesystemNode(_path, n); +} + +bool TizenFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, bool hidden) const { + AppAssert(isDirectory()); + + bool result = false; + + if (_isVirtualDir && mode != Common::FSNode::kListFilesOnly && _path == "/") { + // present well known TIZEN file system areas + myList.push_back(new TizenFilesystemNode(kData)); + myList.push_back(new TizenFilesystemNode(kResource)); + myList.push_back(new TizenFilesystemNode(kSdCard)); + myList.push_back(new TizenFilesystemNode(kMedia)); + myList.push_back(new TizenFilesystemNode(kShared)); + } + + if (!result) { + DirEnumerator *pDirEnum = 0; + Directory *pDir = new Directory(); + + // open directory + if (IsFailed(pDir->Construct(_unicodePath))) { + AppLog("Failed to open directory: %S", _unicodePath.GetPointer()); + } else { + // read all directory entries + pDirEnum = pDir->ReadN(); + if (pDirEnum) { + result = true; + } + + // loop through all directory entries + while (pDirEnum && pDirEnum->MoveNext() == E_SUCCESS) { + DirEntry dirEntry = pDirEnum->GetCurrentDirEntry(); + + // skip 'invisible' files if necessary + Tizen::Base::String fileName = dirEntry.GetName(); + + if (fileName[0] == '.' && !hidden) { + continue; + } + + // skip '.' and '..' to avoid cycles + if (fileName == L"." || fileName == L"..") { + continue; + } + + // Honor the chosen mode + if ((mode == Common::FSNode::kListFilesOnly && dirEntry.IsDirectory()) || + (mode == Common::FSNode::kListDirectoriesOnly && !dirEntry.IsDirectory())) { + continue; + } + myList.push_back(new TizenFilesystemNode(_path, ::fromString(fileName))); + } + } + + // cleanup + if (pDirEnum) { + delete pDirEnum; + } + + // close the opened directory + if (pDir) { + delete pDir; + } + } + + return result; +} + +AbstractFSNode *TizenFilesystemNode::getParent() const { + logEntered(); + if (_path == "/") { + return 0; // The filesystem root has no parent + } + + const char *start = _path.c_str(); + const char *end = start + _path.size(); + + // Strip of the last component. We make use of the fact that at this + // point, path is guaranteed to be normalized + while (end > start && *(end-1) != '/') { + end--; + } + + if (end == start) { + // This only happens if we were called with a relative path, for which + // there simply is no parent. + // TODO: We could also resolve this by assuming that the parent is the + // current working directory, and returning a node referring to that. + return NULL; + } + + return new TizenFilesystemNode(Common::String(start, end)); +} + +Common::SeekableReadStream *TizenFilesystemNode::createReadStream() { + Common::SeekableReadStream *result = TizenFileStream::makeFromPath(_unicodePath, false); + if (result != NULL) { + _isValid = !IsFailed(File::GetAttributes(_unicodePath, _attr)); + } + return result; +} + +Common::WriteStream *TizenFilesystemNode::createWriteStream() { + Common::WriteStream *result = TizenFileStream::makeFromPath(_unicodePath, true); + if (result != NULL) { + _isValid = !IsFailed(File::GetAttributes(_unicodePath, _attr)); + } + return result; +} diff --git a/backends/platform/tizen/fs.h b/backends/platform/tizen/fs.h new file mode 100644 index 0000000000..0356aaad33 --- /dev/null +++ b/backends/platform/tizen/fs.h @@ -0,0 +1,98 @@ +/* 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 TIZEN_FILESYSTEM_H +#define TIZEN_FILESYSTEM_H + +#include +#include +#include +#include + +#include "config.h" +#include "common/scummsys.h" +#include "common/stream.h" +#include "backends/fs/abstract-fs.h" + +using namespace Tizen::Io; +using namespace Tizen::Base; +using namespace Tizen::Base::Utility; + +// +// converts a Tizen (wchar) String into a scummVM (char) string +// +Common::String fromString(const Tizen::Base::String &in); + +// +// Enumerates the possible system paths +// +enum SystemPath { kData, kResource, kSdCard, kMedia, kShared }; + +/** + * Implementation of the ScummVM file system API based on TIZEN. + * + * Parts of this class are documented in the base interface class, AbstractFSNode. + */ +class TizenFilesystemNode : public AbstractFSNode { +public: + /** + * Creates a TizenFilesystemNode for a given path. + * + * @param path the path the new node should point to. + */ + TizenFilesystemNode(const Common::String &path); + + /** + * Creates a TizenFilesystemNode from the given Tizen internal path + * + * @param path the path the new node should point to. + */ + TizenFilesystemNode(SystemPath systemPath); + + Common::String getDisplayName() const { return _displayName; } + Common::String getName() const { return _displayName; } + Common::String getPath() const { return _path; } + + bool exists() const; + bool isDirectory() const; + bool isReadable() const; + bool isWritable() const; + + AbstractFSNode *getChild(const Common::String &n) const; + bool getChildren(AbstractFSList &list, ListMode mode, bool hidden) const; + AbstractFSNode *getParent() const; + + Common::SeekableReadStream *createReadStream(); + Common::WriteStream *createWriteStream(); + +protected: + TizenFilesystemNode(const Common::String &root, const Common::String &p); + void init(const Common::String &nodePath); + + Common::String _displayName; + Common::String _path; + String _unicodePath; + bool _isValid; + bool _isVirtualDir; + FileAttributes _attr; +}; + +#endif diff --git a/backends/platform/tizen/graphics.cpp b/backends/platform/tizen/graphics.cpp new file mode 100644 index 0000000000..bf255cd264 --- /dev/null +++ b/backends/platform/tizen/graphics.cpp @@ -0,0 +1,237 @@ +/* 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 "graphics/fontman.h" + +#include "backends/platform/tizen/form.h" +#include "backends/platform/tizen/system.h" +#include "backends/platform/tizen/graphics.h" + +// +// TizenGraphicsManager +// +TizenGraphicsManager::TizenGraphicsManager(TizenAppForm *appForm) : + _appForm(appForm), + _eglDisplay(EGL_DEFAULT_DISPLAY), + _eglSurface(EGL_NO_SURFACE), + _eglConfig(NULL), + _eglContext(EGL_NO_CONTEXT), + _initState(true) { + assert(appForm != NULL); + _videoMode.fullscreen = true; +} + +TizenGraphicsManager::~TizenGraphicsManager() { + logEntered(); + + if (_eglDisplay != EGL_NO_DISPLAY) { + eglMakeCurrent(_eglDisplay, NULL, NULL, NULL); + if (_eglContext != EGL_NO_CONTEXT) { + eglDestroyContext(_eglDisplay, _eglContext); + } + } +} + +const Graphics::Font *TizenGraphicsManager::getFontOSD() { + return FontMan.getFontByUsage(Graphics::FontManager::kBigGUIFont); +} + +bool TizenGraphicsManager::moveMouse(int16 &x, int16 &y) { + int16 currentX = _cursorState.x; + int16 currentY = _cursorState.y; + + // save the current hardware coordinates + _cursorState.x = x; + _cursorState.y = y; + + // return x/y as game coordinates + adjustMousePosition(x, y); + + // convert current x/y to game coordinates + adjustMousePosition(currentX, currentY); + + // return whether game coordinates have changed + return (currentX != x || currentY != y); +} + +Common::List TizenGraphicsManager::getSupportedFormats() const { + logEntered(); + + Common::List res; + res.push_back(Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0)); + res.push_back(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); + res.push_back(Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0)); + res.push_back(Graphics::PixelFormat::createFormatCLUT8()); + return res; +} + +bool TizenGraphicsManager::hasFeature(OSystem::Feature f) { + bool result = (f == OSystem::kFeatureFullscreenMode || + f == OSystem::kFeatureVirtualKeyboard || + OpenGLGraphicsManager::hasFeature(f)); + return result; +} + +void TizenGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) { + if (f == OSystem::kFeatureVirtualKeyboard && enable) { + _appForm->showKeypad(); + } else { + OpenGLGraphicsManager::setFeatureState(f, enable); + } +} + +void TizenGraphicsManager::setReady() { + _initState = false; +} + +void TizenGraphicsManager::updateScreen() { + if (_transactionMode == kTransactionNone) { + internUpdateScreen(); + } +} + +bool TizenGraphicsManager::loadEgl() { + logEntered(); + + EGLint numConfigs = 1; + EGLint eglConfigList[] = { + EGL_RED_SIZE, 5, + EGL_GREEN_SIZE, 6, + EGL_BLUE_SIZE, 5, + EGL_ALPHA_SIZE, 0, + EGL_DEPTH_SIZE, 8, + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, + EGL_NONE + }; + + EGLint eglContextList[] = { + EGL_CONTEXT_CLIENT_VERSION, 1, + EGL_NONE + }; + + eglBindAPI(EGL_OPENGL_ES_API); + + if (_eglDisplay) { + unloadGFXMode(); + } + + _eglDisplay = eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY); + if (EGL_NO_DISPLAY == _eglDisplay) { + systemError("eglGetDisplay() failed"); + return false; + } + + if (EGL_FALSE == eglInitialize(_eglDisplay, NULL, NULL) || + EGL_SUCCESS != eglGetError()) { + systemError("eglInitialize() failed"); + return false; + } + + if (EGL_FALSE == eglChooseConfig(_eglDisplay, eglConfigList, &_eglConfig, 1, &numConfigs) || + EGL_SUCCESS != eglGetError()) { + systemError("eglChooseConfig() failed"); + return false; + } + + if (!numConfigs) { + systemError("eglChooseConfig() failed. Matching config does not exist \n"); + return false; + } + + _eglSurface = eglCreateWindowSurface(_eglDisplay, _eglConfig, (EGLNativeWindowType)_appForm, NULL); + if (EGL_NO_SURFACE == _eglSurface || EGL_SUCCESS != eglGetError()) { + systemError("eglCreateWindowSurface() failed. EGL_NO_SURFACE"); + return false; + } + + _eglContext = eglCreateContext(_eglDisplay, _eglConfig, EGL_NO_CONTEXT, eglContextList); + if (EGL_NO_CONTEXT == _eglContext || + EGL_SUCCESS != eglGetError()) { + systemError("eglCreateContext() failed"); + return false; + } + + if (false == eglMakeCurrent(_eglDisplay, _eglSurface, _eglSurface, _eglContext) || + EGL_SUCCESS != eglGetError()) { + systemError("eglMakeCurrent() failed"); + return false; + } + + logLeaving(); + return true; +} + +bool TizenGraphicsManager::loadGFXMode() { + logEntered(); + + if (!loadEgl()) { + unloadGFXMode(); + return false; + } + + int x, y, width, height; + _appForm->GetBounds(x, y, width, height); + _videoMode.overlayWidth = _videoMode.hardwareWidth = width; + _videoMode.overlayHeight = _videoMode.hardwareHeight = height; + _videoMode.scaleFactor = 4; // for proportional sized cursor in the launcher + + AppLog("screen size: %dx%d", _videoMode.hardwareWidth, _videoMode.hardwareHeight); + return OpenGLGraphicsManager::loadGFXMode(); +} + +void TizenGraphicsManager::loadTextures() { + logEntered(); + OpenGLGraphicsManager::loadTextures(); +} + +void TizenGraphicsManager::internUpdateScreen() { + if (!_initState) { + OpenGLGraphicsManager::internUpdateScreen(); + eglSwapBuffers(_eglDisplay, _eglSurface); + } +} + +void TizenGraphicsManager::unloadGFXMode() { + logEntered(); + + if (_eglDisplay != EGL_NO_DISPLAY) { + eglMakeCurrent(_eglDisplay, NULL, NULL, NULL); + + if (_eglContext != EGL_NO_CONTEXT) { + eglDestroyContext(_eglDisplay, _eglContext); + _eglContext = EGL_NO_CONTEXT; + } + + if (_eglSurface != EGL_NO_SURFACE) { + eglDestroySurface(_eglDisplay, _eglSurface); + _eglSurface = EGL_NO_SURFACE; + } + + eglTerminate(_eglDisplay); + _eglDisplay = EGL_NO_DISPLAY; + } + + _eglConfig = NULL; + OpenGLGraphicsManager::unloadGFXMode(); + logLeaving(); +} diff --git a/backends/platform/tizen/graphics.h b/backends/platform/tizen/graphics.h new file mode 100644 index 0000000000..27e5a6aaeb --- /dev/null +++ b/backends/platform/tizen/graphics.h @@ -0,0 +1,73 @@ +/* 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 TIZEN_GRAPHICS_H +#define TIZEN_GRAPHICS_H + +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "backends/graphics/opengl/opengl-graphics.h" +#include "graphics/font.h" +#include "backends/platform/tizen/form.h" + +using namespace Tizen::Graphics; +using namespace Tizen::Graphics::Opengl; +using namespace Tizen::App; + +class TizenGraphicsManager : public OpenGLGraphicsManager { +public: + TizenGraphicsManager(TizenAppForm *appForm); + virtual ~TizenGraphicsManager(); + + Common::List getSupportedFormats() const; + bool hasFeature(OSystem::Feature f); + void updateScreen(); + void setFeatureState(OSystem::Feature f, bool enable); + void setReady(); + bool isReady() { return !_initState; } + const Graphics::Font *getFontOSD(); + bool moveMouse(int16 &x, int16 &y); + +private: + void internUpdateScreen(); + bool loadGFXMode(); + void loadTextures(); + void unloadGFXMode(); + void setInternalMousePosition(int x, int y) {} + void showSplash(); + + bool loadEgl(); + TizenAppForm *_appForm; + EGLDisplay _eglDisplay; + EGLSurface _eglSurface; + EGLConfig _eglConfig; + EGLContext _eglContext; + bool _initState; +}; + +#endif diff --git a/backends/platform/tizen/main.cpp b/backends/platform/tizen/main.cpp new file mode 100644 index 0000000000..b12cc3adc9 --- /dev/null +++ b/backends/platform/tizen/main.cpp @@ -0,0 +1,51 @@ +/* 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 +#include +#include + +#include "backends/platform/tizen/application.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; + +/** + * The entry function of tizen application called by the operating system. + */ +extern "C" _EXPORT_ int OspMain(int argc, char *pArgv[]) { + result r = E_SUCCESS; + + AppLog("Application started."); + ArrayList args(SingleObjectDeleter); + args.Construct(); + for (int i = 0; i < argc; i++) { + args.Add(new (std::nothrow) String(pArgv[i])); + } + + r = Tizen::App::UiApp::Execute(TizenScummVM::createInstance, &args); + TryLog(r == E_SUCCESS, "[%s] Application execution failed", GetErrorMessage(r)); + AppLog("Application finished."); + + return static_cast(r); +} + diff --git a/backends/platform/tizen/missing.cpp b/backends/platform/tizen/missing.cpp new file mode 100644 index 0000000000..5ac55d0f6c --- /dev/null +++ b/backends/platform/tizen/missing.cpp @@ -0,0 +1,82 @@ +/* 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 +#include +#include +#include +#include + +#include "backends/platform/tizen/portdefs.h" + +#include +#include +#include +#include + +#define BUF_SIZE 255 + +void systemError(const char *message); + +C_LINKAGE_BEGIN + +int __errno; // for overridden method in saves/default/default-saves.cpp + +void __assert_func(const char *file, int line, + const char *func, const char *err) { + char buffer[BUF_SIZE]; + snprintf(buffer, sizeof(buffer), "%s %d %s %s", file, line, func, err); + systemError(buffer); +} + +void stderr_fprintf(void *, const char *format, ...) { + va_list ap; + char buffer[BUF_SIZE]; + + va_start(ap, format); + vsnprintf(buffer, sizeof(buffer), format, ap); + va_end(ap); + + AppLog(buffer); +} + +void stderr_vfprintf(void *, const char *format, va_list ap) { + char buffer[BUF_SIZE]; + vsnprintf(buffer, sizeof(buffer), format, ap); + AppLog(buffer); +} + +int printf(const char *format, ...) { + int result = 0; + va_list ap; + char buffer[BUF_SIZE]; + + va_start(ap, format); + result = vsnprintf(buffer, sizeof(buffer), format, ap); + va_end(ap); + + AppLog(buffer); + + return result; +} + +C_LINKAGE_END diff --git a/backends/platform/tizen/portdefs.h b/backends/platform/tizen/portdefs.h new file mode 100644 index 0000000000..050ce7d1e0 --- /dev/null +++ b/backends/platform/tizen/portdefs.h @@ -0,0 +1,85 @@ +/* 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 PORT_DEFS_H +#define PORT_DEFS_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#define M_PI 3.14159265358979323846 + +#ifdef __cplusplus + #include // causes a link error when building c programs + #define C_LINKAGE_BEGIN extern "C" { + #define C_LINKAGE_END } +#else + #define C_LINKAGE_BEGIN + #define C_LINKAGE_END +#endif + +// value missing from osp gl headers +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 + +C_LINKAGE_BEGIN + +// for libFLAC +#undef fseeko +#undef ftello +#define fseeko fseek +#define ftello ftell + +// overcome use of fprintf since newlib (1.2) does not +// support stderr/stdout (undefined reference to `_impure_ptr'). + +void stderr_fprintf(void *, const char *format, ...); +void stderr_vfprintf(void *, const char *format, va_list ap); + +#undef fprintf +#undef vfprintf +#undef stderr +#undef stdout +#undef stdin +#undef fputs +#undef fflush + +#define stderr (void *)0 +#define stdout (void *)1 +#define stdin (void *)2 +#define fputs(str, file) +#define fflush(file) +#define sscanf simple_sscanf +#define fprintf stderr_fprintf +#define vfprintf stderr_vfprintf + +int printf(const char *format, ...); +int simple_sscanf(const char *buffer, const char *format, ...); + +C_LINKAGE_END + +#endif diff --git a/backends/platform/tizen/sscanf.cpp b/backends/platform/tizen/sscanf.cpp new file mode 100644 index 0000000000..aa846698f6 --- /dev/null +++ b/backends/platform/tizen/sscanf.cpp @@ -0,0 +1,213 @@ +/* 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 +#include +#include +#include +#include + +// +// simple sscanf replacement to match scummvm usage patterns +// + +bool scanInt(const char **in, va_list *ap, int max) { + // skip leading space characters + while (**in && **in == ' ') { + (*in)++; + } + + // number optionally preceeded with a + or - sign. + bool negate = false; + if (**in == '-') { + (*in)++; + negate = true; + } + + if (**in == '+') { + (*in)++; + } + + int *arg = va_arg(*ap, int*); + char *end; + long n = strtol(*in, &end, 10); + if (negate) { + n = -n; + } + + bool err = false; + if (end == *in || (max > 0 && (end - *in) > max)) { + err = true; + } else { + *arg = (int)n; + *in = end; + } + return err; +} + +bool scanHex(const char **in, va_list *ap) { + unsigned *arg = va_arg(*ap, unsigned*); + char *end; + long n = strtol(*in, &end, 16); + if (end == *in) { + return true; + } + + *in = end; + *arg = (unsigned) n; + return false; +} + +bool scanString(const char **in, va_list *ap) { + char *arg = va_arg(*ap, char*); + while (**in && **in != ' ' && **in != '\n' && **in != '\t') { + *arg = **in; + arg++; + (*in)++; + } + *arg = '\0'; + (*in)++; + return false; +} + +bool scanStringUntil(const char **in, va_list *ap, char c_end) { + char *arg = va_arg(*ap, char*); + while (**in && **in != c_end) { + *arg = **in; + *arg++; + (*in)++; + } + *arg = 0; + (*in)++; + return false; +} + +bool scanChar(const char **in, va_list *ap) { + char *arg = va_arg(*ap, char*); + if (**in) { + *arg = **in; + (*in)++; + } + return false; +} + +extern "C" int simple_sscanf(const char *input, const char *format, ...) { + va_list ap; + int result = 0; + const char *next = input; + + va_start(ap, format); + + while (*format) { + if (*format == '%') { + format++; + int max = 0; + while (isdigit(*format)) { + max = (max * 10) + (*format - '0'); + format++; + } + + bool err = false; + switch (*format++) { + case 'c': + err = scanChar(&next, &ap); + break; + case 'd': + case 'u': + err = scanInt(&next, &ap, max); + break; + case 'x': + err = scanHex(&next, &ap); + break; + case 's': + err = scanString(&next, &ap); + break; + case '[': + // assume %[^c] + if ('^' != *format) { + err = true; + } else { + format++; + if (*format && *(format+1) == ']') { + err = scanStringUntil(&next, &ap, *format); + format += 2; + } else { + err = true; + } + } + break; + default: + err = true; + break; + } + + if (err) { + break; + } else { + result++; + } + } else if (*format++ != *next++) { + // match input + break; + } + } + + va_end(ap); + return result; +} + +#if defined(TEST) +int main(int argc, char *pArgv[]) { + int x,y,xx,yy,h; + char buffer[100]; + unsigned u; + char c; + strcpy(buffer, "hello"); + char *b = buffer; + + if (simple_sscanf("BBX 00009 -1 +10 000", + "BBX %d %d %d %d", + &x, &y, &xx, &yy) != 4) { + printf("Failed\n"); + } else { + printf("Success %d %d %d %d\n", x, y, xx, yy); + } + + if (simple_sscanf("CAT 123x-10 0x100h 123456.AUD $ ", + "CAT %dx%d %xh %06u.AUD %c", + &x, &y, &h, &u, &c) != 5) { + printf("Failed\n"); + } else { + printf("Success %d %d %d %d '%c' \n", x, y, h, u, c); + } + + if (simple_sscanf("COPYRIGHT \"Copyright (c) 1984, 1987 Foo Systems Incorporated", + "COPYRIGHT \"%[^\"]", + b) != 1) { + printf("Failed\n"); + } else { + printf("Success %s\n", buffer); + } + + return 0; +} +#endif diff --git a/backends/platform/tizen/system.cpp b/backends/platform/tizen/system.cpp new file mode 100644 index 0000000000..3d966316c7 --- /dev/null +++ b/backends/platform/tizen/system.cpp @@ -0,0 +1,547 @@ +/* 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 +#include + +#include "common/config-manager.h" +#include "common/file.h" +#include "engines/engine.h" +#include "graphics/font.h" +#include "graphics/fontman.h" +#include "graphics/fonts/bdf.h" +#include "backends/saves/default/default-saves.h" +#include "backends/events/default/default-events.h" +#include "backends/audiocd/default/default-audiocd.h" +#include "backends/mutex/mutex.h" +#include "backends/fs/fs-factory.h" +#include "backends/timer/tizen/timer.h" + +#include "backends/platform/tizen/form.h" +#include "backends/platform/tizen/system.h" +#include "backends/platform/tizen/graphics.h" +#include "backends/platform/tizen/audio.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Locales; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::System; + +#define DEFAULT_CONFIG_FILE "scummvm.ini" +#define MUTEX_BUFFER_SIZE 5 + +// +// TizenFilesystemFactory +// +class TizenFilesystemFactory : public FilesystemFactory { + AbstractFSNode *makeRootFileNode() const; + AbstractFSNode *makeCurrentDirectoryFileNode() const; + AbstractFSNode *makeFileNodePath(const Common::String &path) const; +}; + +AbstractFSNode *TizenFilesystemFactory::makeRootFileNode() const { + return new TizenFilesystemNode("/"); +} + +AbstractFSNode *TizenFilesystemFactory::makeCurrentDirectoryFileNode() const { + return new TizenFilesystemNode("/"); +} + +AbstractFSNode *TizenFilesystemFactory::makeFileNodePath(const Common::String &path) const { + AppAssert(!path.empty()); + return new TizenFilesystemNode(path); +} + +// +// TizenSaveFileManager +// +struct TizenSaveFileManager : public DefaultSaveFileManager { + bool removeSavefile(const Common::String &filename); +}; + +bool TizenSaveFileManager::removeSavefile(const Common::String &filename) { + Common::String savePathName = getSavePath(); + + checkPath(Common::FSNode(savePathName)); + if (getError().getCode() != Common::kNoError) { + return false; + } + + // recreate FSNode since checkPath may have changed/created the directory + Common::FSNode savePath(savePathName); + Common::FSNode file = savePath.getChild(filename); + + String unicodeFileName; + StringUtil::Utf8ToString(file.getPath().c_str(), unicodeFileName); + + switch (Tizen::Io::File::Remove(unicodeFileName)) { + case E_SUCCESS: + return true; + + case E_ILLEGAL_ACCESS: + setError(Common::kWritePermissionDenied, "Search or write permission denied: " + + file.getName()); + break; + + default: + setError(Common::kPathDoesNotExist, "removeSavefile: '" + file.getName() + + "' does not exist or path is invalid"); + break; + } + + return false; +} + +// +// TizenMutexManager +// +struct TizenMutexManager : public MutexManager { + TizenMutexManager(); + ~TizenMutexManager(); + OSystem::MutexRef createMutex(); + void lockMutex(OSystem::MutexRef mutex); + void unlockMutex(OSystem::MutexRef mutex); + void deleteMutex(OSystem::MutexRef mutex); +private: + Mutex *_buffer[MUTEX_BUFFER_SIZE]; +}; + +TizenMutexManager::TizenMutexManager() { + for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) { + _buffer[i] = NULL; + } +} + +TizenMutexManager::~TizenMutexManager() { + for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) { + if (_buffer[i] != NULL) { + delete _buffer[i]; + } + } +} + +OSystem::MutexRef TizenMutexManager::createMutex() { + Mutex *mutex = new Mutex(); + mutex->Create(); + + for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) { + if (_buffer[i] == NULL) { + _buffer[i] = mutex; + break; + } + } + + return (OSystem::MutexRef) mutex; +} + +void TizenMutexManager::lockMutex(OSystem::MutexRef mutex) { + Mutex *m = (Mutex *)mutex; + m->Acquire(); +} + +void TizenMutexManager::unlockMutex(OSystem::MutexRef mutex) { + Mutex *m = (Mutex *)mutex; + m->Release(); +} + +void TizenMutexManager::deleteMutex(OSystem::MutexRef mutex) { + Mutex *m = (Mutex *)mutex; + + for (int i = 0; i < MUTEX_BUFFER_SIZE; i++) { + if (_buffer[i] == m) { + _buffer[i] = NULL; + } + } + + delete m; +} + +// +// TizenEventManager +// +struct TizenEventManager : public DefaultEventManager { + TizenEventManager(Common::EventSource *boss); + void init(); + int shouldQuit() const; +}; + +TizenEventManager::TizenEventManager(Common::EventSource *boss) : + DefaultEventManager(boss) { +} + +void TizenEventManager::init() { + DefaultEventManager::init(); + + // theme and vkbd should have now loaded - clear the splash screen + TizenSystem *system = (TizenSystem *)g_system; + TizenGraphicsManager *graphics = system->getGraphics(); + if (graphics) { + graphics->setReady(); + } +} + +int TizenEventManager::shouldQuit() const { + TizenSystem *system = (TizenSystem *)g_system; + return DefaultEventManager::shouldQuit() || system->isClosing(); +} + +// +// TizenAppFrame - avoid drawing the misplaced UiTheme at startup +// +struct TizenAppFrame : Frame { + result OnDraw(void) { + logEntered(); + TizenAppForm *form = (TizenAppForm *)GetCurrentForm(); + if (form->isStarting()) { + Canvas *canvas = GetCanvasN(); + canvas->SetBackgroundColor(Color::GetColor(COLOR_ID_BLACK)); + canvas->Clear(); + delete canvas; + } + return E_SUCCESS; + } +}; + +// +// TizenSystem +// +TizenSystem::TizenSystem(TizenAppForm *appForm) : + _appForm(appForm), + _audioThread(0), + _epoch(0) { +} + +result TizenSystem::Construct(void) { + logEntered(); + + _fsFactory = new TizenFilesystemFactory(); + if (!_fsFactory) { + return E_OUT_OF_MEMORY; + } + + _resourcePath = fromString(App::GetInstance()->GetAppResourcePath()); + return E_SUCCESS; +} + +TizenSystem::~TizenSystem() { + logEntered(); +} + +result TizenSystem::initModules() { + logEntered(); + + _mutexManager = new TizenMutexManager(); + if (!_mutexManager) { + return E_OUT_OF_MEMORY; + } + + _timerManager = new TizenTimerManager(); + if (!_timerManager) { + return E_OUT_OF_MEMORY; + } + + _savefileManager = new TizenSaveFileManager(); + if (!_savefileManager) { + return E_OUT_OF_MEMORY; + } + + _graphicsManager = (GraphicsManager *)new TizenGraphicsManager(_appForm); + if (!_graphicsManager) { + return E_OUT_OF_MEMORY; + } + + // depends on _graphicsManager when ENABLE_VKEYBD enabled + _eventManager = new TizenEventManager(this); + if (!_eventManager) { + return E_OUT_OF_MEMORY; + } + + _audioThread = new AudioThread(); + if (!_audioThread) { + return E_OUT_OF_MEMORY; + } + + _mixer = _audioThread->Construct(this); + if (!_mixer) { + return E_OUT_OF_MEMORY; + } + + _audiocdManager = (AudioCDManager *)new DefaultAudioCDManager(); + if (!_audiocdManager) { + return E_OUT_OF_MEMORY; + } + + if (IsFailed(_audioThread->Start())) { + AppLog("Failed to start audio thread"); + return E_OUT_OF_MEMORY; + } + + logLeaving(); + return E_SUCCESS; +} + +void TizenSystem::initBackend() { + logEntered(); + + Common::String dataPath = fromString(App::GetInstance()->GetAppDataPath()); + + // use the mobile device theme + ConfMan.set("gui_theme", _resourcePath + "scummmodern"); + + // allow tizen virtual keypad pack to be found + ConfMan.set("vkeybdpath", _resourcePath + "vkeybd_bada"); + ConfMan.set("vkeybd_pack_name", "vkeybd_bada"); + + // set default save path to writable area + if (!ConfMan.hasKey("savepath")) { + ConfMan.set("savepath", dataPath); + } + + // default to no auto-save + if (!ConfMan.hasKey("autosave_period")) { + ConfMan.setInt("autosave_period", 0); + } + + ConfMan.registerDefault("fullscreen", true); + ConfMan.registerDefault("aspect_ratio", false); + ConfMan.setBool("confirm_exit", false); + + SystemTime::GetTicks(_epoch); + + if (E_SUCCESS != initModules()) { + AppLog("initModules failed"); + } else { + OSystem::initBackend(); + + // replace kBigGUIFont for the vkbd and on-screen messages + Common::String fontCacheFile = dataPath + "helvR24.fcc"; + TizenFilesystemNode file(fontCacheFile); + if (!file.exists()) { + Common::String bdfFile = _resourcePath + "fonts/helvR24.bdf"; + TizenFilesystemNode file(bdfFile); + if (file.exists()) { + Common::SeekableReadStream *stream = file.createReadStream(); + Common::File fontFile; + if (stream && fontFile.open(stream, bdfFile)) { + Graphics::BdfFont *font = Graphics::BdfFont::loadFont(fontFile); + Graphics::BdfFont::cacheFontData(*font, fontCacheFile); + FontMan.setFont(Graphics::FontManager::kBigGUIFont, font); + } + } + } else { + Common::SeekableReadStream *stream = file.createReadStream(); + Common::File fontFile; + if (stream && fontFile.open(stream, fontCacheFile)) { + Graphics::BdfFont *font = Graphics::BdfFont::loadFromCache(fontFile); + if (font) { + FontMan.setFont(Graphics::FontManager::kBigGUIFont, font); + } + } + } + } + logLeaving(); +} + +void TizenSystem::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { + // allow translations.dat and game .DAT files to be found + s.addDirectory(_resourcePath, _resourcePath, priority); +} + +void TizenSystem::destroyBackend() { + closeAudio(); + + delete _graphicsManager; + _graphicsManager = NULL; + + delete _savefileManager; + _savefileManager = NULL; + + delete _fsFactory; + _fsFactory = NULL; + + delete _mixer; + _mixer = NULL; + + delete _audiocdManager; + _audiocdManager = NULL; + + delete _timerManager; + _timerManager = NULL; + + delete _eventManager; + _eventManager = NULL; + + delete _mutexManager; + _mutexManager = NULL; +} + +bool TizenSystem::pollEvent(Common::Event &event) { + return _appForm->pollEvent(event); +} + +uint32 TizenSystem::getMillis() { + long long result, ticks = 0; + SystemTime::GetTicks(ticks); + result = ticks - _epoch; + return result; +} + +void TizenSystem::delayMillis(uint msecs) { + if (!_appForm->isClosing()) { + Thread::Sleep(msecs); + } +} + +void TizenSystem::updateScreen() { + if (_graphicsManager != NULL) { + _graphicsManager->updateScreen(); + } +} + +void TizenSystem::getTimeAndDate(TimeDate &td) const { + DateTime currentTime; + + if (E_SUCCESS == SystemTime::GetCurrentTime(WALL_TIME, currentTime)) { + td.tm_sec = currentTime.GetSecond(); + td.tm_min = currentTime.GetMinute(); + td.tm_hour = currentTime.GetHour(); + td.tm_mday = currentTime.GetDay(); + td.tm_mon = currentTime.GetMonth(); + td.tm_year = currentTime.GetYear(); + + Calendar *calendar = Calendar::CreateInstanceN(CALENDAR_GREGORIAN); + calendar->SetTime(currentTime); + td.tm_wday = calendar->GetTimeField(TIME_FIELD_DAY_OF_WEEK) - 1; + delete calendar; + } +} + +void TizenSystem::fatalError() { + systemError("ScummVM: Fatal internal error."); +} + +void TizenSystem::exitSystem() { + if (_appForm) { + closeAudio(); + closeGraphics(); + _appForm->exitSystem(); + } +} + +void TizenSystem::logMessage(LogMessageType::Type type, const char *message) { + if (type == LogMessageType::kError) { + systemError(message); + } else { + AppLog(message); + } +} + +Common::SeekableReadStream *TizenSystem::createConfigReadStream() { + TizenFilesystemNode file(fromString(App::GetInstance()->GetAppDataPath()) + DEFAULT_CONFIG_FILE); + return file.createReadStream(); +} + +Common::WriteStream *TizenSystem::createConfigWriteStream() { + TizenFilesystemNode file(fromString(App::GetInstance()->GetAppDataPath()) + DEFAULT_CONFIG_FILE); + return file.createWriteStream(); +} + +void TizenSystem::closeAudio() { + if (_audioThread) { + _audioThread->Quit(); + _audioThread->Join(); + delete _audioThread; + _audioThread = NULL; + } +} + +void TizenSystem::closeGraphics() { + if (_graphicsManager) { + delete _graphicsManager; + _graphicsManager = NULL; + } +} + +void TizenSystem::setMute(bool on) { + // only change mute after eventManager init() has completed + if (_audioThread) { + TizenGraphicsManager *graphics = getGraphics(); + if (graphics && graphics->isReady()) { + _audioThread->setMute(on); + } + } +} + +// +// create the ScummVM system +// +TizenAppForm *systemStart(Tizen::App::Application *app) { + logEntered(); + + Frame *appFrame = new (std::nothrow) TizenAppFrame(); + if (!appFrame || appFrame->Construct() == E_FAILURE) { + AppLog("Failed to create appFrame"); + return NULL; + } + app->AddFrame(*appFrame); + + TizenAppForm *appForm = new TizenAppForm(); + if (!appForm) { + AppLog("Failed to create appForm"); + return NULL; + } + + if (E_SUCCESS != appForm->Construct() || + E_SUCCESS != appFrame->AddControl(*appForm)) { + delete appForm; + AppLog("Failed to construct appForm"); + return NULL; + } + + appFrame->SetCurrentForm(appForm); + logLeaving(); + return appForm; +} + +// +// display a fatal error notification +// +void systemError(const char *message) { + AppLog("Fatal system error: %s", message); + + if (strspn(message, "Config file buggy:") > 0) { + Tizen::Io::File::Remove(DEFAULT_CONFIG_FILE); + Application::GetInstance()->SendUserEvent(USER_MESSAGE_EXIT_ERR_CONFIG, NULL); + } else { + ArrayList *args = new ArrayList(); + args->Construct(); + args->Add(*(new String(message))); + Application::GetInstance()->SendUserEvent(USER_MESSAGE_EXIT_ERR, args); + } + + if (g_system) { + TizenSystem *system = (TizenSystem *)g_system; + system->exitSystem(); + } +} diff --git a/backends/platform/tizen/system.h b/backends/platform/tizen/system.h new file mode 100644 index 0000000000..19394e1c92 --- /dev/null +++ b/backends/platform/tizen/system.h @@ -0,0 +1,102 @@ +/* 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 TIZEN_SYSTEM_H +#define TIZEN_SYSTEM_H + +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "common/scummsys.h" +#include "backends/modular-backend.h" + +#include "backends/platform/tizen/fs.h" +#include "backends/platform/tizen/form.h" +#include "backends/platform/tizen/audio.h" +#include "backends/platform/tizen/graphics.h" + +#if defined(_DEBUG) +#define logEntered() AppLog("%s entered (%s %d)", __FUNCTION__, __FILE__, __LINE__); +#define logLeaving() AppLog("%s leaving (%s %d)", __FUNCTION__, __FILE__, __LINE__); +#else +#define logEntered() +#define logLeaving() +#endif + +TizenAppForm *systemStart(Tizen::App::Application *app); +void systemError(const char *message); + +#define USER_MESSAGE_EXIT 1000 +#define USER_MESSAGE_EXIT_ERR 1001 +#define USER_MESSAGE_EXIT_ERR_CONFIG 1002 + +// +// TizenSystem +// +class TizenSystem : + public ModularBackend, + Common::EventSource { +public: + TizenSystem(TizenAppForm *appForm); + ~TizenSystem(); + + result Construct(); + void closeAudio(); + void closeGraphics(); + void destroyBackend(); + void setMute(bool on); + void exitSystem(); + bool isClosing() { return _appForm->isClosing(); } + + TizenGraphicsManager *getGraphics() { + return (TizenGraphicsManager *)_graphicsManager; + } + +private: + void initBackend(); + result initModules(); + + void updateScreen(); + bool pollEvent(Common::Event &event); + uint32 getMillis(); + void delayMillis(uint msecs); + void getTimeAndDate(TimeDate &t) const; + void fatalError(); + void logMessage(LogMessageType::Type type, const char *message); + void addSysArchivesToSearchSet(Common::SearchSet &s, int priority); + + Common::EventSource *getDefaultEventSource() { return this; } + Common::SeekableReadStream *createConfigReadStream(); + Common::WriteStream *createConfigWriteStream(); + + TizenAppForm *_appForm; + AudioThread *_audioThread; + long long _epoch; + Common::String _resourcePath; +}; + +#endif diff --git a/backends/platform/tizen/tizen.mk b/backends/platform/tizen/tizen.mk new file mode 100644 index 0000000000..d8925b62dc --- /dev/null +++ b/backends/platform/tizen/tizen.mk @@ -0,0 +1,7 @@ +# port files built under eclipse + +MODULE := backends/platform/tizen + +$(EXECUTABLE): $(OBJS) + rm -f $@ + arm-linux-gnueabi-ar Tru $@ $(OBJS) diff --git a/backends/timer/bada/timer.cpp b/backends/timer/bada/timer.cpp deleted file mode 100644 index e41ecd4864..0000000000 --- a/backends/timer/bada/timer.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* 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. - * - */ - -#if defined(BADA) - -#include "backends/timer/bada/timer.h" - -// -// TimerSlot -// -TimerSlot::TimerSlot(Common::TimerManager::TimerProc callback, - uint32 interval, void *refCon) : - _timer(0), - _callback(callback), - _interval(interval), - _refCon(refCon) { -} - -TimerSlot::~TimerSlot() { -} - -bool TimerSlot::OnStart() { - _timer = new Osp::Base::Runtime::Timer(); - if (!_timer || IsFailed(_timer->Construct(*this))) { - AppLog("Failed to create timer"); - return false; - } - - if (IsFailed(_timer->Start(_interval))) { - AppLog("failed to start timer"); - return false; - } - - AppLog("started timer %d", _interval); - return true; -} - -void TimerSlot::OnStop() { - AppLog("timer stopped"); - if (_timer) { - _timer->Cancel(); - delete _timer; - _timer = NULL; - } -} - -void TimerSlot::OnTimerExpired(Timer &timer) { - _callback(_refCon); - timer.Start(_interval); -} - -// -// BadaTimerManager -// -BadaTimerManager::BadaTimerManager() { -} - -BadaTimerManager::~BadaTimerManager() { - for (Common::List::iterator slot = _timers.begin(); - slot != _timers.end(); ) { - slot->Stop(); - slot = _timers.erase(slot); - } -} - -bool BadaTimerManager::installTimerProc(TimerProc proc, int32 interval, void *refCon, - const Common::String &id) { - TimerSlot *slot = new TimerSlot(proc, interval / 1000, refCon); - - if (IsFailed(slot->Construct(THREAD_TYPE_EVENT_DRIVEN))) { - AppLog("Failed to create timer thread"); - delete slot; - return false; - } - - if (IsFailed(slot->Start())) { - delete slot; - AppLog("Failed to start timer thread"); - return false; - } - - _timers.push_back(*slot); - return true; -} - -void BadaTimerManager::removeTimerProc(TimerProc proc) { - for (Common::List::iterator slot = _timers.begin(); - slot != _timers.end(); ++slot) { - if (slot->_callback == proc) { - slot->Stop(); - slot = _timers.erase(slot); - } - } -} - -#endif diff --git a/backends/timer/bada/timer.h b/backends/timer/bada/timer.h deleted file mode 100644 index 826064d7ff..0000000000 --- a/backends/timer/bada/timer.h +++ /dev/null @@ -1,62 +0,0 @@ -/* 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 BADA_TIMER_H -#define BADA_TIMER_H - -#include - -#include "common/timer.h" -#include "common/list.h" - -using namespace Osp::Base::Runtime; - -struct TimerSlot: public ITimerEventListener, public Thread { - TimerSlot(Common::TimerManager::TimerProc callback, - uint32 interval, - void *refCon); - ~TimerSlot(); - - bool OnStart(void); - void OnStop(void); - void OnTimerExpired(Timer &timer); - - Timer *_timer; - Common::TimerManager::TimerProc _callback; - uint32 _interval; // in microseconds - void *_refCon; -}; - -class BadaTimerManager : public Common::TimerManager { -public: - BadaTimerManager(); - ~BadaTimerManager(); - - bool installTimerProc(TimerProc proc, int32 interval, void *refCon, - const Common::String &id); - void removeTimerProc(TimerProc proc); - -private: - Common::List _timers; -}; - -#endif diff --git a/backends/timer/tizen/timer.cpp b/backends/timer/tizen/timer.cpp new file mode 100644 index 0000000000..fa226ce747 --- /dev/null +++ b/backends/timer/tizen/timer.cpp @@ -0,0 +1,117 @@ +/* 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. + * + */ + +#if defined(TIZEN) + +#include "backends/timer/tizen/timer.h" + +// +// TimerSlot - an event driven thread +// +TimerSlot::TimerSlot(Common::TimerManager::TimerProc callback, uint32 interval, void *refCon) : + _timer(0), + _callback(callback), + _interval(interval), + _refCon(refCon) { +} + +TimerSlot::~TimerSlot() { + delete _timer; +} + +bool TimerSlot::OnStart() { + _timer = new Tizen::Base::Runtime::Timer(); + if (!_timer || IsFailed(_timer->Construct(*this))) { + AppLog("Failed to create timer"); + return false; + } + + if (IsFailed(_timer->StartAsRepeatable(_interval))) { + AppLog("failed to start timer"); + return false; + } + + AppLog("started timer %d", _interval); + return true; +} + +void TimerSlot::OnStop() { + AppLog("timer stopped"); + if (_timer) { + _timer->Cancel(); + delete _timer; + _timer = NULL; + } +} + +void TimerSlot::OnTimerExpired(Timer &timer) { + _callback(_refCon); +} + +// +// TizenTimerManager +// +TizenTimerManager::TizenTimerManager() { +} + +TizenTimerManager::~TizenTimerManager() { + for (Common::List::iterator it = _timers.begin(); it != _timers.end(); ) { + TimerSlot *slot = (*it); + slot->Quit(); + slot->Join(); + delete slot; + it = _timers.erase(it); + } +} + +bool TizenTimerManager::installTimerProc(TimerProc proc, int32 interval, void *refCon, const Common::String &id) { + TimerSlot *slot = new TimerSlot(proc, interval / 1000, refCon); + + if (IsFailed(slot->Construct())) { + AppLog("Failed to create timer thread"); + delete slot; + return false; + } + + if (IsFailed(slot->Start())) { + delete slot; + AppLog("Failed to start timer thread"); + return false; + } + + _timers.push_back(slot); + return true; +} + +void TizenTimerManager::removeTimerProc(TimerProc proc) { + for (Common::List::iterator it = _timers.begin(); it != _timers.end(); ++it) { + TimerSlot *slot = (*it); + if (slot->_callback == proc) { + slot->Quit(); + slot->Join(); + delete slot; + it = _timers.erase(it); + } + } +} + +#endif diff --git a/backends/timer/tizen/timer.h b/backends/timer/tizen/timer.h new file mode 100644 index 0000000000..4b2596401a --- /dev/null +++ b/backends/timer/tizen/timer.h @@ -0,0 +1,59 @@ +/* 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 TIZEN_TIMER_H +#define TIZEN_TIMER_H + +#include + +#include "common/timer.h" +#include "common/list.h" + +using namespace Tizen::Base::Runtime; + +struct TimerSlot: public EventDrivenThread, public ITimerEventListener { + TimerSlot(Common::TimerManager::TimerProc callback, uint32 interval, void *refCon); + ~TimerSlot(); + + bool OnStart(void); + void OnStop(void); + void OnTimerExpired(Timer &timer); + + Timer *_timer; + Common::TimerManager::TimerProc _callback; + uint32 _interval; // in microseconds + void *_refCon; +}; + +class TizenTimerManager : public Common::TimerManager { +public: + TizenTimerManager(); + ~TizenTimerManager(); + + bool installTimerProc(TimerProc proc, int32 interval, void *refCon, const Common::String &id); + void removeTimerProc(TimerProc proc); + +private: + Common::List _timers; +}; + +#endif -- cgit v1.2.3 From 86c656a75ba7a6766d1886fb723f8727de4e68a7 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 4 Jul 2013 01:23:06 +0200 Subject: SDL: Fix compilation on Solaris 10. This replaces a dummy FILE definition before including the SDL headers with simply using the toolchain's definition on Solaris. This is pretty harmless because we only allow FILE to be used in the SDL headers by this. Fixes bug #3614514 "#define FILE FAKE_FILE doesn't work on Solaris (w/ patch)". Thanks to lblume for his patch! --- backends/platform/sdl/sdl-sys.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'backends') diff --git a/backends/platform/sdl/sdl-sys.h b/backends/platform/sdl/sdl-sys.h index ca3c586e03..eccf73815d 100644 --- a/backends/platform/sdl/sdl-sys.h +++ b/backends/platform/sdl/sdl-sys.h @@ -35,8 +35,11 @@ // it with an alternate slightly less unfriendly override. #if !defined(FORBIDDEN_SYMBOL_ALLOW_ALL) && !defined(FORBIDDEN_SYMBOL_EXCEPTION_FILE) #undef FILE +// Solaris has typedef __FILE FILE in several places already +#if !defined(__sun) typedef struct { int FAKE; } FAKE_FILE; #define FILE FAKE_FILE +#endif // (__sun) #endif #if !defined(FORBIDDEN_SYMBOL_ALLOW_ALL) && !defined(FORBIDDEN_SYMBOL_EXCEPTION_strcasecmp) -- cgit v1.2.3 From 93fc2608859c9cb64f291eeacb766c53d4b55323 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 3 Jun 2013 02:25:22 +0200 Subject: SDL: Fix compilation by moving getMixerManager out of USE_OPENGL guard. --- backends/platform/sdl/sdl.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'backends') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 77e6f73d48..f55dd277c7 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -501,6 +501,10 @@ SdlMixerManager *OSystem_SDL::getMixerManager() { return g_eventRec.getMixerManager(); } +Common::TimerManager *OSystem_SDL::getTimerManager() { + return g_eventRec.getTimerManager(); +} + #ifdef USE_OPENGL const OSystem::GraphicsMode *OSystem_SDL::getSupportedGraphicsModes() const { @@ -656,8 +660,4 @@ void OSystem_SDL::setupGraphicsModes() { } } -Common::TimerManager *OSystem_SDL::getTimerManager() { - return g_eventRec.getTimerManager(); -} - #endif -- cgit v1.2.3 From b286a6d033287dce11dfa4216ad11728b892667d Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Thu, 4 Jul 2013 14:54:56 +0300 Subject: RECORDER: Fix guard ifdef --- backends/graphics/surfacesdl/surfacesdl-graphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends') diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index e174a6e807..f66f43e8bf 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -768,7 +768,7 @@ bool SurfaceSdlGraphicsManager::loadGFXMode() { } -#ifdef ENABLE_KEYMAPPER +#ifdef ENABLE_EVENTRECORDER _displayDisabled = ConfMan.getBool("disable_display"); if (_displayDisabled) { -- cgit v1.2.3 From 8d6aa77769d2d914fc05464435d6558b734bd4c1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 4 Jul 2013 15:41:01 +0200 Subject: GUI: Cleanup EventRecorder::getSurface. Formerly the function created a SDL_Surface by hand. Instead now it uses SDL_CreateRGBSurface (which is used in the SDL backend anyway and yields the same results). This should fix PS3 port compilation. --- backends/graphics/surfacesdl/surfacesdl-graphics.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'backends') diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index f66f43e8bf..1ebd019488 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -878,12 +878,7 @@ void SurfaceSdlGraphicsManager::unloadGFXMode() { } if (_hwscreen) { - if (_displayDisabled) { - delete _hwscreen; - } else { - SDL_FreeSurface(_hwscreen); - } - + SDL_FreeSurface(_hwscreen); _hwscreen = NULL; } -- cgit v1.2.3 From 4a7e4e5b22da3587a9d68978d7be31e4e78a8ccc Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Sat, 6 Jul 2013 23:54:45 -0400 Subject: ALL: Don't use EventRecorder at all when not compiled in --- backends/modular-backend.cpp | 6 ++++++ backends/platform/sdl/sdl.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) (limited to 'backends') diff --git a/backends/modular-backend.cpp b/backends/modular-backend.cpp index d84df75439..6afe06aeca 100644 --- a/backends/modular-backend.cpp +++ b/backends/modular-backend.cpp @@ -142,9 +142,15 @@ void ModularBackend::fillScreen(uint32 col) { } void ModularBackend::updateScreen() { +#ifdef ENABLE_EVENTRECORDER g_eventRec.preDrawOverlayGui(); +#endif + _graphicsManager->updateScreen(); + +#ifdef ENABLE_EVENTRECORDER g_eventRec.postDrawOverlayGui(); +#endif } void ModularBackend::setShakePos(int shakeOffset) { diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index f55dd277c7..7ab367d4a4 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -98,7 +98,13 @@ OSystem_SDL::~OSystem_SDL() { delete _mixerManager; _mixerManager = 0; +#ifdef ENABLE_EVENTRECORDER + // HACK HACK HACK + // This is nasty. delete g_eventRec.getTimerManager(); +#else + delete _timerManager; +#endif _timerManager = 0; delete _mutexManager; @@ -193,9 +199,15 @@ void OSystem_SDL::initBackend() { // Setup and start mixer _mixerManager->init(); } + +#ifdef ENABLE_EVENTRECORDER g_eventRec.registerMixerManager(_mixerManager); g_eventRec.registerTimerManager(new SdlTimerManager()); +#else + if (_timerManager == 0) + _timerManager = new SdlTimerManager(); +#endif if (_audiocdManager == 0) { // Audio CD support was removed with SDL 1.3 @@ -470,12 +482,18 @@ void OSystem_SDL::setupIcon() { uint32 OSystem_SDL::getMillis(bool skipRecord) { uint32 millis = SDL_GetTicks(); + +#ifdef ENABLE_EVENTRECORDER g_eventRec.processMillis(millis, skipRecord); +#endif + return millis; } void OSystem_SDL::delayMillis(uint msecs) { +#ifdef ENABLE_EVENTRECORDER if (!g_eventRec.processDelayMillis()) +#endif SDL_Delay(msecs); } @@ -498,11 +516,20 @@ Audio::Mixer *OSystem_SDL::getMixer() { SdlMixerManager *OSystem_SDL::getMixerManager() { assert(_mixerManager); + +#ifdef ENABLE_EVENTRECORDER return g_eventRec.getMixerManager(); +#else + return _mixerManager; +#endif } Common::TimerManager *OSystem_SDL::getTimerManager() { +#ifdef ENABLE_EVENTRECORDER return g_eventRec.getTimerManager(); +#else + return _timerManager; +#endif } #ifdef USE_OPENGL -- cgit v1.2.3 From 989ea7cb56245ce1918ddf54c2e06973ebcd6239 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sun, 14 Jul 2013 19:01:47 +0200 Subject: JANITORIAL: Remove trailing whitespace --- backends/graphics/surfacesdl/surfacesdl-graphics.cpp | 2 +- backends/platform/tizen/form.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'backends') diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index 1ebd019488..a2e1981e79 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -773,7 +773,7 @@ bool SurfaceSdlGraphicsManager::loadGFXMode() { if (_displayDisabled) { _hwscreen = g_eventRec.getSurface(_videoMode.hardwareWidth, _videoMode.hardwareHeight); - } else + } else #endif { _hwscreen = SDL_SetVideoMode(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 16, diff --git a/backends/platform/tizen/form.cpp b/backends/platform/tizen/form.cpp index cce4b99557..5050699ca9 100644 --- a/backends/platform/tizen/form.cpp +++ b/backends/platform/tizen/form.cpp @@ -316,16 +316,16 @@ void TizenAppForm::invokeShortcut() { case kControlMouse: setButtonShortcut(); break; - + case kEscapeKey: pushKey(Common::KEYCODE_ESCAPE); break; - + case kGameMenu: _buttonState = kLeftButton; pushKey(Common::KEYCODE_F5); break; - + case kShowKeypad: showKeypad(); break; -- cgit v1.2.3 From 55afab4d68454a2ea18da39e0c0c856424ecfb46 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 3 Aug 2013 01:27:41 +0200 Subject: BACKENDS: Prefer getBasePtr over direct Surface::pixels access. --- backends/base-backend.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backends') diff --git a/backends/base-backend.cpp b/backends/base-backend.cpp index 3e0005dedd..f410270d9e 100644 --- a/backends/base-backend.cpp +++ b/backends/base-backend.cpp @@ -57,7 +57,7 @@ void BaseBackend::initBackend() { void BaseBackend::fillScreen(uint32 col) { Graphics::Surface *screen = lockScreen(); - if (screen && screen->pixels) - memset(screen->pixels, col, screen->h * screen->pitch); + if (screen && screen->getBasePtr(0, 0)) + memset(screen->getBasePtr(0, 0), col, screen->h * screen->pitch); unlockScreen(); } -- cgit v1.2.3 From 3169e070135ed06b7f5c5e8ad60c088e4cbd496f Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 3 Aug 2013 01:32:11 +0200 Subject: OPENGL: Prefer getBasePtr over direct Surface::pixels access. --- backends/graphics/opengl/opengl-graphics.cpp | 40 +++++++++++++--------------- 1 file changed, 19 insertions(+), 21 deletions(-) (limited to 'backends') diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp index 48e2663d44..d126ebc212 100644 --- a/backends/graphics/opengl/opengl-graphics.cpp +++ b/backends/graphics/opengl/opengl-graphics.cpp @@ -357,7 +357,7 @@ void OpenGLGraphicsManager::copyRectToScreen(const void *buf, int pitch, int x, // Copy buffer data to game screen internal buffer const byte *src = (const byte *)buf; - byte *dst = (byte *)_screenData.pixels + y * _screenData.pitch + x * _screenData.format.bytesPerPixel; + byte *dst = (byte *)_screenData.getBasePtr(x, y); for (int i = 0; i < h; i++) { memcpy(dst, src, w * _screenData.format.bytesPerPixel); src += pitch; @@ -385,15 +385,15 @@ void OpenGLGraphicsManager::fillScreen(uint32 col) { #ifdef USE_RGB_COLOR if (_screenFormat.bytesPerPixel == 1) { - memset(_screenData.pixels, col, _screenData.h * _screenData.pitch); + memset(_screenData.getBasePtr(0, 0), col, _screenData.h * _screenData.pitch); } else if (_screenFormat.bytesPerPixel == 2) { - uint16 *pixels = (uint16 *)_screenData.pixels; + uint16 *pixels = (uint16 *)_screenData.getBasePtr(0, 0); uint16 col16 = (uint16)col; for (int i = 0; i < _screenData.w * _screenData.h; i++) { pixels[i] = col16; } } else if (_screenFormat.bytesPerPixel == 3) { - uint8 *pixels = (uint8 *)_screenData.pixels; + uint8 *pixels = (uint8 *)_screenData.getBasePtr(0, 0); byte r = (col >> 16) & 0xFF; byte g = (col >> 8) & 0xFF; byte b = col & 0xFF; @@ -404,13 +404,13 @@ void OpenGLGraphicsManager::fillScreen(uint32 col) { pixels += 3; } } else if (_screenFormat.bytesPerPixel == 4) { - uint32 *pixels = (uint32 *)_screenData.pixels; + uint32 *pixels = (uint32 *)_screenData.getBasePtr(0, 0); for (int i = 0; i < _screenData.w * _screenData.h; i++) { pixels[i] = col; } } #else - memset(_screenData.pixels, col, _screenData.h * _screenData.pitch); + memset(_screenData.getBasePtr(0, 0), col, _screenData.h * _screenData.pitch); #endif _screenNeedsRedraw = true; } @@ -463,12 +463,12 @@ Graphics::PixelFormat OpenGLGraphicsManager::getOverlayFormat() const { void OpenGLGraphicsManager::clearOverlay() { // Set all pixels to 0 - memset(_overlayData.pixels, 0, _overlayData.h * _overlayData.pitch); + memset(_overlayData.getBasePtr(0, 0), 0, _overlayData.h * _overlayData.pitch); _overlayNeedsRedraw = true; } void OpenGLGraphicsManager::grabOverlay(void *buf, int pitch) { - const byte *src = (byte *)_overlayData.pixels; + const byte *src = (byte *)_overlayData.getBasePtr(0, 0); byte *dst = (byte *)buf; for (int i = 0; i < _overlayData.h; i++) { // Copy overlay data to buffer @@ -509,7 +509,7 @@ void OpenGLGraphicsManager::copyRectToOverlay(const void *buf, int pitch, int x, return; // Copy buffer data to internal overlay surface - byte *dst = (byte *)_overlayData.pixels + y * _overlayData.pitch; + byte *dst = (byte *)_overlayData.getBasePtr(0, y); for (int i = 0; i < h; i++) { memcpy(dst + x * _overlayData.format.bytesPerPixel, src, w * _overlayData.format.bytesPerPixel); src += pitch; @@ -609,7 +609,7 @@ void OpenGLGraphicsManager::setMouseCursor(const void *buf, uint w, uint h, int _cursorData.create(w, h, _cursorFormat); // Save cursor data - memcpy(_cursorData.pixels, buf, h * _cursorData.pitch); + memcpy(_cursorData.getBasePtr(0, 0), buf, h * _cursorData.pitch); // Set cursor info _cursorState.w = w; @@ -688,7 +688,7 @@ void OpenGLGraphicsManager::refreshGameScreen() { byte *surface = new byte[w * h * 3]; // Convert the paletted buffer to RGB888 - const byte *src = (byte *)_screenData.pixels + y * _screenData.pitch; + const byte *src = (byte *)_screenData.getBasePtr(0, y); src += x * _screenData.format.bytesPerPixel; byte *dst = surface; for (int i = 0; i < h; i++) { @@ -708,8 +708,7 @@ void OpenGLGraphicsManager::refreshGameScreen() { delete[] surface; } else { // Update the texture - _gameTexture->updateBuffer((byte *)_screenData.pixels + y * _screenData.pitch + - x * _screenData.format.bytesPerPixel, _screenData.pitch, x, y, w, h); + _gameTexture->updateBuffer((byte *)_screenData.getBasePtr(x, y), _screenData.pitch, x, y, w, h); } _screenNeedsRedraw = false; @@ -730,7 +729,7 @@ void OpenGLGraphicsManager::refreshOverlay() { byte *surface = new byte[w * h * 3]; // Convert the paletted buffer to RGB888 - const byte *src = (byte *)_overlayData.pixels + y * _overlayData.pitch; + const byte *src = (byte *)_overlayData.getBasePtr(0, y); src += x * _overlayData.format.bytesPerPixel; byte *dst = surface; for (int i = 0; i < h; i++) { @@ -750,8 +749,7 @@ void OpenGLGraphicsManager::refreshOverlay() { delete[] surface; } else { // Update the texture - _overlayTexture->updateBuffer((byte *)_overlayData.pixels + y * _overlayData.pitch + - x * _overlayData.format.bytesPerPixel, _overlayData.pitch, x, y, w, h); + _overlayTexture->updateBuffer((byte *)_overlayData.getBasePtr(x, y), _overlayData.pitch, x, y, w, h); } _overlayNeedsRedraw = false; @@ -780,7 +778,7 @@ void OpenGLGraphicsManager::refreshCursor() { palette = _cursorPalette; // Convert the paletted cursor to RGBA8888 - const byte *src = (byte *)_cursorData.pixels; + const byte *src = (byte *)_cursorData.getBasePtr(0, 0); for (int i = 0; i < _cursorState.w * _cursorState.h; i++) { // Check for keycolor if (src[i] != _cursorKeyColor) { @@ -796,7 +794,7 @@ void OpenGLGraphicsManager::refreshCursor() { // Convert the RGB cursor to RGBA8888 if (_cursorFormat.bytesPerPixel == 2) { - const uint16 *src = (uint16 *)_cursorData.pixels; + const uint16 *src = (uint16 *)_cursorData.getBasePtr(0, 0); for (int i = 0; i < _cursorState.w * _cursorState.h; i++) { // Check for keycolor if (src[i] != _cursorKeyColor) { @@ -808,7 +806,7 @@ void OpenGLGraphicsManager::refreshCursor() { dst += 4; } } else if (_cursorFormat.bytesPerPixel == 4) { - const uint32 *src = (uint32 *)_cursorData.pixels; + const uint32 *src = (uint32 *)_cursorData.getBasePtr(0, 0); for (int i = 0; i < _cursorState.w * _cursorState.h; i++) { // Check for keycolor if (src[i] != _cursorKeyColor) { @@ -1356,7 +1354,7 @@ void OpenGLGraphicsManager::updateOSD() { _osdSurface.create(_osdTexture->getWidth(), _osdTexture->getHeight(), _overlayFormat); else // Clear everything - memset(_osdSurface.pixels, 0, _osdSurface.h * _osdSurface.pitch); + memset(_osdSurface.getBasePtr(0, 0), 0, _osdSurface.h * _osdSurface.pitch); // Determine a rect which would contain the message string (clipped to the // screen dimensions). @@ -1390,7 +1388,7 @@ void OpenGLGraphicsManager::updateOSD() { } // Update the texture - _osdTexture->updateBuffer(_osdSurface.pixels, _osdSurface.pitch, 0, 0, + _osdTexture->updateBuffer(_osdSurface.getBasePtr(0, 0), _osdSurface.pitch, 0, 0, _osdSurface.w, _osdSurface.h); } #endif -- cgit v1.2.3 From b7706acb4107b6dd6b562062f1d20720e0560f9e Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 3 Aug 2013 01:40:57 +0200 Subject: SDL: Prefer getBasePtr over direct Surface::pixels access. --- backends/graphics/surfacesdl/surfacesdl-graphics.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backends') diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index a2e1981e79..e36e43b05e 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -1340,8 +1340,8 @@ void SurfaceSdlGraphicsManager::unlockScreen() { void SurfaceSdlGraphicsManager::fillScreen(uint32 col) { Graphics::Surface *screen = lockScreen(); - if (screen && screen->pixels) - memset(screen->pixels, col, screen->h * screen->pitch); + if (screen && screen->getBasePtr(0, 0)) + memset(screen->getBasePtr(0, 0), col, screen->h * screen->pitch); unlockScreen(); } -- cgit v1.2.3 From 7670680aa8ca1975b7c481ac8b402e8b2df17081 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 3 Aug 2013 02:45:04 +0200 Subject: IPHONE: Take advantage of Surface::getPixels. --- backends/platform/iphone/osys_video.mm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'backends') diff --git a/backends/platform/iphone/osys_video.mm b/backends/platform/iphone/osys_video.mm index a11bf32c54..d48003be95 100644 --- a/backends/platform/iphone/osys_video.mm +++ b/backends/platform/iphone/osys_video.mm @@ -310,7 +310,7 @@ void OSystem_IPHONE::hideOverlay() { void OSystem_IPHONE::clearOverlay() { //printf("clearOverlay()\n"); - bzero(_videoContext->overlayTexture.getBasePtr(0, 0), _videoContext->overlayTexture.h * _videoContext->overlayTexture.pitch); + bzero(_videoContext->overlayTexture.getPixels(), _videoContext->overlayTexture.h * _videoContext->overlayTexture.pitch); dirtyFullOverlayScreen(); } @@ -319,7 +319,7 @@ void OSystem_IPHONE::grabOverlay(void *buf, int pitch) { int h = _videoContext->overlayHeight; byte *dst = (byte *)buf; - const byte *src = (const byte *)_videoContext->overlayTexture.getBasePtr(0, 0); + const byte *src = (const byte *)_videoContext->overlayTexture.getPixels(); do { memcpy(dst, src, _videoContext->overlayWidth * sizeof(uint16)); src += _videoContext->overlayTexture.pitch; @@ -428,7 +428,7 @@ void OSystem_IPHONE::setMouseCursor(const void *buf, uint w, uint h, int hotspot _mouseKeyColor = keycolor; - memcpy(_mouseBuffer.getBasePtr(0, 0), buf, h * _mouseBuffer.pitch); + memcpy(_mouseBuffer.getPixels(), buf, h * _mouseBuffer.pitch); _mouseDirty = true; _mouseNeedTextureUpdate = true; @@ -464,7 +464,7 @@ void OSystem_IPHONE::updateMouseTexture() { else palette = _gamePaletteRGBA5551; - uint16 *mouseBuf = (uint16 *)mouseTexture.getBasePtr(0, 0); + uint16 *mouseBuf = (uint16 *)mouseTexture.getPixels(); for (uint x = 0; x < _videoContext->mouseWidth; ++x) { for (uint y = 0; y < _videoContext->mouseHeight; ++y) { const byte color = *(const byte *)_mouseBuffer.getBasePtr(x, y); @@ -475,12 +475,12 @@ void OSystem_IPHONE::updateMouseTexture() { } } } else { - if (crossBlit((byte *)mouseTexture.getBasePtr(0, 0), (const byte *)_mouseBuffer.getBasePtr(0, 0), mouseTexture.pitch, + if (crossBlit((byte *)mouseTexture.getPixels(), (const byte *)_mouseBuffer.getPixels(), mouseTexture.pitch, _mouseBuffer.pitch, _mouseBuffer.w, _mouseBuffer.h, mouseTexture.format, _mouseBuffer.format)) { if (!_mouseBuffer.format.aBits()) { // Apply color keying since the original cursor had no alpha channel. - const uint16 *src = (const uint16 *)_mouseBuffer.getBasePtr(0, 0); - uint8 *dstRaw = (uint8 *)mouseTexture.getBasePtr(0, 0); + const uint16 *src = (const uint16 *)_mouseBuffer.getPixels(); + uint8 *dstRaw = (uint8 *)mouseTexture.getPixels(); for (uint y = 0; y < _mouseBuffer.h; ++y, dstRaw += mouseTexture.pitch) { uint16 *dst = (uint16 *)dstRaw; @@ -495,7 +495,7 @@ void OSystem_IPHONE::updateMouseTexture() { } else { // TODO: Log this! // Make the cursor all transparent... we really need a better fallback ;-). - memset(mouseTexture.getBasePtr(0, 0), 0, mouseTexture.h * mouseTexture.pitch); + memset(mouseTexture.getPixels(), 0, mouseTexture.h * mouseTexture.pitch); } } -- cgit v1.2.3 From 79c124842bae01e2be82192f23001bec5c55710b Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 3 Aug 2013 02:45:19 +0200 Subject: OPENGL: Take advantage of Surface::getPixels. --- backends/graphics/opengl/opengl-graphics.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'backends') diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp index d126ebc212..84be83d524 100644 --- a/backends/graphics/opengl/opengl-graphics.cpp +++ b/backends/graphics/opengl/opengl-graphics.cpp @@ -385,15 +385,15 @@ void OpenGLGraphicsManager::fillScreen(uint32 col) { #ifdef USE_RGB_COLOR if (_screenFormat.bytesPerPixel == 1) { - memset(_screenData.getBasePtr(0, 0), col, _screenData.h * _screenData.pitch); + memset(_screenData.getPixels(), col, _screenData.h * _screenData.pitch); } else if (_screenFormat.bytesPerPixel == 2) { - uint16 *pixels = (uint16 *)_screenData.getBasePtr(0, 0); + uint16 *pixels = (uint16 *)_screenData.getPixels(); uint16 col16 = (uint16)col; for (int i = 0; i < _screenData.w * _screenData.h; i++) { pixels[i] = col16; } } else if (_screenFormat.bytesPerPixel == 3) { - uint8 *pixels = (uint8 *)_screenData.getBasePtr(0, 0); + uint8 *pixels = (uint8 *)_screenData.getPixels(); byte r = (col >> 16) & 0xFF; byte g = (col >> 8) & 0xFF; byte b = col & 0xFF; @@ -404,13 +404,13 @@ void OpenGLGraphicsManager::fillScreen(uint32 col) { pixels += 3; } } else if (_screenFormat.bytesPerPixel == 4) { - uint32 *pixels = (uint32 *)_screenData.getBasePtr(0, 0); + uint32 *pixels = (uint32 *)_screenData.getPixels(); for (int i = 0; i < _screenData.w * _screenData.h; i++) { pixels[i] = col; } } #else - memset(_screenData.getBasePtr(0, 0), col, _screenData.h * _screenData.pitch); + memset(_screenData.getPixels(), col, _screenData.h * _screenData.pitch); #endif _screenNeedsRedraw = true; } @@ -463,12 +463,12 @@ Graphics::PixelFormat OpenGLGraphicsManager::getOverlayFormat() const { void OpenGLGraphicsManager::clearOverlay() { // Set all pixels to 0 - memset(_overlayData.getBasePtr(0, 0), 0, _overlayData.h * _overlayData.pitch); + memset(_overlayData.getPixels(), 0, _overlayData.h * _overlayData.pitch); _overlayNeedsRedraw = true; } void OpenGLGraphicsManager::grabOverlay(void *buf, int pitch) { - const byte *src = (byte *)_overlayData.getBasePtr(0, 0); + const byte *src = (byte *)_overlayData.getPixels(); byte *dst = (byte *)buf; for (int i = 0; i < _overlayData.h; i++) { // Copy overlay data to buffer @@ -609,7 +609,7 @@ void OpenGLGraphicsManager::setMouseCursor(const void *buf, uint w, uint h, int _cursorData.create(w, h, _cursorFormat); // Save cursor data - memcpy(_cursorData.getBasePtr(0, 0), buf, h * _cursorData.pitch); + memcpy(_cursorData.getPixels(), buf, h * _cursorData.pitch); // Set cursor info _cursorState.w = w; @@ -778,7 +778,7 @@ void OpenGLGraphicsManager::refreshCursor() { palette = _cursorPalette; // Convert the paletted cursor to RGBA8888 - const byte *src = (byte *)_cursorData.getBasePtr(0, 0); + const byte *src = (byte *)_cursorData.getPixels(); for (int i = 0; i < _cursorState.w * _cursorState.h; i++) { // Check for keycolor if (src[i] != _cursorKeyColor) { @@ -794,7 +794,7 @@ void OpenGLGraphicsManager::refreshCursor() { // Convert the RGB cursor to RGBA8888 if (_cursorFormat.bytesPerPixel == 2) { - const uint16 *src = (uint16 *)_cursorData.getBasePtr(0, 0); + const uint16 *src = (uint16 *)_cursorData.getPixels(); for (int i = 0; i < _cursorState.w * _cursorState.h; i++) { // Check for keycolor if (src[i] != _cursorKeyColor) { @@ -806,7 +806,7 @@ void OpenGLGraphicsManager::refreshCursor() { dst += 4; } } else if (_cursorFormat.bytesPerPixel == 4) { - const uint32 *src = (uint32 *)_cursorData.getBasePtr(0, 0); + const uint32 *src = (uint32 *)_cursorData.getPixels(); for (int i = 0; i < _cursorState.w * _cursorState.h; i++) { // Check for keycolor if (src[i] != _cursorKeyColor) { @@ -1354,7 +1354,7 @@ void OpenGLGraphicsManager::updateOSD() { _osdSurface.create(_osdTexture->getWidth(), _osdTexture->getHeight(), _overlayFormat); else // Clear everything - memset(_osdSurface.getBasePtr(0, 0), 0, _osdSurface.h * _osdSurface.pitch); + memset(_osdSurface.getPixels(), 0, _osdSurface.h * _osdSurface.pitch); // Determine a rect which would contain the message string (clipped to the // screen dimensions). @@ -1388,7 +1388,7 @@ void OpenGLGraphicsManager::updateOSD() { } // Update the texture - _osdTexture->updateBuffer(_osdSurface.getBasePtr(0, 0), _osdSurface.pitch, 0, 0, + _osdTexture->updateBuffer(_osdSurface.getPixels(), _osdSurface.pitch, 0, 0, _osdSurface.w, _osdSurface.h); } #endif -- cgit v1.2.3 From f386e15b6f6f1862264d3cb79d98bfeebf841480 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 3 Aug 2013 02:45:32 +0200 Subject: SDL: Take advantage of Surface::getPixels. --- backends/graphics/surfacesdl/surfacesdl-graphics.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backends') diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index e36e43b05e..860ed0f4a3 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -1340,8 +1340,8 @@ void SurfaceSdlGraphicsManager::unlockScreen() { void SurfaceSdlGraphicsManager::fillScreen(uint32 col) { Graphics::Surface *screen = lockScreen(); - if (screen && screen->getBasePtr(0, 0)) - memset(screen->getBasePtr(0, 0), col, screen->h * screen->pitch); + if (screen && screen->getPixels()) + memset(screen->getPixels(), col, screen->h * screen->pitch); unlockScreen(); } -- cgit v1.2.3 From 767f0d8ca9114ea05cc1e8c5dc1940cc9718c306 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 3 Aug 2013 02:45:42 +0200 Subject: BACKENDS: Take advantage of Surface::getPixels. --- backends/base-backend.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backends') diff --git a/backends/base-backend.cpp b/backends/base-backend.cpp index f410270d9e..3e95c3e26a 100644 --- a/backends/base-backend.cpp +++ b/backends/base-backend.cpp @@ -57,7 +57,7 @@ void BaseBackend::initBackend() { void BaseBackend::fillScreen(uint32 col) { Graphics::Surface *screen = lockScreen(); - if (screen && screen->getBasePtr(0, 0)) - memset(screen->getBasePtr(0, 0), col, screen->h * screen->pitch); + if (screen && screen->getPixels()) + memset(screen->getPixels(), col, screen->h * screen->pitch); unlockScreen(); } -- cgit v1.2.3 From 9a80fa88e0742c38eeb32fd91334570fff6c60ae Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 3 Aug 2013 04:07:44 +0200 Subject: SDL: Do not set Surface::pixels directly anymore. --- .../graphics/surfacesdl/surfacesdl-graphics.cpp | 25 +++++++++------------- 1 file changed, 10 insertions(+), 15 deletions(-) (limited to 'backends') diff --git a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp index 860ed0f4a3..871c6c49b2 100644 --- a/backends/graphics/surfacesdl/surfacesdl-graphics.cpp +++ b/backends/graphics/surfacesdl/surfacesdl-graphics.cpp @@ -1308,15 +1308,13 @@ Graphics::Surface *SurfaceSdlGraphicsManager::lockScreen() { if (SDL_LockSurface(_screen) == -1) error("SDL_LockSurface failed: %s", SDL_GetError()); - _framebuffer.pixels = _screen->pixels; - _framebuffer.w = _screen->w; - _framebuffer.h = _screen->h; - _framebuffer.pitch = _screen->pitch; + _framebuffer.init(_screen->w, _screen->h, _screen->pitch, _screen->pixels, #ifdef USE_RGB_COLOR - _framebuffer.format = _screenFormat; + _screenFormat #else - _framebuffer.format = Graphics::PixelFormat::createFormatCLUT8(); + Graphics::PixelFormat::createFormatCLUT8() #endif + ); return &_framebuffer; } @@ -2062,15 +2060,12 @@ void SurfaceSdlGraphicsManager::displayMessageOnOSD(const char *msg) { error("displayMessageOnOSD: SDL_LockSurface failed: %s", SDL_GetError()); Graphics::Surface dst; - dst.pixels = _osdSurface->pixels; - dst.w = _osdSurface->w; - dst.h = _osdSurface->h; - dst.pitch = _osdSurface->pitch; - dst.format = Graphics::PixelFormat(_osdSurface->format->BytesPerPixel, - 8 - _osdSurface->format->Rloss, 8 - _osdSurface->format->Gloss, - 8 - _osdSurface->format->Bloss, 8 - _osdSurface->format->Aloss, - _osdSurface->format->Rshift, _osdSurface->format->Gshift, - _osdSurface->format->Bshift, _osdSurface->format->Ashift); + dst.init(_osdSurface->w, _osdSurface->h, _osdSurface->pitch, _osdSurface->pixels, + Graphics::PixelFormat(_osdSurface->format->BytesPerPixel, + 8 - _osdSurface->format->Rloss, 8 - _osdSurface->format->Gloss, + 8 - _osdSurface->format->Bloss, 8 - _osdSurface->format->Aloss, + _osdSurface->format->Rshift, _osdSurface->format->Gshift, + _osdSurface->format->Bshift, _osdSurface->format->Ashift)); // The font we are going to use: const Graphics::Font *font = FontMan.getFontByUsage(Graphics::FontManager::kLocalizedFont); -- cgit v1.2.3 From 0f050fe797f2f7d0b5da65f443142c0ffdd006ce Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 6 Aug 2013 03:29:16 +0200 Subject: WII: Do not access Surface::pixels directly. --- backends/platform/wii/osystem_gfx.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'backends') diff --git a/backends/platform/wii/osystem_gfx.cpp b/backends/platform/wii/osystem_gfx.cpp index a9bcdbb8d1..92c890b0a9 100644 --- a/backends/platform/wii/osystem_gfx.cpp +++ b/backends/platform/wii/osystem_gfx.cpp @@ -528,16 +528,13 @@ void OSystem_Wii::updateScreen() { } Graphics::Surface *OSystem_Wii::lockScreen() { - _surface.pixels = _gamePixels; - _surface.w = _gameWidth; - _surface.h = _gameHeight; + _surface.init(_gameWidth, _gameHeight, #ifdef USE_RGB_COLOR - _surface.pitch = _gameWidth * _pfGame.bytesPerPixel; - _surface.format = _pfGame; + _gameWidth * _pfGame.bytesPerPixel, _gamePixels, _pfGame #else - _surface.pitch = _gameWidth; - _surface.format = Graphics::PixelFormat::createFormatCLUT8(); + _gameWidth, _gamePixels, Graphics::PixelFormat::createFormatCLUT8() #endif + ); return &_surface; } -- cgit v1.2.3 From 6639958d7af352db5f500292b3c0398a3c0579b0 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 6 Aug 2013 03:30:38 +0200 Subject: PS2: Do not access Surface::pixels directly. --- backends/platform/ps2/Gs2dScreen.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'backends') diff --git a/backends/platform/ps2/Gs2dScreen.cpp b/backends/platform/ps2/Gs2dScreen.cpp index e818305c29..58667c0230 100644 --- a/backends/platform/ps2/Gs2dScreen.cpp +++ b/backends/platform/ps2/Gs2dScreen.cpp @@ -392,12 +392,8 @@ void Gs2dScreen::copyScreenRect(const uint8 *buf, int pitch, int x, int y, int w Graphics::Surface *Gs2dScreen::lockScreen() { WaitSema(g_DmacSema); - _framebuffer.pixels = _screenBuf; - _framebuffer.w = _width; - _framebuffer.h = _height; - _framebuffer.pitch = _width; // -not- _pitch; ! It's EE mem, not Tex - _framebuffer.format = Graphics::PixelFormat::createFormatCLUT8(); - + // -not- _pitch; ! It's EE mem, not Tex + _framebuffer.init(_width, _height, _width, _screenBuf, Graphics::PixelFormat::createFormatCLUT8()); return &_framebuffer; } -- cgit v1.2.3 From 6d86a66493a7f9b74eeb14a5ff4bd750805d00ee Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 6 Aug 2013 03:33:56 +0200 Subject: NDS: Do not access Surface::pixels directly. --- backends/platform/ds/arm9/source/osystem_ds.cpp | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) (limited to 'backends') diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index 2f6358d8ee..f109983fbc 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -296,7 +296,7 @@ void OSystem_DS::copyRectToScreen(const void *buf, int pitch, int x, int y, int // to save a few pennies/euro cents on the hardware. if (_frameBufferExists) { - bg = (u16 *)_framebuffer.pixels; + bg = (u16 *)_framebuffer.getPixels(); stride = _framebuffer.pitch; } else { bg = (u16 *)DS::get8BitBackBuffer(); @@ -455,7 +455,7 @@ void OSystem_DS::copyRectToScreen(const void *buf, int pitch, int x, int y, int dmaCopyHalfWords(3, src, dest1, w); - if ((!_frameBufferExists) || (buf == _framebuffer.pixels)) { + if ((!_frameBufferExists) || (buf == _framebuffer.getPixels())) { dmaCopyHalfWords(2, src, dest2, w); } @@ -476,7 +476,7 @@ void OSystem_DS::updateScreen() { _frameBufferExists = false; // Copy temp framebuffer back to screen - copyRectToScreen((byte *)_framebuffer.pixels, _framebuffer.pitch, 0, 0, _framebuffer.w, _framebuffer.h); + copyRectToScreen((byte *)_framebuffer.getPixels(), _framebuffer.pitch, 0, 0, _framebuffer.w, _framebuffer.h); } DS::displayMode16BitFlipBuffer(); @@ -755,11 +755,8 @@ Graphics::Surface *OSystem_DS::createTempFrameBuffer() { if (DS::isCpuScalerEnabled()) { - _framebuffer.pixels = DS::getScalerBuffer(); - _framebuffer.w = DS::getGameWidth(); - _framebuffer.h = DS::getGameHeight(); - _framebuffer.pitch = DS::getGameWidth(); - _framebuffer.format = Graphics::PixelFormat::createFormatCLUT8(); + _framebuffer.init(DS::getGameWidth(), DS::getGameHeight(), DS::getGameWidth(), + DS::getScalerBuffer(), Graphics::PixelFormat::createFormatCLUT8()); } else { @@ -780,11 +777,7 @@ Graphics::Surface *OSystem_DS::createTempFrameBuffer() { dmaCopyHalfWords(3, srcLine, destLine, width); } - _framebuffer.pixels = dest; - _framebuffer.w = width; - _framebuffer.h = height; - _framebuffer.pitch = width; - _framebuffer.format = Graphics::PixelFormat::createFormatCLUT8(); + _framebuffer.init(width, height, width, dest, Graphics::PixelFormat::createFormatCLUT8()); } @@ -798,8 +791,8 @@ Graphics::Surface *OSystem_DS::createTempFrameBuffer() { for (int y = 0; y < DS::getGameHeight(); y++) { DC_FlushRange(image + (y * imageStrideInWords), DS::getGameWidth()); for (int x = 0; x < DS::getGameWidth() >> 1; x++) { - *(((u16 *) (_framebuffer.pixels)) + y * (DS::getGameWidth() >> 1) + x) = image[(y * imageStrideInWords) + x]; -// *(((u16 *) (surf->pixels)) + y * (DS::getGameWidth() >> 1) + x) = image[y * imageStrideInWords + x]; + *(((u16 *) (_framebuffer.getPixels())) + y * (DS::getGameWidth() >> 1) + x) = image[(y * imageStrideInWords) + x]; +// *(((u16 *) (surf->getPixels())) + y * (DS::getGameWidth() >> 1) + x) = image[y * imageStrideInWords + x]; } }*/ -- cgit v1.2.3 From 09f7e4d5d4d45a4db7c85520be66cf81fe975607 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 6 Aug 2013 03:35:07 +0200 Subject: IPHONE: Do not access Surface::pixels directly. --- backends/platform/iphone/iphone_video.mm | 6 +++--- backends/platform/iphone/osys_main.cpp | 2 +- backends/platform/iphone/osys_video.mm | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) (limited to 'backends') diff --git a/backends/platform/iphone/iphone_video.mm b/backends/platform/iphone/iphone_video.mm index 0bfae30fc7..f2c1527658 100644 --- a/backends/platform/iphone/iphone_video.mm +++ b/backends/platform/iphone/iphone_video.mm @@ -365,7 +365,7 @@ const char *iPhone_getDocumentsDir() { _mouseTexCoords[5] = _mouseTexCoords[7] = _videoContext.mouseHeight / (GLfloat)_videoContext.mouseTexture.h; glBindTexture(GL_TEXTURE_2D, _mouseCursorTexture); printOpenGLError(); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _videoContext.mouseTexture.w, _videoContext.mouseTexture.h, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, _videoContext.mouseTexture.pixels); printOpenGLError(); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _videoContext.mouseTexture.w, _videoContext.mouseTexture.h, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, _videoContext.mouseTexture.getPixels()); printOpenGLError(); } - (void)updateMainSurface { @@ -377,7 +377,7 @@ const char *iPhone_getDocumentsDir() { // Unfortunately we have to update the whole texture every frame, since glTexSubImage2D is actually slower in all cases // due to the iPhone internals having to convert the whole texture back from its internal format when used. // In the future we could use several tiled textures instead. - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, _videoContext.screenTexture.w, _videoContext.screenTexture.h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, _videoContext.screenTexture.pixels); printOpenGLError(); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, _videoContext.screenTexture.w, _videoContext.screenTexture.h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, _videoContext.screenTexture.getPixels()); printOpenGLError(); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); printOpenGLError(); } @@ -386,7 +386,7 @@ const char *iPhone_getDocumentsDir() { glTexCoordPointer(2, GL_FLOAT, 0, _overlayTexCoords); printOpenGLError(); glBindTexture(GL_TEXTURE_2D, _overlayTexture); printOpenGLError(); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _videoContext.overlayTexture.w, _videoContext.overlayTexture.h, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, _videoContext.overlayTexture.pixels); printOpenGLError(); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _videoContext.overlayTexture.w, _videoContext.overlayTexture.h, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, _videoContext.overlayTexture.getPixels()); printOpenGLError(); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); printOpenGLError(); } diff --git a/backends/platform/iphone/osys_main.cpp b/backends/platform/iphone/osys_main.cpp index 460d3fd2ac..ea566c3da0 100644 --- a/backends/platform/iphone/osys_main.cpp +++ b/backends/platform/iphone/osys_main.cpp @@ -78,7 +78,7 @@ OSystem_IPHONE::~OSystem_IPHONE() { // Prevent accidental freeing of the screen texture here. This needs to be // checked since we might use the screen texture as framebuffer in the case // of hi-color games for example. - if (_framebuffer.pixels == _videoContext->screenTexture.pixels) + if (_framebuffer.getPixels() == _videoContext->screenTexture.getPixels()) _framebuffer.free(); _mouseBuffer.free(); } diff --git a/backends/platform/iphone/osys_video.mm b/backends/platform/iphone/osys_video.mm index d48003be95..ce7f94f5bd 100644 --- a/backends/platform/iphone/osys_video.mm +++ b/backends/platform/iphone/osys_video.mm @@ -76,8 +76,8 @@ void OSystem_IPHONE::initSize(uint width, uint height, const Graphics::PixelForm // In case we use the screen texture as frame buffer we reset the pixels // pointer here to avoid freeing the screen texture. - if (_framebuffer.pixels == _videoContext->screenTexture.pixels) - _framebuffer.pixels = 0; + if (_framebuffer.getPixels() == _videoContext->screenTexture.getPixels()) + _framebuffer.setPixels(0); // Create the screen texture right here. We need to do this here, since // when a game requests hi-color mode, we actually set the framebuffer @@ -417,7 +417,7 @@ void OSystem_IPHONE::setMouseCursor(const void *buf, uint w, uint h, int hotspot #endif assert(pixelFormat.bytesPerPixel == 1 || pixelFormat.bytesPerPixel == 2); - if (_mouseBuffer.w != w || _mouseBuffer.h != h || _mouseBuffer.format != pixelFormat || !_mouseBuffer.pixels) + if (_mouseBuffer.w != w || _mouseBuffer.h != h || _mouseBuffer.format != pixelFormat || !_mouseBuffer.getPixels()) _mouseBuffer.create(w, h, pixelFormat); _videoContext->mouseWidth = w; -- cgit v1.2.3 From 9179f0b78fc3548b2fdddb97cc6108d0a49e593c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 6 Aug 2013 03:39:58 +0200 Subject: PSP: Do not access Surface::pixels directly. --- backends/platform/psp/default_display_client.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'backends') diff --git a/backends/platform/psp/default_display_client.cpp b/backends/platform/psp/default_display_client.cpp index bc252144fa..6d6eb641f7 100644 --- a/backends/platform/psp/default_display_client.cpp +++ b/backends/platform/psp/default_display_client.cpp @@ -192,11 +192,8 @@ void Screen::setScummvmPixelFormat(const Graphics::PixelFormat *format) { Graphics::Surface *Screen::lockAndGetForEditing() { DEBUG_ENTER_FUNC(); - _frameBuffer.pixels = _buffer.getPixels(); - _frameBuffer.w = _buffer.getSourceWidth(); - _frameBuffer.h = _buffer.getSourceHeight(); - _frameBuffer.pitch = _buffer.getBytesPerPixel() * _buffer.getWidth(); - _frameBuffer.format = _pixelFormat; + _frameBuffer.init(_buffer.getSourceWidth(), _buffer.getSourceHeight(), _buffer.getBytesPerPixel() * _buffer.getWidth(), + _buffer.getPixels(), _pixelFormat); // We'll set to dirty once we unlock the screen return &_frameBuffer; -- cgit v1.2.3 From d9b90d67d3145147f90ed0dd9b53e7c3928f78ba Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 6 Aug 2013 03:43:08 +0200 Subject: ANDROID: Do not access Surface::pixels directly. --- backends/platform/android/gfx.cpp | 4 ++-- backends/platform/android/texture.cpp | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) (limited to 'backends') diff --git a/backends/platform/android/gfx.cpp b/backends/platform/android/gfx.cpp index cd0fd88484..882dcff9a4 100644 --- a/backends/platform/android/gfx.cpp +++ b/backends/platform/android/gfx.cpp @@ -552,7 +552,7 @@ Graphics::Surface *OSystem_Android::lockScreen() { GLTHREADCHECK; Graphics::Surface *surface = _game_texture->surface(); - assert(surface->pixels); + assert(surface->getPixels()); return surface; } @@ -645,7 +645,7 @@ void OSystem_Android::grabOverlay(void *buf, int pitch) { assert(surface->format.bytesPerPixel == sizeof(uint16)); byte *dst = (byte *)buf; - const byte *src = (const byte *)surface->pixels; + const byte *src = (const byte *)surface->getPixels(); uint h = surface->h; do { diff --git a/backends/platform/android/texture.cpp b/backends/platform/android/texture.cpp index b174e93191..cc41c0d8a6 100644 --- a/backends/platform/android/texture.cpp +++ b/backends/platform/android/texture.cpp @@ -233,7 +233,7 @@ void GLESTexture::allocBuffer(GLuint w, GLuint h) { _pixels = new byte[w * h * _surface.format.bytesPerPixel]; assert(_pixels); - _surface.pixels = _pixels; + _surface.setPixels(_pixels); fillBuffer(0); @@ -256,7 +256,7 @@ void GLESTexture::updateBuffer(GLuint x, GLuint y, GLuint w, GLuint h, } void GLESTexture::fillBuffer(uint32 color) { - assert(_surface.pixels); + assert(_surface.getPixels()); if (_pixelFormat.bytesPerPixel == 1 || ((color & 0xff) == ((color >> 8) & 0xff))) @@ -377,7 +377,7 @@ void GLESFakePaletteTexture::allocBuffer(GLuint w, GLuint h) { assert(_pixels); // fixup surface, for the outside this is a CLUT8 surface - _surface.pixels = _pixels; + _surface.setPixels(_pixels); fillBuffer(0); @@ -386,8 +386,8 @@ void GLESFakePaletteTexture::allocBuffer(GLuint w, GLuint h) { } void GLESFakePaletteTexture::fillBuffer(uint32 color) { - assert(_surface.pixels); - memset(_surface.pixels, color & 0xff, _surface.pitch * _surface.h); + assert(_surface.getPixels()); + memset(_surface.getPixels(), color & 0xff, _surface.pitch * _surface.h); setDirty(); } -- cgit v1.2.3 From 30d2eb7a97ac744e767fb6d48cc2419928312afe Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 6 Aug 2013 03:44:20 +0200 Subject: DC: Do not access Surface::pixels directly. --- backends/platform/dc/display.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'backends') diff --git a/backends/platform/dc/display.cpp b/backends/platform/dc/display.cpp index cc5798fc10..54ee6000ed 100644 --- a/backends/platform/dc/display.cpp +++ b/backends/platform/dc/display.cpp @@ -711,11 +711,7 @@ Graphics::Surface *OSystem_Dreamcast::lockScreen() if (!screen) return 0; - _framebuffer.pixels = screen; - _framebuffer.w = _screen_w; - _framebuffer.h = _screen_h; - _framebuffer.pitch = SCREEN_W*2; - _framebuffer.format = screenFormats[_screenFormat]; + _framebuffer.init(_screen_w, _screen_h, SCREEN_W*2, screen, screenFormats[_screenFormat]); return &_framebuffer; } -- cgit v1.2.3 From c28f3baa7745453945e2ddd1f9fc474830b1e97b Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 6 Aug 2013 03:45:13 +0200 Subject: N64: Do not access Surface::pixels anymore. --- backends/platform/n64/osys_n64_base.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'backends') diff --git a/backends/platform/n64/osys_n64_base.cpp b/backends/platform/n64/osys_n64_base.cpp index afd93f5e09..36e5085764 100644 --- a/backends/platform/n64/osys_n64_base.cpp +++ b/backends/platform/n64/osys_n64_base.cpp @@ -605,11 +605,7 @@ void OSystem_N64::updateScreen() { } Graphics::Surface *OSystem_N64::lockScreen() { - _framebuffer.pixels = _offscreen_pal; - _framebuffer.w = _gameWidth; - _framebuffer.h = _gameHeight; - _framebuffer.pitch = _screenWidth; - _framebuffer.format = Graphics::PixelFormat::createFormatCLUT8(); + _framebuffer.init(_gameWidth, _gameHeight, _screenWidth, _offscreen_pal, Graphics::PixelFormat::createFormatCLUT8()); return &_framebuffer; } -- cgit v1.2.3 From 911c74e82c7653da01bca6398149deb7013d7378 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 6 Aug 2013 03:47:00 +0200 Subject: VKEYBD: Do not access Surface::pixels anymore. --- backends/vkeybd/virtual-keyboard-gui.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'backends') diff --git a/backends/vkeybd/virtual-keyboard-gui.cpp b/backends/vkeybd/virtual-keyboard-gui.cpp index 75de86472f..8bf9a54251 100644 --- a/backends/vkeybd/virtual-keyboard-gui.cpp +++ b/backends/vkeybd/virtual-keyboard-gui.cpp @@ -36,7 +36,7 @@ static void blit(Graphics::Surface *surf_dst, Graphics::Surface *surf_src, int16 if (surf_dst->format.bytesPerPixel != sizeof(OverlayColor) || surf_src->format.bytesPerPixel != sizeof(OverlayColor)) return; - const OverlayColor *src = (const OverlayColor *)surf_src->pixels; + const OverlayColor *src = (const OverlayColor *)surf_src->getPixels(); int blitW = surf_src->w; int blitH = surf_src->h; @@ -161,7 +161,7 @@ void VirtualKeyboardGUI::run() { _system->clearOverlay(); } _overlayBackup.create(_screenW, _screenH, _system->getOverlayFormat()); - _system->grabOverlay(_overlayBackup.pixels, _overlayBackup.pitch); + _system->grabOverlay(_overlayBackup.getPixels(), _overlayBackup.pitch); setupCursor(); @@ -171,7 +171,7 @@ void VirtualKeyboardGUI::run() { removeCursor(); - _system->copyRectToOverlay(_overlayBackup.pixels, _overlayBackup.pitch, 0, 0, _overlayBackup.w, _overlayBackup.h); + _system->copyRectToOverlay(_overlayBackup.getPixels(), _overlayBackup.pitch, 0, 0, _overlayBackup.w, _overlayBackup.h); if (!g_gui.isActive()) _system->hideOverlay(); _overlayBackup.free(); @@ -262,7 +262,7 @@ void VirtualKeyboardGUI::screenChanged() { _screenH = newScreenH; _overlayBackup.create(_screenW, _screenH, _system->getOverlayFormat()); - _system->grabOverlay(_overlayBackup.pixels, _overlayBackup.pitch); + _system->grabOverlay(_overlayBackup.getPixels(), _overlayBackup.pitch); if (!_kbd->checkModeResolutions()) { _displaying = false; @@ -356,7 +356,7 @@ void VirtualKeyboardGUI::redraw() { Graphics::Surface surf; surf.create(w, h, _system->getOverlayFormat()); - OverlayColor *dst = (OverlayColor *)surf.pixels; + OverlayColor *dst = (OverlayColor *)surf.getPixels(); const OverlayColor *src = (OverlayColor *) _overlayBackup.getBasePtr(_dirtyRect.left, _dirtyRect.top); while (h--) { @@ -371,7 +371,7 @@ void VirtualKeyboardGUI::redraw() { blit(&surf, &_dispSurface, _dispX - _dirtyRect.left, _dispY - _dirtyRect.top, _dispBackColor); } - _system->copyRectToOverlay(surf.pixels, surf.pitch, + _system->copyRectToOverlay(surf.getPixels(), surf.pitch, _dirtyRect.left, _dirtyRect.top, surf.w, surf.h); surf.free(); -- cgit v1.2.3 From 952a119ae16da8795785ca05a3f62ba7f5aee50b Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 7 Aug 2013 21:41:24 +0200 Subject: IPHONE: Fix accidental double free. This was a copy&paste error. I also adapted the comment to be more clear. --- backends/platform/iphone/osys_main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backends') diff --git a/backends/platform/iphone/osys_main.cpp b/backends/platform/iphone/osys_main.cpp index ea566c3da0..a814495b80 100644 --- a/backends/platform/iphone/osys_main.cpp +++ b/backends/platform/iphone/osys_main.cpp @@ -77,8 +77,8 @@ OSystem_IPHONE::~OSystem_IPHONE() { delete _mixer; // Prevent accidental freeing of the screen texture here. This needs to be // checked since we might use the screen texture as framebuffer in the case - // of hi-color games for example. - if (_framebuffer.getPixels() == _videoContext->screenTexture.getPixels()) + // of hi-color games for example. Otherwise this can lead to a double free. + if (_framebuffer.getPixels() != _videoContext->screenTexture.getPixels()) _framebuffer.free(); _mouseBuffer.free(); } -- cgit v1.2.3 From 7c58e9a6d57aa88590b0929110a617c6fe84a4fe Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 13 Aug 2013 00:26:58 +0200 Subject: DC: Use const version of ConfigManager::getGameDomains. This should fix compilation for the DC port. --- backends/platform/dc/selector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends') diff --git a/backends/platform/dc/selector.cpp b/backends/platform/dc/selector.cpp index 339e5df62d..4026c7dde6 100644 --- a/backends/platform/dc/selector.cpp +++ b/backends/platform/dc/selector.cpp @@ -219,7 +219,7 @@ static int findGames(Game *games, int max, bool use_ini) if (use_ini) { ConfMan.loadDefaultConfigFile(); - Common::ConfigManager::DomainMap &game_domains = ConfMan.getGameDomains(); + const Common::ConfigManager::DomainMap &game_domains = ConfMan.getGameDomains(); for(Common::ConfigManager::DomainMap::const_iterator i = game_domains.begin(); curr_game < max && i != game_domains.end(); i++) { Common::String path = (*i)._value["path"]; -- cgit v1.2.3 From 67137434416df22f5e75cd29d94c8a9fa195ed66 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 14 Aug 2013 00:15:40 +0200 Subject: VKEYBD: Make code agnostic of OverlayColor. This removes the use of OverlayColor in vkeybd and supports both 16 and 32bit overlays. --- backends/vkeybd/virtual-keyboard-gui.cpp | 34 ++++++++++++++++++++------------ backends/vkeybd/virtual-keyboard-gui.h | 6 +++--- backends/vkeybd/virtual-keyboard.h | 4 ++-- 3 files changed, 26 insertions(+), 18 deletions(-) (limited to 'backends') diff --git a/backends/vkeybd/virtual-keyboard-gui.cpp b/backends/vkeybd/virtual-keyboard-gui.cpp index 8bf9a54251..ec4cbf1de2 100644 --- a/backends/vkeybd/virtual-keyboard-gui.cpp +++ b/backends/vkeybd/virtual-keyboard-gui.cpp @@ -32,11 +32,9 @@ namespace Common { -static void blit(Graphics::Surface *surf_dst, Graphics::Surface *surf_src, int16 x, int16 y, OverlayColor transparent) { - if (surf_dst->format.bytesPerPixel != sizeof(OverlayColor) || surf_src->format.bytesPerPixel != sizeof(OverlayColor)) - return; - - const OverlayColor *src = (const OverlayColor *)surf_src->getPixels(); +template +static void blitImplementation(Graphics::Surface *surf_dst, Graphics::Surface *surf_src, int16 x, int16 y, ColorType transparent) { + const ColorType *src = (const ColorType *)surf_src->getPixels(); int blitW = surf_src->w; int blitH = surf_src->h; @@ -58,13 +56,13 @@ static void blit(Graphics::Surface *surf_dst, Graphics::Surface *surf_src, int16 if (blitW <= 0 || blitH <= 0) return; - OverlayColor *dst = (OverlayColor *)surf_dst->getBasePtr(x, y); + ColorType *dst = (ColorType *)surf_dst->getBasePtr(x, y); int dstAdd = surf_dst->w - blitW; int srcAdd = surf_src->w - blitW; for (int i = 0; i < blitH; ++i) { for (int j = 0; j < blitW; ++j, ++dst, ++src) { - OverlayColor col = *src; + ColorType col = *src; if (col != transparent) *dst = col; } @@ -73,6 +71,16 @@ static void blit(Graphics::Surface *surf_dst, Graphics::Surface *surf_src, int16 } } +static void blit(Graphics::Surface *surf_dst, Graphics::Surface *surf_src, int16 x, int16 y, uint32 transparent) { + if (surf_dst->format.bytesPerPixel != surf_src->format.bytesPerPixel) + return; + + if (surf_dst->format.bytesPerPixel == 2) + blitImplementation(surf_dst, surf_src, x, y, transparent); + else if (surf_dst->format.bytesPerPixel == 4) + blitImplementation(surf_dst, surf_src, x, y, transparent); +} + VirtualKeyboardGUI::VirtualKeyboardGUI(VirtualKeyboard *kbd) : _kbd(kbd), _displaying(false), _drag(false), _drawCaret(false), _displayEnabled(false), _firstRun(true), @@ -111,7 +119,7 @@ void VirtualKeyboardGUI::initMode(VirtualKeyboard::Mode *mode) { } } -void VirtualKeyboardGUI::setupDisplayArea(Rect &r, OverlayColor forecolor) { +void VirtualKeyboardGUI::setupDisplayArea(Rect &r, uint32 forecolor) { _dispFont = FontMan.getFontByUsage(Graphics::FontManager::kBigGUIFont); if (!fontIsSuitable(_dispFont, r)) { @@ -356,13 +364,13 @@ void VirtualKeyboardGUI::redraw() { Graphics::Surface surf; surf.create(w, h, _system->getOverlayFormat()); - OverlayColor *dst = (OverlayColor *)surf.getPixels(); - const OverlayColor *src = (OverlayColor *) _overlayBackup.getBasePtr(_dirtyRect.left, _dirtyRect.top); + byte *dst = (byte *)surf.getPixels(); + const byte *src = (const byte *)_overlayBackup.getBasePtr(_dirtyRect.left, _dirtyRect.top); while (h--) { - memcpy(dst, src, surf.w * sizeof(OverlayColor)); - dst += surf.w; - src += _overlayBackup.w; + memcpy(dst, src, surf.pitch); + dst += surf.pitch; + src += _overlayBackup.pitch; } blit(&surf, _kbdSurface, _kbdBound.left - _dirtyRect.left, diff --git a/backends/vkeybd/virtual-keyboard-gui.h b/backends/vkeybd/virtual-keyboard-gui.h index d0f9c884ed..a2000adea0 100644 --- a/backends/vkeybd/virtual-keyboard-gui.h +++ b/backends/vkeybd/virtual-keyboard-gui.h @@ -99,7 +99,7 @@ private: VirtualKeyboard *_kbd; Rect _kbdBound; Graphics::Surface *_kbdSurface; - OverlayColor _kbdTransparentColor; + uint32 _kbdTransparentColor; Point _dragPoint; bool _drag; @@ -113,7 +113,7 @@ private: const Graphics::Font *_dispFont; int16 _dispX, _dispY; uint _dispI; - OverlayColor _dispForeColor, _dispBackColor; + uint32 _dispForeColor, _dispBackColor; int _lastScreenChanged; int16 _screenW, _screenH; @@ -121,7 +121,7 @@ private: bool _displaying; bool _firstRun; - void setupDisplayArea(Rect &r, OverlayColor forecolor); + void setupDisplayArea(Rect &r, uint32 forecolor); void move(int16 x, int16 y); void moveToDefaultPosition(); void screenChanged(); diff --git a/backends/vkeybd/virtual-keyboard.h b/backends/vkeybd/virtual-keyboard.h index 4ab5ad446d..3b2b2196bd 100644 --- a/backends/vkeybd/virtual-keyboard.h +++ b/backends/vkeybd/virtual-keyboard.h @@ -112,11 +112,11 @@ protected: String resolution; String bitmapName; Graphics::Surface *image; - OverlayColor transparentColor; + uint32 transparentColor; ImageMap imageMap; VKEventMap events; Rect displayArea; - OverlayColor displayFontColor; + uint32 displayFontColor; Mode() : image(0) {} ~Mode() { -- cgit v1.2.3