From b406ba58847780d346093d881eb544a3c7b81506 Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Mon, 22 Aug 2011 09:45:53 +0200 Subject: BADA: Strip off windows-style line endings --- backends/platform/bada/audio.cpp | 520 +++++++++---------- backends/platform/bada/audio.h | 146 +++--- backends/platform/bada/form.cpp | 928 ++++++++++++++++----------------- backends/platform/bada/form.h | 216 ++++---- backends/platform/bada/graphics.cpp | 630 +++++++++++------------ backends/platform/bada/graphics.h | 146 +++--- backends/platform/bada/sscanf.cpp | 364 ++++++------- backends/platform/bada/system.cpp | 998 ++++++++++++++++++------------------ 8 files changed, 1974 insertions(+), 1974 deletions(-) (limited to 'backends/platform/bada') 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 -#include - -#include "backends/platform/bada/audio.h" -#include "backends/platform/bada/system.h" - -#define TIMER_INCREMENT 10 -#define TIMER_INTERVAL 40 -#define MIN_TIMER_INTERVAL 10 -#define MAX_TIMER_INTERVAL 160 -#define INIT_LEVEL 3 -#define CONFIG_KEY L"audiovol" - -// sound level pre-sets -const int levels[] = {0, 1, 10, 45, 70, 99}; - -AudioThread::AudioThread() : - _mixer(0), - _timer(0), - _audioOut(0), - _head(0), - _tail(0), - _ready(0), - _interval(TIMER_INTERVAL), - _playing(-1), - _muted(true) { -} - -Audio::MixerImpl *AudioThread::Construct(OSystem *system) { - logEntered(); - - if (IsFailed(Thread::Construct(THREAD_TYPE_EVENT_DRIVEN, - DEFAULT_STACK_SIZE, - THREAD_PRIORITY_HIGH))) { - AppLog("Failed to create AudioThread"); - return NULL; - } - - _mixer = new Audio::MixerImpl(system, 44100); - return _mixer; -} - -AudioThread::~AudioThread() { - logEntered(); -} - -bool AudioThread::isSilentMode() { - bool silentMode; - String key(L"SilentMode"); - Osp::System::SettingInfo::GetValue(key, silentMode); - return silentMode; -} - -void AudioThread::setMute(bool on) { - if (_audioOut && !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 +#include + +#include "backends/platform/bada/audio.h" +#include "backends/platform/bada/system.h" + +#define TIMER_INCREMENT 10 +#define TIMER_INTERVAL 40 +#define MIN_TIMER_INTERVAL 10 +#define MAX_TIMER_INTERVAL 160 +#define INIT_LEVEL 3 +#define CONFIG_KEY L"audiovol" + +// sound level pre-sets +const int levels[] = {0, 1, 10, 45, 70, 99}; + +AudioThread::AudioThread() : + _mixer(0), + _timer(0), + _audioOut(0), + _head(0), + _tail(0), + _ready(0), + _interval(TIMER_INTERVAL), + _playing(-1), + _muted(true) { +} + +Audio::MixerImpl *AudioThread::Construct(OSystem *system) { + logEntered(); + + if (IsFailed(Thread::Construct(THREAD_TYPE_EVENT_DRIVEN, + DEFAULT_STACK_SIZE, + THREAD_PRIORITY_HIGH))) { + AppLog("Failed to create AudioThread"); + return NULL; + } + + _mixer = new Audio::MixerImpl(system, 44100); + return _mixer; +} + +AudioThread::~AudioThread() { + logEntered(); +} + +bool AudioThread::isSilentMode() { + bool silentMode; + String key(L"SilentMode"); + Osp::System::SettingInfo::GetValue(key, silentMode); + return silentMode; +} + +void AudioThread::setMute(bool on) { + if (_audioOut && !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 -#include -#include -#include - -#include "config.h" -#include "common/scummsys.h" -#include "common/system.h" -#include "audio/mixer_intern.h" - -using namespace Osp::Base; -using namespace Osp::Base::Collection; -using namespace Osp::Base::Runtime; -using namespace Osp::Media; -using namespace Osp::Io; - -#define NUM_AUDIO_BUFFERS 2 - -class AudioThread: public Osp::Media::IAudioOutEventListener, - public Osp::Base::Runtime::ITimerEventListener, - public Osp::Base::Runtime::Thread { -public: - AudioThread(void); - ~AudioThread(void); - - Audio::MixerImpl *Construct(OSystem *system); - bool isSilentMode(); - void setMute(bool on); - int setVolume(bool up, bool minMax); - - bool OnStart(void); - void OnStop(void); - void OnAudioOutErrorOccurred(Osp::Media::AudioOut &src, result r); - void OnAudioOutInterrupted(Osp::Media::AudioOut &src); - void OnAudioOutReleased(Osp::Media::AudioOut &src); - void OnAudioOutBufferEndReached(Osp::Media::AudioOut &src); - void OnTimerExpired(Timer &timer); - -private: - Audio::MixerImpl *_mixer; - Osp::Base::Runtime::Timer *_timer; - Osp::Media::AudioOut *_audioOut; - Osp::Base::ByteBuffer _audioBuffer[NUM_AUDIO_BUFFERS]; - int _head, _tail, _ready, _interval, _playing; - bool _muted; -}; - -#endif +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef BADA_AUDIO_H +#define BADA_AUDIO_H + +#include +#include +#include +#include + +#include "config.h" +#include "common/scummsys.h" +#include "common/system.h" +#include "audio/mixer_intern.h" + +using namespace Osp::Base; +using namespace Osp::Base::Collection; +using namespace Osp::Base::Runtime; +using namespace Osp::Media; +using namespace Osp::Io; + +#define NUM_AUDIO_BUFFERS 2 + +class AudioThread: public Osp::Media::IAudioOutEventListener, + public Osp::Base::Runtime::ITimerEventListener, + public Osp::Base::Runtime::Thread { +public: + AudioThread(void); + ~AudioThread(void); + + Audio::MixerImpl *Construct(OSystem *system); + bool isSilentMode(); + void setMute(bool on); + int setVolume(bool up, bool minMax); + + bool OnStart(void); + void OnStop(void); + void OnAudioOutErrorOccurred(Osp::Media::AudioOut &src, result r); + void OnAudioOutInterrupted(Osp::Media::AudioOut &src); + void OnAudioOutReleased(Osp::Media::AudioOut &src); + void OnAudioOutBufferEndReached(Osp::Media::AudioOut &src); + void OnTimerExpired(Timer &timer); + +private: + Audio::MixerImpl *_mixer; + Osp::Base::Runtime::Timer *_timer; + Osp::Media::AudioOut *_audioOut; + Osp::Base::ByteBuffer _audioBuffer[NUM_AUDIO_BUFFERS]; + int _head, _tail, _ready, _interval, _playing; + bool _muted; +}; + +#endif diff --git a/backends/platform/bada/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 - -#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 + +#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 -#include -#include -#include -#include -#include - -#include "config.h" -#include "common/scummsys.h" -#include "common/events.h" -#include "common/queue.h" -#include "common/mutex.h" - -// -// BadaAppForm -// -class BadaAppForm : public Osp::Ui::Controls::Form, - public Osp::Ui::IOrientationEventListener, - public Osp::Ui::ITouchEventListener, - public Osp::Ui::IKeyEventListener, - public Osp::Base::Runtime::IRunnable { -public: - BadaAppForm(); - ~BadaAppForm(); - - result Construct(); - bool pollEvent(Common::Event &event); - bool isClosing() { return _state == 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 _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 +#include +#include +#include +#include +#include + +#include "config.h" +#include "common/scummsys.h" +#include "common/events.h" +#include "common/queue.h" +#include "common/mutex.h" + +// +// BadaAppForm +// +class BadaAppForm : public Osp::Ui::Controls::Form, + public Osp::Ui::IOrientationEventListener, + public Osp::Ui::ITouchEventListener, + public Osp::Ui::IKeyEventListener, + public Osp::Base::Runtime::IRunnable { +public: + BadaAppForm(); + ~BadaAppForm(); + + result Construct(); + bool pollEvent(Common::Event &event); + bool isClosing() { return _state == 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 _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 BadaGraphicsManager::getSupportedFormats() const { - logEntered(); - - Common::List res; - res.push_back(Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0)); - res.push_back(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); - res.push_back(Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0)); - res.push_back(Graphics::PixelFormat::createFormatCLUT8()); - return res; -} - -bool BadaGraphicsManager::hasFeature(OSystem::Feature f) { - bool result = (f == OSystem::kFeatureFullscreenMode || - f == OSystem::kFeatureVirtualKeyboard || - OpenGLGraphicsManager::hasFeature(f)); - return result; -} - -void BadaGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) { - OpenGLGraphicsManager::setFeatureState(f, enable); -} - -void BadaGraphicsManager::setReady() { - _initState = false; -} - -void BadaGraphicsManager::updateScreen() { - if (_transactionMode == kTransactionNone) { - internUpdateScreen(); - } -} - -bool BadaGraphicsManager::loadEgl() { - logEntered(); - - EGLint numConfigs = 1; - EGLint eglConfigList[] = { - EGL_RED_SIZE, 5, - EGL_GREEN_SIZE, 6, - EGL_BLUE_SIZE, 5, - EGL_ALPHA_SIZE, 0, - EGL_DEPTH_SIZE, 8, - EGL_SURFACE_TYPE, EGL_WINDOW_BIT, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, - EGL_NONE - }; - - EGLint eglContextList[] = { - EGL_CONTEXT_CLIENT_VERSION, 1, - EGL_NONE - }; - - eglBindAPI(EGL_OPENGL_ES_API); - - if (_eglDisplay) { - unloadGFXMode(); - } - - _eglDisplay = eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY); - if (EGL_NO_DISPLAY == _eglDisplay) { - systemError("eglGetDisplay() failed"); - return false; - } - - if (EGL_FALSE == eglInitialize(_eglDisplay, NULL, NULL) || - EGL_SUCCESS != eglGetError()) { - systemError("eglInitialize() failed"); - return false; - } - - if (EGL_FALSE == eglChooseConfig(_eglDisplay, eglConfigList, - &_eglConfig, 1, &numConfigs) || - EGL_SUCCESS != eglGetError()) { - systemError("eglChooseConfig() failed"); - return false; - } - - if (!numConfigs) { - systemError("eglChooseConfig() failed. Matching config does not exist \n"); - return false; - } - - _eglSurface = eglCreateWindowSurface(_eglDisplay, _eglConfig, - (EGLNativeWindowType)_appForm, NULL); - if (EGL_NO_SURFACE == _eglSurface || EGL_SUCCESS != eglGetError()) { - systemError("eglCreateWindowSurface() failed. EGL_NO_SURFACE"); - return false; - } - - _eglContext = eglCreateContext(_eglDisplay, _eglConfig, - EGL_NO_CONTEXT, eglContextList); - if (EGL_NO_CONTEXT == _eglContext || - EGL_SUCCESS != eglGetError()) { - systemError("eglCreateContext() failed"); - return false; - } - - if (false == eglMakeCurrent(_eglDisplay, _eglSurface, _eglSurface, _eglContext) || - EGL_SUCCESS != eglGetError()) { - systemError("eglMakeCurrent() failed"); - return false; - } - - logLeaving(); - return true; -} - -bool BadaGraphicsManager::loadGFXMode() { - logEntered(); - - if (!loadEgl()) { - unloadGFXMode(); - return false; - } - - int x, y, width, height; - _appForm->GetBounds(x, y, width, height); - _videoMode.overlayWidth = _videoMode.hardwareWidth = width; - _videoMode.overlayHeight = _videoMode.hardwareHeight = height; - _videoMode.scaleFactor = 3; // for proportional sized cursor in the launcher - - AppLog("screen size: %dx%d", _videoMode.hardwareWidth, _videoMode.hardwareHeight); - return OpenGLGraphicsManager::loadGFXMode(); -} - -void BadaGraphicsManager::loadTextures() { - logEntered(); - - OpenGLGraphicsManager::loadTextures(); - - // prevent image skew in some games, see: - // http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall - // 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 BadaGraphicsManager::getSupportedFormats() const { + logEntered(); + + Common::List res; + res.push_back(Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0)); + res.push_back(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); + res.push_back(Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0)); + res.push_back(Graphics::PixelFormat::createFormatCLUT8()); + return res; +} + +bool BadaGraphicsManager::hasFeature(OSystem::Feature f) { + bool result = (f == OSystem::kFeatureFullscreenMode || + f == OSystem::kFeatureVirtualKeyboard || + OpenGLGraphicsManager::hasFeature(f)); + return result; +} + +void BadaGraphicsManager::setFeatureState(OSystem::Feature f, bool enable) { + OpenGLGraphicsManager::setFeatureState(f, enable); +} + +void BadaGraphicsManager::setReady() { + _initState = false; +} + +void BadaGraphicsManager::updateScreen() { + if (_transactionMode == kTransactionNone) { + internUpdateScreen(); + } +} + +bool BadaGraphicsManager::loadEgl() { + logEntered(); + + EGLint numConfigs = 1; + EGLint eglConfigList[] = { + EGL_RED_SIZE, 5, + EGL_GREEN_SIZE, 6, + EGL_BLUE_SIZE, 5, + EGL_ALPHA_SIZE, 0, + EGL_DEPTH_SIZE, 8, + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, + EGL_NONE + }; + + EGLint eglContextList[] = { + EGL_CONTEXT_CLIENT_VERSION, 1, + EGL_NONE + }; + + eglBindAPI(EGL_OPENGL_ES_API); + + if (_eglDisplay) { + unloadGFXMode(); + } + + _eglDisplay = eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY); + if (EGL_NO_DISPLAY == _eglDisplay) { + systemError("eglGetDisplay() failed"); + return false; + } + + if (EGL_FALSE == eglInitialize(_eglDisplay, NULL, NULL) || + EGL_SUCCESS != eglGetError()) { + systemError("eglInitialize() failed"); + return false; + } + + if (EGL_FALSE == eglChooseConfig(_eglDisplay, eglConfigList, + &_eglConfig, 1, &numConfigs) || + EGL_SUCCESS != eglGetError()) { + systemError("eglChooseConfig() failed"); + return false; + } + + if (!numConfigs) { + systemError("eglChooseConfig() failed. Matching config does not exist \n"); + return false; + } + + _eglSurface = eglCreateWindowSurface(_eglDisplay, _eglConfig, + (EGLNativeWindowType)_appForm, NULL); + if (EGL_NO_SURFACE == _eglSurface || EGL_SUCCESS != eglGetError()) { + systemError("eglCreateWindowSurface() failed. EGL_NO_SURFACE"); + return false; + } + + _eglContext = eglCreateContext(_eglDisplay, _eglConfig, + EGL_NO_CONTEXT, eglContextList); + if (EGL_NO_CONTEXT == _eglContext || + EGL_SUCCESS != eglGetError()) { + systemError("eglCreateContext() failed"); + return false; + } + + if (false == eglMakeCurrent(_eglDisplay, _eglSurface, _eglSurface, _eglContext) || + EGL_SUCCESS != eglGetError()) { + systemError("eglMakeCurrent() failed"); + return false; + } + + logLeaving(); + return true; +} + +bool BadaGraphicsManager::loadGFXMode() { + logEntered(); + + if (!loadEgl()) { + unloadGFXMode(); + return false; + } + + int x, y, width, height; + _appForm->GetBounds(x, y, width, height); + _videoMode.overlayWidth = _videoMode.hardwareWidth = width; + _videoMode.overlayHeight = _videoMode.hardwareHeight = height; + _videoMode.scaleFactor = 3; // for proportional sized cursor in the launcher + + AppLog("screen size: %dx%d", _videoMode.hardwareWidth, _videoMode.hardwareHeight); + return OpenGLGraphicsManager::loadGFXMode(); +} + +void BadaGraphicsManager::loadTextures() { + logEntered(); + + OpenGLGraphicsManager::loadTextures(); + + // prevent image skew in some games, see: + // http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall + // 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 -#include -#include -#include -#include -#include - -#include "config.h" -#include "backends/graphics/opengl/opengl-graphics.h" -#include "graphics/font.h" -#include "backends/platform/bada/form.h" - -using namespace Osp::Graphics; -using namespace Osp::Graphics::Opengl; -using namespace Osp::App; - -class BadaGraphicsManager : public OpenGLGraphicsManager { -public: - BadaGraphicsManager(BadaAppForm *appForm); - - Common::List getSupportedFormats() const; - bool hasFeature(OSystem::Feature f); - void updateScreen(); - void setFeatureState(OSystem::Feature f, bool enable); - void setReady(); - bool isReady() { return !_initState; } - const Graphics::Font *getFontOSD(); - bool moveMouse(int16 &x, int16 &y); - -private: - void internUpdateScreen(); - bool loadGFXMode(); - void loadTextures(); - void unloadGFXMode(); - void 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 +#include +#include +#include +#include +#include + +#include "config.h" +#include "backends/graphics/opengl/opengl-graphics.h" +#include "graphics/font.h" +#include "backends/platform/bada/form.h" + +using namespace Osp::Graphics; +using namespace Osp::Graphics::Opengl; +using namespace Osp::App; + +class BadaGraphicsManager : public OpenGLGraphicsManager { +public: + BadaGraphicsManager(BadaAppForm *appForm); + + Common::List getSupportedFormats() const; + bool hasFeature(OSystem::Feature f); + void updateScreen(); + void setFeatureState(OSystem::Feature f, bool enable); + void setReady(); + bool isReady() { return !_initState; } + const Graphics::Font *getFontOSD(); + bool moveMouse(int16 &x, int16 &y); + +private: + void internUpdateScreen(); + bool loadGFXMode(); + void loadTextures(); + void unloadGFXMode(); + void 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 -#include -#include -#include -#include - -// -// 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 +#include +#include +#include +#include + +// +// 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 - -#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 + +#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(); + } +} -- cgit v1.2.3