diff options
-rw-r--r-- | backends/platform/bada/audio.cpp | 520 | ||||
-rw-r--r-- | backends/platform/bada/audio.h | 146 | ||||
-rw-r--r-- | backends/platform/bada/form.cpp | 928 | ||||
-rw-r--r-- | backends/platform/bada/form.h | 216 | ||||
-rw-r--r-- | backends/platform/bada/graphics.cpp | 630 | ||||
-rw-r--r-- | backends/platform/bada/graphics.h | 146 | ||||
-rw-r--r-- | backends/platform/bada/sscanf.cpp | 364 | ||||
-rw-r--r-- | backends/platform/bada/system.cpp | 998 |
8 files changed, 1974 insertions, 1974 deletions
diff --git a/backends/platform/bada/audio.cpp b/backends/platform/bada/audio.cpp index 4ead7ebde1..7c20f57f10 100644 --- a/backends/platform/bada/audio.cpp +++ b/backends/platform/bada/audio.cpp @@ -1,260 +1,260 @@ -/* 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 <FSysSettingInfo.h>
-#include <FAppAppRegistry.h>
-
-#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 && !isSilentMode()) {
- _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 && !isSilentMode()) {
- 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);
-}
-
+/* 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 <FSysSettingInfo.h> +#include <FAppAppRegistry.h> + +#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 && !isSilentMode()) { + _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 && !isSilentMode()) { + 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 index 9279593afd..a6debef5a8 100644 --- a/backends/platform/bada/audio.h +++ b/backends/platform/bada/audio.h @@ -1,73 +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 BADA_AUDIO_H
-#define BADA_AUDIO_H
-
-#include <FBase.h>
-#include <FMedia.h>
-#include <FIo.h>
-#include <FBaseByteBuffer.h>
-
-#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
+/* 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 <FBase.h> +#include <FMedia.h> +#include <FIo.h> +#include <FBaseByteBuffer.h> + +#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/form.cpp b/backends/platform/bada/form.cpp index 35721dbc5f..418cdc482b 100644 --- a/backends/platform/bada/form.cpp +++ b/backends/platform/bada/form.cpp @@ -1,464 +1,464 @@ -/* 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 <FAppApplication.h>
-
-#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(InitState),
- _buttonState(LeftButton),
- _shortcut(SetVolume) {
- _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 != ErrorState) {
- terminate();
-
- _gameThread->Stop();
- if (_state != ErrorState) {
- _gameThread->Join();
- }
-
- delete _gameThread;
- _gameThread = NULL;
- }
-
- if (_eventQueueLock) {
- delete _eventQueueLock;
- _eventQueueLock = NULL;
- }
-
- logLeaving();
-}
-
-//
-// abort the game thread
-//
-void BadaAppForm::terminate() {
- if (_state == ActiveState) {
- ((BadaSystem *)g_system)->setMute(true);
-
- _eventQueueLock->Acquire();
-
- Common::Event e;
- e.type = Common::EVENT_QUIT;
- _eventQueue.push(e);
- _state = ClosingState;
-
- _eventQueueLock->Release();
-
- // block while thread ends
- AppLog("waiting for shutdown");
- for (int i = 0; i < EXIT_SLEEP_STEP && _state == ClosingState; i++) {
- Thread::Sleep(EXIT_SLEEP);
- }
-
- if (_state == ClosingState) {
- // failed to terminate - Join() will freeze
- _state = ErrorState;
- }
- }
-}
-
-void BadaAppForm::exitSystem() {
- _state = ErrorState;
-
- 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 == InitState) {
- _state = ActiveState;
- _gameThread->Start();
- }
-}
-
-Object *BadaAppForm::Run(void) {
- scummvm_main(0, 0);
-
- if (_state == ActiveState) {
- Application::GetInstance()->SendUserEvent(USER_MESSAGE_EXIT, NULL);
- }
- _state = DoneState;
- return NULL;
-}
-
-void BadaAppForm::setButtonShortcut() {
- switch (_buttonState) {
- case LeftButton:
- g_system->displayMessageOnOSD(_("Right Click Once"));
- _buttonState = RightButtonOnce;
- break;
- case RightButtonOnce:
- g_system->displayMessageOnOSD(_("Right Click"));
- _buttonState = RightButton;
- break;
- case RightButton:
- g_system->displayMessageOnOSD(_("Move Only"));
- _buttonState = MoveOnly;
- break;
- case MoveOnly:
- g_system->displayMessageOnOSD(_("Left Click"));
- _buttonState = LeftButton;
- break;
- }
-}
-
-void BadaAppForm::setShortcut() {
- // cycle to the next shortcut
- switch (_shortcut) {
- case ControlMouse:
- g_system->displayMessageOnOSD(_("Escape Key"));
- _shortcut = EscapeKey;
- break;
-
- case EscapeKey:
- g_system->displayMessageOnOSD(_("Game Menu"));
- _shortcut = GameMenu;
- break;
-
- case GameMenu:
- g_system->displayMessageOnOSD(_("Show Keypad"));
- _shortcut = ShowKeypad;
- break;
-
- case SetVolume:
- // fallthru
-
- case ShowKeypad:
- g_system->displayMessageOnOSD(_("Control Mouse"));
- _shortcut = ControlMouse;
- 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 = LeftButton;
- pushKey(Common::KEYCODE_F7);
-}
-
-void BadaAppForm::OnTouchDoublePressed(const Control &source,
- const Point ¤tPosition,
- const TouchEventInfo &touchInfo) {
- if (_buttonState != MoveOnly) {
- pushEvent(_buttonState == LeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN,
- currentPosition);
- pushEvent(_buttonState == LeftButton ? 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 != LeftButton) {
- 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 != MoveOnly) {
- pushEvent(_buttonState == LeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN,
- currentPosition);
- }
-}
-
-void BadaAppForm::OnTouchReleased(const Control &source,
- const Point ¤tPosition,
- const TouchEventInfo &touchInfo) {
- if (_buttonState != MoveOnly) {
- pushEvent(_buttonState == LeftButton ? Common::EVENT_LBUTTONUP : Common::EVENT_RBUTTONUP,
- currentPosition);
- if (_buttonState == RightButtonOnce) {
- _buttonState = LeftButton;
- }
- // 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 = SetVolume;
- setVolume(true, true);
- return;
-
- case KEY_SIDE_DOWN:
- _shortcut = SetVolume;
- setVolume(false, true);
- return;
-
- case KEY_CAMERA:
- _shortcut = ShowKeypad;
- showKeypad();
- return;
-
- default:
- break;
- }
-}
-
-void BadaAppForm::OnKeyPressed(const Control &source, KeyCode keyCode) {
- switch (keyCode) {
- case KEY_SIDE_UP:
- if (_shortcut != SetVolume) {
- _shortcut = SetVolume;
- } else {
- setVolume(true, false);
- }
- return;
-
- case KEY_SIDE_DOWN:
- switch (_shortcut) {
- case ControlMouse:
- setButtonShortcut();
- break;
-
- case EscapeKey:
- pushKey(Common::KEYCODE_ESCAPE);
- break;
-
- case GameMenu:
- pushKey(Common::KEYCODE_F5);
- break;
-
- case ShowKeypad:
- showKeypad();
- break;
-
- default:
- setVolume(false, false);
- break;
- }
- break;
-
- case KEY_CAMERA:
- setShortcut();
- break;
-
- default:
- break;
- }
-}
-
-void BadaAppForm::OnKeyReleased(const Control &source, KeyCode keyCode) {
-}
+/* 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 <FAppApplication.h> + +#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(InitState), + _buttonState(LeftButton), + _shortcut(SetVolume) { + _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 != ErrorState) { + terminate(); + + _gameThread->Stop(); + if (_state != ErrorState) { + _gameThread->Join(); + } + + delete _gameThread; + _gameThread = NULL; + } + + if (_eventQueueLock) { + delete _eventQueueLock; + _eventQueueLock = NULL; + } + + logLeaving(); +} + +// +// abort the game thread +// +void BadaAppForm::terminate() { + if (_state == ActiveState) { + ((BadaSystem *)g_system)->setMute(true); + + _eventQueueLock->Acquire(); + + Common::Event e; + e.type = Common::EVENT_QUIT; + _eventQueue.push(e); + _state = ClosingState; + + _eventQueueLock->Release(); + + // block while thread ends + AppLog("waiting for shutdown"); + for (int i = 0; i < EXIT_SLEEP_STEP && _state == ClosingState; i++) { + Thread::Sleep(EXIT_SLEEP); + } + + if (_state == ClosingState) { + // failed to terminate - Join() will freeze + _state = ErrorState; + } + } +} + +void BadaAppForm::exitSystem() { + _state = ErrorState; + + 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 == InitState) { + _state = ActiveState; + _gameThread->Start(); + } +} + +Object *BadaAppForm::Run(void) { + scummvm_main(0, 0); + + if (_state == ActiveState) { + Application::GetInstance()->SendUserEvent(USER_MESSAGE_EXIT, NULL); + } + _state = DoneState; + return NULL; +} + +void BadaAppForm::setButtonShortcut() { + switch (_buttonState) { + case LeftButton: + g_system->displayMessageOnOSD(_("Right Click Once")); + _buttonState = RightButtonOnce; + break; + case RightButtonOnce: + g_system->displayMessageOnOSD(_("Right Click")); + _buttonState = RightButton; + break; + case RightButton: + g_system->displayMessageOnOSD(_("Move Only")); + _buttonState = MoveOnly; + break; + case MoveOnly: + g_system->displayMessageOnOSD(_("Left Click")); + _buttonState = LeftButton; + break; + } +} + +void BadaAppForm::setShortcut() { + // cycle to the next shortcut + switch (_shortcut) { + case ControlMouse: + g_system->displayMessageOnOSD(_("Escape Key")); + _shortcut = EscapeKey; + break; + + case EscapeKey: + g_system->displayMessageOnOSD(_("Game Menu")); + _shortcut = GameMenu; + break; + + case GameMenu: + g_system->displayMessageOnOSD(_("Show Keypad")); + _shortcut = ShowKeypad; + break; + + case SetVolume: + // fallthru + + case ShowKeypad: + g_system->displayMessageOnOSD(_("Control Mouse")); + _shortcut = ControlMouse; + 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 = LeftButton; + pushKey(Common::KEYCODE_F7); +} + +void BadaAppForm::OnTouchDoublePressed(const Control &source, + const Point ¤tPosition, + const TouchEventInfo &touchInfo) { + if (_buttonState != MoveOnly) { + pushEvent(_buttonState == LeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN, + currentPosition); + pushEvent(_buttonState == LeftButton ? 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 != LeftButton) { + 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 != MoveOnly) { + pushEvent(_buttonState == LeftButton ? Common::EVENT_LBUTTONDOWN : Common::EVENT_RBUTTONDOWN, + currentPosition); + } +} + +void BadaAppForm::OnTouchReleased(const Control &source, + const Point ¤tPosition, + const TouchEventInfo &touchInfo) { + if (_buttonState != MoveOnly) { + pushEvent(_buttonState == LeftButton ? Common::EVENT_LBUTTONUP : Common::EVENT_RBUTTONUP, + currentPosition); + if (_buttonState == RightButtonOnce) { + _buttonState = LeftButton; + } + // 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 = SetVolume; + setVolume(true, true); + return; + + case KEY_SIDE_DOWN: + _shortcut = SetVolume; + setVolume(false, true); + return; + + case KEY_CAMERA: + _shortcut = ShowKeypad; + showKeypad(); + return; + + default: + break; + } +} + +void BadaAppForm::OnKeyPressed(const Control &source, KeyCode keyCode) { + switch (keyCode) { + case KEY_SIDE_UP: + if (_shortcut != SetVolume) { + _shortcut = SetVolume; + } else { + setVolume(true, false); + } + return; + + case KEY_SIDE_DOWN: + switch (_shortcut) { + case ControlMouse: + setButtonShortcut(); + break; + + case EscapeKey: + pushKey(Common::KEYCODE_ESCAPE); + break; + + case GameMenu: + pushKey(Common::KEYCODE_F5); + break; + + case ShowKeypad: + 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 index aa134615b7..ec04f19559 100644 --- a/backends/platform/bada/form.h +++ b/backends/platform/bada/form.h @@ -1,108 +1,108 @@ -/* 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 <FApp.h>
-#include <FUi.h>
-#include <FSystem.h>
-#include <FBase.h>
-#include <FUiITouchEventListener.h>
-#include <FUiITextEventListener.h>
-
-#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 == ClosingState; }
- 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<Common::Event> _eventQueue;
- enum {InitState, ActiveState, ClosingState, DoneState, ErrorState} _state;
- enum {LeftButton, RightButtonOnce, RightButton, MoveOnly} _buttonState;
- enum {ControlMouse, EscapeKey, GameMenu, ShowKeypad, SetVolume} _shortcut;
-};
-
-#endif
+/* 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 <FApp.h> +#include <FUi.h> +#include <FSystem.h> +#include <FBase.h> +#include <FUiITouchEventListener.h> +#include <FUiITextEventListener.h> + +#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 == ClosingState; } + 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<Common::Event> _eventQueue; + enum {InitState, ActiveState, ClosingState, DoneState, ErrorState} _state; + enum {LeftButton, RightButtonOnce, RightButton, MoveOnly} _buttonState; + enum {ControlMouse, EscapeKey, GameMenu, ShowKeypad, SetVolume} _shortcut; +}; + +#endif diff --git a/backends/platform/bada/graphics.cpp b/backends/platform/bada/graphics.cpp index 81176b13d3..7c4fc03ac1 100644 --- a/backends/platform/bada/graphics.cpp +++ b/backends/platform/bada/graphics.cpp @@ -1,315 +1,315 @@ -/* 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;
- _videoMode.antialiasing = 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<Graphics::PixelFormat> BadaGraphicsManager::getSupportedFormats() const {
- logEntered();
-
- Common::List<Graphics::PixelFormat> 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
- // note: this did not solve the pixel border problem in refreshGameScreen()
- 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();
-}
-
-void BadaGraphicsManager::refreshGameScreen() {
- if (_screenNeedsRedraw)
- _screenDirtyRect = Common::Rect(0, 0, _screenData.w, _screenData.h);
-
- int x = _screenDirtyRect.left;
- int y = _screenDirtyRect.top;
- int w = _screenDirtyRect.width();
- int h = _screenDirtyRect.height();
-
- if (_screenData.format.bytesPerPixel == 1) {
- // Create a temporary RGB888 surface
- int sw = w;
- int sh = h;
-
- if (_videoMode.screenWidth == w && _videoMode.screenHeight == h) {
- // The extra border prevents random pixels from appearing in the right and bottom
- // screen column/row. Not sure whether this should be applied to opengl-graphics.cpp
- sw = w + 1;
- sh = h + 1;
- }
-
- byte *surface = new byte[sw * sh * 3];
-
- // Convert the paletted buffer to RGB888
- const byte *src = (byte *)_screenData.pixels + y * _screenData.pitch;
- src += x * _screenData.format.bytesPerPixel;
- byte *dst = surface;
- for (int i = 0; i < h; i++) {
- for (int j = 0; j < w; j++) {
- dst[0] = _gamePalette[src[j] * 3];
- dst[1] = _gamePalette[src[j] * 3 + 1];
- dst[2] = _gamePalette[src[j] * 3 + 2];
- dst += 3;
- }
- src += _screenData.pitch;
- }
-
- // Update the texture
- _gameTexture->updateBuffer(surface, w * 3, x, y, sw, sh);
-
- // Free the temp surface
- delete[] surface;
- } else {
- // Update the texture
- _gameTexture->updateBuffer((byte *)_screenData.pixels + y * _screenData.pitch +
- x * _screenData.format.bytesPerPixel, _screenData.pitch, x, y, w, h);
- }
-
- _screenNeedsRedraw = false;
- _screenDirtyRect = Common::Rect();
-}
-
-// 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();
-
-}
+/* 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; + _videoMode.antialiasing = 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<Graphics::PixelFormat> BadaGraphicsManager::getSupportedFormats() const { + logEntered(); + + Common::List<Graphics::PixelFormat> 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 + // note: this did not solve the pixel border problem in refreshGameScreen() + 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(); +} + +void BadaGraphicsManager::refreshGameScreen() { + if (_screenNeedsRedraw) + _screenDirtyRect = Common::Rect(0, 0, _screenData.w, _screenData.h); + + int x = _screenDirtyRect.left; + int y = _screenDirtyRect.top; + int w = _screenDirtyRect.width(); + int h = _screenDirtyRect.height(); + + if (_screenData.format.bytesPerPixel == 1) { + // Create a temporary RGB888 surface + int sw = w; + int sh = h; + + if (_videoMode.screenWidth == w && _videoMode.screenHeight == h) { + // The extra border prevents random pixels from appearing in the right and bottom + // screen column/row. Not sure whether this should be applied to opengl-graphics.cpp + sw = w + 1; + sh = h + 1; + } + + byte *surface = new byte[sw * sh * 3]; + + // Convert the paletted buffer to RGB888 + const byte *src = (byte *)_screenData.pixels + y * _screenData.pitch; + src += x * _screenData.format.bytesPerPixel; + byte *dst = surface; + for (int i = 0; i < h; i++) { + for (int j = 0; j < w; j++) { + dst[0] = _gamePalette[src[j] * 3]; + dst[1] = _gamePalette[src[j] * 3 + 1]; + dst[2] = _gamePalette[src[j] * 3 + 2]; + dst += 3; + } + src += _screenData.pitch; + } + + // Update the texture + _gameTexture->updateBuffer(surface, w * 3, x, y, sw, sh); + + // Free the temp surface + delete[] surface; + } else { + // Update the texture + _gameTexture->updateBuffer((byte *)_screenData.pixels + y * _screenData.pitch + + x * _screenData.format.bytesPerPixel, _screenData.pitch, x, y, w, h); + } + + _screenNeedsRedraw = false; + _screenDirtyRect = Common::Rect(); +} + +// 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 index 573965bc36..5e49419979 100644 --- a/backends/platform/bada/graphics.h +++ b/backends/platform/bada/graphics.h @@ -1,73 +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 BADA_GRAPHICS_H
-#define BADA_GRAPHICS_H
-
-#include <FBase.h>
-#include <FGraphics.h>
-#include <FApp.h>
-#include <FGraphicsOpengl.h>
-#include <FSystem.h>
-#include <FUi.h>
-
-#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<Graphics::PixelFormat> 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 refreshGameScreen();
- void setInternalMousePosition(int x, int y) {}
- void showSplash();
-
- bool loadEgl();
- BadaAppForm *_appForm;
- EGLDisplay _eglDisplay;
- EGLSurface _eglSurface;
- EGLConfig _eglConfig;
- EGLContext _eglContext;
- bool _initState;
-};
-
-#endif
+/* 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 <FBase.h> +#include <FGraphics.h> +#include <FApp.h> +#include <FGraphicsOpengl.h> +#include <FSystem.h> +#include <FUi.h> + +#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<Graphics::PixelFormat> 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 refreshGameScreen(); + 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/sscanf.cpp b/backends/platform/bada/sscanf.cpp index 8eab3ee5d1..421c23b288 100644 --- a/backends/platform/bada/sscanf.cpp +++ b/backends/platform/bada/sscanf.cpp @@ -1,182 +1,182 @@ -/* 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 <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <ctype.h>
-
-//
-// simple sscanf replacement to match scummvm usage patterns
-//
-
-bool scanInt(const char **in, va_list *ap, int max) {
- while (**in && (**in == ' ' || **in == '0')) {
- (*in)++;
- }
-
- int *arg = va_arg(*ap, int*);
- char *end;
- long n = strtol(*in, &end, 0);
-
- 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,h;
- char buffer[100];
- unsigned u;
- char c;
- strcpy(buffer, "hello");
- char *b = buffer;
-
- // strcpy(buffer, "in the buffer something");
- if (simple_sscanf("CAT 123x-10 0x100 FONT large 1 enough\n 123456.AUD $",
- "CAT %dx%d %x FONT %[^\n] %06u.AUD %c",
- &x, &y, &h, b, &u, &c) != 6) {
- printf("Failed\n");
- } else {
- printf("Success %d %d %d %s %d '%c'\n", x, y, h, buffer, u, c);
- }
- return 0;
-}
-#endif
+/* 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 <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <ctype.h> + +// +// simple sscanf replacement to match scummvm usage patterns +// + +bool scanInt(const char **in, va_list *ap, int max) { + while (**in && (**in == ' ' || **in == '0')) { + (*in)++; + } + + int *arg = va_arg(*ap, int*); + char *end; + long n = strtol(*in, &end, 0); + + 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,h; + char buffer[100]; + unsigned u; + char c; + strcpy(buffer, "hello"); + char *b = buffer; + + // strcpy(buffer, "in the buffer something"); + if (simple_sscanf("CAT 123x-10 0x100 FONT large 1 enough\n 123456.AUD $", + "CAT %dx%d %x FONT %[^\n] %06u.AUD %c", + &x, &y, &h, b, &u, &c) != 6) { + printf("Failed\n"); + } else { + printf("Success %d %d %d %s %d '%c'\n", x, y, h, buffer, u, c); + } + return 0; +} +#endif diff --git a/backends/platform/bada/system.cpp b/backends/platform/bada/system.cpp index 4503b8fa6b..bc921e0dff 100644 --- a/backends/platform/bada/system.cpp +++ b/backends/platform/bada/system.cpp @@ -1,499 +1,499 @@ -/* 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 <FUiCtrlMessageBox.h>
-
-#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::Ui::Controls;
-
-#define DEFAULT_CONFIG_FILE "/Home/scummvm.ini"
-#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();
-
- // allow translations and game .DAT files to be found
- ConfMan.set("extrapath", "/Res");
-
- // 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", true);
- ConfMan.setBool("confirm_exit", false);
-
- Osp::System::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-ASCII.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::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;
- Osp::System::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 == Osp::System::SystemTime::GetCurrentTime(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();
- }
-}
-
-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) {
- if (_audioThread) {
- _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();
- }
-}
+/* 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 <FUiCtrlMessageBox.h> + +#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::Ui::Controls; + +#define DEFAULT_CONFIG_FILE "/Home/scummvm.ini" +#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(); + + // allow translations and game .DAT files to be found + ConfMan.set("extrapath", "/Res"); + + // 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", true); + ConfMan.setBool("confirm_exit", false); + + Osp::System::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-ASCII.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::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; + Osp::System::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 == Osp::System::SystemTime::GetCurrentTime(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(); + } +} + +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) { + if (_audioThread) { + _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(); + } +} |