From 16c559a095af85a7f553912461cf4468366070a7 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sat, 29 May 2010 01:56:34 +0000 Subject: Added again base-backend. Started sdl backend refatoring, file, mutex and timer subsystems created. svn-id: r49305 --- backends/platform/sdl/file.cpp | 235 ++++++++++++++++++++++++++++++++++++++++ backends/platform/sdl/file.h | 67 ++++++++++++ backends/platform/sdl/mutex.cpp | 83 ++++++++++++++ backends/platform/sdl/mutex.h | 69 ++++++++++++ backends/platform/sdl/timer.cpp | 121 +++++++++++++++++++++ backends/platform/sdl/timer.h | 69 ++++++++++++ 6 files changed, 644 insertions(+) create mode 100644 backends/platform/sdl/file.cpp create mode 100644 backends/platform/sdl/file.h create mode 100644 backends/platform/sdl/mutex.cpp create mode 100644 backends/platform/sdl/mutex.h create mode 100644 backends/platform/sdl/timer.cpp create mode 100644 backends/platform/sdl/timer.h (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/file.cpp b/backends/platform/sdl/file.cpp new file mode 100644 index 0000000000..a8dd230059 --- /dev/null +++ b/backends/platform/sdl/file.cpp @@ -0,0 +1,235 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#if defined(WIN32) +#include +// winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h +#undef ARRAYSIZE +#endif + +#include "backends/platform/sdl/file.h" +#include "common/archive.h" + +#ifdef UNIX + #include "backends/saves/posix/posix-saves.h" +#else + #include "backends/saves/default/default-saves.h" +#endif + +/* + * Include header files needed for the getFilesystemFactory() method. + */ +#if defined(__amigaos4__) + #include "backends/fs/amigaos4/amigaos4-fs-factory.h" +#elif defined(UNIX) + #include "backends/fs/posix/posix-fs-factory.h" +#elif defined(WIN32) + #include "backends/fs/windows/windows-fs-factory.h" +#endif + + +#if defined(UNIX) +#ifdef MACOSX +#define DEFAULT_CONFIG_FILE "Library/Preferences/ScummVM Preferences" +#elif defined(SAMSUNGTV) +#define DEFAULT_CONFIG_FILE "/dtv/usb/sda1/.scummvmrc" +#else +#define DEFAULT_CONFIG_FILE ".scummvmrc" +#endif +#else +#define DEFAULT_CONFIG_FILE "scummvm.ini" +#endif + +SdlSubSys_File::SdlSubSys_File() + : + _inited(false), + _fsFactory(0), + _savefile(0) { + +} + +SdlSubSys_File::~SdlSubSys_File() { +} + +void SdlSubSys_File::fileInit(OSystem *mainSys) { + if (_inited) { + return; + } + _mainSys = mainSys; + + // Create the savefile manager, if none exists yet (we check for this to + // allow subclasses to provide their own). + if (_savefile == 0) { + #ifdef UNIX + _savefile = new POSIXSaveFileManager(); + #else + _savefile = new DefaultSaveFileManager(); + #endif + } + +#if defined(__amigaos4__) + _fsFactory = new AmigaOSFilesystemFactory(); +#elif defined(UNIX) + _fsFactory = new POSIXFilesystemFactory(); +#elif defined(WIN32) + _fsFactory = new WindowsFilesystemFactory(); +#elif defined(__SYMBIAN32__) + // Do nothing since its handled by the Symbian SDL inheritance +#else + #error Unknown and unsupported FS backend +#endif + + _inited = true; +} + +void SdlSubSys_File::fileDone() { + delete _savefile; +} + +bool SdlSubSys_File::hasFeature(Feature f) { + return false; +} + +void SdlSubSys_File::setFeatureState(Feature f, bool enable) { + +} + +bool SdlSubSys_File::getFeatureState(Feature f) { + return false; +} + +Common::SaveFileManager *SdlSubSys_File::getSavefileManager() { + assert(_savefile); + return _savefile; +} + +FilesystemFactory *SdlSubSys_File::getFilesystemFactory() { + assert(_fsFactory); + return _fsFactory; +} + +void SdlSubSys_File::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { + +#ifdef DATA_PATH + // Add the global DATA_PATH to the directory search list + // FIXME: We use depth = 4 for now, to match the old code. May want to change that + Common::FSNode dataNode(DATA_PATH); + if (dataNode.exists() && dataNode.isDirectory()) { + s.add(DATA_PATH, new Common::FSDirectory(dataNode, 4), priority); + } +#endif + +#ifdef MACOSX + // Get URL of the Resource directory of the .app bundle + CFURLRef fileUrl = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); + if (fileUrl) { + // Try to convert the URL to an absolute path + UInt8 buf[MAXPATHLEN]; + if (CFURLGetFileSystemRepresentation(fileUrl, true, buf, sizeof(buf))) { + // Success: Add it to the search path + Common::String bundlePath((const char *)buf); + s.add("__OSX_BUNDLE__", new Common::FSDirectory(bundlePath), priority); + } + CFRelease(fileUrl); + } + +#endif + +} + +static Common::String getDefaultConfigFileName() { + char configFile[MAXPATHLEN]; +#if defined (WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) + OSVERSIONINFO win32OsVersion; + ZeroMemory(&win32OsVersion, sizeof(OSVERSIONINFO)); + win32OsVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&win32OsVersion); + // Check for non-9X version of Windows. + if (win32OsVersion.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS) { + // Use the Application Data directory of the user profile. + if (win32OsVersion.dwMajorVersion >= 5) { + if (!GetEnvironmentVariable("APPDATA", configFile, sizeof(configFile))) + error("Unable to access application data directory"); + } else { + if (!GetEnvironmentVariable("USERPROFILE", configFile, sizeof(configFile))) + error("Unable to access user profile directory"); + + strcat(configFile, "\\Application Data"); + CreateDirectory(configFile, NULL); + } + + strcat(configFile, "\\ScummVM"); + CreateDirectory(configFile, NULL); + strcat(configFile, "\\" DEFAULT_CONFIG_FILE); + + FILE *tmp = NULL; + if ((tmp = fopen(configFile, "r")) == NULL) { + // Check windows directory + char oldConfigFile[MAXPATHLEN]; + GetWindowsDirectory(oldConfigFile, MAXPATHLEN); + strcat(oldConfigFile, "\\" DEFAULT_CONFIG_FILE); + if ((tmp = fopen(oldConfigFile, "r"))) { + strcpy(configFile, oldConfigFile); + + fclose(tmp); + } + } else { + fclose(tmp); + } + } else { + // Check windows directory + GetWindowsDirectory(configFile, MAXPATHLEN); + strcat(configFile, "\\" DEFAULT_CONFIG_FILE); + } +#elif defined(UNIX) + // On UNIX type systems, by default we store the config file inside + // to the HOME directory of the user. + // + // GP2X is Linux based but Home dir can be read only so do not use + // it and put the config in the executable dir. + // + // On the iPhone, the home dir of the user when you launch the app + // from the Springboard, is /. Which we don't want. + const char *home = getenv("HOME"); + if (home != NULL && strlen(home) < MAXPATHLEN) + snprintf(configFile, MAXPATHLEN, "%s/%s", home, DEFAULT_CONFIG_FILE); + else + strcpy(configFile, DEFAULT_CONFIG_FILE); +#else + strcpy(configFile, DEFAULT_CONFIG_FILE); +#endif + + return configFile; +} + +Common::SeekableReadStream *SdlSubSys_File::createConfigReadStream() { + Common::FSNode file(getDefaultConfigFileName()); + return file.createReadStream(); +} + +Common::WriteStream *SdlSubSys_File::createConfigWriteStream() { + Common::FSNode file(getDefaultConfigFileName()); + return file.createWriteStream(); +} diff --git a/backends/platform/sdl/file.h b/backends/platform/sdl/file.h new file mode 100644 index 0000000000..4f23a06594 --- /dev/null +++ b/backends/platform/sdl/file.h @@ -0,0 +1,67 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef BACKENDS_SDL_SUBSYS_FILE_H +#define BACKENDS_SDL_SUBSYS_FILE_H + +#include "backends/base-subsys-file.h" + +#if defined(__SYMBIAN32__) +#include +#else +#include +#endif + +class SdlSubSys_File : public BaseSubSys_File { +public: + SdlSubSys_File(); + ~SdlSubSys_File(); + + virtual void fileInit(OSystem *mainSys); + virtual void fileDone(); + + bool hasFeature(Feature f); + void setFeatureState(Feature f, bool enable); + bool getFeatureState(Feature f); + + virtual Common::SeekableReadStream *createConfigReadStream(); + virtual Common::WriteStream *createConfigWriteStream(); + + virtual Common::SaveFileManager *getSavefileManager(); + virtual FilesystemFactory *getFilesystemFactory(); + virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); + +protected: + bool _inited; + + FilesystemFactory *_fsFactory; + Common::SaveFileManager *_savefile; + +private: + OSystem *_mainSys; +}; + + +#endif diff --git a/backends/platform/sdl/mutex.cpp b/backends/platform/sdl/mutex.cpp new file mode 100644 index 0000000000..ce9eef6a96 --- /dev/null +++ b/backends/platform/sdl/mutex.cpp @@ -0,0 +1,83 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "backends/platform/sdl/mutex.h" + +SdlSubSys_Mutex::SdlSubSys_Mutex() + : + _inited(false) { + +} + +SdlSubSys_Mutex::~SdlSubSys_Mutex() { + if (_inited) { + mutexDone(); + } +} + +void SdlSubSys_Mutex::mutexInit(OSystem *mainSys) { + if (_inited) { + return; + } + _mainSys = mainSys; + + _graphicsMutex = createMutex(); + + _inited = true; +} + +void SdlSubSys_Mutex::mutexDone() { + deleteMutex(_graphicsMutex); + + _inited = false; +} + +bool SdlSubSys_Mutex::hasFeature(Feature f) { + return false; +} + +void SdlSubSys_Mutex::setFeatureState(Feature f, bool enable) { + +} + +bool SdlSubSys_Mutex::getFeatureState(Feature f) { + return false; +} + +OSystem::MutexRef SdlSubSys_Mutex::createMutex() { + return (MutexRef) SDL_CreateMutex(); +} + +void SdlSubSys_Mutex::lockMutex(MutexRef mutex) { + SDL_mutexP((SDL_mutex *) mutex); +} + +void SdlSubSys_Mutex::unlockMutex(MutexRef mutex) { + SDL_mutexV((SDL_mutex *) mutex); +} + +void SdlSubSys_Mutex::deleteMutex(MutexRef mutex) { + SDL_DestroyMutex((SDL_mutex *) mutex); +} diff --git a/backends/platform/sdl/mutex.h b/backends/platform/sdl/mutex.h new file mode 100644 index 0000000000..9479aa9ece --- /dev/null +++ b/backends/platform/sdl/mutex.h @@ -0,0 +1,69 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef BACKENDS_SDL_SUBSYS_MUTEX_H +#define BACKENDS_SDL_SUBSYS_MUTEX_H + +#include "backends/base-subsys-mutex.h" + +#if defined(__SYMBIAN32__) +#include +#else +#include +#endif + +class SdlSubSys_Mutex : public BaseSubSys_Mutex { +public: + SdlSubSys_Mutex(); + ~SdlSubSys_Mutex(); + + virtual void mutexInit(OSystem *mainSys); + virtual void mutexDone(); + + bool hasFeature(Feature f); + void setFeatureState(Feature f, bool enable); + bool getFeatureState(Feature f); + + // Mutex handling + MutexRef createMutex(); + void lockMutex(MutexRef mutex); + void unlockMutex(MutexRef mutex); + void deleteMutex(MutexRef mutex); + +protected: + bool _inited; + + /** + * Mutex which prevents multiple threads from interfering with each other + * when accessing the screen. + */ + MutexRef _graphicsMutex; + +private: + OSystem *_mainSys; +}; + + +#endif diff --git a/backends/platform/sdl/timer.cpp b/backends/platform/sdl/timer.cpp new file mode 100644 index 0000000000..a6dfc67918 --- /dev/null +++ b/backends/platform/sdl/timer.cpp @@ -0,0 +1,121 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "backends/platform/sdl/timer.h" +#include "backends/timer/default/default-timer.h" +#include "common/EventRecorder.h" +#include // for getTimeAndDate() + +static Uint32 timer_handler(Uint32 interval, void *param) { + ((DefaultTimerManager *)param)->handler(); + return interval; +} + +SdlSubSys_Timer::SdlSubSys_Timer() + : + _inited(false), + _timerID(), + _timer(0) { + +} + +SdlSubSys_Timer::~SdlSubSys_Timer() { + if (_inited) { + timerDone(); + } +} + +void SdlSubSys_Timer::timerInit(OSystem *mainSys) { + if (_inited) { + return; + } + _mainSys = mainSys; + + if (SDL_InitSubSystem(SDL_INIT_TIMER) == -1) { + error("Could not initialize SDL Timer: %s", SDL_GetError()); + } + + // Create and hook up the timer manager, if none exists yet (we check for + // this to allow subclasses to provide their own). + if (_timer == 0) { + // Note: We could implement a custom SDLTimerManager by using + // SDL_AddTimer. That might yield better timer resolution, but it would + // also change the semantics of a timer: Right now, ScummVM timers + // *never* run in parallel, due to the way they are implemented. If we + // switched to SDL_AddTimer, each timer might run in a separate thread. + // However, not all our code is prepared for that, so we can't just + // switch. Still, it's a potential future change to keep in mind. + _timer = new DefaultTimerManager(); + _timerID = SDL_AddTimer(10, &timer_handler, _timer); + } + + _inited = true; +} + +void SdlSubSys_Timer::timerDone() { + delete _timer; + SDL_RemoveTimer(_timerID); + SDL_QuitSubSystem(SDL_INIT_TIMER); + + _inited = false; +} + +bool SdlSubSys_Timer::hasFeature(Feature f) { + return false; +} + +void SdlSubSys_Timer::setFeatureState(Feature f, bool enable) { + +} + +bool SdlSubSys_Timer::getFeatureState(Feature f) { + return false; +} + +uint32 SdlSubSys_Timer::getMillis() { + uint32 millis = SDL_GetTicks(); + g_eventRec.processMillis(millis); + return millis; +} + +void SdlSubSys_Timer::delayMillis(uint msecs) { + SDL_Delay(msecs); +} + +void SdlSubSys_Timer::getTimeAndDate(TimeDate &td) const { + time_t curTime = time(0); + struct tm t = *localtime(&curTime); + td.tm_sec = t.tm_sec; + td.tm_min = t.tm_min; + td.tm_hour = t.tm_hour; + td.tm_mday = t.tm_mday; + td.tm_mon = t.tm_mon; + td.tm_year = t.tm_year; +} + +Common::TimerManager *SdlSubSys_Timer::getTimerManager() { + assert(_timer); + return _timer; +} diff --git a/backends/platform/sdl/timer.h b/backends/platform/sdl/timer.h new file mode 100644 index 0000000000..1d15b5ad98 --- /dev/null +++ b/backends/platform/sdl/timer.h @@ -0,0 +1,69 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifndef BACKENDS_SDL_SUBSYS_TIMER_H +#define BACKENDS_SDL_SUBSYS_TIMER_H + +#include "backends/base-subsys-timer.h" + +#if defined(__SYMBIAN32__) +#include +#else +#include +#endif + +class SdlSubSys_Timer : public BaseSubSys_Timer { +public: + SdlSubSys_Timer(); + ~SdlSubSys_Timer(); + + virtual void timerInit(OSystem *mainSys); + virtual void timerDone(); + + bool hasFeature(Feature f); + void setFeatureState(Feature f, bool enable); + bool getFeatureState(Feature f); + + // Get the number of milliseconds since the program was started. + uint32 getMillis(); + + // Delay for a specified amount of milliseconds + void delayMillis(uint msecs); + + virtual void getTimeAndDate(TimeDate &t) const; + virtual Common::TimerManager *getTimerManager(); + +protected: + bool _inited; + + SDL_TimerID _timerID; + Common::TimerManager *_timer; + +private: + OSystem *_mainSys; +}; + + +#endif -- cgit v1.2.3 From 0bc8f4c8b4050c54e551aabdf58b30be79b6720c Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Tue, 1 Jun 2010 04:00:55 +0000 Subject: SDL audio subsystem created. svn-id: r49369 --- backends/platform/sdl/audio.cpp | 350 ++++++++++++++++++++++++++++++++++++++++ backends/platform/sdl/audio.h | 116 +++++++++++++ 2 files changed, 466 insertions(+) create mode 100644 backends/platform/sdl/audio.cpp create mode 100644 backends/platform/sdl/audio.h (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/audio.cpp b/backends/platform/sdl/audio.cpp new file mode 100644 index 0000000000..7cbdd010d6 --- /dev/null +++ b/backends/platform/sdl/audio.cpp @@ -0,0 +1,350 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "backends/platform/sdl/audio.h" +#include "sound/mixer_intern.h" +#include "common/config-manager.h" + +//#define SAMPLES_PER_SEC 11025 +#define SAMPLES_PER_SEC 22050 +//#define SAMPLES_PER_SEC 44100 + +SdlSubSys_Audio::SdlSubSys_Audio() + : + _inited(false), + _cdrom(0), +#if MIXER_DOUBLE_BUFFERING + _soundMutex(0), _soundCond(0), _soundThread(0), + _soundThreadIsRunning(false), _soundThreadShouldQuit(false), +#endif + _mixer(0) { + +} + +SdlSubSys_Audio::~SdlSubSys_Audio() { + if (_inited) { + audioDone(); + } +} + +void SdlSubSys_Audio::audioInit() { + if (_inited) { + return; + } + + // Create and hook up the mixer, if none exists yet (we check for this to + // allow subclasses to provide their own). + if (_mixer == 0) { + setupMixer(); + } + + _inited = true; +} + +void SdlSubSys_Audio::audioDone() { + if (_cdrom) { + SDL_CDStop(_cdrom); + SDL_CDClose(_cdrom); + } + + closeMixer(); + + _inited = false; +} + +bool SdlSubSys_Audio::hasFeature(Feature f) { + return false; +} + +void SdlSubSys_Audio::setFeatureState(Feature f, bool enable) { + +} + +bool SdlSubSys_Audio::getFeatureState(Feature f) { + return false; +} + +#if MIXER_DOUBLE_BUFFERING + +void SdlSubSys_Audio::mixerProducerThread() { + byte nextSoundBuffer; + + SDL_LockMutex(_soundMutex); + while (true) { + // Wait till we are allowed to produce data + SDL_CondWait(_soundCond, _soundMutex); + + if (_soundThreadShouldQuit) + break; + + // Generate samples and put them into the next buffer + nextSoundBuffer = _activeSoundBuf ^ 1; + _mixer->mixCallback(_soundBuffers[nextSoundBuffer], _soundBufSize); + + // Swap buffers + _activeSoundBuf = nextSoundBuffer; + } + SDL_UnlockMutex(_soundMutex); +} + +int SDLCALL SdlSubSys_Audio::mixerProducerThreadEntry(void *arg) { + OSystem_SDL *this_ = (OSystem_SDL *)arg; + assert(this_); + this_->mixerProducerThread(); + return 0; +} + + +void SdlSubSys_Audio::initThreadedMixer(Audio::MixerImpl *mixer, uint bufSize) { + _soundThreadIsRunning = false; + _soundThreadShouldQuit = false; + + // Create mutex and condition variable + _soundMutex = SDL_CreateMutex(); + _soundCond = SDL_CreateCond(); + + // Create two sound buffers + _activeSoundBuf = 0; + _soundBufSize = bufSize; + _soundBuffers[0] = (byte *)calloc(1, bufSize); + _soundBuffers[1] = (byte *)calloc(1, bufSize); + + _soundThreadIsRunning = true; + + // Finally start the thread + _soundThread = SDL_CreateThread(mixerProducerThreadEntry, this); +} + +void SdlSubSys_Audio::deinitThreadedMixer() { + // Kill thread?? _soundThread + + if (_soundThreadIsRunning) { + // Signal the producer thread to end, and wait for it to actually finish. + _soundThreadShouldQuit = true; + SDL_CondBroadcast(_soundCond); + SDL_WaitThread(_soundThread, NULL); + + // Kill the mutex & cond variables. + // Attention: AT this point, the mixer callback must not be running + // anymore, else we will crash! + SDL_DestroyMutex(_soundMutex); + SDL_DestroyCond(_soundCond); + + _soundThreadIsRunning = false; + + free(_soundBuffers[0]); + free(_soundBuffers[1]); + } +} + + +void SdlSubSys_Audio::mixCallback(void *arg, byte *samples, int len) { + OSystem_SDL *this_ = (OSystem_SDL *)arg; + assert(this_); + assert(this_->_mixer); + + assert((int)this_->_soundBufSize == len); + + // Lock mutex, to ensure our data is not overwritten by the producer thread + SDL_LockMutex(this_->_soundMutex); + + // Copy data from the current sound buffer + memcpy(samples, this_->_soundBuffers[this_->_activeSoundBuf], len); + + // Unlock mutex and wake up the produced thread + SDL_UnlockMutex(this_->_soundMutex); + SDL_CondSignal(this_->_soundCond); +} + +#else + +void SdlSubSys_Audio::mixCallback(void *sys, byte *samples, int len) { + SdlSubSys_Audio *this_ = (SdlSubSys_Audio *)sys; + assert(this_); + assert(this_->_mixer); + + this_->_mixer->mixCallback(samples, len); +} + +#endif + +void SdlSubSys_Audio::setupMixer() { + SDL_AudioSpec desired; + + // Determine the desired output sampling frequency. + uint32 samplesPerSec = 0; + if (ConfMan.hasKey("output_rate")) + samplesPerSec = ConfMan.getInt("output_rate"); + if (samplesPerSec <= 0) + samplesPerSec = SAMPLES_PER_SEC; + + // Determine the sample buffer size. We want it to store enough data for + // at least 1/16th of a second (though at most 8192 samples). Note + // that it must be a power of two. So e.g. at 22050 Hz, we request a + // sample buffer size of 2048. + uint32 samples = 8192; + while (samples * 16 > samplesPerSec * 2) + samples >>= 1; + + memset(&desired, 0, sizeof(desired)); + desired.freq = samplesPerSec; + desired.format = AUDIO_S16SYS; + desired.channels = 2; + desired.samples = (uint16)samples; + desired.callback = mixCallback; + desired.userdata = this; + + assert(!_mixer); + if (SDL_OpenAudio(&desired, &_obtainedRate) != 0) { + warning("Could not open audio device: %s", SDL_GetError()); + _mixer = new Audio::MixerImpl(this, samplesPerSec); + assert(_mixer); + _mixer->setReady(false); + } else { + // Note: This should be the obtained output rate, but it seems that at + // least on some platforms SDL will lie and claim it did get the rate + // even if it didn't. Probably only happens for "weird" rates, though. + samplesPerSec = _obtainedRate.freq; + debug(1, "Output sample rate: %d Hz", samplesPerSec); + + // Create the mixer instance and start the sound processing + _mixer = new Audio::MixerImpl(this, samplesPerSec); + assert(_mixer); + _mixer->setReady(true); + +#if MIXER_DOUBLE_BUFFERING + initThreadedMixer(_mixer, _obtainedRate.samples * 4); +#endif + + // start the sound system + SDL_PauseAudio(0); + } +} + +void SdlSubSys_Audio::closeMixer() { + if (_mixer) + _mixer->setReady(false); + + SDL_CloseAudio(); + + delete _mixer; + _mixer = 0; + +#if MIXER_DOUBLE_BUFFERING + deinitThreadedMixer(); +#endif + +} + +Audio::Mixer *SdlSubSys_Audio::getMixer() { + assert(_mixer); + return _mixer; +} + +bool SdlSubSys_Audio::openCD(int drive) { + if (SDL_InitSubSystem(SDL_INIT_CDROM) == -1) + _cdrom = NULL; + else { + _cdrom = SDL_CDOpen(drive); + // Did it open? Check if _cdrom is NULL + if (!_cdrom) { + warning("Couldn't open drive: %s", SDL_GetError()); + } else { + _cdNumLoops = 0; + _cdStopTime = 0; + _cdEndTime = 0; + } + } + + return (_cdrom != NULL); +} + +void SdlSubSys_Audio::stopCD() { /* Stop CD Audio in 1/10th of a second */ + _cdStopTime = SDL_GetTicks() + 100; + _cdNumLoops = 0; +} + +void SdlSubSys_Audio::playCD(int track, int num_loops, int start_frame, int duration) { + if (!num_loops && !start_frame) + return; + + if (!_cdrom) + return; + + if (duration > 0) + duration += 5; + + _cdTrack = track; + _cdNumLoops = num_loops; + _cdStartFrame = start_frame; + + SDL_CDStatus(_cdrom); + if (start_frame == 0 && duration == 0) + SDL_CDPlayTracks(_cdrom, track, 0, 1, 0); + else + SDL_CDPlayTracks(_cdrom, track, start_frame, 0, duration); + _cdDuration = duration; + _cdStopTime = 0; + _cdEndTime = SDL_GetTicks() + _cdrom->track[track].length * 1000 / CD_FPS; +} + +bool SdlSubSys_Audio::pollCD() { + if (!_cdrom) + return false; + + return (_cdNumLoops != 0 && (SDL_GetTicks() < _cdEndTime || SDL_CDStatus(_cdrom) == CD_PLAYING)); +} + +void SdlSubSys_Audio::updateCD() { + if (!_cdrom) + return; + + if (_cdStopTime != 0 && SDL_GetTicks() >= _cdStopTime) { + SDL_CDStop(_cdrom); + _cdNumLoops = 0; + _cdStopTime = 0; + return; + } + + if (_cdNumLoops == 0 || SDL_GetTicks() < _cdEndTime) + return; + + if (_cdNumLoops != 1 && SDL_CDStatus(_cdrom) != CD_STOPPED) { + // Wait another second for it to be done + _cdEndTime += 1000; + return; + } + + if (_cdNumLoops > 0) + _cdNumLoops--; + + if (_cdNumLoops != 0) { + if (_cdStartFrame == 0 && _cdDuration == 0) + SDL_CDPlayTracks(_cdrom, _cdTrack, 0, 1, 0); + else + SDL_CDPlayTracks(_cdrom, _cdTrack, _cdStartFrame, 0, _cdDuration); + _cdEndTime = SDL_GetTicks() + _cdrom->track[_cdTrack].length * 1000 / CD_FPS; + } +} diff --git a/backends/platform/sdl/audio.h b/backends/platform/sdl/audio.h new file mode 100644 index 0000000000..4ef560999e --- /dev/null +++ b/backends/platform/sdl/audio.h @@ -0,0 +1,116 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef BACKENDS_SDL_SUBSYS_AUDIO_H +#define BACKENDS_SDL_SUBSYS_AUDIO_H + +#include "backends/base-subsys-audio.h" + +#if defined(__SYMBIAN32__) +#include +#else +#include +#endif + +#if defined(MACOSX) +// On Mac OS X, we need to double buffer the audio buffer, else anything +// which produces sampled data with high latency (like the MT-32 emulator) +// will sound terribly. +// This could be enabled for more / most ports in the future, but needs some +// testing. +#define MIXER_DOUBLE_BUFFERING 1 +#endif + +namespace Audio { + class MixerImpl; +} + +class SdlSubSys_Audio : public BaseSubSys_Audio { +public: + SdlSubSys_Audio(); + ~SdlSubSys_Audio(); + + virtual void audioInit(); + virtual void audioDone(); + + bool hasFeature(Feature f); + void setFeatureState(Feature f, bool enable); + bool getFeatureState(Feature f); + + // Set function that generates samples + virtual void setupMixer(); + static void mixCallback(void *s, byte *samples, int len); + + virtual void closeMixer(); + + virtual Audio::Mixer *getMixer(); + + virtual bool openCD(int drive); + + // Poll CD status + // Returns true if cd audio is playing + bool pollCD(); + + // Play CD audio track + void playCD(int track, int num_loops, int start_frame, int duration); + + // Stop CD audio track + void stopCD(); + + // Update CD audio status + void updateCD(); + +protected: + bool _inited; + + SDL_AudioSpec _obtainedRate; + + // CD Audio + SDL_CD *_cdrom; + int _cdTrack, _cdNumLoops, _cdStartFrame, _cdDuration; + uint32 _cdEndTime, _cdStopTime; + +#ifdef MIXER_DOUBLE_BUFFERING + SDL_mutex *_soundMutex; + SDL_cond *_soundCond; + SDL_Thread *_soundThread; + bool _soundThreadIsRunning; + bool _soundThreadShouldQuit; + + byte _activeSoundBuf; + uint _soundBufSize; + byte *_soundBuffers[2]; + + void mixerProducerThread(); + static int SDLCALL mixerProducerThreadEntry(void *arg); + void initThreadedMixer(Audio::MixerImpl *mixer, uint bufSize); + void deinitThreadedMixer(); +#endif + + Audio::MixerImpl *_mixer; +}; + + +#endif -- cgit v1.2.3 From 38dbbca964ac182439c2e61840783a4b7465688a Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Tue, 1 Jun 2010 04:02:44 +0000 Subject: Removed OSystem pointer. Added left initialization code to file subsystem. svn-id: r49370 --- backends/platform/sdl/file.cpp | 34 ++++++++++++++++++++-------------- backends/platform/sdl/file.h | 5 +---- backends/platform/sdl/mutex.cpp | 6 +++--- backends/platform/sdl/mutex.h | 5 +---- backends/platform/sdl/timer.cpp | 3 +-- backends/platform/sdl/timer.h | 5 +---- 6 files changed, 27 insertions(+), 31 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/file.cpp b/backends/platform/sdl/file.cpp index a8dd230059..4c742395df 100644 --- a/backends/platform/sdl/file.cpp +++ b/backends/platform/sdl/file.cpp @@ -68,16 +68,29 @@ SdlSubSys_File::SdlSubSys_File() _fsFactory(0), _savefile(0) { + #if defined(__amigaos4__) + _fsFactory = new AmigaOSFilesystemFactory(); + #elif defined(UNIX) + _fsFactory = new POSIXFilesystemFactory(); + #elif defined(WIN32) + _fsFactory = new WindowsFilesystemFactory(); + #elif defined(__SYMBIAN32__) + // Do nothing since its handled by the Symbian SDL inheritance + #else + #error Unknown and unsupported FS backend + #endif } SdlSubSys_File::~SdlSubSys_File() { + if (_inited) { + fileDone(); + } } -void SdlSubSys_File::fileInit(OSystem *mainSys) { +void SdlSubSys_File::fileInit() { if (_inited) { return; } - _mainSys = mainSys; // Create the savefile manager, if none exists yet (we check for this to // allow subclasses to provide their own). @@ -89,23 +102,16 @@ void SdlSubSys_File::fileInit(OSystem *mainSys) { #endif } -#if defined(__amigaos4__) - _fsFactory = new AmigaOSFilesystemFactory(); -#elif defined(UNIX) - _fsFactory = new POSIXFilesystemFactory(); -#elif defined(WIN32) - _fsFactory = new WindowsFilesystemFactory(); -#elif defined(__SYMBIAN32__) - // Do nothing since its handled by the Symbian SDL inheritance -#else - #error Unknown and unsupported FS backend -#endif - _inited = true; } void SdlSubSys_File::fileDone() { + // Event Manager requires save manager for storing + // recorded events + delete getEventManager(); delete _savefile; + + _inited = false; } bool SdlSubSys_File::hasFeature(Feature f) { diff --git a/backends/platform/sdl/file.h b/backends/platform/sdl/file.h index 4f23a06594..0e0bec7ce8 100644 --- a/backends/platform/sdl/file.h +++ b/backends/platform/sdl/file.h @@ -39,7 +39,7 @@ public: SdlSubSys_File(); ~SdlSubSys_File(); - virtual void fileInit(OSystem *mainSys); + virtual void fileInit(); virtual void fileDone(); bool hasFeature(Feature f); @@ -58,9 +58,6 @@ protected: FilesystemFactory *_fsFactory; Common::SaveFileManager *_savefile; - -private: - OSystem *_mainSys; }; diff --git a/backends/platform/sdl/mutex.cpp b/backends/platform/sdl/mutex.cpp index ce9eef6a96..28a495cbd9 100644 --- a/backends/platform/sdl/mutex.cpp +++ b/backends/platform/sdl/mutex.cpp @@ -27,7 +27,8 @@ SdlSubSys_Mutex::SdlSubSys_Mutex() : - _inited(false) { + _inited(false), + _graphicsMutex(0) { } @@ -37,11 +38,10 @@ SdlSubSys_Mutex::~SdlSubSys_Mutex() { } } -void SdlSubSys_Mutex::mutexInit(OSystem *mainSys) { +void SdlSubSys_Mutex::mutexInit() { if (_inited) { return; } - _mainSys = mainSys; _graphicsMutex = createMutex(); diff --git a/backends/platform/sdl/mutex.h b/backends/platform/sdl/mutex.h index 9479aa9ece..0f53a6067a 100644 --- a/backends/platform/sdl/mutex.h +++ b/backends/platform/sdl/mutex.h @@ -39,7 +39,7 @@ public: SdlSubSys_Mutex(); ~SdlSubSys_Mutex(); - virtual void mutexInit(OSystem *mainSys); + virtual void mutexInit(); virtual void mutexDone(); bool hasFeature(Feature f); @@ -60,9 +60,6 @@ protected: * when accessing the screen. */ MutexRef _graphicsMutex; - -private: - OSystem *_mainSys; }; diff --git a/backends/platform/sdl/timer.cpp b/backends/platform/sdl/timer.cpp index a6dfc67918..865c64826d 100644 --- a/backends/platform/sdl/timer.cpp +++ b/backends/platform/sdl/timer.cpp @@ -47,11 +47,10 @@ SdlSubSys_Timer::~SdlSubSys_Timer() { } } -void SdlSubSys_Timer::timerInit(OSystem *mainSys) { +void SdlSubSys_Timer::timerInit() { if (_inited) { return; } - _mainSys = mainSys; if (SDL_InitSubSystem(SDL_INIT_TIMER) == -1) { error("Could not initialize SDL Timer: %s", SDL_GetError()); diff --git a/backends/platform/sdl/timer.h b/backends/platform/sdl/timer.h index 1d15b5ad98..f624c5cf6e 100644 --- a/backends/platform/sdl/timer.h +++ b/backends/platform/sdl/timer.h @@ -39,7 +39,7 @@ public: SdlSubSys_Timer(); ~SdlSubSys_Timer(); - virtual void timerInit(OSystem *mainSys); + virtual void timerInit(); virtual void timerDone(); bool hasFeature(Feature f); @@ -60,9 +60,6 @@ protected: SDL_TimerID _timerID; Common::TimerManager *_timer; - -private: - OSystem *_mainSys; }; -- cgit v1.2.3 From 56b9e6c9b70a5a1b00ddadfb9cc4e298c1153a0b Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Mon, 7 Jun 2010 03:19:18 +0000 Subject: Removed code that is now in managers. Added mutex and graphics manager initialization and functions redirections. svn-id: r49473 --- backends/platform/sdl/sdl.cpp | 348 +++++++++++++++++++++++------------------- backends/platform/sdl/sdl.h | 241 +++-------------------------- 2 files changed, 205 insertions(+), 384 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 9fa43cb389..6f82ede114 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -87,50 +87,15 @@ static Uint32 timer_handler(Uint32 interval, void *param) { return interval; } -AspectRatio::AspectRatio(int w, int h) { - // TODO : Validation and so on... - // Currently, we just ensure the program don't instantiate non-supported aspect ratios - _kw = w; - _kh = h; -} - -#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) && defined(USE_SCALERS) -static const size_t AR_COUNT = 4; -static const char* desiredAspectRatioAsStrings[AR_COUNT] = { "auto", "4/3", "16/9", "16/10" }; -static const AspectRatio desiredAspectRatios[AR_COUNT] = { AspectRatio(0, 0), AspectRatio(4,3), AspectRatio(16,9), AspectRatio(16,10) }; - -static AspectRatio getDesiredAspectRatio() { - //TODO : We could parse an arbitrary string, if we code enough proper validation - Common::String desiredAspectRatio = ConfMan.get("desired_screen_aspect_ratio"); - - for (size_t i = 0; i < AR_COUNT; i++) { - assert(desiredAspectRatioAsStrings[i] != NULL); - - if (!scumm_stricmp(desiredAspectRatio.c_str(), desiredAspectRatioAsStrings[i])) { - return desiredAspectRatios[i]; - } - } - // TODO : Report a warning - return AspectRatio(0, 0); -} -#endif - void OSystem_SDL::initBackend() { assert(!_inited); int joystick_num = ConfMan.getInt("joystick_num"); - uint32 sdlFlags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER; + uint32 sdlFlags = 0; if (ConfMan.hasKey("disable_sdl_parachute")) sdlFlags |= SDL_INIT_NOPARACHUTE; -#ifdef _WIN32_WCE - if (ConfMan.hasKey("use_GDI") && ConfMan.getBool("use_GDI")) { - SDL_VideoInit("windib", 0); - sdlFlags ^= SDL_INIT_VIDEO; - } -#endif - if (joystick_num > -1) sdlFlags |= SDL_INIT_JOYSTICK; @@ -138,53 +103,15 @@ void OSystem_SDL::initBackend() { error("Could not initialize SDL: %s", SDL_GetError()); } - _graphicsMutex = createMutex(); - - SDL_ShowCursor(SDL_DISABLE); - // Enable unicode support if possible SDL_EnableUNICODE(1); - memset(&_oldVideoMode, 0, sizeof(_oldVideoMode)); - memset(&_videoMode, 0, sizeof(_videoMode)); - memset(&_transactionDetails, 0, sizeof(_transactionDetails)); - - _cksumValid = false; -#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) && defined(USE_SCALERS) - _videoMode.mode = GFX_DOUBLESIZE; - _videoMode.scaleFactor = 2; - _videoMode.aspectRatioCorrection = ConfMan.getBool("aspect_ratio"); - _videoMode.desiredAspectRatio = getDesiredAspectRatio(); - _scalerProc = Normal2x; -#else // for small screen platforms - _videoMode.mode = GFX_NORMAL; - _videoMode.scaleFactor = 1; - _videoMode.aspectRatioCorrection = false; - _scalerProc = Normal1x; -#endif - _scalerType = 0; - _modeFlags = 0; - -#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) - _videoMode.fullscreen = ConfMan.getBool("fullscreen"); -#else - _videoMode.fullscreen = true; -#endif - -#if !defined(MACOSX) && !defined(__SYMBIAN32__) - // Setup a custom program icon. - // Don't set icon on OS X, as we use a nicer external icon there. - // Don't for Symbian: it uses the EScummVM.aif file for the icon. - setupIcon(); -#endif - // enable joystick if (joystick_num > -1 && SDL_NumJoysticks() > 0) { printf("Using joystick: %s\n", SDL_JoystickName(0)); _joystick = SDL_JoystickOpen(joystick_num); } - // Create the savefile manager, if none exists yet (we check for this to // allow subclasses to provide their own). if (_savefile == 0) { @@ -198,23 +125,45 @@ void OSystem_SDL::initBackend() { // Create and hook up the mixer, if none exists yet (we check for this to // allow subclasses to provide their own). if (_mixer == 0) { + // TODO: Implement SdlAudioManager + if (SDL_InitSubSystem(SDL_INIT_AUDIO) == -1) { + error("Could not initialize SDL: %s", SDL_GetError()); + } + setupMixer(); } // Create and hook up the timer manager, if none exists yet (we check for // this to allow subclasses to provide their own). if (_timer == 0) { - // Note: We could implement a custom SDLTimerManager by using - // SDL_AddTimer. That might yield better timer resolution, but it would - // also change the semantics of a timer: Right now, ScummVM timers - // *never* run in parallel, due to the way they are implemented. If we - // switched to SDL_AddTimer, each timer might run in a separate thread. - // However, not all our code is prepared for that, so we can't just - // switch. Still, it's a potential future change to keep in mind. + // TODO: Implement SdlTimerManager + if (SDL_InitSubSystem(SDL_INIT_TIMER) == -1) { + error("Could not initialize SDL: %s", SDL_GetError()); + } + _timer = new DefaultTimerManager(); _timerID = SDL_AddTimer(10, &timer_handler, _timer); } + // Create and hook up the mutex manager, if none exists yet (we check for + // this to allow subclasses to provide their own). + if (_mutexManager == 0) { + _mutexManager = new SdlMutexManager(); + } + + // Create and hook up the graphics manager, if none exists yet (we check for + // this to allow subclasses to provide their own). + if (_graphicsManager == 0) { + _graphicsManager = new SdlGraphicsManager(); + } + +#if !defined(MACOSX) && !defined(__SYMBIAN32__) + // Setup a custom program icon. + // Don't set icon on OS X, as we use a nicer external icon there. + // Don't for Symbian: it uses the EScummVM.aif file for the icon. + setupIcon(); +#endif + // Invoke parent implementation of this method OSystem::initBackend(); @@ -223,23 +172,9 @@ void OSystem_SDL::initBackend() { OSystem_SDL::OSystem_SDL() : -#ifdef USE_OSD - _osdSurface(0), _osdAlpha(SDL_ALPHA_TRANSPARENT), _osdFadeStartTime(0), -#endif - _hwscreen(0), _screen(0), _tmpscreen(0), -#ifdef USE_RGB_COLOR - _screenFormat(Graphics::PixelFormat::createFormatCLUT8()), - _cursorFormat(Graphics::PixelFormat::createFormatCLUT8()), -#endif - _overlayVisible(false), - _overlayscreen(0), _tmpscreen2(0), - _cdrom(0), _scalerProc(0), _modeChanged(false), _screenChangeCount(0), _dirtyChecksums(0), + _cdrom(0), _scrollLock(false), - _mouseVisible(false), _mouseNeedsRedraw(false), _mouseData(0), _mouseSurface(0), - _mouseOrigSurface(0), _cursorTargetScale(1), _cursorPaletteDisabled(true), _joystick(0), - _currentShakePos(0), _newShakePos(0), - _paletteDirtyStart(0), _paletteDirtyEnd(0), #if MIXER_DOUBLE_BUFFERING _soundMutex(0), _soundCond(0), _soundThread(0), _soundThreadIsRunning(false), _soundThreadShouldQuit(false), @@ -248,22 +183,14 @@ OSystem_SDL::OSystem_SDL() _savefile(0), _mixer(0), _timer(0), - _screenIsLocked(false), - _graphicsMutex(0), _transactionMode(kTransactionNone) { - - // allocate palette storage - _currentPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256); - _cursorPalette = (SDL_Color *)calloc(sizeof(SDL_Color), 256); - - _mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0; + _mutexManager(0), + _graphicsManager(0) { // reset mouse state memset(&_km, 0, sizeof(_km)); - memset(&_mouseCurState, 0, sizeof(_mouseCurState)); _inited = false; - #if defined(__amigaos4__) _fsFactory = new AmigaOSFilesystemFactory(); #elif defined(UNIX) @@ -281,11 +208,6 @@ OSystem_SDL::~OSystem_SDL() { SDL_RemoveTimer(_timerID); closeMixer(); - free(_dirtyChecksums); - free(_currentPalette); - free(_cursorPalette); - free(_mouseData); - delete _savefile; delete _timer; } @@ -450,50 +372,15 @@ void OSystem_SDL::setWindowCaption(const char *caption) { } bool OSystem_SDL::hasFeature(Feature f) { - return - (f == kFeatureFullscreenMode) || - (f == kFeatureAspectRatioCorrection) || - (f == kFeatureAutoComputeDirtyRects) || - (f == kFeatureCursorHasPalette) || - (f == kFeatureIconifyWindow); + return _graphicsManager->hasFeature(f); } void OSystem_SDL::setFeatureState(Feature f, bool enable) { - switch (f) { - case kFeatureFullscreenMode: - setFullscreenMode(enable); - break; - case kFeatureAspectRatioCorrection: - setAspectRatioCorrection(enable); - break; - case kFeatureAutoComputeDirtyRects: - if (enable) - _modeFlags |= DF_WANT_RECT_OPTIM; - else - _modeFlags &= ~DF_WANT_RECT_OPTIM; - break; - case kFeatureIconifyWindow: - if (enable) - SDL_WM_IconifyWindow(); - break; - default: - break; - } + _graphicsManager->setFeatureState(f, enable); } bool OSystem_SDL::getFeatureState(Feature f) { - assert (_transactionMode == kTransactionNone); - - switch (f) { - case kFeatureFullscreenMode: - return _videoMode.fullscreen; - case kFeatureAspectRatioCorrection: - return _videoMode.aspectRatioCorrection; - case kFeatureAutoComputeDirtyRects: - return _modeFlags & DF_WANT_RECT_OPTIM; - default: - return false; - } + return _graphicsManager->getFeatureState(f); } void OSystem_SDL::deinit() { @@ -501,8 +388,6 @@ void OSystem_SDL::deinit() { SDL_CDStop(_cdrom); SDL_CDClose(_cdrom); } - unloadGFXMode(); - deleteMutex(_graphicsMutex); if (_joystick) SDL_JoystickClose(_joystick); @@ -512,11 +397,6 @@ void OSystem_SDL::deinit() { SDL_RemoveTimer(_timerID); closeMixer(); - free(_dirtyChecksums); - free(_currentPalette); - free(_cursorPalette); - free(_mouseData); - delete _timer; SDL_Quit(); @@ -587,20 +467,24 @@ void OSystem_SDL::setupIcon() { free(icon); } +#pragma mark - +#pragma mark --- Mutex --- +#pragma mark - + OSystem::MutexRef OSystem_SDL::createMutex() { - return (MutexRef) SDL_CreateMutex(); + return _mutexManager->createMutex(); } void OSystem_SDL::lockMutex(MutexRef mutex) { - SDL_mutexP((SDL_mutex *) mutex); + _mutexManager->lockMutex(mutex); } void OSystem_SDL::unlockMutex(MutexRef mutex) { - SDL_mutexV((SDL_mutex *) mutex); + _mutexManager->unlockMutex(mutex); } void OSystem_SDL::deleteMutex(MutexRef mutex) { - SDL_DestroyMutex((SDL_mutex *) mutex); + _mutexManager->deleteMutex(mutex); } #pragma mark - @@ -873,3 +757,147 @@ void OSystem_SDL::updateCD() { _cdEndTime = SDL_GetTicks() + _cdrom->track[_cdTrack].length * 1000 / CD_FPS; } } + +#pragma mark - +#pragma mark --- Graphics --- +#pragma mark - + +const OSystem::GraphicsMode *OSystem_SDL::getSupportedGraphicsModes() const { + return _graphicsManager->getSupportedGraphicsModes(); +} + +int OSystem_SDL::getDefaultGraphicsMode() const { + return _graphicsManager->getDefaultGraphicsMode(); +} + +bool OSystem_SDL::setGraphicsMode(int mode) { + return _graphicsManager->setGraphicsMode(mode); +} + +int OSystem_SDL::getGraphicsMode() const { + return _graphicsManager->getGraphicsMode(); +} + +#ifdef USE_RGB_COLOR +Graphics::PixelFormat OSystem_SDL::getScreenFormat() const { + return _graphicsManager->getScreenFormat(); +} + +Common::List OSystem_SDL::getSupportedFormats() { + return _graphicsManager->getSupportedFormats(); +} +#endif + +void OSystem_SDL::beginGFXTransaction() { + _graphicsManager->beginGFXTransaction(); +} + +OSystem::TransactionError OSystem_SDL::endGFXTransaction() { + return _graphicsManager->endGFXTransaction(); +} + +void OSystem_SDL::initSize(uint w, uint h, const Graphics::PixelFormat *format ) { + _graphicsManager->initSize(w, h, format); +} + +int16 OSystem_SDL::getHeight() { + return _graphicsManager->getHeight(); +} + +int16 OSystem_SDL::getWidth() { + return _graphicsManager->getWidth(); +} + +void OSystem_SDL::setPalette(const byte *colors, uint start, uint num) { + _graphicsManager->setPalette(colors, start, num); +} + +void OSystem_SDL::grabPalette(byte *colors, uint start, uint num) { + _graphicsManager->grabPalette(colors, start, num); +} + +void OSystem_SDL::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) { + _graphicsManager->copyRectToScreen(buf, pitch, x, y, w, h); +} + +Graphics::Surface *OSystem_SDL::lockScreen() { + return _graphicsManager->lockScreen(); +} + +void OSystem_SDL::unlockScreen() { + _graphicsManager->unlockScreen(); +} + +/*void OSystem_SDL::fillScreen(uint32 col) { + _graphicsManager->fillScreen(col); +}*/ + +void OSystem_SDL::updateScreen() { + _graphicsManager->updateScreen(); +} + +void OSystem_SDL::setShakePos(int shakeOffset) { + _graphicsManager->setShakePos(shakeOffset); +} + +void OSystem_SDL::showOverlay() { + _graphicsManager->showOverlay(); +} + +void OSystem_SDL::hideOverlay() { + _graphicsManager->hideOverlay(); +} + +Graphics::PixelFormat OSystem_SDL::getOverlayFormat() const { + return _graphicsManager->getOverlayFormat(); +} + +void OSystem_SDL::clearOverlay() { + _graphicsManager->clearOverlay(); +} + +void OSystem_SDL::grabOverlay(OverlayColor *buf, int pitch) { + _graphicsManager->grabOverlay(buf, pitch); +} + +void OSystem_SDL::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { + _graphicsManager->copyRectToOverlay(buf, pitch, x, y, w, h); +} + +int16 OSystem_SDL::getOverlayHeight() { + return _graphicsManager->getOverlayHeight(); +} + +int16 OSystem_SDL::getOverlayWidth() { + return _graphicsManager->getOverlayWidth(); +} + +bool OSystem_SDL::showMouse(bool visible) { + return _graphicsManager->showMouse(visible); +} + +void OSystem_SDL::warpMouse(int x, int y) { + _graphicsManager->warpMouse(x, y); +} + +void OSystem_SDL::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format) { + _graphicsManager->setMouseCursor(buf, w, h, hotspotX, hotspotY, keycolor, cursorTargetScale, format); +} + +void OSystem_SDL::setCursorPalette(const byte *colors, uint start, uint num) { + _graphicsManager->setCursorPalette(colors, start, num); +} + +void OSystem_SDL::disableCursorPalette(bool disable) { + _graphicsManager->disableCursorPalette(disable); +} + +int OSystem_SDL::getScreenChangeID() const { + return _graphicsManager->getScreenChangeID(); +} + +#ifdef USE_OSD +void OSystem_SDL::displayMessageOnOSD(const char *msg) { + _graphicsManager->displayMessageOnOSD(msg); +} +#endif diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index c850ec5ab1..214a8a988c 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -33,6 +33,10 @@ #endif #include "backends/base-backend.h" + +#include "backends/mutex/sdl/sdl-mutex.h" +#include "backends/graphics/sdl/sdl-graphics.h" + #include "graphics/scaler.h" @@ -54,35 +58,6 @@ namespace Audio { #define MIXER_DOUBLE_BUFFERING 1 #endif - -enum { - GFX_NORMAL = 0, - GFX_DOUBLESIZE = 1, - GFX_TRIPLESIZE = 2, - GFX_2XSAI = 3, - GFX_SUPER2XSAI = 4, - GFX_SUPEREAGLE = 5, - GFX_ADVMAME2X = 6, - GFX_ADVMAME3X = 7, - GFX_HQ2X = 8, - GFX_HQ3X = 9, - GFX_TV2X = 10, - GFX_DOTMATRIX = 11 -}; - -class AspectRatio { - int _kw, _kh; -public: - AspectRatio() { _kw = _kh = 0; } - AspectRatio(int w, int h); - - bool isAuto() const { return (_kw | _kh) == 0; } - - int kw() const { return _kw; } - int kh() const { return _kh; } -}; - - class OSystem_SDL : public BaseBackend { public: OSystem_SDL(); @@ -90,12 +65,18 @@ public: virtual void initBackend(); + +protected: + SdlMutexManager *_mutexManager; + SdlGraphicsManager *_graphicsManager; + +public: void beginGFXTransaction(); TransactionError endGFXTransaction(); #ifdef USE_RGB_COLOR // Game screen - virtual Graphics::PixelFormat getScreenFormat() const { return _screenFormat; } + virtual Graphics::PixelFormat getScreenFormat() const; // Highest supported virtual Common::List getSupportedFormats(); @@ -105,7 +86,7 @@ public: // Typically, 320x200 CLUT8 virtual void initSize(uint w, uint h, const Graphics::PixelFormat *format); // overloaded by CE backend - virtual int getScreenChangeID() const { return _screenChangeCount; } + virtual int getScreenChangeID() const; // Set colors of the palette void setPalette(const byte *colors, uint start, uint num); @@ -138,10 +119,7 @@ public: void setCursorPalette(const byte *colors, uint start, uint num); // Disables or enables cursor palette - void disableCursorPalette(bool disable) { - _cursorPaletteDisabled = disable; - blitCursor(); - } + void disableCursorPalette(bool disable); // Shaking is used in SCUMM. Set current shake position. void setShakePos(int shake_pos); @@ -214,7 +192,7 @@ public: void deleteMutex(MutexRef mutex); // Overlay - virtual Graphics::PixelFormat getOverlayFormat() const { return _overlayFormat; } + virtual Graphics::PixelFormat getOverlayFormat() const; virtual void showOverlay(); virtual void hideOverlay(); @@ -223,8 +201,8 @@ public: virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h); virtual int16 getHeight(); virtual int16 getWidth(); - virtual int16 getOverlayHeight() { return _videoMode.overlayHeight; } - virtual int16 getOverlayWidth() { return _videoMode.overlayWidth; } + virtual int16 getOverlayHeight(); + virtual int16 getOverlayWidth(); virtual const GraphicsMode *getSupportedGraphicsModes() const; virtual int getDefaultGraphicsMode() const; @@ -254,110 +232,11 @@ protected: bool _inited; SDL_AudioSpec _obtainedRate; -#ifdef USE_OSD - SDL_Surface *_osdSurface; - Uint8 _osdAlpha; // Transparency level of the OSD - uint32 _osdFadeStartTime; // When to start the fade out - enum { - kOSDFadeOutDelay = 2 * 1000, // Delay before the OSD is faded out (in milliseconds) - kOSDFadeOutDuration = 500, // Duration of the OSD fade out (in milliseconds) - kOSDColorKey = 1, - kOSDInitialAlpha = 80 // Initial alpha level, in percent - }; -#endif - - // hardware screen - SDL_Surface *_hwscreen; - - // unseen game screen - SDL_Surface *_screen; -#ifdef USE_RGB_COLOR - Graphics::PixelFormat _screenFormat; - Graphics::PixelFormat _cursorFormat; -#endif - - // temporary screen (for scalers) - SDL_Surface *_tmpscreen; - SDL_Surface *_tmpscreen2; - - // overlay - SDL_Surface *_overlayscreen; - bool _overlayVisible; - Graphics::PixelFormat _overlayFormat; - // CD Audio SDL_CD *_cdrom; int _cdTrack, _cdNumLoops, _cdStartFrame, _cdDuration; uint32 _cdEndTime, _cdStopTime; - enum { - DF_WANT_RECT_OPTIM = 1 << 0 - }; - - enum { - kTransactionNone = 0, - kTransactionActive = 1, - kTransactionRollback = 2 - }; - - struct TransactionDetails { - bool sizeChanged; - bool needHotswap; - bool needUpdatescreen; - bool normal1xScaler; -#ifdef USE_RGB_COLOR - bool formatChanged; -#endif - }; - TransactionDetails _transactionDetails; - - struct VideoState { - bool setup; - - bool fullscreen; - bool aspectRatioCorrection; - AspectRatio desiredAspectRatio; - - int mode; - int scaleFactor; - - int screenWidth, screenHeight; - int overlayWidth, overlayHeight; - int hardwareWidth, hardwareHeight; -#ifdef USE_RGB_COLOR - Graphics::PixelFormat format; -#endif - }; - VideoState _videoMode, _oldVideoMode; - - virtual void setGraphicsModeIntern(); // overloaded by CE backend - - /** Force full redraw on next updateScreen */ - bool _forceFull; - ScalerProc *_scalerProc; - int _scalerType; - int _transactionMode; - - bool _screenIsLocked; - Graphics::Surface _framebuffer; - - /** Current video mode flags (see DF_* constants) */ - uint32 _modeFlags; - bool _modeChanged; - int _screenChangeCount; - - enum { - NUM_DIRTY_RECT = 100, - MAX_SCALING = 3 - }; - - // Dirty rect management - SDL_Rect _dirtyRectList[NUM_DIRTY_RECT]; - int _numDirtyRects; - uint32 *_dirtyChecksums; - bool _cksumValid; - int _cksumNum; - // Keyboard mouse emulation. Disabled by fingolfin 2004-12-18. // I am keeping the rest of the code in for now, since the joystick // code (or rather, "hack") uses it, too. @@ -366,50 +245,7 @@ protected: uint32 last_time, delay_time, x_down_time, y_down_time; }; - struct MousePos { - // The mouse position, using either virtual (game) or real - // (overlay) coordinates. - int16 x, y; - - // The size and hotspot of the original cursor image. - int16 w, h; - int16 hotX, hotY; - - // The size and hotspot of the pre-scaled cursor image, in real - // coordinates. - int16 rW, rH; - int16 rHotX, rHotY; - - // The size and hotspot of the pre-scaled cursor image, in game - // coordinates. - int16 vW, vH; - int16 vHotX, vHotY; - - MousePos() : x(0), y(0), w(0), h(0), hotX(0), hotY(0), - rW(0), rH(0), rHotX(0), rHotY(0), vW(0), vH(0), - vHotX(0), vHotY(0) - { } - }; - - // mouse KbdMouse _km; - bool _mouseVisible; - bool _mouseNeedsRedraw; - byte *_mouseData; - SDL_Rect _mouseBackup; - MousePos _mouseCurState; -#ifdef USE_RGB_COLOR - uint32 _mouseKeyColor; -#else - byte _mouseKeyColor; -#endif - int _cursorTargetScale; - bool _cursorPaletteDisabled; - SDL_Surface *_mouseOrigSurface; - SDL_Surface *_mouseSurface; - enum { - kMouseColorKey = 1 - }; // Scroll lock state - since SDL doesn't track it bool _scrollLock; @@ -417,23 +253,6 @@ protected: // joystick SDL_Joystick *_joystick; - // Shake mode - int _currentShakePos; - int _newShakePos; - - // Palette data - SDL_Color *_currentPalette; - uint _paletteDirtyStart, _paletteDirtyEnd; - - // Cursor palette data - SDL_Color *_cursorPalette; - - /** - * Mutex which prevents multiple threads from interfering with each other - * when accessing the screen. - */ - MutexRef _graphicsMutex; - #ifdef MIXER_DOUBLE_BUFFERING SDL_mutex *_soundMutex; SDL_cond *_soundCond; @@ -459,40 +278,14 @@ protected: Common::TimerManager *_timer; protected: - void addDirtyRgnAuto(const byte *buf); - void makeChecksums(const byte *buf); - - virtual void addDirtyRect(int x, int y, int w, int h, bool realCoordinates = false); // overloaded by CE backend - - virtual void drawMouse(); // overloaded by CE backend - virtual void undrawMouse(); // overloaded by CE backend (FIXME) - virtual void blitCursor(); // overloaded by CE backend (FIXME) - - /** Set the position of the virtual mouse cursor. */ - void setMousePos(int x, int y); virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend void toggleMouseGrab(); - virtual void internUpdateScreen(); // overloaded by CE backend - - virtual bool loadGFXMode(); // overloaded by CE backend - virtual void unloadGFXMode(); // overloaded by CE backend - virtual bool hotswapGFXMode(); // overloaded by CE backend - - void setFullscreenMode(bool enable); - void setAspectRatioCorrection(bool enable); - - virtual bool saveScreenshot(const char *filename); // overloaded by CE backend - - int effectiveScreenHeight() const; + void handleKbdMouse(); void setupIcon(); - void handleKbdMouse(); virtual bool remapKey(SDL_Event &ev, Common::Event &event); - - bool handleScalerHotkeys(const SDL_KeyboardEvent &key); - bool isScalerHotkey(const Common::Event &event); }; #endif -- cgit v1.2.3 From e23ae648bc5f32c3b1bd492ade83fb5794e69f95 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Mon, 7 Jun 2010 03:23:05 +0000 Subject: Removed old subsystems design files. Removed graphics.cpp svn-id: r49474 --- backends/platform/sdl/audio.cpp | 350 ------- backends/platform/sdl/audio.h | 116 --- backends/platform/sdl/file.cpp | 241 ----- backends/platform/sdl/file.h | 64 -- backends/platform/sdl/graphics.cpp | 2025 ------------------------------------ backends/platform/sdl/module.mk | 1 - backends/platform/sdl/mutex.cpp | 83 -- backends/platform/sdl/mutex.h | 66 -- backends/platform/sdl/timer.cpp | 120 --- backends/platform/sdl/timer.h | 66 -- 10 files changed, 3132 deletions(-) delete mode 100644 backends/platform/sdl/audio.cpp delete mode 100644 backends/platform/sdl/audio.h delete mode 100644 backends/platform/sdl/file.cpp delete mode 100644 backends/platform/sdl/file.h delete mode 100644 backends/platform/sdl/graphics.cpp delete mode 100644 backends/platform/sdl/mutex.cpp delete mode 100644 backends/platform/sdl/mutex.h delete mode 100644 backends/platform/sdl/timer.cpp delete mode 100644 backends/platform/sdl/timer.h (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/audio.cpp b/backends/platform/sdl/audio.cpp deleted file mode 100644 index 7cbdd010d6..0000000000 --- a/backends/platform/sdl/audio.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "backends/platform/sdl/audio.h" -#include "sound/mixer_intern.h" -#include "common/config-manager.h" - -//#define SAMPLES_PER_SEC 11025 -#define SAMPLES_PER_SEC 22050 -//#define SAMPLES_PER_SEC 44100 - -SdlSubSys_Audio::SdlSubSys_Audio() - : - _inited(false), - _cdrom(0), -#if MIXER_DOUBLE_BUFFERING - _soundMutex(0), _soundCond(0), _soundThread(0), - _soundThreadIsRunning(false), _soundThreadShouldQuit(false), -#endif - _mixer(0) { - -} - -SdlSubSys_Audio::~SdlSubSys_Audio() { - if (_inited) { - audioDone(); - } -} - -void SdlSubSys_Audio::audioInit() { - if (_inited) { - return; - } - - // Create and hook up the mixer, if none exists yet (we check for this to - // allow subclasses to provide their own). - if (_mixer == 0) { - setupMixer(); - } - - _inited = true; -} - -void SdlSubSys_Audio::audioDone() { - if (_cdrom) { - SDL_CDStop(_cdrom); - SDL_CDClose(_cdrom); - } - - closeMixer(); - - _inited = false; -} - -bool SdlSubSys_Audio::hasFeature(Feature f) { - return false; -} - -void SdlSubSys_Audio::setFeatureState(Feature f, bool enable) { - -} - -bool SdlSubSys_Audio::getFeatureState(Feature f) { - return false; -} - -#if MIXER_DOUBLE_BUFFERING - -void SdlSubSys_Audio::mixerProducerThread() { - byte nextSoundBuffer; - - SDL_LockMutex(_soundMutex); - while (true) { - // Wait till we are allowed to produce data - SDL_CondWait(_soundCond, _soundMutex); - - if (_soundThreadShouldQuit) - break; - - // Generate samples and put them into the next buffer - nextSoundBuffer = _activeSoundBuf ^ 1; - _mixer->mixCallback(_soundBuffers[nextSoundBuffer], _soundBufSize); - - // Swap buffers - _activeSoundBuf = nextSoundBuffer; - } - SDL_UnlockMutex(_soundMutex); -} - -int SDLCALL SdlSubSys_Audio::mixerProducerThreadEntry(void *arg) { - OSystem_SDL *this_ = (OSystem_SDL *)arg; - assert(this_); - this_->mixerProducerThread(); - return 0; -} - - -void SdlSubSys_Audio::initThreadedMixer(Audio::MixerImpl *mixer, uint bufSize) { - _soundThreadIsRunning = false; - _soundThreadShouldQuit = false; - - // Create mutex and condition variable - _soundMutex = SDL_CreateMutex(); - _soundCond = SDL_CreateCond(); - - // Create two sound buffers - _activeSoundBuf = 0; - _soundBufSize = bufSize; - _soundBuffers[0] = (byte *)calloc(1, bufSize); - _soundBuffers[1] = (byte *)calloc(1, bufSize); - - _soundThreadIsRunning = true; - - // Finally start the thread - _soundThread = SDL_CreateThread(mixerProducerThreadEntry, this); -} - -void SdlSubSys_Audio::deinitThreadedMixer() { - // Kill thread?? _soundThread - - if (_soundThreadIsRunning) { - // Signal the producer thread to end, and wait for it to actually finish. - _soundThreadShouldQuit = true; - SDL_CondBroadcast(_soundCond); - SDL_WaitThread(_soundThread, NULL); - - // Kill the mutex & cond variables. - // Attention: AT this point, the mixer callback must not be running - // anymore, else we will crash! - SDL_DestroyMutex(_soundMutex); - SDL_DestroyCond(_soundCond); - - _soundThreadIsRunning = false; - - free(_soundBuffers[0]); - free(_soundBuffers[1]); - } -} - - -void SdlSubSys_Audio::mixCallback(void *arg, byte *samples, int len) { - OSystem_SDL *this_ = (OSystem_SDL *)arg; - assert(this_); - assert(this_->_mixer); - - assert((int)this_->_soundBufSize == len); - - // Lock mutex, to ensure our data is not overwritten by the producer thread - SDL_LockMutex(this_->_soundMutex); - - // Copy data from the current sound buffer - memcpy(samples, this_->_soundBuffers[this_->_activeSoundBuf], len); - - // Unlock mutex and wake up the produced thread - SDL_UnlockMutex(this_->_soundMutex); - SDL_CondSignal(this_->_soundCond); -} - -#else - -void SdlSubSys_Audio::mixCallback(void *sys, byte *samples, int len) { - SdlSubSys_Audio *this_ = (SdlSubSys_Audio *)sys; - assert(this_); - assert(this_->_mixer); - - this_->_mixer->mixCallback(samples, len); -} - -#endif - -void SdlSubSys_Audio::setupMixer() { - SDL_AudioSpec desired; - - // Determine the desired output sampling frequency. - uint32 samplesPerSec = 0; - if (ConfMan.hasKey("output_rate")) - samplesPerSec = ConfMan.getInt("output_rate"); - if (samplesPerSec <= 0) - samplesPerSec = SAMPLES_PER_SEC; - - // Determine the sample buffer size. We want it to store enough data for - // at least 1/16th of a second (though at most 8192 samples). Note - // that it must be a power of two. So e.g. at 22050 Hz, we request a - // sample buffer size of 2048. - uint32 samples = 8192; - while (samples * 16 > samplesPerSec * 2) - samples >>= 1; - - memset(&desired, 0, sizeof(desired)); - desired.freq = samplesPerSec; - desired.format = AUDIO_S16SYS; - desired.channels = 2; - desired.samples = (uint16)samples; - desired.callback = mixCallback; - desired.userdata = this; - - assert(!_mixer); - if (SDL_OpenAudio(&desired, &_obtainedRate) != 0) { - warning("Could not open audio device: %s", SDL_GetError()); - _mixer = new Audio::MixerImpl(this, samplesPerSec); - assert(_mixer); - _mixer->setReady(false); - } else { - // Note: This should be the obtained output rate, but it seems that at - // least on some platforms SDL will lie and claim it did get the rate - // even if it didn't. Probably only happens for "weird" rates, though. - samplesPerSec = _obtainedRate.freq; - debug(1, "Output sample rate: %d Hz", samplesPerSec); - - // Create the mixer instance and start the sound processing - _mixer = new Audio::MixerImpl(this, samplesPerSec); - assert(_mixer); - _mixer->setReady(true); - -#if MIXER_DOUBLE_BUFFERING - initThreadedMixer(_mixer, _obtainedRate.samples * 4); -#endif - - // start the sound system - SDL_PauseAudio(0); - } -} - -void SdlSubSys_Audio::closeMixer() { - if (_mixer) - _mixer->setReady(false); - - SDL_CloseAudio(); - - delete _mixer; - _mixer = 0; - -#if MIXER_DOUBLE_BUFFERING - deinitThreadedMixer(); -#endif - -} - -Audio::Mixer *SdlSubSys_Audio::getMixer() { - assert(_mixer); - return _mixer; -} - -bool SdlSubSys_Audio::openCD(int drive) { - if (SDL_InitSubSystem(SDL_INIT_CDROM) == -1) - _cdrom = NULL; - else { - _cdrom = SDL_CDOpen(drive); - // Did it open? Check if _cdrom is NULL - if (!_cdrom) { - warning("Couldn't open drive: %s", SDL_GetError()); - } else { - _cdNumLoops = 0; - _cdStopTime = 0; - _cdEndTime = 0; - } - } - - return (_cdrom != NULL); -} - -void SdlSubSys_Audio::stopCD() { /* Stop CD Audio in 1/10th of a second */ - _cdStopTime = SDL_GetTicks() + 100; - _cdNumLoops = 0; -} - -void SdlSubSys_Audio::playCD(int track, int num_loops, int start_frame, int duration) { - if (!num_loops && !start_frame) - return; - - if (!_cdrom) - return; - - if (duration > 0) - duration += 5; - - _cdTrack = track; - _cdNumLoops = num_loops; - _cdStartFrame = start_frame; - - SDL_CDStatus(_cdrom); - if (start_frame == 0 && duration == 0) - SDL_CDPlayTracks(_cdrom, track, 0, 1, 0); - else - SDL_CDPlayTracks(_cdrom, track, start_frame, 0, duration); - _cdDuration = duration; - _cdStopTime = 0; - _cdEndTime = SDL_GetTicks() + _cdrom->track[track].length * 1000 / CD_FPS; -} - -bool SdlSubSys_Audio::pollCD() { - if (!_cdrom) - return false; - - return (_cdNumLoops != 0 && (SDL_GetTicks() < _cdEndTime || SDL_CDStatus(_cdrom) == CD_PLAYING)); -} - -void SdlSubSys_Audio::updateCD() { - if (!_cdrom) - return; - - if (_cdStopTime != 0 && SDL_GetTicks() >= _cdStopTime) { - SDL_CDStop(_cdrom); - _cdNumLoops = 0; - _cdStopTime = 0; - return; - } - - if (_cdNumLoops == 0 || SDL_GetTicks() < _cdEndTime) - return; - - if (_cdNumLoops != 1 && SDL_CDStatus(_cdrom) != CD_STOPPED) { - // Wait another second for it to be done - _cdEndTime += 1000; - return; - } - - if (_cdNumLoops > 0) - _cdNumLoops--; - - if (_cdNumLoops != 0) { - if (_cdStartFrame == 0 && _cdDuration == 0) - SDL_CDPlayTracks(_cdrom, _cdTrack, 0, 1, 0); - else - SDL_CDPlayTracks(_cdrom, _cdTrack, _cdStartFrame, 0, _cdDuration); - _cdEndTime = SDL_GetTicks() + _cdrom->track[_cdTrack].length * 1000 / CD_FPS; - } -} diff --git a/backends/platform/sdl/audio.h b/backends/platform/sdl/audio.h deleted file mode 100644 index 4ef560999e..0000000000 --- a/backends/platform/sdl/audio.h +++ /dev/null @@ -1,116 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef BACKENDS_SDL_SUBSYS_AUDIO_H -#define BACKENDS_SDL_SUBSYS_AUDIO_H - -#include "backends/base-subsys-audio.h" - -#if defined(__SYMBIAN32__) -#include -#else -#include -#endif - -#if defined(MACOSX) -// On Mac OS X, we need to double buffer the audio buffer, else anything -// which produces sampled data with high latency (like the MT-32 emulator) -// will sound terribly. -// This could be enabled for more / most ports in the future, but needs some -// testing. -#define MIXER_DOUBLE_BUFFERING 1 -#endif - -namespace Audio { - class MixerImpl; -} - -class SdlSubSys_Audio : public BaseSubSys_Audio { -public: - SdlSubSys_Audio(); - ~SdlSubSys_Audio(); - - virtual void audioInit(); - virtual void audioDone(); - - bool hasFeature(Feature f); - void setFeatureState(Feature f, bool enable); - bool getFeatureState(Feature f); - - // Set function that generates samples - virtual void setupMixer(); - static void mixCallback(void *s, byte *samples, int len); - - virtual void closeMixer(); - - virtual Audio::Mixer *getMixer(); - - virtual bool openCD(int drive); - - // Poll CD status - // Returns true if cd audio is playing - bool pollCD(); - - // Play CD audio track - void playCD(int track, int num_loops, int start_frame, int duration); - - // Stop CD audio track - void stopCD(); - - // Update CD audio status - void updateCD(); - -protected: - bool _inited; - - SDL_AudioSpec _obtainedRate; - - // CD Audio - SDL_CD *_cdrom; - int _cdTrack, _cdNumLoops, _cdStartFrame, _cdDuration; - uint32 _cdEndTime, _cdStopTime; - -#ifdef MIXER_DOUBLE_BUFFERING - SDL_mutex *_soundMutex; - SDL_cond *_soundCond; - SDL_Thread *_soundThread; - bool _soundThreadIsRunning; - bool _soundThreadShouldQuit; - - byte _activeSoundBuf; - uint _soundBufSize; - byte *_soundBuffers[2]; - - void mixerProducerThread(); - static int SDLCALL mixerProducerThreadEntry(void *arg); - void initThreadedMixer(Audio::MixerImpl *mixer, uint bufSize); - void deinitThreadedMixer(); -#endif - - Audio::MixerImpl *_mixer; -}; - - -#endif diff --git a/backends/platform/sdl/file.cpp b/backends/platform/sdl/file.cpp deleted file mode 100644 index 4c742395df..0000000000 --- a/backends/platform/sdl/file.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#if defined(WIN32) -#include -// winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h -#undef ARRAYSIZE -#endif - -#include "backends/platform/sdl/file.h" -#include "common/archive.h" - -#ifdef UNIX - #include "backends/saves/posix/posix-saves.h" -#else - #include "backends/saves/default/default-saves.h" -#endif - -/* - * Include header files needed for the getFilesystemFactory() method. - */ -#if defined(__amigaos4__) - #include "backends/fs/amigaos4/amigaos4-fs-factory.h" -#elif defined(UNIX) - #include "backends/fs/posix/posix-fs-factory.h" -#elif defined(WIN32) - #include "backends/fs/windows/windows-fs-factory.h" -#endif - - -#if defined(UNIX) -#ifdef MACOSX -#define DEFAULT_CONFIG_FILE "Library/Preferences/ScummVM Preferences" -#elif defined(SAMSUNGTV) -#define DEFAULT_CONFIG_FILE "/dtv/usb/sda1/.scummvmrc" -#else -#define DEFAULT_CONFIG_FILE ".scummvmrc" -#endif -#else -#define DEFAULT_CONFIG_FILE "scummvm.ini" -#endif - -SdlSubSys_File::SdlSubSys_File() - : - _inited(false), - _fsFactory(0), - _savefile(0) { - - #if defined(__amigaos4__) - _fsFactory = new AmigaOSFilesystemFactory(); - #elif defined(UNIX) - _fsFactory = new POSIXFilesystemFactory(); - #elif defined(WIN32) - _fsFactory = new WindowsFilesystemFactory(); - #elif defined(__SYMBIAN32__) - // Do nothing since its handled by the Symbian SDL inheritance - #else - #error Unknown and unsupported FS backend - #endif -} - -SdlSubSys_File::~SdlSubSys_File() { - if (_inited) { - fileDone(); - } -} - -void SdlSubSys_File::fileInit() { - if (_inited) { - return; - } - - // Create the savefile manager, if none exists yet (we check for this to - // allow subclasses to provide their own). - if (_savefile == 0) { - #ifdef UNIX - _savefile = new POSIXSaveFileManager(); - #else - _savefile = new DefaultSaveFileManager(); - #endif - } - - _inited = true; -} - -void SdlSubSys_File::fileDone() { - // Event Manager requires save manager for storing - // recorded events - delete getEventManager(); - delete _savefile; - - _inited = false; -} - -bool SdlSubSys_File::hasFeature(Feature f) { - return false; -} - -void SdlSubSys_File::setFeatureState(Feature f, bool enable) { - -} - -bool SdlSubSys_File::getFeatureState(Feature f) { - return false; -} - -Common::SaveFileManager *SdlSubSys_File::getSavefileManager() { - assert(_savefile); - return _savefile; -} - -FilesystemFactory *SdlSubSys_File::getFilesystemFactory() { - assert(_fsFactory); - return _fsFactory; -} - -void SdlSubSys_File::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { - -#ifdef DATA_PATH - // Add the global DATA_PATH to the directory search list - // FIXME: We use depth = 4 for now, to match the old code. May want to change that - Common::FSNode dataNode(DATA_PATH); - if (dataNode.exists() && dataNode.isDirectory()) { - s.add(DATA_PATH, new Common::FSDirectory(dataNode, 4), priority); - } -#endif - -#ifdef MACOSX - // Get URL of the Resource directory of the .app bundle - CFURLRef fileUrl = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); - if (fileUrl) { - // Try to convert the URL to an absolute path - UInt8 buf[MAXPATHLEN]; - if (CFURLGetFileSystemRepresentation(fileUrl, true, buf, sizeof(buf))) { - // Success: Add it to the search path - Common::String bundlePath((const char *)buf); - s.add("__OSX_BUNDLE__", new Common::FSDirectory(bundlePath), priority); - } - CFRelease(fileUrl); - } - -#endif - -} - -static Common::String getDefaultConfigFileName() { - char configFile[MAXPATHLEN]; -#if defined (WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) - OSVERSIONINFO win32OsVersion; - ZeroMemory(&win32OsVersion, sizeof(OSVERSIONINFO)); - win32OsVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&win32OsVersion); - // Check for non-9X version of Windows. - if (win32OsVersion.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS) { - // Use the Application Data directory of the user profile. - if (win32OsVersion.dwMajorVersion >= 5) { - if (!GetEnvironmentVariable("APPDATA", configFile, sizeof(configFile))) - error("Unable to access application data directory"); - } else { - if (!GetEnvironmentVariable("USERPROFILE", configFile, sizeof(configFile))) - error("Unable to access user profile directory"); - - strcat(configFile, "\\Application Data"); - CreateDirectory(configFile, NULL); - } - - strcat(configFile, "\\ScummVM"); - CreateDirectory(configFile, NULL); - strcat(configFile, "\\" DEFAULT_CONFIG_FILE); - - FILE *tmp = NULL; - if ((tmp = fopen(configFile, "r")) == NULL) { - // Check windows directory - char oldConfigFile[MAXPATHLEN]; - GetWindowsDirectory(oldConfigFile, MAXPATHLEN); - strcat(oldConfigFile, "\\" DEFAULT_CONFIG_FILE); - if ((tmp = fopen(oldConfigFile, "r"))) { - strcpy(configFile, oldConfigFile); - - fclose(tmp); - } - } else { - fclose(tmp); - } - } else { - // Check windows directory - GetWindowsDirectory(configFile, MAXPATHLEN); - strcat(configFile, "\\" DEFAULT_CONFIG_FILE); - } -#elif defined(UNIX) - // On UNIX type systems, by default we store the config file inside - // to the HOME directory of the user. - // - // GP2X is Linux based but Home dir can be read only so do not use - // it and put the config in the executable dir. - // - // On the iPhone, the home dir of the user when you launch the app - // from the Springboard, is /. Which we don't want. - const char *home = getenv("HOME"); - if (home != NULL && strlen(home) < MAXPATHLEN) - snprintf(configFile, MAXPATHLEN, "%s/%s", home, DEFAULT_CONFIG_FILE); - else - strcpy(configFile, DEFAULT_CONFIG_FILE); -#else - strcpy(configFile, DEFAULT_CONFIG_FILE); -#endif - - return configFile; -} - -Common::SeekableReadStream *SdlSubSys_File::createConfigReadStream() { - Common::FSNode file(getDefaultConfigFileName()); - return file.createReadStream(); -} - -Common::WriteStream *SdlSubSys_File::createConfigWriteStream() { - Common::FSNode file(getDefaultConfigFileName()); - return file.createWriteStream(); -} diff --git a/backends/platform/sdl/file.h b/backends/platform/sdl/file.h deleted file mode 100644 index 0e0bec7ce8..0000000000 --- a/backends/platform/sdl/file.h +++ /dev/null @@ -1,64 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef BACKENDS_SDL_SUBSYS_FILE_H -#define BACKENDS_SDL_SUBSYS_FILE_H - -#include "backends/base-subsys-file.h" - -#if defined(__SYMBIAN32__) -#include -#else -#include -#endif - -class SdlSubSys_File : public BaseSubSys_File { -public: - SdlSubSys_File(); - ~SdlSubSys_File(); - - virtual void fileInit(); - virtual void fileDone(); - - bool hasFeature(Feature f); - void setFeatureState(Feature f, bool enable); - bool getFeatureState(Feature f); - - virtual Common::SeekableReadStream *createConfigReadStream(); - virtual Common::WriteStream *createConfigWriteStream(); - - virtual Common::SaveFileManager *getSavefileManager(); - virtual FilesystemFactory *getFilesystemFactory(); - virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); - -protected: - bool _inited; - - FilesystemFactory *_fsFactory; - Common::SaveFileManager *_savefile; -}; - - -#endif diff --git a/backends/platform/sdl/graphics.cpp b/backends/platform/sdl/graphics.cpp deleted file mode 100644 index b3ef101e9e..0000000000 --- a/backends/platform/sdl/graphics.cpp +++ /dev/null @@ -1,2025 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "backends/platform/sdl/sdl.h" -#include "common/mutex.h" -#include "common/util.h" -#ifdef USE_RGB_COLOR -#include "common/list.h" -#endif -#include "graphics/font.h" -#include "graphics/fontman.h" -#include "graphics/scaler.h" -#include "graphics/scaler/aspect.h" -#include "graphics/surface.h" - -static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { - {"1x", "Normal (no scaling)", GFX_NORMAL}, -#ifdef USE_SCALERS - {"2x", "2x", GFX_DOUBLESIZE}, - {"3x", "3x", GFX_TRIPLESIZE}, - {"2xsai", "2xSAI", GFX_2XSAI}, - {"super2xsai", "Super2xSAI", GFX_SUPER2XSAI}, - {"supereagle", "SuperEagle", GFX_SUPEREAGLE}, - {"advmame2x", "AdvMAME2x", GFX_ADVMAME2X}, - {"advmame3x", "AdvMAME3x", GFX_ADVMAME3X}, -#ifdef USE_HQ_SCALERS - {"hq2x", "HQ2x", GFX_HQ2X}, - {"hq3x", "HQ3x", GFX_HQ3X}, -#endif - {"tv2x", "TV2x", GFX_TV2X}, - {"dotmatrix", "DotMatrix", GFX_DOTMATRIX}, -#endif - {0, 0, 0} -}; - -// Table of relative scalers magnitudes -// [definedScale - 1][scaleFactor - 1] -static ScalerProc *scalersMagn[3][3] = { -#ifdef USE_SCALERS - { Normal1x, AdvMame2x, AdvMame3x }, - { Normal1x, Normal1x, Normal1o5x }, - { Normal1x, Normal1x, Normal1x } -#else // remove dependencies on other scalers - { Normal1x, Normal1x, Normal1x }, - { Normal1x, Normal1x, Normal1x }, - { Normal1x, Normal1x, Normal1x } -#endif -}; - -static const int s_gfxModeSwitchTable[][4] = { - { GFX_NORMAL, GFX_DOUBLESIZE, GFX_TRIPLESIZE, -1 }, - { GFX_NORMAL, GFX_ADVMAME2X, GFX_ADVMAME3X, -1 }, - { GFX_NORMAL, GFX_HQ2X, GFX_HQ3X, -1 }, - { GFX_NORMAL, GFX_2XSAI, -1, -1 }, - { GFX_NORMAL, GFX_SUPER2XSAI, -1, -1 }, - { GFX_NORMAL, GFX_SUPEREAGLE, -1, -1 }, - { GFX_NORMAL, GFX_TV2X, -1, -1 }, - { GFX_NORMAL, GFX_DOTMATRIX, -1, -1 } - }; - -#ifdef USE_SCALERS -static int cursorStretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY); -#endif - -const OSystem::GraphicsMode *OSystem_SDL::getSupportedGraphicsModes() const { - return s_supportedGraphicsModes; -} - -int OSystem_SDL::getDefaultGraphicsMode() const { - return GFX_DOUBLESIZE; -} - -void OSystem_SDL::beginGFXTransaction() { - assert(_transactionMode == kTransactionNone); - - _transactionMode = kTransactionActive; - - _transactionDetails.sizeChanged = false; - - _transactionDetails.needHotswap = false; - _transactionDetails.needUpdatescreen = false; - - _transactionDetails.normal1xScaler = false; -#ifdef USE_RGB_COLOR - _transactionDetails.formatChanged = false; -#endif - - _oldVideoMode = _videoMode; -} - -OSystem::TransactionError OSystem_SDL::endGFXTransaction() { - int errors = kTransactionSuccess; - - assert(_transactionMode != kTransactionNone); - - if (_transactionMode == kTransactionRollback) { - if (_videoMode.fullscreen != _oldVideoMode.fullscreen) { - errors |= kTransactionFullscreenFailed; - - _videoMode.fullscreen = _oldVideoMode.fullscreen; - } else if (_videoMode.aspectRatioCorrection != _oldVideoMode.aspectRatioCorrection) { - errors |= kTransactionAspectRatioFailed; - - _videoMode.aspectRatioCorrection = _oldVideoMode.aspectRatioCorrection; - } else if (_videoMode.mode != _oldVideoMode.mode) { - errors |= kTransactionModeSwitchFailed; - - _videoMode.mode = _oldVideoMode.mode; - _videoMode.scaleFactor = _oldVideoMode.scaleFactor; -#ifdef USE_RGB_COLOR - } else if (_videoMode.format != _oldVideoMode.format) { - errors |= kTransactionFormatNotSupported; - - _videoMode.format = _oldVideoMode.format; - _screenFormat = _videoMode.format; -#endif - } else if (_videoMode.screenWidth != _oldVideoMode.screenWidth || _videoMode.screenHeight != _oldVideoMode.screenHeight) { - errors |= kTransactionSizeChangeFailed; - - _videoMode.screenWidth = _oldVideoMode.screenWidth; - _videoMode.screenHeight = _oldVideoMode.screenHeight; - _videoMode.overlayWidth = _oldVideoMode.overlayWidth; - _videoMode.overlayHeight = _oldVideoMode.overlayHeight; - } - - if (_videoMode.fullscreen == _oldVideoMode.fullscreen && - _videoMode.aspectRatioCorrection == _oldVideoMode.aspectRatioCorrection && - _videoMode.mode == _oldVideoMode.mode && - _videoMode.screenWidth == _oldVideoMode.screenWidth && - _videoMode.screenHeight == _oldVideoMode.screenHeight) { - - // Our new video mode would now be exactly the same as the - // old one. Since we still can not assume SDL_SetVideoMode - // to be working fine, we need to invalidate the old video - // mode, so loadGFXMode would error out properly. - _oldVideoMode.setup = false; - } - } - -#ifdef USE_RGB_COLOR - if (_transactionDetails.sizeChanged || _transactionDetails.formatChanged) { -#else - if (_transactionDetails.sizeChanged) { -#endif - unloadGFXMode(); - if (!loadGFXMode()) { - if (_oldVideoMode.setup) { - _transactionMode = kTransactionRollback; - errors |= endGFXTransaction(); - } - } else { - setGraphicsModeIntern(); - clearOverlay(); - - _videoMode.setup = true; - _modeChanged = true; - // OSystem_SDL::pollEvent used to update the screen change count, - // but actually it gives problems when a video mode was changed - // but OSystem_SDL::pollEvent was not called. This for example - // caused a crash under certain circumstances when doing an RTL. - // To fix this issue we update the screen change count right here. - _screenChangeCount++; - } - } else if (_transactionDetails.needHotswap) { - setGraphicsModeIntern(); - if (!hotswapGFXMode()) { - if (_oldVideoMode.setup) { - _transactionMode = kTransactionRollback; - errors |= endGFXTransaction(); - } - } else { - _videoMode.setup = true; - _modeChanged = true; - // OSystem_SDL::pollEvent used to update the screen change count, - // but actually it gives problems when a video mode was changed - // but OSystem_SDL::pollEvent was not called. This for example - // caused a crash under certain circumstances when doing an RTL. - // To fix this issue we update the screen change count right here. - _screenChangeCount++; - - if (_transactionDetails.needUpdatescreen) - internUpdateScreen(); - } - } else if (_transactionDetails.needUpdatescreen) { - setGraphicsModeIntern(); - internUpdateScreen(); - } - - _transactionMode = kTransactionNone; - return (TransactionError)errors; -} - -#ifdef USE_RGB_COLOR -const Graphics::PixelFormat RGBList[] = { -#ifdef ENABLE_32BIT - // RGBA8888, ARGB8888, RGB888 - Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0), - Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24), - Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0), -#endif - // RGB565, XRGB1555, RGB555, RGBA4444, ARGB4444 - Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), - Graphics::PixelFormat(2, 5, 5, 5, 1, 10, 5, 0, 15), - Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0), - Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0), - Graphics::PixelFormat(2, 4, 4, 4, 4, 8, 4, 0, 12) -}; -const Graphics::PixelFormat BGRList[] = { -#ifdef ENABLE_32BIT - // ABGR8888, BGRA8888, BGR888 - Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24), - Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0), - Graphics::PixelFormat(3, 8, 8, 8, 0, 0, 8, 16, 0), -#endif - // BGR565, XBGR1555, BGR555, ABGR4444, BGRA4444 - Graphics::PixelFormat(2, 5, 6, 5, 0, 0, 5, 11, 0), - Graphics::PixelFormat(2, 5, 5, 5, 1, 0, 5, 10, 15), - Graphics::PixelFormat(2, 5, 5, 5, 0, 0, 5, 10, 0), - Graphics::PixelFormat(2, 4, 4, 4, 4, 0, 4, 8, 12), - Graphics::PixelFormat(2, 4, 4, 4, 4, 4, 8, 12, 0) -}; - -// TODO: prioritize matching alpha masks -Common::List OSystem_SDL::getSupportedFormats() { - static Common::List list; - static bool inited = false; - - if (inited) - return list; - - bool BGR = false; - int listLength = ARRAYSIZE(RGBList); - - Graphics::PixelFormat format = Graphics::PixelFormat::createFormatCLUT8(); - if (_hwscreen) { - // Get our currently set hardware format - format = Graphics::PixelFormat(_hwscreen->format->BytesPerPixel, - 8 - _hwscreen->format->Rloss, 8 - _hwscreen->format->Gloss, - 8 - _hwscreen->format->Bloss, 8 - _hwscreen->format->Aloss, - _hwscreen->format->Rshift, _hwscreen->format->Gshift, - _hwscreen->format->Bshift, _hwscreen->format->Ashift); - - // Workaround to MacOSX SDL not providing an accurate Aloss value. - if (_hwscreen->format->Amask == 0) - format.aLoss = 8; - - // Push it first, as the prefered format. - list.push_back(format); - - if (format.bShift > format.rShift) - BGR = true; - - // Mark that we don't need to do this any more. - inited = true; - } - - for (int i = 0; i < listLength; i++) { - if (inited && (RGBList[i].bytesPerPixel > format.bytesPerPixel)) - continue; - if (BGR) { - if (BGRList[i] != format) - list.push_back(BGRList[i]); - list.push_back(RGBList[i]); - } else { - if (RGBList[i] != format) - list.push_back(RGBList[i]); - list.push_back(BGRList[i]); - } - } - list.push_back(Graphics::PixelFormat::createFormatCLUT8()); - return list; -} -#endif - -bool OSystem_SDL::setGraphicsMode(int mode) { - Common::StackLock lock(_graphicsMutex); - - assert(_transactionMode == kTransactionActive); - - if (_oldVideoMode.setup && _oldVideoMode.mode == mode) - return true; - - int newScaleFactor = 1; - - switch (mode) { - case GFX_NORMAL: - newScaleFactor = 1; - break; -#ifdef USE_SCALERS - case GFX_DOUBLESIZE: - newScaleFactor = 2; - break; - case GFX_TRIPLESIZE: - newScaleFactor = 3; - break; - - case GFX_2XSAI: - newScaleFactor = 2; - break; - case GFX_SUPER2XSAI: - newScaleFactor = 2; - break; - case GFX_SUPEREAGLE: - newScaleFactor = 2; - break; - case GFX_ADVMAME2X: - newScaleFactor = 2; - break; - case GFX_ADVMAME3X: - newScaleFactor = 3; - break; -#ifdef USE_HQ_SCALERS - case GFX_HQ2X: - newScaleFactor = 2; - break; - case GFX_HQ3X: - newScaleFactor = 3; - break; -#endif - case GFX_TV2X: - newScaleFactor = 2; - break; - case GFX_DOTMATRIX: - newScaleFactor = 2; - break; -#endif // USE_SCALERS - - default: - warning("unknown gfx mode %d", mode); - return false; - } - - _transactionDetails.normal1xScaler = (mode == GFX_NORMAL); - if (_oldVideoMode.setup && _oldVideoMode.scaleFactor != newScaleFactor) - _transactionDetails.needHotswap = true; - - _transactionDetails.needUpdatescreen = true; - - _videoMode.mode = mode; - _videoMode.scaleFactor = newScaleFactor; - - return true; -} - -void OSystem_SDL::setGraphicsModeIntern() { - Common::StackLock lock(_graphicsMutex); - ScalerProc *newScalerProc = 0; - - switch (_videoMode.mode) { - case GFX_NORMAL: - newScalerProc = Normal1x; - break; -#ifdef USE_SCALERS - case GFX_DOUBLESIZE: - newScalerProc = Normal2x; - break; - case GFX_TRIPLESIZE: - newScalerProc = Normal3x; - break; - - case GFX_2XSAI: - newScalerProc = _2xSaI; - break; - case GFX_SUPER2XSAI: - newScalerProc = Super2xSaI; - break; - case GFX_SUPEREAGLE: - newScalerProc = SuperEagle; - break; - case GFX_ADVMAME2X: - newScalerProc = AdvMame2x; - break; - case GFX_ADVMAME3X: - newScalerProc = AdvMame3x; - break; -#ifdef USE_HQ_SCALERS - case GFX_HQ2X: - newScalerProc = HQ2x; - break; - case GFX_HQ3X: - newScalerProc = HQ3x; - break; -#endif - case GFX_TV2X: - newScalerProc = TV2x; - break; - case GFX_DOTMATRIX: - newScalerProc = DotMatrix; - break; -#endif // USE_SCALERS - - default: - error("Unknown gfx mode %d", _videoMode.mode); - } - - _scalerProc = newScalerProc; - - if (_videoMode.mode != GFX_NORMAL) { - for (int i = 0; i < ARRAYSIZE(s_gfxModeSwitchTable); i++) { - if (s_gfxModeSwitchTable[i][1] == _videoMode.mode || s_gfxModeSwitchTable[i][2] == _videoMode.mode) { - _scalerType = i; - break; - } - } - } - - if (!_screen || !_hwscreen) - return; - - // Blit everything to the screen - _forceFull = true; - - // Even if the old and new scale factors are the same, we may have a - // different scaler for the cursor now. - blitCursor(); -} - -int OSystem_SDL::getGraphicsMode() const { - assert (_transactionMode == kTransactionNone); - return _videoMode.mode; -} - -void OSystem_SDL::initSize(uint w, uint h, const Graphics::PixelFormat *format) { - assert(_transactionMode == kTransactionActive); - -#ifdef USE_RGB_COLOR - //avoid redundant format changes - Graphics::PixelFormat newFormat; - if (!format) - newFormat = Graphics::PixelFormat::createFormatCLUT8(); - else - newFormat = *format; - - assert(newFormat.bytesPerPixel > 0); - - if (newFormat != _videoMode.format) { - _videoMode.format = newFormat; - _transactionDetails.formatChanged = true; - _screenFormat = newFormat; - } -#endif - - // Avoid redundant res changes - if ((int)w == _videoMode.screenWidth && (int)h == _videoMode.screenHeight) - return; - - _videoMode.screenWidth = w; - _videoMode.screenHeight = h; - - _cksumNum = (w * h / (8 * 8)); - - _transactionDetails.sizeChanged = true; - - free(_dirtyChecksums); - _dirtyChecksums = (uint32 *)calloc(_cksumNum * 2, sizeof(uint32)); -} - -int OSystem_SDL::effectiveScreenHeight() const { - return _videoMode.scaleFactor * - (_videoMode.aspectRatioCorrection - ? real2Aspect(_videoMode.screenHeight) - : _videoMode.screenHeight); -} - -static void fixupResolutionForAspectRatio(AspectRatio desiredAspectRatio, int &width, int &height) { - assert(&width != &height); - - if (desiredAspectRatio.isAuto()) - return; - - int kw = desiredAspectRatio.kw(); - int kh = desiredAspectRatio.kh(); - - const int w = width; - const int h = height; - - SDL_Rect const* const*availableModes = SDL_ListModes(NULL, SDL_FULLSCREEN|SDL_SWSURFACE); //TODO : Maybe specify a pixel format - assert(availableModes); - - const SDL_Rect *bestMode = NULL; - uint bestMetric = (uint)-1; // Metric is wasted space - while (const SDL_Rect *mode = *availableModes++) { - if (mode->w < w) - continue; - if (mode->h < h) - continue; - if (mode->h * kw != mode->w * kh) - continue; - //printf("%d %d\n", mode->w, mode->h); - - uint metric = mode->w * mode->h - w * h; - if (metric > bestMetric) - continue; - - bestMetric = metric; - bestMode = mode; - } - - if (!bestMode) { - warning("Unable to enforce the desired aspect ratio!"); - return; - } - //printf("%d %d\n", bestMode->w, bestMode->h); - width = bestMode->w; - height = bestMode->h; -} - -bool OSystem_SDL::loadGFXMode() { - assert(_inited); - _forceFull = true; - -#if !defined(__MAEMO__) && !defined(GP2XWIZ) && !defined(LINUXMOTO) - _videoMode.overlayWidth = _videoMode.screenWidth * _videoMode.scaleFactor; - _videoMode.overlayHeight = _videoMode.screenHeight * _videoMode.scaleFactor; - - if (_videoMode.screenHeight != 200 && _videoMode.screenHeight != 400) - _videoMode.aspectRatioCorrection = false; - - if (_videoMode.aspectRatioCorrection) - _videoMode.overlayHeight = real2Aspect(_videoMode.overlayHeight); - - _videoMode.hardwareWidth = _videoMode.screenWidth * _videoMode.scaleFactor; - _videoMode.hardwareHeight = effectiveScreenHeight(); -#else - _videoMode.hardwareWidth = _videoMode.overlayWidth; - _videoMode.hardwareHeight = _videoMode.overlayHeight; -#endif - - // - // Create the surface that contains the 8 bit game data - // -#ifdef USE_RGB_COLOR - _screen = SDL_CreateRGBSurface(SDL_SWSURFACE, _videoMode.screenWidth, _videoMode.screenHeight, - _screenFormat.bytesPerPixel << 3, - ((1 << _screenFormat.rBits()) - 1) << _screenFormat.rShift , - ((1 << _screenFormat.gBits()) - 1) << _screenFormat.gShift , - ((1 << _screenFormat.bBits()) - 1) << _screenFormat.bShift , - ((1 << _screenFormat.aBits()) - 1) << _screenFormat.aShift ); - if (_screen == NULL) - error("allocating _screen failed"); - -#else - _screen = SDL_CreateRGBSurface(SDL_SWSURFACE, _videoMode.screenWidth, _videoMode.screenHeight, 8, 0, 0, 0, 0); - if (_screen == NULL) - error("allocating _screen failed"); -#endif - - // - // Create the surface that contains the scaled graphics in 16 bit mode - // - - if (_videoMode.fullscreen) { - fixupResolutionForAspectRatio(_videoMode.desiredAspectRatio, _videoMode.hardwareWidth, _videoMode.hardwareHeight); - } - - _hwscreen = SDL_SetVideoMode(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 16, - _videoMode.fullscreen ? (SDL_FULLSCREEN|SDL_SWSURFACE) : SDL_SWSURFACE - ); - if (_hwscreen == NULL) { - // DON'T use error(), as this tries to bring up the debug - // console, which WON'T WORK now that _hwscreen is hosed. - - if (!_oldVideoMode.setup) { - warning("SDL_SetVideoMode says we can't switch to that mode (%s)", SDL_GetError()); - quit(); - } else { - return false; - } - } - - // - // Create the surface used for the graphics in 16 bit before scaling, and also the overlay - // - - // Need some extra bytes around when using 2xSaI - _tmpscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, _videoMode.screenWidth + 3, _videoMode.screenHeight + 3, - 16, - _hwscreen->format->Rmask, - _hwscreen->format->Gmask, - _hwscreen->format->Bmask, - _hwscreen->format->Amask); - - if (_tmpscreen == NULL) - error("allocating _tmpscreen failed"); - - _overlayscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, _videoMode.overlayWidth, _videoMode.overlayHeight, - 16, - _hwscreen->format->Rmask, - _hwscreen->format->Gmask, - _hwscreen->format->Bmask, - _hwscreen->format->Amask); - - if (_overlayscreen == NULL) - error("allocating _overlayscreen failed"); - - _overlayFormat.bytesPerPixel = _overlayscreen->format->BytesPerPixel; - - _overlayFormat.rLoss = _overlayscreen->format->Rloss; - _overlayFormat.gLoss = _overlayscreen->format->Gloss; - _overlayFormat.bLoss = _overlayscreen->format->Bloss; - _overlayFormat.aLoss = _overlayscreen->format->Aloss; - - _overlayFormat.rShift = _overlayscreen->format->Rshift; - _overlayFormat.gShift = _overlayscreen->format->Gshift; - _overlayFormat.bShift = _overlayscreen->format->Bshift; - _overlayFormat.aShift = _overlayscreen->format->Ashift; - - _tmpscreen2 = SDL_CreateRGBSurface(SDL_SWSURFACE, _videoMode.overlayWidth + 3, _videoMode.overlayHeight + 3, - 16, - _hwscreen->format->Rmask, - _hwscreen->format->Gmask, - _hwscreen->format->Bmask, - _hwscreen->format->Amask); - - if (_tmpscreen2 == NULL) - error("allocating _tmpscreen2 failed"); - -#ifdef USE_OSD - _osdSurface = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, - _hwscreen->w, - _hwscreen->h, - 16, - _hwscreen->format->Rmask, - _hwscreen->format->Gmask, - _hwscreen->format->Bmask, - _hwscreen->format->Amask); - if (_osdSurface == NULL) - error("allocating _osdSurface failed"); - SDL_SetColorKey(_osdSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, kOSDColorKey); -#endif - - // keyboard cursor control, some other better place for it? - _km.x_max = _videoMode.screenWidth * _videoMode.scaleFactor - 1; - _km.y_max = effectiveScreenHeight() - 1; - _km.delay_time = 25; - _km.last_time = 0; - - // Distinguish 555 and 565 mode - if (_hwscreen->format->Rmask == 0x7C00) - InitScalers(555); - else - InitScalers(565); - - return true; -} - -void OSystem_SDL::unloadGFXMode() { - if (_screen) { - SDL_FreeSurface(_screen); - _screen = NULL; - } - - if (_hwscreen) { - SDL_FreeSurface(_hwscreen); - _hwscreen = NULL; - } - - if (_tmpscreen) { - SDL_FreeSurface(_tmpscreen); - _tmpscreen = NULL; - } - - if (_tmpscreen2) { - SDL_FreeSurface(_tmpscreen2); - _tmpscreen2 = NULL; - } - - if (_overlayscreen) { - SDL_FreeSurface(_overlayscreen); - _overlayscreen = NULL; - } - -#ifdef USE_OSD - if (_osdSurface) { - SDL_FreeSurface(_osdSurface); - _osdSurface = NULL; - } -#endif - DestroyScalers(); -} - -bool OSystem_SDL::hotswapGFXMode() { - if (!_screen) - return false; - - // Keep around the old _screen & _overlayscreen so we can restore the screen data - // after the mode switch. - SDL_Surface *old_screen = _screen; - _screen = NULL; - SDL_Surface *old_overlayscreen = _overlayscreen; - _overlayscreen = NULL; - - // Release the HW screen surface - SDL_FreeSurface(_hwscreen); _hwscreen = NULL; - - SDL_FreeSurface(_tmpscreen); _tmpscreen = NULL; - SDL_FreeSurface(_tmpscreen2); _tmpscreen2 = NULL; - -#ifdef USE_OSD - // Release the OSD surface - SDL_FreeSurface(_osdSurface); _osdSurface = NULL; -#endif - - // Setup the new GFX mode - if (!loadGFXMode()) { - unloadGFXMode(); - - _screen = old_screen; - _overlayscreen = old_overlayscreen; - - return false; - } - - // reset palette - SDL_SetColors(_screen, _currentPalette, 0, 256); - - // Restore old screen content - SDL_BlitSurface(old_screen, NULL, _screen, NULL); - SDL_BlitSurface(old_overlayscreen, NULL, _overlayscreen, NULL); - - // Free the old surfaces - SDL_FreeSurface(old_screen); - SDL_FreeSurface(old_overlayscreen); - - // Update cursor to new scale - blitCursor(); - - // Blit everything to the screen - internUpdateScreen(); - - return true; -} - -void OSystem_SDL::updateScreen() { - assert (_transactionMode == kTransactionNone); - - Common::StackLock lock(_graphicsMutex); // Lock the mutex until this function ends - - internUpdateScreen(); -} - -void OSystem_SDL::internUpdateScreen() { - SDL_Surface *srcSurf, *origSurf; - int height, width; - ScalerProc *scalerProc; - int scale1; - -#if defined (DEBUG) && ! defined(_WIN32_WCE) // definitions not available for non-DEBUG here. (needed this to compile in SYMBIAN32 & linux?) - assert(_hwscreen != NULL); - assert(_hwscreen->map->sw_data != NULL); -#endif - - // If the shake position changed, fill the dirty area with blackness - if (_currentShakePos != _newShakePos) { - SDL_Rect blackrect = {0, 0, _videoMode.screenWidth * _videoMode.scaleFactor, _newShakePos * _videoMode.scaleFactor}; - - if (_videoMode.aspectRatioCorrection && !_overlayVisible) - blackrect.h = real2Aspect(blackrect.h - 1) + 1; - - SDL_FillRect(_hwscreen, &blackrect, 0); - - _currentShakePos = _newShakePos; - - _forceFull = true; - } - - // Check whether the palette was changed in the meantime and update the - // screen surface accordingly. - if (_screen && _paletteDirtyEnd != 0) { - SDL_SetColors(_screen, _currentPalette + _paletteDirtyStart, - _paletteDirtyStart, - _paletteDirtyEnd - _paletteDirtyStart); - - _paletteDirtyEnd = 0; - - _forceFull = true; - } - -#ifdef USE_OSD - // OSD visible (i.e. non-transparent)? - if (_osdAlpha != SDL_ALPHA_TRANSPARENT) { - // Updated alpha value - const int diff = SDL_GetTicks() - _osdFadeStartTime; - if (diff > 0) { - if (diff >= kOSDFadeOutDuration) { - // Back to full transparency - _osdAlpha = SDL_ALPHA_TRANSPARENT; - } else { - // Do a linear fade out... - const int startAlpha = SDL_ALPHA_TRANSPARENT + kOSDInitialAlpha * (SDL_ALPHA_OPAQUE - SDL_ALPHA_TRANSPARENT) / 100; - _osdAlpha = startAlpha + diff * (SDL_ALPHA_TRANSPARENT - startAlpha) / kOSDFadeOutDuration; - } - SDL_SetAlpha(_osdSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, _osdAlpha); - _forceFull = true; - } - } -#endif - - if (!_overlayVisible) { - origSurf = _screen; - srcSurf = _tmpscreen; - width = _videoMode.screenWidth; - height = _videoMode.screenHeight; - scalerProc = _scalerProc; - scale1 = _videoMode.scaleFactor; - } else { - origSurf = _overlayscreen; - srcSurf = _tmpscreen2; - width = _videoMode.overlayWidth; - height = _videoMode.overlayHeight; - scalerProc = Normal1x; - - scale1 = 1; - } - - // Add the area covered by the mouse cursor to the list of dirty rects if - // we have to redraw the mouse. - if (_mouseNeedsRedraw) - undrawMouse(); - - // Force a full redraw if requested - if (_forceFull) { - _numDirtyRects = 1; - _dirtyRectList[0].x = 0; - _dirtyRectList[0].y = 0; - _dirtyRectList[0].w = width; - _dirtyRectList[0].h = height; - } - - // Only draw anything if necessary - if (_numDirtyRects > 0 || _mouseNeedsRedraw) { - SDL_Rect *r; - SDL_Rect dst; - uint32 srcPitch, dstPitch; - SDL_Rect *lastRect = _dirtyRectList + _numDirtyRects; - - for (r = _dirtyRectList; r != lastRect; ++r) { - dst = *r; - dst.x++; // Shift rect by one since 2xSai needs to access the data around - dst.y++; // any pixel to scale it, and we want to avoid mem access crashes. - - if (SDL_BlitSurface(origSurf, r, srcSurf, &dst) != 0) - error("SDL_BlitSurface failed: %s", SDL_GetError()); - } - - SDL_LockSurface(srcSurf); - SDL_LockSurface(_hwscreen); - - srcPitch = srcSurf->pitch; - dstPitch = _hwscreen->pitch; - - for (r = _dirtyRectList; r != lastRect; ++r) { - register int dst_y = r->y + _currentShakePos; - register int dst_h = 0; - register int orig_dst_y = 0; - register int rx1 = r->x * scale1; - - if (dst_y < height) { - dst_h = r->h; - if (dst_h > height - dst_y) - dst_h = height - dst_y; - - orig_dst_y = dst_y; - dst_y = dst_y * scale1; - - if (_videoMode.aspectRatioCorrection && !_overlayVisible) - dst_y = real2Aspect(dst_y); - - assert(scalerProc != NULL); - scalerProc((byte *)srcSurf->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch, - (byte *)_hwscreen->pixels + rx1 * 2 + dst_y * dstPitch, dstPitch, r->w, dst_h); - } - - r->x = rx1; - r->y = dst_y; - r->w = r->w * scale1; - r->h = dst_h * scale1; - -#ifdef USE_SCALERS - if (_videoMode.aspectRatioCorrection && orig_dst_y < height && !_overlayVisible) - r->h = stretch200To240((uint8 *) _hwscreen->pixels, dstPitch, r->w, r->h, r->x, r->y, orig_dst_y * scale1); -#endif - } - SDL_UnlockSurface(srcSurf); - SDL_UnlockSurface(_hwscreen); - - // Readjust the dirty rect list in case we are doing a full update. - // This is necessary if shaking is active. - if (_forceFull) { - _dirtyRectList[0].y = 0; - _dirtyRectList[0].h = effectiveScreenHeight(); - } - - drawMouse(); - -#ifdef USE_OSD - if (_osdAlpha != SDL_ALPHA_TRANSPARENT) { - SDL_BlitSurface(_osdSurface, 0, _hwscreen, 0); - } -#endif - // Finally, blit all our changes to the screen - SDL_UpdateRects(_hwscreen, _numDirtyRects, _dirtyRectList); - } - - _numDirtyRects = 0; - _forceFull = false; - _mouseNeedsRedraw = false; -} - -bool OSystem_SDL::saveScreenshot(const char *filename) { - assert(_hwscreen != NULL); - - Common::StackLock lock(_graphicsMutex); // Lock the mutex until this function ends - return SDL_SaveBMP(_hwscreen, filename) == 0; -} - -void OSystem_SDL::setFullscreenMode(bool enable) { - Common::StackLock lock(_graphicsMutex); - - if (_oldVideoMode.setup && _oldVideoMode.fullscreen == enable) - return; - - if (_transactionMode == kTransactionActive) { - _videoMode.fullscreen = enable; - _transactionDetails.needHotswap = true; - } -} - -void OSystem_SDL::setAspectRatioCorrection(bool enable) { - Common::StackLock lock(_graphicsMutex); - - if (_oldVideoMode.setup && _oldVideoMode.aspectRatioCorrection == enable) - return; - - if (_transactionMode == kTransactionActive) { - _videoMode.aspectRatioCorrection = enable; - _transactionDetails.needHotswap = true; - } -} - -void OSystem_SDL::copyRectToScreen(const byte *src, int pitch, int x, int y, int w, int h) { - assert (_transactionMode == kTransactionNone); - assert(src); - - if (_screen == NULL) { - warning("OSystem_SDL::copyRectToScreen: _screen == NULL"); - return; - } - - Common::StackLock lock(_graphicsMutex); // Lock the mutex until this function ends - - assert(x >= 0 && x < _videoMode.screenWidth); - assert(y >= 0 && y < _videoMode.screenHeight); - assert(h > 0 && y + h <= _videoMode.screenHeight); - assert(w > 0 && x + w <= _videoMode.screenWidth); - - if (IS_ALIGNED(src, 4) && pitch == _videoMode.screenWidth && x == 0 && y == 0 && - w == _videoMode.screenWidth && h == _videoMode.screenHeight && _modeFlags & DF_WANT_RECT_OPTIM) { - /* Special, optimized case for full screen updates. - * It tries to determine what areas were actually changed, - * and just updates those, on the actual display. */ - addDirtyRgnAuto(src); - } else { - _cksumValid = false; - addDirtyRect(x, y, w, h); - } - - // Try to lock the screen surface - if (SDL_LockSurface(_screen) == -1) - error("SDL_LockSurface failed: %s", SDL_GetError()); - -#ifdef USE_RGB_COLOR - byte *dst = (byte *)_screen->pixels + y * _videoMode.screenWidth * _screenFormat.bytesPerPixel + x * _screenFormat.bytesPerPixel; - if (_videoMode.screenWidth == w && pitch == w * _screenFormat.bytesPerPixel) { - memcpy(dst, src, h*w*_screenFormat.bytesPerPixel); - } else { - do { - memcpy(dst, src, w * _screenFormat.bytesPerPixel); - src += pitch; - dst += _videoMode.screenWidth * _screenFormat.bytesPerPixel; - } while (--h); - } -#else - byte *dst = (byte *)_screen->pixels + y * _videoMode.screenWidth + x; - if (_videoMode.screenWidth == pitch && pitch == w) { - memcpy(dst, src, h*w); - } else { - do { - memcpy(dst, src, w); - src += pitch; - dst += _videoMode.screenWidth; - } while (--h); - } -#endif - - // Unlock the screen surface - SDL_UnlockSurface(_screen); -} - -Graphics::Surface *OSystem_SDL::lockScreen() { - assert (_transactionMode == kTransactionNone); - - // Lock the graphics mutex - lockMutex(_graphicsMutex); - - // paranoia check - assert(!_screenIsLocked); - _screenIsLocked = true; - - // Try to lock the screen surface - if (SDL_LockSurface(_screen) == -1) - error("SDL_LockSurface failed: %s", SDL_GetError()); - - _framebuffer.pixels = _screen->pixels; - _framebuffer.w = _screen->w; - _framebuffer.h = _screen->h; - _framebuffer.pitch = _screen->pitch; -#ifdef USE_RGB_COLOR - _framebuffer.bytesPerPixel = _screenFormat.bytesPerPixel; -#else - _framebuffer.bytesPerPixel = 1; -#endif - - return &_framebuffer; -} - -void OSystem_SDL::unlockScreen() { - assert (_transactionMode == kTransactionNone); - - // paranoia check - assert(_screenIsLocked); - _screenIsLocked = false; - - // Unlock the screen surface - SDL_UnlockSurface(_screen); - - // Trigger a full screen update - _forceFull = true; - - // Finally unlock the graphics mutex - unlockMutex(_graphicsMutex); -} - -void OSystem_SDL::addDirtyRect(int x, int y, int w, int h, bool realCoordinates) { - if (_forceFull) - return; - - if (_numDirtyRects == NUM_DIRTY_RECT) { - _forceFull = true; - return; - } - - int height, width; - - if (!_overlayVisible && !realCoordinates) { - width = _videoMode.screenWidth; - height = _videoMode.screenHeight; - } else { - width = _videoMode.overlayWidth; - height = _videoMode.overlayHeight; - } - - // Extend the dirty region by 1 pixel for scalers - // that "smear" the screen, e.g. 2xSAI - if (!realCoordinates) { - x--; - y--; - w+=2; - h+=2; - } - - // clip - if (x < 0) { - w += x; - x = 0; - } - - if (y < 0) { - h += y; - y=0; - } - - if (w > width - x) { - w = width - x; - } - - if (h > height - y) { - h = height - y; - } - -#ifdef USE_SCALERS - if (_videoMode.aspectRatioCorrection && !_overlayVisible && !realCoordinates) { - makeRectStretchable(x, y, w, h); - } -#endif - - if (w == width && h == height) { - _forceFull = true; - return; - } - - if (w > 0 && h > 0) { - SDL_Rect *r = &_dirtyRectList[_numDirtyRects++]; - - r->x = x; - r->y = y; - r->w = w; - r->h = h; - } -} - - -void OSystem_SDL::makeChecksums(const byte *buf) { - assert(buf); - uint32 *sums = _dirtyChecksums; - uint x,y; - const uint last_x = (uint)_videoMode.screenWidth / 8; - const uint last_y = (uint)_videoMode.screenHeight / 8; - - const uint BASE = 65521; /* largest prime smaller than 65536 */ - - /* the 8x8 blocks in buf are enumerated starting in the top left corner and - * reading each line at a time from left to right */ - for (y = 0; y != last_y; y++, buf += _videoMode.screenWidth * (8 - 1)) - for (x = 0; x != last_x; x++, buf += 8) { - // Adler32 checksum algorithm (from RFC1950, used by gzip and zlib). - // This computes the Adler32 checksum of a 8x8 pixel block. Note - // that we can do the modulo operation (which is the slowest part) - // of the algorithm) at the end, instead of doing each iteration, - // since we only have 64 iterations in total - and thus s1 and - // s2 can't overflow anyway. - uint32 s1 = 1; - uint32 s2 = 0; - const byte *ptr = buf; - for (int subY = 0; subY < 8; subY++) { - for (int subX = 0; subX < 8; subX++) { - s1 += ptr[subX]; - s2 += s1; - } - ptr += _videoMode.screenWidth; - } - - s1 %= BASE; - s2 %= BASE; - - /* output the checksum for this block */ - *sums++ = (s2 << 16) + s1; - } -} - -void OSystem_SDL::addDirtyRgnAuto(const byte *buf) { - assert(buf); - assert(IS_ALIGNED(buf, 4)); - - /* generate a table of the checksums */ - makeChecksums(buf); - - if (!_cksumValid) { - _forceFull = true; - _cksumValid = true; - } - - /* go through the checksum list, compare it with the previous checksums, - and add all dirty rectangles to a list. try to combine small rectangles - into bigger ones in a simple way */ - if (!_forceFull) { - int x, y, w; - uint32 *ck = _dirtyChecksums; - - for (y = 0; y != _videoMode.screenHeight / 8; y++) { - for (x = 0; x != _videoMode.screenWidth / 8; x++, ck++) { - if (ck[0] != ck[_cksumNum]) { - /* found a dirty 8x8 block, now go as far to the right as possible, - and at the same time, unmark the dirty status by setting old to new. */ - w=0; - do { - ck[w + _cksumNum] = ck[w]; - w++; - } while (x + w != _videoMode.screenWidth / 8 && ck[w] != ck[w + _cksumNum]); - - addDirtyRect(x * 8, y * 8, w * 8, 8); - - if (_forceFull) - goto get_out; - } - } - } - } else { - get_out:; - /* Copy old checksums to new */ - memcpy(_dirtyChecksums + _cksumNum, _dirtyChecksums, _cksumNum * sizeof(uint32)); - } -} - -int16 OSystem_SDL::getHeight() { - return _videoMode.screenHeight; -} - -int16 OSystem_SDL::getWidth() { - return _videoMode.screenWidth; -} - -void OSystem_SDL::setPalette(const byte *colors, uint start, uint num) { - assert(colors); - -#ifdef USE_RGB_COLOR - assert(_screenFormat.bytesPerPixel == 1); -#endif - - // Setting the palette before _screen is created is allowed - for now - - // since we don't actually set the palette until the screen is updated. - // But it could indicate a programming error, so let's warn about it. - - if (!_screen) - warning("OSystem_SDL::setPalette: _screen == NULL"); - - const byte *b = colors; - uint i; - SDL_Color *base = _currentPalette + start; - for (i = 0; i < num; i++) { - base[i].r = b[0]; - base[i].g = b[1]; - base[i].b = b[2]; - b += 4; - } - - if (start < _paletteDirtyStart) - _paletteDirtyStart = start; - - if (start + num > _paletteDirtyEnd) - _paletteDirtyEnd = start + num; - - // Some games blink cursors with palette - if (_cursorPaletteDisabled) - blitCursor(); -} - -void OSystem_SDL::grabPalette(byte *colors, uint start, uint num) { - assert(colors); - -#ifdef USE_RGB_COLOR - assert(_screenFormat.bytesPerPixel == 1); -#endif - - const SDL_Color *base = _currentPalette + start; - - for (uint i = 0; i < num; ++i) { - colors[i * 4] = base[i].r; - colors[i * 4 + 1] = base[i].g; - colors[i * 4 + 2] = base[i].b; - colors[i * 4 + 3] = 0xFF; - } -} - -void OSystem_SDL::setCursorPalette(const byte *colors, uint start, uint num) { - assert(colors); - const byte *b = colors; - uint i; - SDL_Color *base = _cursorPalette + start; - for (i = 0; i < num; i++) { - base[i].r = b[0]; - base[i].g = b[1]; - base[i].b = b[2]; - b += 4; - } - - _cursorPaletteDisabled = false; - blitCursor(); -} - - -void OSystem_SDL::setShakePos(int shake_pos) { - assert (_transactionMode == kTransactionNone); - - _newShakePos = shake_pos; -} - - -#pragma mark - -#pragma mark --- Overlays --- -#pragma mark - - -void OSystem_SDL::showOverlay() { - assert (_transactionMode == kTransactionNone); - - int x, y; - - if (_overlayVisible) - return; - - _overlayVisible = true; - - // Since resolution could change, put mouse to adjusted position - // Fixes bug #1349059 - x = _mouseCurState.x * _videoMode.scaleFactor; - if (_videoMode.aspectRatioCorrection) - y = real2Aspect(_mouseCurState.y) * _videoMode.scaleFactor; - else - y = _mouseCurState.y * _videoMode.scaleFactor; - - warpMouse(x, y); - - clearOverlay(); -} - -void OSystem_SDL::hideOverlay() { - assert (_transactionMode == kTransactionNone); - - if (!_overlayVisible) - return; - - int x, y; - - _overlayVisible = false; - - // Since resolution could change, put mouse to adjusted position - // Fixes bug #1349059 - x = _mouseCurState.x / _videoMode.scaleFactor; - y = _mouseCurState.y / _videoMode.scaleFactor; - if (_videoMode.aspectRatioCorrection) - y = aspect2Real(y); - - warpMouse(x, y); - - clearOverlay(); - - _forceFull = true; -} - -void OSystem_SDL::clearOverlay() { - //assert (_transactionMode == kTransactionNone); - - Common::StackLock lock(_graphicsMutex); // Lock the mutex until this function ends - - if (!_overlayVisible) - return; - - // Clear the overlay by making the game screen "look through" everywhere. - SDL_Rect src, dst; - src.x = src.y = 0; - dst.x = dst.y = 1; - src.w = dst.w = _videoMode.screenWidth; - src.h = dst.h = _videoMode.screenHeight; - if (SDL_BlitSurface(_screen, &src, _tmpscreen, &dst) != 0) - error("SDL_BlitSurface failed: %s", SDL_GetError()); - - SDL_LockSurface(_tmpscreen); - SDL_LockSurface(_overlayscreen); - _scalerProc((byte *)(_tmpscreen->pixels) + _tmpscreen->pitch + 2, _tmpscreen->pitch, - (byte *)_overlayscreen->pixels, _overlayscreen->pitch, _videoMode.screenWidth, _videoMode.screenHeight); - -#ifdef USE_SCALERS - if (_videoMode.aspectRatioCorrection) - stretch200To240((uint8 *)_overlayscreen->pixels, _overlayscreen->pitch, - _videoMode.overlayWidth, _videoMode.screenHeight * _videoMode.scaleFactor, 0, 0, 0); -#endif - SDL_UnlockSurface(_tmpscreen); - SDL_UnlockSurface(_overlayscreen); - - _forceFull = true; -} - -void OSystem_SDL::grabOverlay(OverlayColor *buf, int pitch) { - assert (_transactionMode == kTransactionNone); - - if (_overlayscreen == NULL) - return; - - if (SDL_LockSurface(_overlayscreen) == -1) - error("SDL_LockSurface failed: %s", SDL_GetError()); - - byte *src = (byte *)_overlayscreen->pixels; - int h = _videoMode.overlayHeight; - do { - memcpy(buf, src, _videoMode.overlayWidth * 2); - src += _overlayscreen->pitch; - buf += pitch; - } while (--h); - - SDL_UnlockSurface(_overlayscreen); -} - -void OSystem_SDL::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { - assert (_transactionMode == kTransactionNone); - - if (_overlayscreen == NULL) - return; - - // Clip the coordinates - if (x < 0) { - w += x; - buf -= x; - x = 0; - } - - if (y < 0) { - h += y; buf -= y * pitch; - y = 0; - } - - if (w > _videoMode.overlayWidth - x) { - w = _videoMode.overlayWidth - x; - } - - if (h > _videoMode.overlayHeight - y) { - h = _videoMode.overlayHeight - y; - } - - if (w <= 0 || h <= 0) - return; - - // Mark the modified region as dirty - _cksumValid = false; - addDirtyRect(x, y, w, h); - - if (SDL_LockSurface(_overlayscreen) == -1) - error("SDL_LockSurface failed: %s", SDL_GetError()); - - byte *dst = (byte *)_overlayscreen->pixels + y * _overlayscreen->pitch + x * 2; - do { - memcpy(dst, buf, w * 2); - dst += _overlayscreen->pitch; - buf += pitch; - } while (--h); - - SDL_UnlockSurface(_overlayscreen); -} - - -#pragma mark - -#pragma mark --- Mouse --- -#pragma mark - - -bool OSystem_SDL::showMouse(bool visible) { - if (_mouseVisible == visible) - return visible; - - bool last = _mouseVisible; - _mouseVisible = visible; - _mouseNeedsRedraw = true; - - return last; -} - -void OSystem_SDL::setMousePos(int x, int y) { - if (x != _mouseCurState.x || y != _mouseCurState.y) { - _mouseNeedsRedraw = true; - _mouseCurState.x = x; - _mouseCurState.y = y; - } -} - -void OSystem_SDL::warpMouse(int x, int y) { - int y1 = y; - - if (_videoMode.aspectRatioCorrection && !_overlayVisible) - y1 = real2Aspect(y); - - if (_mouseCurState.x != x || _mouseCurState.y != y) { - if (!_overlayVisible) - SDL_WarpMouse(x * _videoMode.scaleFactor, y1 * _videoMode.scaleFactor); - else - SDL_WarpMouse(x, y1); - - // SDL_WarpMouse() generates a mouse movement event, so - // setMousePos() would be called eventually. However, the - // cannon script in CoMI calls this function twice each time - // the cannon is reloaded. Unless we update the mouse position - // immediately the second call is ignored, causing the cannon - // to change its aim. - - setMousePos(x, y); - } -} - -void OSystem_SDL::setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format) { -#ifdef USE_RGB_COLOR - if (!format) - _cursorFormat = Graphics::PixelFormat::createFormatCLUT8(); - else if (format->bytesPerPixel <= _screenFormat.bytesPerPixel) - _cursorFormat = *format; - - if (_cursorFormat.bytesPerPixel < 4) - assert(keycolor < (uint)(1 << (_cursorFormat.bytesPerPixel << 3))); -#else - assert(keycolor <= 0xFF); -#endif - - if (w == 0 || h == 0) - return; - - _mouseCurState.hotX = hotspot_x; - _mouseCurState.hotY = hotspot_y; - - _mouseKeyColor = keycolor; - - _cursorTargetScale = cursorTargetScale; - - if (_mouseCurState.w != (int)w || _mouseCurState.h != (int)h) { - _mouseCurState.w = w; - _mouseCurState.h = h; - - if (_mouseOrigSurface) - SDL_FreeSurface(_mouseOrigSurface); - - // Allocate bigger surface because AdvMame2x adds black pixel at [0,0] - _mouseOrigSurface = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, - _mouseCurState.w + 2, - _mouseCurState.h + 2, - 16, - _hwscreen->format->Rmask, - _hwscreen->format->Gmask, - _hwscreen->format->Bmask, - _hwscreen->format->Amask); - - if (_mouseOrigSurface == NULL) - error("allocating _mouseOrigSurface failed"); - SDL_SetColorKey(_mouseOrigSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, kMouseColorKey); - } - - free(_mouseData); -#ifdef USE_RGB_COLOR - _mouseData = (byte *)malloc(w * h * _cursorFormat.bytesPerPixel); - memcpy(_mouseData, buf, w * h * _cursorFormat.bytesPerPixel); -#else - _mouseData = (byte *)malloc(w * h); - memcpy(_mouseData, buf, w * h); -#endif - - blitCursor(); -} - -void OSystem_SDL::blitCursor() { - byte *dstPtr; - const byte *srcPtr = _mouseData; -#ifdef USE_RGB_COLOR - uint32 color; -#else - byte color; -#endif - int w, h, i, j; - - if (!_mouseOrigSurface || !_mouseData) - return; - - _mouseNeedsRedraw = true; - - w = _mouseCurState.w; - h = _mouseCurState.h; - - SDL_LockSurface(_mouseOrigSurface); - - // Make whole surface transparent - for (i = 0; i < h + 2; i++) { - dstPtr = (byte *)_mouseOrigSurface->pixels + _mouseOrigSurface->pitch * i; - for (j = 0; j < w + 2; j++) { - *(uint16 *)dstPtr = kMouseColorKey; - dstPtr += 2; - } - } - - // Draw from [1,1] since AdvMame2x adds artefact at 0,0 - dstPtr = (byte *)_mouseOrigSurface->pixels + _mouseOrigSurface->pitch + 2; - - SDL_Color *palette; - - if (_cursorPaletteDisabled) - palette = _currentPalette; - else - palette = _cursorPalette; - - for (i = 0; i < h; i++) { - for (j = 0; j < w; j++) { -#ifdef USE_RGB_COLOR - if (_cursorFormat.bytesPerPixel > 1) { - if (_cursorFormat.bytesPerPixel == 2) - color = *(const uint16 *)srcPtr; - else - color = *(const uint32 *)srcPtr; - if (color != _mouseKeyColor) { // transparent, don't draw - uint8 r, g, b; - _cursorFormat.colorToRGB(color, r, g, b); - *(uint16 *)dstPtr = SDL_MapRGB(_mouseOrigSurface->format, - r, g, b); - } - dstPtr += 2; - srcPtr += _cursorFormat.bytesPerPixel; - } else { -#endif - color = *srcPtr; - if (color != _mouseKeyColor) { // transparent, don't draw - *(uint16 *)dstPtr = SDL_MapRGB(_mouseOrigSurface->format, - palette[color].r, palette[color].g, palette[color].b); - } - dstPtr += 2; - srcPtr++; -#ifdef USE_RGB_COLOR - } -#endif - } - dstPtr += _mouseOrigSurface->pitch - w * 2; - } - - int rW, rH; - - if (_cursorTargetScale >= _videoMode.scaleFactor) { - // The cursor target scale is greater or equal to the scale at - // which the rest of the screen is drawn. We do not downscale - // the cursor image, we draw it at its original size. It will - // appear too large on screen. - - rW = w; - rH = h; - _mouseCurState.rHotX = _mouseCurState.hotX; - _mouseCurState.rHotY = _mouseCurState.hotY; - - // The virtual dimensions may be larger than the original. - - _mouseCurState.vW = w * _cursorTargetScale / _videoMode.scaleFactor; - _mouseCurState.vH = h * _cursorTargetScale / _videoMode.scaleFactor; - _mouseCurState.vHotX = _mouseCurState.hotX * _cursorTargetScale / - _videoMode.scaleFactor; - _mouseCurState.vHotY = _mouseCurState.hotY * _cursorTargetScale / - _videoMode.scaleFactor; - } else { - // The cursor target scale is smaller than the scale at which - // the rest of the screen is drawn. We scale up the cursor - // image to make it appear correct. - - rW = w * _videoMode.scaleFactor / _cursorTargetScale; - rH = h * _videoMode.scaleFactor / _cursorTargetScale; - _mouseCurState.rHotX = _mouseCurState.hotX * _videoMode.scaleFactor / - _cursorTargetScale; - _mouseCurState.rHotY = _mouseCurState.hotY * _videoMode.scaleFactor / - _cursorTargetScale; - - // The virtual dimensions will be the same as the original. - - _mouseCurState.vW = w; - _mouseCurState.vH = h; - _mouseCurState.vHotX = _mouseCurState.hotX; - _mouseCurState.vHotY = _mouseCurState.hotY; - } - -#ifdef USE_SCALERS - int rH1 = rH; // store original to pass to aspect-correction function later -#endif - - if (_videoMode.aspectRatioCorrection && _cursorTargetScale == 1) { - rH = real2Aspect(rH - 1) + 1; - _mouseCurState.rHotY = real2Aspect(_mouseCurState.rHotY); - } - - if (_mouseCurState.rW != rW || _mouseCurState.rH != rH) { - _mouseCurState.rW = rW; - _mouseCurState.rH = rH; - - if (_mouseSurface) - SDL_FreeSurface(_mouseSurface); - - _mouseSurface = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, - _mouseCurState.rW, - _mouseCurState.rH, - 16, - _hwscreen->format->Rmask, - _hwscreen->format->Gmask, - _hwscreen->format->Bmask, - _hwscreen->format->Amask); - - if (_mouseSurface == NULL) - error("allocating _mouseSurface failed"); - - SDL_SetColorKey(_mouseSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, kMouseColorKey); - } - - SDL_LockSurface(_mouseSurface); - - ScalerProc *scalerProc; - - // If possible, use the same scaler for the cursor as for the rest of - // the game. This only works well with the non-blurring scalers so we - // actually only use the 1x, 1.5x, 2x and AdvMame scalers. - - if (_cursorTargetScale == 1 && (_videoMode.mode == GFX_DOUBLESIZE || _videoMode.mode == GFX_TRIPLESIZE)) - scalerProc = _scalerProc; - else - scalerProc = scalersMagn[_cursorTargetScale - 1][_videoMode.scaleFactor - 1]; - - scalerProc((byte *)_mouseOrigSurface->pixels + _mouseOrigSurface->pitch + 2, - _mouseOrigSurface->pitch, (byte *)_mouseSurface->pixels, _mouseSurface->pitch, - _mouseCurState.w, _mouseCurState.h); - -#ifdef USE_SCALERS - if (_videoMode.aspectRatioCorrection && _cursorTargetScale == 1) - cursorStretch200To240((uint8 *)_mouseSurface->pixels, _mouseSurface->pitch, rW, rH1, 0, 0, 0); -#endif - - SDL_UnlockSurface(_mouseSurface); - SDL_UnlockSurface(_mouseOrigSurface); -} - -#ifdef USE_SCALERS -// Basically it is kVeryFastAndUglyAspectMode of stretch200To240 from -// common/scale/aspect.cpp -static int cursorStretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY) { - int maxDstY = real2Aspect(origSrcY + height - 1); - int y; - const uint8 *startSrcPtr = buf + srcX * 2 + (srcY - origSrcY) * pitch; - uint8 *dstPtr = buf + srcX * 2 + maxDstY * pitch; - - for (y = maxDstY; y >= srcY; y--) { - const uint8 *srcPtr = startSrcPtr + aspect2Real(y) * pitch; - - if (srcPtr == dstPtr) - break; - memcpy(dstPtr, srcPtr, width * 2); - dstPtr -= pitch; - } - - return 1 + maxDstY - srcY; -} -#endif - -void OSystem_SDL::toggleMouseGrab() { - if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) - SDL_WM_GrabInput(SDL_GRAB_ON); - else - SDL_WM_GrabInput(SDL_GRAB_OFF); -} - -void OSystem_SDL::undrawMouse() { - const int x = _mouseBackup.x; - const int y = _mouseBackup.y; - - // When we switch bigger overlay off mouse jumps. Argh! - // This is intended to prevent undrawing offscreen mouse - if (!_overlayVisible && (x >= _videoMode.screenWidth || y >= _videoMode.screenHeight)) - return; - - if (_mouseBackup.w != 0 && _mouseBackup.h != 0) - addDirtyRect(x, y, _mouseBackup.w, _mouseBackup.h); -} - -void OSystem_SDL::drawMouse() { - if (!_mouseVisible || !_mouseSurface) { - _mouseBackup.x = _mouseBackup.y = _mouseBackup.w = _mouseBackup.h = 0; - return; - } - - SDL_Rect dst; - int scale; - int width, height; - int hotX, hotY; - - dst.x = _mouseCurState.x; - dst.y = _mouseCurState.y; - - if (!_overlayVisible) { - scale = _videoMode.scaleFactor; - width = _videoMode.screenWidth; - height = _videoMode.screenHeight; - dst.w = _mouseCurState.vW; - dst.h = _mouseCurState.vH; - hotX = _mouseCurState.vHotX; - hotY = _mouseCurState.vHotY; - } else { - scale = 1; - width = _videoMode.overlayWidth; - height = _videoMode.overlayHeight; - dst.w = _mouseCurState.rW; - dst.h = _mouseCurState.rH; - hotX = _mouseCurState.rHotX; - hotY = _mouseCurState.rHotY; - } - - // The mouse is undrawn using virtual coordinates, i.e. they may be - // scaled and aspect-ratio corrected. - - _mouseBackup.x = dst.x - hotX; - _mouseBackup.y = dst.y - hotY; - _mouseBackup.w = dst.w; - _mouseBackup.h = dst.h; - - // We draw the pre-scaled cursor image, so now we need to adjust for - // scaling, shake position and aspect ratio correction manually. - - if (!_overlayVisible) { - dst.y += _currentShakePos; - } - - if (_videoMode.aspectRatioCorrection && !_overlayVisible) - dst.y = real2Aspect(dst.y); - - dst.x = scale * dst.x - _mouseCurState.rHotX; - dst.y = scale * dst.y - _mouseCurState.rHotY; - dst.w = _mouseCurState.rW; - dst.h = _mouseCurState.rH; - - // Note that SDL_BlitSurface() and addDirtyRect() will both perform any - // clipping necessary - - if (SDL_BlitSurface(_mouseSurface, NULL, _hwscreen, &dst) != 0) - error("SDL_BlitSurface failed: %s", SDL_GetError()); - - // The screen will be updated using real surface coordinates, i.e. - // they will not be scaled or aspect-ratio corrected. - - addDirtyRect(dst.x, dst.y, dst.w, dst.h, true); -} - -#pragma mark - -#pragma mark --- On Screen Display --- -#pragma mark - - -#ifdef USE_OSD -void OSystem_SDL::displayMessageOnOSD(const char *msg) { - assert (_transactionMode == kTransactionNone); - assert(msg); - - Common::StackLock lock(_graphicsMutex); // Lock the mutex until this function ends - - uint i; - - // Lock the OSD surface for drawing - if (SDL_LockSurface(_osdSurface)) - error("displayMessageOnOSD: SDL_LockSurface failed: %s", SDL_GetError()); - - Graphics::Surface dst; - dst.pixels = _osdSurface->pixels; - dst.w = _osdSurface->w; - dst.h = _osdSurface->h; - dst.pitch = _osdSurface->pitch; - dst.bytesPerPixel = _osdSurface->format->BytesPerPixel; - - // The font we are going to use: - const Graphics::Font *font = FontMan.getFontByUsage(Graphics::FontManager::kOSDFont); - - // Clear everything with the "transparent" color, i.e. the colorkey - SDL_FillRect(_osdSurface, 0, kOSDColorKey); - - // Split the message into separate lines. - Common::Array lines; - const char *ptr; - for (ptr = msg; *ptr; ++ptr) { - if (*ptr == '\n') { - lines.push_back(Common::String(msg, ptr - msg)); - msg = ptr + 1; - } - } - lines.push_back(Common::String(msg, ptr - msg)); - - // Determine a rect which would contain the message string (clipped to the - // screen dimensions). - const int vOffset = 6; - const int lineSpacing = 1; - const int lineHeight = font->getFontHeight() + 2 * lineSpacing; - int width = 0; - int height = lineHeight * lines.size() + 2 * vOffset; - for (i = 0; i < lines.size(); i++) { - width = MAX(width, font->getStringWidth(lines[i]) + 14); - } - - // Clip the rect - if (width > dst.w) - width = dst.w; - if (height > dst.h) - height = dst.h; - - // Draw a dark gray rect - // TODO: Rounded corners ? Border? - SDL_Rect osdRect; - osdRect.x = (dst.w - width) / 2; - osdRect.y = (dst.h - height) / 2; - osdRect.w = width; - osdRect.h = height; - SDL_FillRect(_osdSurface, &osdRect, SDL_MapRGB(_osdSurface->format, 64, 64, 64)); - - // Render the message, centered, and in white - for (i = 0; i < lines.size(); i++) { - font->drawString(&dst, lines[i], - osdRect.x, osdRect.y + i * lineHeight + vOffset + lineSpacing, osdRect.w, - SDL_MapRGB(_osdSurface->format, 255, 255, 255), - Graphics::kTextAlignCenter); - } - - // Finished drawing, so unlock the OSD surface again - SDL_UnlockSurface(_osdSurface); - - // Init the OSD display parameters, and the fade out - _osdAlpha = SDL_ALPHA_TRANSPARENT + kOSDInitialAlpha * (SDL_ALPHA_OPAQUE - SDL_ALPHA_TRANSPARENT) / 100; - _osdFadeStartTime = SDL_GetTicks() + kOSDFadeOutDelay; - SDL_SetAlpha(_osdSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, _osdAlpha); - - // Ensure a full redraw takes place next time the screen is updated - _forceFull = true; -} -#endif - - -#pragma mark - -#pragma mark --- Misc --- -#pragma mark - - -bool OSystem_SDL::handleScalerHotkeys(const SDL_KeyboardEvent &key) { - // Ctrl-Alt-a toggles aspect ratio correction - if (key.keysym.sym == 'a') { - beginGFXTransaction(); - setFeatureState(kFeatureAspectRatioCorrection, !_videoMode.aspectRatioCorrection); - endGFXTransaction(); -#ifdef USE_OSD - char buffer[128]; - if (_videoMode.aspectRatioCorrection) - sprintf(buffer, "Enabled aspect ratio correction\n%d x %d -> %d x %d", - _videoMode.screenWidth, _videoMode.screenHeight, - _hwscreen->w, _hwscreen->h - ); - else - sprintf(buffer, "Disabled aspect ratio correction\n%d x %d -> %d x %d", - _videoMode.screenWidth, _videoMode.screenHeight, - _hwscreen->w, _hwscreen->h - ); - displayMessageOnOSD(buffer); -#endif - internUpdateScreen(); - return true; - } - - int newMode = -1; - int factor = _videoMode.scaleFactor - 1; - - // Increase/decrease the scale factor - if (key.keysym.sym == SDLK_EQUALS || key.keysym.sym == SDLK_PLUS || key.keysym.sym == SDLK_MINUS || - key.keysym.sym == SDLK_KP_PLUS || key.keysym.sym == SDLK_KP_MINUS) { - factor += (key.keysym.sym == SDLK_MINUS || key.keysym.sym == SDLK_KP_MINUS) ? -1 : +1; - if (0 <= factor && factor <= 3) { - newMode = s_gfxModeSwitchTable[_scalerType][factor]; - } - } - - const bool isNormalNumber = (SDLK_1 <= key.keysym.sym && key.keysym.sym <= SDLK_9); - const bool isKeypadNumber = (SDLK_KP1 <= key.keysym.sym && key.keysym.sym <= SDLK_KP9); - if (isNormalNumber || isKeypadNumber) { - _scalerType = key.keysym.sym - (isNormalNumber ? SDLK_1 : SDLK_KP1); - if (_scalerType >= ARRAYSIZE(s_gfxModeSwitchTable)) - return false; - - while (s_gfxModeSwitchTable[_scalerType][factor] < 0) { - assert(factor > 0); - factor--; - } - newMode = s_gfxModeSwitchTable[_scalerType][factor]; - } - - if (newMode >= 0) { - beginGFXTransaction(); - setGraphicsMode(newMode); - endGFXTransaction(); -#ifdef USE_OSD - if (_osdSurface) { - const char *newScalerName = 0; - const GraphicsMode *g = getSupportedGraphicsModes(); - while (g->name) { - if (g->id == _videoMode.mode) { - newScalerName = g->description; - break; - } - g++; - } - if (newScalerName) { - char buffer[128]; - sprintf(buffer, "Active graphics filter: %s\n%d x %d -> %d x %d", - newScalerName, - _videoMode.screenWidth, _videoMode.screenHeight, - _hwscreen->w, _hwscreen->h - ); - displayMessageOnOSD(buffer); - } - } -#endif - internUpdateScreen(); - - return true; - } else { - return false; - } -} - -bool OSystem_SDL::isScalerHotkey(const Common::Event &event) { - if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) { - const bool isNormalNumber = (Common::KEYCODE_1 <= event.kbd.keycode && event.kbd.keycode <= Common::KEYCODE_9); - const bool isKeypadNumber = (Common::KEYCODE_KP1 <= event.kbd.keycode && event.kbd.keycode <= Common::KEYCODE_KP9); - const bool isScaleKey = (event.kbd.keycode == Common::KEYCODE_EQUALS || event.kbd.keycode == Common::KEYCODE_PLUS || event.kbd.keycode == Common::KEYCODE_MINUS || - event.kbd.keycode == Common::KEYCODE_KP_PLUS || event.kbd.keycode == Common::KEYCODE_KP_MINUS); - - if (isNormalNumber || isKeypadNumber) { - int keyValue = event.kbd.keycode - (isNormalNumber ? Common::KEYCODE_1 : Common::KEYCODE_KP1); - if (keyValue >= ARRAYSIZE(s_gfxModeSwitchTable)) - return false; - } - return (isScaleKey || event.kbd.keycode == 'a'); - } - return false; -} diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index f6ec769253..a9cce272aa 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -2,7 +2,6 @@ MODULE := backends/platform/sdl MODULE_OBJS := \ events.o \ - graphics.o \ hardwarekeys.o \ main.o \ sdl.o diff --git a/backends/platform/sdl/mutex.cpp b/backends/platform/sdl/mutex.cpp deleted file mode 100644 index 28a495cbd9..0000000000 --- a/backends/platform/sdl/mutex.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "backends/platform/sdl/mutex.h" - -SdlSubSys_Mutex::SdlSubSys_Mutex() - : - _inited(false), - _graphicsMutex(0) { - -} - -SdlSubSys_Mutex::~SdlSubSys_Mutex() { - if (_inited) { - mutexDone(); - } -} - -void SdlSubSys_Mutex::mutexInit() { - if (_inited) { - return; - } - - _graphicsMutex = createMutex(); - - _inited = true; -} - -void SdlSubSys_Mutex::mutexDone() { - deleteMutex(_graphicsMutex); - - _inited = false; -} - -bool SdlSubSys_Mutex::hasFeature(Feature f) { - return false; -} - -void SdlSubSys_Mutex::setFeatureState(Feature f, bool enable) { - -} - -bool SdlSubSys_Mutex::getFeatureState(Feature f) { - return false; -} - -OSystem::MutexRef SdlSubSys_Mutex::createMutex() { - return (MutexRef) SDL_CreateMutex(); -} - -void SdlSubSys_Mutex::lockMutex(MutexRef mutex) { - SDL_mutexP((SDL_mutex *) mutex); -} - -void SdlSubSys_Mutex::unlockMutex(MutexRef mutex) { - SDL_mutexV((SDL_mutex *) mutex); -} - -void SdlSubSys_Mutex::deleteMutex(MutexRef mutex) { - SDL_DestroyMutex((SDL_mutex *) mutex); -} diff --git a/backends/platform/sdl/mutex.h b/backends/platform/sdl/mutex.h deleted file mode 100644 index 0f53a6067a..0000000000 --- a/backends/platform/sdl/mutex.h +++ /dev/null @@ -1,66 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef BACKENDS_SDL_SUBSYS_MUTEX_H -#define BACKENDS_SDL_SUBSYS_MUTEX_H - -#include "backends/base-subsys-mutex.h" - -#if defined(__SYMBIAN32__) -#include -#else -#include -#endif - -class SdlSubSys_Mutex : public BaseSubSys_Mutex { -public: - SdlSubSys_Mutex(); - ~SdlSubSys_Mutex(); - - virtual void mutexInit(); - virtual void mutexDone(); - - bool hasFeature(Feature f); - void setFeatureState(Feature f, bool enable); - bool getFeatureState(Feature f); - - // Mutex handling - MutexRef createMutex(); - void lockMutex(MutexRef mutex); - void unlockMutex(MutexRef mutex); - void deleteMutex(MutexRef mutex); - -protected: - bool _inited; - - /** - * Mutex which prevents multiple threads from interfering with each other - * when accessing the screen. - */ - MutexRef _graphicsMutex; -}; - - -#endif diff --git a/backends/platform/sdl/timer.cpp b/backends/platform/sdl/timer.cpp deleted file mode 100644 index 865c64826d..0000000000 --- a/backends/platform/sdl/timer.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "backends/platform/sdl/timer.h" -#include "backends/timer/default/default-timer.h" -#include "common/EventRecorder.h" -#include // for getTimeAndDate() - -static Uint32 timer_handler(Uint32 interval, void *param) { - ((DefaultTimerManager *)param)->handler(); - return interval; -} - -SdlSubSys_Timer::SdlSubSys_Timer() - : - _inited(false), - _timerID(), - _timer(0) { - -} - -SdlSubSys_Timer::~SdlSubSys_Timer() { - if (_inited) { - timerDone(); - } -} - -void SdlSubSys_Timer::timerInit() { - if (_inited) { - return; - } - - if (SDL_InitSubSystem(SDL_INIT_TIMER) == -1) { - error("Could not initialize SDL Timer: %s", SDL_GetError()); - } - - // Create and hook up the timer manager, if none exists yet (we check for - // this to allow subclasses to provide their own). - if (_timer == 0) { - // Note: We could implement a custom SDLTimerManager by using - // SDL_AddTimer. That might yield better timer resolution, but it would - // also change the semantics of a timer: Right now, ScummVM timers - // *never* run in parallel, due to the way they are implemented. If we - // switched to SDL_AddTimer, each timer might run in a separate thread. - // However, not all our code is prepared for that, so we can't just - // switch. Still, it's a potential future change to keep in mind. - _timer = new DefaultTimerManager(); - _timerID = SDL_AddTimer(10, &timer_handler, _timer); - } - - _inited = true; -} - -void SdlSubSys_Timer::timerDone() { - delete _timer; - SDL_RemoveTimer(_timerID); - SDL_QuitSubSystem(SDL_INIT_TIMER); - - _inited = false; -} - -bool SdlSubSys_Timer::hasFeature(Feature f) { - return false; -} - -void SdlSubSys_Timer::setFeatureState(Feature f, bool enable) { - -} - -bool SdlSubSys_Timer::getFeatureState(Feature f) { - return false; -} - -uint32 SdlSubSys_Timer::getMillis() { - uint32 millis = SDL_GetTicks(); - g_eventRec.processMillis(millis); - return millis; -} - -void SdlSubSys_Timer::delayMillis(uint msecs) { - SDL_Delay(msecs); -} - -void SdlSubSys_Timer::getTimeAndDate(TimeDate &td) const { - time_t curTime = time(0); - struct tm t = *localtime(&curTime); - td.tm_sec = t.tm_sec; - td.tm_min = t.tm_min; - td.tm_hour = t.tm_hour; - td.tm_mday = t.tm_mday; - td.tm_mon = t.tm_mon; - td.tm_year = t.tm_year; -} - -Common::TimerManager *SdlSubSys_Timer::getTimerManager() { - assert(_timer); - return _timer; -} diff --git a/backends/platform/sdl/timer.h b/backends/platform/sdl/timer.h deleted file mode 100644 index f624c5cf6e..0000000000 --- a/backends/platform/sdl/timer.h +++ /dev/null @@ -1,66 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef BACKENDS_SDL_SUBSYS_TIMER_H -#define BACKENDS_SDL_SUBSYS_TIMER_H - -#include "backends/base-subsys-timer.h" - -#if defined(__SYMBIAN32__) -#include -#else -#include -#endif - -class SdlSubSys_Timer : public BaseSubSys_Timer { -public: - SdlSubSys_Timer(); - ~SdlSubSys_Timer(); - - virtual void timerInit(); - virtual void timerDone(); - - bool hasFeature(Feature f); - void setFeatureState(Feature f, bool enable); - bool getFeatureState(Feature f); - - // Get the number of milliseconds since the program was started. - uint32 getMillis(); - - // Delay for a specified amount of milliseconds - void delayMillis(uint msecs); - - virtual void getTimeAndDate(TimeDate &t) const; - virtual Common::TimerManager *getTimerManager(); - -protected: - bool _inited; - - SDL_TimerID _timerID; - Common::TimerManager *_timer; -}; - - -#endif -- cgit v1.2.3 From 9d8bff31a4eb90eaac637d21724e5f3693483d4e Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Mon, 7 Jun 2010 03:25:24 +0000 Subject: Moved toggleMouseGrab from SdlGraphicsManager. Disabled some code, will fix later. Added code for access for moved variables and functions in SdlGraphicsManager. svn-id: r49475 --- backends/platform/sdl/events.cpp | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/events.cpp b/backends/platform/sdl/events.cpp index 1965cb3031..9f80557c0c 100644 --- a/backends/platform/sdl/events.cpp +++ b/backends/platform/sdl/events.cpp @@ -76,12 +76,12 @@ void OSystem_SDL::fillMouseEvent(Common::Event &event, int x, int y) { _km.y = y; // Adjust for the screen scaling - if (!_overlayVisible) { + /*if (!_overlayVisible) { // FIXME event.mouse.x /= _videoMode.scaleFactor; event.mouse.y /= _videoMode.scaleFactor; if (_videoMode.aspectRatioCorrection) event.mouse.y = aspect2Real(event.mouse.y); - } + }*/ } void OSystem_SDL::handleKbdMouse() { @@ -184,8 +184,8 @@ bool OSystem_SDL::pollEvent(Common::Event &event) { handleKbdMouse(); // If the screen mode changed, send an Common::EVENT_SCREEN_CHANGED - if (_modeChanged) { - _modeChanged = false; + if (_graphicsManager->_modeChanged) { + _graphicsManager->_modeChanged = false; event.type = Common::EVENT_SCREEN_CHANGED; return true; } @@ -218,7 +218,7 @@ bool OSystem_SDL::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) { return handleJoyAxisMotion(ev, event); case SDL_VIDEOEXPOSE: - _forceFull = true; + _graphicsManager->_forceFull = true; break; case SDL_QUIT: @@ -243,7 +243,8 @@ bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) { event.kbd.flags |= Common::KBD_SCRL; // Alt-Return and Alt-Enter toggle full screen mode - if (event.kbd.hasFlags(Common::KBD_ALT) && (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER)) { + // TODO: make a function in graphics manager for this + /*if (event.kbd.hasFlags(Common::KBD_ALT) && (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER)) { beginGFXTransaction(); setFullscreenMode(!_videoMode.fullscreen); endGFXTransaction(); @@ -255,10 +256,11 @@ bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) { #endif return false; - } + }*/ // Alt-S: Create a screenshot - if (event.kbd.hasFlags(Common::KBD_ALT) && ev.key.keysym.sym == 's') { + // TODO: make a function in graphics manager for this + /*if (event.kbd.hasFlags(Common::KBD_ALT) && ev.key.keysym.sym == 's') { char filename[20]; for (int n = 0;; n++) { @@ -275,7 +277,7 @@ bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) { else printf("Could not save screenshot!\n"); return false; - } + }*/ // Ctrl-m toggles mouse capture if (event.kbd.hasFlags(Common::KBD_CTRL) && ev.key.keysym.sym == 'm') { @@ -310,7 +312,7 @@ bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) { // Ctrl-Alt- will change the GFX mode if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) { - if (handleScalerHotkeys(ev.key)) + if (_graphicsManager->handleScalerHotkeys(ev.key)) return false; } @@ -339,7 +341,7 @@ bool OSystem_SDL::handleKeyUp(SDL_Event &ev, Common::Event &event) { if (_scrollLock) event.kbd.flags |= Common::KBD_SCRL; - if (isScalerHotkey(event)) + if (_graphicsManager->isScalerHotkey(event)) // Swallow these key up events return false; @@ -350,7 +352,7 @@ bool OSystem_SDL::handleMouseMotion(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_MOUSEMOVE; fillMouseEvent(event, ev.motion.x, ev.motion.y); - setMousePos(event.mouse.x, event.mouse.y); + _graphicsManager->setMousePos(event.mouse.x, event.mouse.y); return true; } @@ -570,3 +572,10 @@ bool OSystem_SDL::remapKey(SDL_Event &ev, Common::Event &event) { #endif return false; } + +void OSystem_SDL::toggleMouseGrab() { + if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) + SDL_WM_GrabInput(SDL_GRAB_ON); + else + SDL_WM_GrabInput(SDL_GRAB_OFF); +} -- cgit v1.2.3 From e991cd8c53ad21af037df1e0a16816aeea2d0fe2 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Wed, 9 Jun 2010 20:09:57 +0000 Subject: - Revised abstract AudioCDManager. - Removed AudioCDManager Singleton, and changed code for using AudioCDManager in OSystem. - Added initialization code for new AudioCDManager in BaseBackend and OSystem_SDL. svn-id: r49548 --- backends/platform/sdl/sdl.cpp | 112 ++++++------------------------------------ backends/platform/sdl/sdl.h | 24 ++------- 2 files changed, 19 insertions(+), 117 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 6f82ede114..c662fed2bf 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -157,6 +157,10 @@ void OSystem_SDL::initBackend() { _graphicsManager = new SdlGraphicsManager(); } + if (_audiocdManager == 0) { + _audiocdManager = new SdlAudioCDManager(); + } + #if !defined(MACOSX) && !defined(__SYMBIAN32__) // Setup a custom program icon. // Don't set icon on OS X, as we use a nicer external icon there. @@ -172,7 +176,6 @@ void OSystem_SDL::initBackend() { OSystem_SDL::OSystem_SDL() : - _cdrom(0), _scrollLock(false), _joystick(0), #if MIXER_DOUBLE_BUFFERING @@ -184,7 +187,8 @@ OSystem_SDL::OSystem_SDL() _mixer(0), _timer(0), _mutexManager(0), - _graphicsManager(0) { + _graphicsManager(0), + _audiocdManager(0) { // reset mouse state memset(&_km, 0, sizeof(_km)); @@ -384,11 +388,6 @@ bool OSystem_SDL::getFeatureState(Feature f) { } void OSystem_SDL::deinit() { - if (_cdrom) { - SDL_CDStop(_cdrom); - SDL_CDClose(_cdrom); - } - if (_joystick) SDL_JoystickClose(_joystick); @@ -668,96 +667,6 @@ Audio::Mixer *OSystem_SDL::getMixer() { return _mixer; } -#pragma mark - -#pragma mark --- CD Audio --- -#pragma mark - - -bool OSystem_SDL::openCD(int drive) { - if (SDL_InitSubSystem(SDL_INIT_CDROM) == -1) - _cdrom = NULL; - else { - _cdrom = SDL_CDOpen(drive); - // Did it open? Check if _cdrom is NULL - if (!_cdrom) { - warning("Couldn't open drive: %s", SDL_GetError()); - } else { - _cdNumLoops = 0; - _cdStopTime = 0; - _cdEndTime = 0; - } - } - - return (_cdrom != NULL); -} - -void OSystem_SDL::stopCD() { /* Stop CD Audio in 1/10th of a second */ - _cdStopTime = SDL_GetTicks() + 100; - _cdNumLoops = 0; -} - -void OSystem_SDL::playCD(int track, int num_loops, int start_frame, int duration) { - if (!num_loops && !start_frame) - return; - - if (!_cdrom) - return; - - if (duration > 0) - duration += 5; - - _cdTrack = track; - _cdNumLoops = num_loops; - _cdStartFrame = start_frame; - - SDL_CDStatus(_cdrom); - if (start_frame == 0 && duration == 0) - SDL_CDPlayTracks(_cdrom, track, 0, 1, 0); - else - SDL_CDPlayTracks(_cdrom, track, start_frame, 0, duration); - _cdDuration = duration; - _cdStopTime = 0; - _cdEndTime = SDL_GetTicks() + _cdrom->track[track].length * 1000 / CD_FPS; -} - -bool OSystem_SDL::pollCD() { - if (!_cdrom) - return false; - - return (_cdNumLoops != 0 && (SDL_GetTicks() < _cdEndTime || SDL_CDStatus(_cdrom) == CD_PLAYING)); -} - -void OSystem_SDL::updateCD() { - if (!_cdrom) - return; - - if (_cdStopTime != 0 && SDL_GetTicks() >= _cdStopTime) { - SDL_CDStop(_cdrom); - _cdNumLoops = 0; - _cdStopTime = 0; - return; - } - - if (_cdNumLoops == 0 || SDL_GetTicks() < _cdEndTime) - return; - - if (_cdNumLoops != 1 && SDL_CDStatus(_cdrom) != CD_STOPPED) { - // Wait another second for it to be done - _cdEndTime += 1000; - return; - } - - if (_cdNumLoops > 0) - _cdNumLoops--; - - if (_cdNumLoops != 0) { - if (_cdStartFrame == 0 && _cdDuration == 0) - SDL_CDPlayTracks(_cdrom, _cdTrack, 0, 1, 0); - else - SDL_CDPlayTracks(_cdrom, _cdTrack, _cdStartFrame, 0, _cdDuration); - _cdEndTime = SDL_GetTicks() + _cdrom->track[_cdTrack].length * 1000 / CD_FPS; - } -} - #pragma mark - #pragma mark --- Graphics --- #pragma mark - @@ -900,4 +809,13 @@ int OSystem_SDL::getScreenChangeID() const { void OSystem_SDL::displayMessageOnOSD(const char *msg) { _graphicsManager->displayMessageOnOSD(msg); } + +#pragma mark - +#pragma mark --- AudioCD --- +#pragma mark - + +AudioCDManager *OSystem_SDL::getAudioCD() { + return (AudioCDManager *)_audiocdManager; +} + #endif diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 214a8a988c..ebe8728f51 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -36,6 +36,7 @@ #include "backends/mutex/sdl/sdl-mutex.h" #include "backends/graphics/sdl/sdl-graphics.h" +#include "backends/audiocd/sdl/sdl-audiocd.h" #include "graphics/scaler.h" @@ -69,6 +70,7 @@ public: protected: SdlMutexManager *_mutexManager; SdlGraphicsManager *_graphicsManager; + SdlAudioCDManager *_audiocdManager; public: void beginGFXTransaction(); @@ -164,19 +166,6 @@ public: virtual Audio::Mixer *getMixer(); - // Poll CD status - // Returns true if cd audio is playing - bool pollCD(); - - // Play CD audio track - void playCD(int track, int num_loops, int start_frame, int duration); - - // Stop CD audio track - void stopCD(); - - // Update CD audio status - void updateCD(); - // Quit virtual void quit(); // overloaded by CE backend @@ -210,7 +199,6 @@ public: virtual int getGraphicsMode() const; virtual void setWindowCaption(const char *caption); - virtual bool openCD(int drive); virtual bool hasFeature(Feature f); virtual void setFeatureState(Feature f, bool enable); @@ -228,15 +216,12 @@ public: virtual Common::SeekableReadStream *createConfigReadStream(); virtual Common::WriteStream *createConfigWriteStream(); + virtual AudioCDManager *getAudioCD(); + protected: bool _inited; SDL_AudioSpec _obtainedRate; - // CD Audio - SDL_CD *_cdrom; - int _cdTrack, _cdNumLoops, _cdStartFrame, _cdDuration; - uint32 _cdEndTime, _cdStopTime; - // Keyboard mouse emulation. Disabled by fingolfin 2004-12-18. // I am keeping the rest of the code in for now, since the joystick // code (or rather, "hack") uses it, too. @@ -277,7 +262,6 @@ protected: SDL_TimerID _timerID; Common::TimerManager *_timer; -protected: virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend void toggleMouseGrab(); -- cgit v1.2.3 From 7b63e8ae2505897f5c275bf755ef8384b4cb91a4 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Thu, 10 Jun 2010 03:16:50 +0000 Subject: Made creation of SdlMutexManager earlier than other modules. svn-id: r49555 --- backends/platform/sdl/sdl.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index c662fed2bf..684befa623 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -106,6 +106,12 @@ void OSystem_SDL::initBackend() { // Enable unicode support if possible SDL_EnableUNICODE(1); + // Create and hook up the mutex manager, if none exists yet (we check for + // this to allow subclasses to provide their own). + if (_mutexManager == 0) { + _mutexManager = new SdlMutexManager(); + } + // enable joystick if (joystick_num > -1 && SDL_NumJoysticks() > 0) { printf("Using joystick: %s\n", SDL_JoystickName(0)); @@ -145,12 +151,6 @@ void OSystem_SDL::initBackend() { _timerID = SDL_AddTimer(10, &timer_handler, _timer); } - // Create and hook up the mutex manager, if none exists yet (we check for - // this to allow subclasses to provide their own). - if (_mutexManager == 0) { - _mutexManager = new SdlMutexManager(); - } - // Create and hook up the graphics manager, if none exists yet (we check for // this to allow subclasses to provide their own). if (_graphicsManager == 0) { -- cgit v1.2.3 From e81fb60d34029c761c8b935ceaad3322f7b8bdee Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Fri, 11 Jun 2010 02:50:25 +0000 Subject: Add Common::EventSource inheritance for ModularBackend. OSystem_SDL now subclass from ModularBackend insteand of BaseBackend. Added forceFullRedraw() to SdlGraphicsManager and removed _modeChanged. svn-id: r49590 --- backends/platform/sdl/events.cpp | 12 +- backends/platform/sdl/sdl.cpp | 256 ++++----------------------------------- backends/platform/sdl/sdl.h | 151 ++++------------------- 3 files changed, 52 insertions(+), 367 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/events.cpp b/backends/platform/sdl/events.cpp index 9f80557c0c..fc5332adb5 100644 --- a/backends/platform/sdl/events.cpp +++ b/backends/platform/sdl/events.cpp @@ -184,11 +184,11 @@ bool OSystem_SDL::pollEvent(Common::Event &event) { handleKbdMouse(); // If the screen mode changed, send an Common::EVENT_SCREEN_CHANGED - if (_graphicsManager->_modeChanged) { + /*if (_graphicsManager->_modeChanged) { // TODO: use getScreenChangeID _graphicsManager->_modeChanged = false; event.type = Common::EVENT_SCREEN_CHANGED; return true; - } + }*/ while (SDL_PollEvent(&ev)) { preprocessEvents(&ev); @@ -218,7 +218,7 @@ bool OSystem_SDL::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) { return handleJoyAxisMotion(ev, event); case SDL_VIDEOEXPOSE: - _graphicsManager->_forceFull = true; + ((SdlGraphicsManager *)_graphicsManager)->forceFullRedraw(); break; case SDL_QUIT: @@ -312,7 +312,7 @@ bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) { // Ctrl-Alt- will change the GFX mode if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) { - if (_graphicsManager->handleScalerHotkeys(ev.key)) + if (((SdlGraphicsManager *)_graphicsManager)->handleScalerHotkeys(ev.key)) return false; } @@ -341,7 +341,7 @@ bool OSystem_SDL::handleKeyUp(SDL_Event &ev, Common::Event &event) { if (_scrollLock) event.kbd.flags |= Common::KBD_SCRL; - if (_graphicsManager->isScalerHotkey(event)) + if (((SdlGraphicsManager *)_graphicsManager)->isScalerHotkey(event)) // Swallow these key up events return false; @@ -352,7 +352,7 @@ bool OSystem_SDL::handleMouseMotion(SDL_Event &ev, Common::Event &event) { event.type = Common::EVENT_MOUSEMOVE; fillMouseEvent(event, ev.motion.x, ev.motion.y); - _graphicsManager->setMousePos(event.mouse.x, event.mouse.y); + ((SdlGraphicsManager *)_graphicsManager)->setMousePos(event.mouse.x, event.mouse.y); return true; } diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 684befa623..8ace81c0a6 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -118,13 +118,19 @@ void OSystem_SDL::initBackend() { _joystick = SDL_JoystickOpen(joystick_num); } + // Create and hook up the event manager, if none exists yet (we check for + // this to allow subclasses to provide their own). + if (_eventManager == 0) { + _eventManager = new DefaultEventManager(this); + } + // Create the savefile manager, if none exists yet (we check for this to // allow subclasses to provide their own). - if (_savefile == 0) { + if (_savefileManager == 0) { #ifdef UNIX - _savefile = new POSIXSaveFileManager(); + _savefileManager = new POSIXSaveFileManager(); #else - _savefile = new DefaultSaveFileManager(); + _savefileManager = new DefaultSaveFileManager(); #endif } @@ -141,14 +147,14 @@ void OSystem_SDL::initBackend() { // Create and hook up the timer manager, if none exists yet (we check for // this to allow subclasses to provide their own). - if (_timer == 0) { + if (_timerManager == 0) { // TODO: Implement SdlTimerManager if (SDL_InitSubSystem(SDL_INIT_TIMER) == -1) { error("Could not initialize SDL: %s", SDL_GetError()); } - _timer = new DefaultTimerManager(); - _timerID = SDL_AddTimer(10, &timer_handler, _timer); + _timerManager = new DefaultTimerManager(); + _timerID = SDL_AddTimer(10, &timer_handler, _timerManager); } // Create and hook up the graphics manager, if none exists yet (we check for @@ -158,7 +164,7 @@ void OSystem_SDL::initBackend() { } if (_audiocdManager == 0) { - _audiocdManager = new SdlAudioCDManager(); + _audiocdManager = (AudioCDManager *)new SdlAudioCDManager(); } #if !defined(MACOSX) && !defined(__SYMBIAN32__) @@ -176,19 +182,12 @@ void OSystem_SDL::initBackend() { OSystem_SDL::OSystem_SDL() : - _scrollLock(false), - _joystick(0), #if MIXER_DOUBLE_BUFFERING _soundMutex(0), _soundCond(0), _soundThread(0), _soundThreadIsRunning(false), _soundThreadShouldQuit(false), #endif - _fsFactory(0), - _savefile(0), - _mixer(0), - _timer(0), - _mutexManager(0), - _graphicsManager(0), - _audiocdManager(0) { + _scrollLock(false), + _joystick(0) { // reset mouse state memset(&_km, 0, sizeof(_km)); @@ -212,8 +211,8 @@ OSystem_SDL::~OSystem_SDL() { SDL_RemoveTimer(_timerID); closeMixer(); - delete _savefile; - delete _timer; + delete _savefileManager; + delete _timerManager; } uint32 OSystem_SDL::getMillis() { @@ -237,21 +236,6 @@ void OSystem_SDL::getTimeAndDate(TimeDate &td) const { td.tm_year = t.tm_year; } -Common::TimerManager *OSystem_SDL::getTimerManager() { - assert(_timer); - return _timer; -} - -Common::SaveFileManager *OSystem_SDL::getSavefileManager() { - assert(_savefile); - return _savefile; -} - -FilesystemFactory *OSystem_SDL::getFilesystemFactory() { - assert(_fsFactory); - return _fsFactory; -} - void OSystem_SDL::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { #ifdef DATA_PATH @@ -375,18 +359,6 @@ void OSystem_SDL::setWindowCaption(const char *caption) { SDL_WM_SetCaption(cap.c_str(), cap.c_str()); } -bool OSystem_SDL::hasFeature(Feature f) { - return _graphicsManager->hasFeature(f); -} - -void OSystem_SDL::setFeatureState(Feature f, bool enable) { - _graphicsManager->setFeatureState(f, enable); -} - -bool OSystem_SDL::getFeatureState(Feature f) { - return _graphicsManager->getFeatureState(f); -} - void OSystem_SDL::deinit() { if (_joystick) SDL_JoystickClose(_joystick); @@ -396,14 +368,14 @@ void OSystem_SDL::deinit() { SDL_RemoveTimer(_timerID); closeMixer(); - delete _timer; + delete _timerManager; SDL_Quit(); // Event Manager requires save manager for storing // recorded events delete getEventManager(); - delete _savefile; + delete _savefileManager; } void OSystem_SDL::quit() { @@ -466,26 +438,6 @@ void OSystem_SDL::setupIcon() { free(icon); } -#pragma mark - -#pragma mark --- Mutex --- -#pragma mark - - -OSystem::MutexRef OSystem_SDL::createMutex() { - return _mutexManager->createMutex(); -} - -void OSystem_SDL::lockMutex(MutexRef mutex) { - _mutexManager->lockMutex(mutex); -} - -void OSystem_SDL::unlockMutex(MutexRef mutex) { - _mutexManager->unlockMutex(mutex); -} - -void OSystem_SDL::deleteMutex(MutexRef mutex) { - _mutexManager->deleteMutex(mutex); -} - #pragma mark - #pragma mark --- Audio --- #pragma mark - @@ -585,11 +537,11 @@ void OSystem_SDL::mixCallback(void *arg, byte *samples, int len) { #else void OSystem_SDL::mixCallback(void *sys, byte *samples, int len) { - OSystem_SDL *this_ = (OSystem_SDL *)sys; + ModularBackend *this_ = (ModularBackend *)sys; assert(this_); - assert(this_->_mixer); + assert(this_->getMixer()); - this_->_mixer->mixCallback(samples, len); + ((Audio::MixerImpl *)this_->getMixer())->mixCallback(samples, len); } #endif @@ -625,7 +577,7 @@ void OSystem_SDL::setupMixer() { warning("Could not open audio device: %s", SDL_GetError()); _mixer = new Audio::MixerImpl(this, samplesPerSec); assert(_mixer); - _mixer->setReady(false); + ((Audio::MixerImpl *)_mixer)->setReady(false); } else { // Note: This should be the obtained output rate, but it seems that at // least on some platforms SDL will lie and claim it did get the rate @@ -636,7 +588,7 @@ void OSystem_SDL::setupMixer() { // Create the mixer instance and start the sound processing _mixer = new Audio::MixerImpl(this, samplesPerSec); assert(_mixer); - _mixer->setReady(true); + ((Audio::MixerImpl *)_mixer)->setReady(true); #if MIXER_DOUBLE_BUFFERING initThreadedMixer(_mixer, _obtainedRate.samples * 4); @@ -649,7 +601,7 @@ void OSystem_SDL::setupMixer() { void OSystem_SDL::closeMixer() { if (_mixer) - _mixer->setReady(false); + ((Audio::MixerImpl *)_mixer)->setReady(false); SDL_CloseAudio(); @@ -661,161 +613,3 @@ void OSystem_SDL::closeMixer() { #endif } - -Audio::Mixer *OSystem_SDL::getMixer() { - assert(_mixer); - return _mixer; -} - -#pragma mark - -#pragma mark --- Graphics --- -#pragma mark - - -const OSystem::GraphicsMode *OSystem_SDL::getSupportedGraphicsModes() const { - return _graphicsManager->getSupportedGraphicsModes(); -} - -int OSystem_SDL::getDefaultGraphicsMode() const { - return _graphicsManager->getDefaultGraphicsMode(); -} - -bool OSystem_SDL::setGraphicsMode(int mode) { - return _graphicsManager->setGraphicsMode(mode); -} - -int OSystem_SDL::getGraphicsMode() const { - return _graphicsManager->getGraphicsMode(); -} - -#ifdef USE_RGB_COLOR -Graphics::PixelFormat OSystem_SDL::getScreenFormat() const { - return _graphicsManager->getScreenFormat(); -} - -Common::List OSystem_SDL::getSupportedFormats() { - return _graphicsManager->getSupportedFormats(); -} -#endif - -void OSystem_SDL::beginGFXTransaction() { - _graphicsManager->beginGFXTransaction(); -} - -OSystem::TransactionError OSystem_SDL::endGFXTransaction() { - return _graphicsManager->endGFXTransaction(); -} - -void OSystem_SDL::initSize(uint w, uint h, const Graphics::PixelFormat *format ) { - _graphicsManager->initSize(w, h, format); -} - -int16 OSystem_SDL::getHeight() { - return _graphicsManager->getHeight(); -} - -int16 OSystem_SDL::getWidth() { - return _graphicsManager->getWidth(); -} - -void OSystem_SDL::setPalette(const byte *colors, uint start, uint num) { - _graphicsManager->setPalette(colors, start, num); -} - -void OSystem_SDL::grabPalette(byte *colors, uint start, uint num) { - _graphicsManager->grabPalette(colors, start, num); -} - -void OSystem_SDL::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) { - _graphicsManager->copyRectToScreen(buf, pitch, x, y, w, h); -} - -Graphics::Surface *OSystem_SDL::lockScreen() { - return _graphicsManager->lockScreen(); -} - -void OSystem_SDL::unlockScreen() { - _graphicsManager->unlockScreen(); -} - -/*void OSystem_SDL::fillScreen(uint32 col) { - _graphicsManager->fillScreen(col); -}*/ - -void OSystem_SDL::updateScreen() { - _graphicsManager->updateScreen(); -} - -void OSystem_SDL::setShakePos(int shakeOffset) { - _graphicsManager->setShakePos(shakeOffset); -} - -void OSystem_SDL::showOverlay() { - _graphicsManager->showOverlay(); -} - -void OSystem_SDL::hideOverlay() { - _graphicsManager->hideOverlay(); -} - -Graphics::PixelFormat OSystem_SDL::getOverlayFormat() const { - return _graphicsManager->getOverlayFormat(); -} - -void OSystem_SDL::clearOverlay() { - _graphicsManager->clearOverlay(); -} - -void OSystem_SDL::grabOverlay(OverlayColor *buf, int pitch) { - _graphicsManager->grabOverlay(buf, pitch); -} - -void OSystem_SDL::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { - _graphicsManager->copyRectToOverlay(buf, pitch, x, y, w, h); -} - -int16 OSystem_SDL::getOverlayHeight() { - return _graphicsManager->getOverlayHeight(); -} - -int16 OSystem_SDL::getOverlayWidth() { - return _graphicsManager->getOverlayWidth(); -} - -bool OSystem_SDL::showMouse(bool visible) { - return _graphicsManager->showMouse(visible); -} - -void OSystem_SDL::warpMouse(int x, int y) { - _graphicsManager->warpMouse(x, y); -} - -void OSystem_SDL::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format) { - _graphicsManager->setMouseCursor(buf, w, h, hotspotX, hotspotY, keycolor, cursorTargetScale, format); -} - -void OSystem_SDL::setCursorPalette(const byte *colors, uint start, uint num) { - _graphicsManager->setCursorPalette(colors, start, num); -} - -void OSystem_SDL::disableCursorPalette(bool disable) { - _graphicsManager->disableCursorPalette(disable); -} - -int OSystem_SDL::getScreenChangeID() const { - return _graphicsManager->getScreenChangeID(); -} - -#ifdef USE_OSD -void OSystem_SDL::displayMessageOnOSD(const char *msg) { - _graphicsManager->displayMessageOnOSD(msg); -} - -#pragma mark - -#pragma mark --- AudioCD --- -#pragma mark - - -AudioCDManager *OSystem_SDL::getAudioCD() { - return (AudioCDManager *)_audiocdManager; -} - -#endif diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index ebe8728f51..67ad339da7 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -32,7 +32,7 @@ #include #endif -#include "backends/base-backend.h" +#include "backends/modular-backend.h" #include "backends/mutex/sdl/sdl-mutex.h" #include "backends/graphics/sdl/sdl-graphics.h" @@ -59,165 +59,46 @@ namespace Audio { #define MIXER_DOUBLE_BUFFERING 1 #endif -class OSystem_SDL : public BaseBackend { +class OSystem_SDL : public ModularBackend { public: OSystem_SDL(); virtual ~OSystem_SDL(); virtual void initBackend(); - -protected: - SdlMutexManager *_mutexManager; - SdlGraphicsManager *_graphicsManager; - SdlAudioCDManager *_audiocdManager; - -public: - void beginGFXTransaction(); - TransactionError endGFXTransaction(); - -#ifdef USE_RGB_COLOR - // Game screen - virtual Graphics::PixelFormat getScreenFormat() const; - - // Highest supported - virtual Common::List getSupportedFormats(); -#endif - - // Set the size and format of the video bitmap. - // Typically, 320x200 CLUT8 - virtual void initSize(uint w, uint h, const Graphics::PixelFormat *format); // overloaded by CE backend - - virtual int getScreenChangeID() const; - - // Set colors of the palette - void setPalette(const byte *colors, uint start, uint num); - - // Get colors of the palette - void grabPalette(byte *colors, uint start, uint num); - - // Draw a bitmap to screen. - // The screen will not be updated to reflect the new bitmap - virtual void copyRectToScreen(const byte *src, int pitch, int x, int y, int w, int h); // overloaded by CE backend (FIXME) - - virtual Graphics::Surface *lockScreen(); - virtual void unlockScreen(); - - // Update the dirty areas of the screen - void updateScreen(); - - // Either show or hide the mouse cursor - bool showMouse(bool visible); - - // Warp the mouse cursor. Where set_mouse_pos() only informs the - // backend of the mouse cursor's current position, this function - // actually moves the cursor to the specified position. - virtual void warpMouse(int x, int y); // overloaded by CE backend (FIXME) - - // Set the bitmap that's used when drawing the cursor. - virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format); // overloaded by CE backend (FIXME) - - // Set colors of cursor palette - void setCursorPalette(const byte *colors, uint start, uint num); - - // Disables or enables cursor palette - void disableCursorPalette(bool disable); - - // Shaking is used in SCUMM. Set current shake position. - void setShakePos(int shake_pos); - // Get the number of milliseconds since the program was started. uint32 getMillis(); // Delay for a specified amount of milliseconds void delayMillis(uint msecs); + virtual void getTimeAndDate(TimeDate &t) const; + // Get the next event. // Returns true if an event was retrieved. virtual bool pollEvent(Common::Event &event); // overloaded by CE backend -protected: - virtual bool dispatchSDLEvent(SDL_Event &ev, Common::Event &event); - - // Handlers for specific SDL events, called by pollEvent. - // This way, if a backend inherits fromt the SDL backend, it can - // change the behavior of only a single event, without having to override all - // of pollEvent. - virtual bool handleKeyDown(SDL_Event &ev, Common::Event &event); - virtual bool handleKeyUp(SDL_Event &ev, Common::Event &event); - virtual bool handleMouseMotion(SDL_Event &ev, Common::Event &event); - virtual bool handleMouseButtonDown(SDL_Event &ev, Common::Event &event); - virtual bool handleMouseButtonUp(SDL_Event &ev, Common::Event &event); - virtual bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event); - virtual bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event); - virtual bool handleJoyAxisMotion(SDL_Event &ev, Common::Event &event); - -public: - - // Define all hardware keys for keymapper virtual Common::HardwareKeySet *getHardwareKeySet(); + virtual void preprocessEvents(SDL_Event *event) {} + // Set function that generates samples virtual void setupMixer(); static void mixCallback(void *s, byte *samples, int len); - virtual void closeMixer(); - virtual Audio::Mixer *getMixer(); - // Quit virtual void quit(); // overloaded by CE backend void deinit(); - virtual void getTimeAndDate(TimeDate &t) const; - virtual Common::TimerManager *getTimerManager(); - - // Mutex handling - MutexRef createMutex(); - void lockMutex(MutexRef mutex); - void unlockMutex(MutexRef mutex); - void deleteMutex(MutexRef mutex); - - // Overlay - virtual Graphics::PixelFormat getOverlayFormat() const; - - virtual void showOverlay(); - virtual void hideOverlay(); - virtual void clearOverlay(); - virtual void grabOverlay(OverlayColor *buf, int pitch); - virtual void copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h); - virtual int16 getHeight(); - virtual int16 getWidth(); - virtual int16 getOverlayHeight(); - virtual int16 getOverlayWidth(); - - virtual const GraphicsMode *getSupportedGraphicsModes() const; - virtual int getDefaultGraphicsMode() const; - virtual bool setGraphicsMode(int mode); - virtual int getGraphicsMode() const; - virtual void setWindowCaption(const char *caption); - virtual bool hasFeature(Feature f); - virtual void setFeatureState(Feature f, bool enable); - virtual bool getFeatureState(Feature f); - virtual void preprocessEvents(SDL_Event *event) {} - -#ifdef USE_OSD - void displayMessageOnOSD(const char *msg); -#endif - - virtual Common::SaveFileManager *getSavefileManager(); - virtual FilesystemFactory *getFilesystemFactory(); virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); - virtual Common::SeekableReadStream *createConfigReadStream(); virtual Common::WriteStream *createConfigWriteStream(); - virtual AudioCDManager *getAudioCD(); - protected: bool _inited; SDL_AudioSpec _obtainedRate; @@ -238,6 +119,21 @@ protected: // joystick SDL_Joystick *_joystick; + virtual bool dispatchSDLEvent(SDL_Event &ev, Common::Event &event); + + // Handlers for specific SDL events, called by pollEvent. + // This way, if a backend inherits fromt the SDL backend, it can + // change the behavior of only a single event, without having to override all + // of pollEvent. + virtual bool handleKeyDown(SDL_Event &ev, Common::Event &event); + virtual bool handleKeyUp(SDL_Event &ev, Common::Event &event); + virtual bool handleMouseMotion(SDL_Event &ev, Common::Event &event); + virtual bool handleMouseButtonDown(SDL_Event &ev, Common::Event &event); + virtual bool handleMouseButtonUp(SDL_Event &ev, Common::Event &event); + virtual bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event); + virtual bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event); + virtual bool handleJoyAxisMotion(SDL_Event &ev, Common::Event &event); + #ifdef MIXER_DOUBLE_BUFFERING SDL_mutex *_soundMutex; SDL_cond *_soundCond; @@ -255,12 +151,7 @@ protected: void deinitThreadedMixer(); #endif - FilesystemFactory *_fsFactory; - Common::SaveFileManager *_savefile; - Audio::MixerImpl *_mixer; - SDL_TimerID _timerID; - Common::TimerManager *_timer; virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend void toggleMouseGrab(); -- cgit v1.2.3 From b49814f274c5634324680567d4d1dfea1d23b698 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Fri, 11 Jun 2010 23:04:57 +0000 Subject: Fixed compilation error on Mac. svn-id: r49600 --- backends/platform/sdl/sdl.cpp | 4 ++-- backends/platform/sdl/sdl.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 8ace81c0a6..43de2303f9 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -457,7 +457,7 @@ void OSystem_SDL::mixerProducerThread() { // Generate samples and put them into the next buffer nextSoundBuffer = _activeSoundBuf ^ 1; - _mixer->mixCallback(_soundBuffers[nextSoundBuffer], _soundBufSize); + ((Audio::MixerImpl *)_mixer)->mixCallback(_soundBuffers[nextSoundBuffer], _soundBufSize); // Swap buffers _activeSoundBuf = nextSoundBuffer; @@ -473,7 +473,7 @@ int SDLCALL OSystem_SDL::mixerProducerThreadEntry(void *arg) { } -void OSystem_SDL::initThreadedMixer(Audio::MixerImpl *mixer, uint bufSize) { +void OSystem_SDL::initThreadedMixer(Audio::Mixer *mixer, uint bufSize) { _soundThreadIsRunning = false; _soundThreadShouldQuit = false; diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 67ad339da7..9cd7da0b4f 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -147,7 +147,7 @@ protected: void mixerProducerThread(); static int SDLCALL mixerProducerThreadEntry(void *arg); - void initThreadedMixer(Audio::MixerImpl *mixer, uint bufSize); + void initThreadedMixer(Audio::Mixer *mixer, uint bufSize); void deinitThreadedMixer(); #endif -- cgit v1.2.3 From 3cfa482b43dcfef774fb0c284bf19ab07cdc4f20 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sat, 12 Jun 2010 02:54:51 +0000 Subject: Created SdlMixerImpl. Added setSampleRate method to Audio::MixerImpl. Updated and removed mixer code in OSystem_SDL for using SdlMixerImpl. svn-id: r49602 --- backends/platform/sdl/sdl.cpp | 198 ++---------------------------------------- backends/platform/sdl/sdl.h | 32 ------- 2 files changed, 7 insertions(+), 223 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 43de2303f9..76e795004d 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -42,17 +42,13 @@ #include "backends/saves/default/default-saves.h" #endif #include "backends/timer/default/default-timer.h" -#include "sound/mixer_intern.h" + +#include "backends/mixer/sdl/sdl-mixer.h" #include "icons/scummvm.xpm" #include // for getTimeAndDate() -//#define SAMPLES_PER_SEC 11025 -#define SAMPLES_PER_SEC 22050 -//#define SAMPLES_PER_SEC 44100 - - /* * Include header files needed for the getFilesystemFactory() method. */ @@ -137,12 +133,11 @@ void OSystem_SDL::initBackend() { // Create and hook up the mixer, if none exists yet (we check for this to // allow subclasses to provide their own). if (_mixer == 0) { - // TODO: Implement SdlAudioManager if (SDL_InitSubSystem(SDL_INIT_AUDIO) == -1) { error("Could not initialize SDL: %s", SDL_GetError()); } - setupMixer(); + _mixer = new SdlMixerImpl(this); } // Create and hook up the timer manager, if none exists yet (we check for @@ -182,10 +177,6 @@ void OSystem_SDL::initBackend() { OSystem_SDL::OSystem_SDL() : -#if MIXER_DOUBLE_BUFFERING - _soundMutex(0), _soundCond(0), _soundThread(0), - _soundThreadIsRunning(false), _soundThreadShouldQuit(false), -#endif _scrollLock(false), _joystick(0) { @@ -209,8 +200,8 @@ OSystem_SDL::OSystem_SDL() OSystem_SDL::~OSystem_SDL() { SDL_RemoveTimer(_timerID); - closeMixer(); - + + delete _mixer; delete _savefileManager; delete _timerManager; } @@ -366,7 +357,8 @@ void OSystem_SDL::deinit() { SDL_ShowCursor(SDL_ENABLE); SDL_RemoveTimer(_timerID); - closeMixer(); + + delete _mixer; delete _timerManager; @@ -437,179 +429,3 @@ void OSystem_SDL::setupIcon() { SDL_FreeSurface(sdl_surf); free(icon); } - -#pragma mark - -#pragma mark --- Audio --- -#pragma mark - - -#if MIXER_DOUBLE_BUFFERING - -void OSystem_SDL::mixerProducerThread() { - byte nextSoundBuffer; - - SDL_LockMutex(_soundMutex); - while (true) { - // Wait till we are allowed to produce data - SDL_CondWait(_soundCond, _soundMutex); - - if (_soundThreadShouldQuit) - break; - - // Generate samples and put them into the next buffer - nextSoundBuffer = _activeSoundBuf ^ 1; - ((Audio::MixerImpl *)_mixer)->mixCallback(_soundBuffers[nextSoundBuffer], _soundBufSize); - - // Swap buffers - _activeSoundBuf = nextSoundBuffer; - } - SDL_UnlockMutex(_soundMutex); -} - -int SDLCALL OSystem_SDL::mixerProducerThreadEntry(void *arg) { - OSystem_SDL *this_ = (OSystem_SDL *)arg; - assert(this_); - this_->mixerProducerThread(); - return 0; -} - - -void OSystem_SDL::initThreadedMixer(Audio::Mixer *mixer, uint bufSize) { - _soundThreadIsRunning = false; - _soundThreadShouldQuit = false; - - // Create mutex and condition variable - _soundMutex = SDL_CreateMutex(); - _soundCond = SDL_CreateCond(); - - // Create two sound buffers - _activeSoundBuf = 0; - _soundBufSize = bufSize; - _soundBuffers[0] = (byte *)calloc(1, bufSize); - _soundBuffers[1] = (byte *)calloc(1, bufSize); - - _soundThreadIsRunning = true; - - // Finally start the thread - _soundThread = SDL_CreateThread(mixerProducerThreadEntry, this); -} - -void OSystem_SDL::deinitThreadedMixer() { - // Kill thread?? _soundThread - - if (_soundThreadIsRunning) { - // Signal the producer thread to end, and wait for it to actually finish. - _soundThreadShouldQuit = true; - SDL_CondBroadcast(_soundCond); - SDL_WaitThread(_soundThread, NULL); - - // Kill the mutex & cond variables. - // Attention: AT this point, the mixer callback must not be running - // anymore, else we will crash! - SDL_DestroyMutex(_soundMutex); - SDL_DestroyCond(_soundCond); - - _soundThreadIsRunning = false; - - free(_soundBuffers[0]); - free(_soundBuffers[1]); - } -} - - -void OSystem_SDL::mixCallback(void *arg, byte *samples, int len) { - OSystem_SDL *this_ = (OSystem_SDL *)arg; - assert(this_); - assert(this_->_mixer); - - assert((int)this_->_soundBufSize == len); - - // Lock mutex, to ensure our data is not overwritten by the producer thread - SDL_LockMutex(this_->_soundMutex); - - // Copy data from the current sound buffer - memcpy(samples, this_->_soundBuffers[this_->_activeSoundBuf], len); - - // Unlock mutex and wake up the produced thread - SDL_UnlockMutex(this_->_soundMutex); - SDL_CondSignal(this_->_soundCond); -} - -#else - -void OSystem_SDL::mixCallback(void *sys, byte *samples, int len) { - ModularBackend *this_ = (ModularBackend *)sys; - assert(this_); - assert(this_->getMixer()); - - ((Audio::MixerImpl *)this_->getMixer())->mixCallback(samples, len); -} - -#endif - -void OSystem_SDL::setupMixer() { - SDL_AudioSpec desired; - - // Determine the desired output sampling frequency. - uint32 samplesPerSec = 0; - if (ConfMan.hasKey("output_rate")) - samplesPerSec = ConfMan.getInt("output_rate"); - if (samplesPerSec <= 0) - samplesPerSec = SAMPLES_PER_SEC; - - // Determine the sample buffer size. We want it to store enough data for - // at least 1/16th of a second (though at most 8192 samples). Note - // that it must be a power of two. So e.g. at 22050 Hz, we request a - // sample buffer size of 2048. - uint32 samples = 8192; - while (samples * 16 > samplesPerSec * 2) - samples >>= 1; - - memset(&desired, 0, sizeof(desired)); - desired.freq = samplesPerSec; - desired.format = AUDIO_S16SYS; - desired.channels = 2; - desired.samples = (uint16)samples; - desired.callback = mixCallback; - desired.userdata = this; - - assert(!_mixer); - if (SDL_OpenAudio(&desired, &_obtainedRate) != 0) { - warning("Could not open audio device: %s", SDL_GetError()); - _mixer = new Audio::MixerImpl(this, samplesPerSec); - assert(_mixer); - ((Audio::MixerImpl *)_mixer)->setReady(false); - } else { - // Note: This should be the obtained output rate, but it seems that at - // least on some platforms SDL will lie and claim it did get the rate - // even if it didn't. Probably only happens for "weird" rates, though. - samplesPerSec = _obtainedRate.freq; - debug(1, "Output sample rate: %d Hz", samplesPerSec); - - // Create the mixer instance and start the sound processing - _mixer = new Audio::MixerImpl(this, samplesPerSec); - assert(_mixer); - ((Audio::MixerImpl *)_mixer)->setReady(true); - -#if MIXER_DOUBLE_BUFFERING - initThreadedMixer(_mixer, _obtainedRate.samples * 4); -#endif - - // start the sound system - SDL_PauseAudio(0); - } -} - -void OSystem_SDL::closeMixer() { - if (_mixer) - ((Audio::MixerImpl *)_mixer)->setReady(false); - - SDL_CloseAudio(); - - delete _mixer; - _mixer = 0; - -#if MIXER_DOUBLE_BUFFERING - deinitThreadedMixer(); -#endif - -} diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 9cd7da0b4f..cb157b003e 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -50,15 +50,6 @@ namespace Audio { #define USE_OSD 1 #endif -#if defined(MACOSX) -// On Mac OS X, we need to double buffer the audio buffer, else anything -// which produces sampled data with high latency (like the MT-32 emulator) -// will sound terribly. -// This could be enabled for more / most ports in the future, but needs some -// testing. -#define MIXER_DOUBLE_BUFFERING 1 -#endif - class OSystem_SDL : public ModularBackend { public: OSystem_SDL(); @@ -83,11 +74,6 @@ public: virtual void preprocessEvents(SDL_Event *event) {} - // Set function that generates samples - virtual void setupMixer(); - static void mixCallback(void *s, byte *samples, int len); - virtual void closeMixer(); - // Quit virtual void quit(); // overloaded by CE backend @@ -101,7 +87,6 @@ public: protected: bool _inited; - SDL_AudioSpec _obtainedRate; // Keyboard mouse emulation. Disabled by fingolfin 2004-12-18. // I am keeping the rest of the code in for now, since the joystick @@ -134,23 +119,6 @@ protected: virtual bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event); virtual bool handleJoyAxisMotion(SDL_Event &ev, Common::Event &event); -#ifdef MIXER_DOUBLE_BUFFERING - SDL_mutex *_soundMutex; - SDL_cond *_soundCond; - SDL_Thread *_soundThread; - bool _soundThreadIsRunning; - bool _soundThreadShouldQuit; - - byte _activeSoundBuf; - uint _soundBufSize; - byte *_soundBuffers[2]; - - void mixerProducerThread(); - static int SDLCALL mixerProducerThreadEntry(void *arg); - void initThreadedMixer(Audio::Mixer *mixer, uint bufSize); - void deinitThreadedMixer(); -#endif - SDL_TimerID _timerID; virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend -- cgit v1.2.3 From 360b82858cd21307a784fe1029825021e076756f Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sun, 13 Jun 2010 20:31:25 +0000 Subject: Added SdlEventManager. svn-id: r49635 --- backends/platform/sdl/events.cpp | 581 --------------------------------------- backends/platform/sdl/sdl.cpp | 38 +-- backends/platform/sdl/sdl.h | 48 +--- 3 files changed, 19 insertions(+), 648 deletions(-) delete mode 100644 backends/platform/sdl/events.cpp (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/events.cpp b/backends/platform/sdl/events.cpp deleted file mode 100644 index fc5332adb5..0000000000 --- a/backends/platform/sdl/events.cpp +++ /dev/null @@ -1,581 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "backends/platform/sdl/sdl.h" -#include "common/util.h" -#include "common/events.h" -#include "graphics/scaler/aspect.h" // for aspect2Real - -// FIXME move joystick defines out and replace with confile file options -// we should really allow users to map any key to a joystick button -#define JOY_DEADZONE 3200 - -#ifndef __SYMBIAN32__ // Symbian wants dialog joystick i.e cursor for movement/selection - #define JOY_ANALOG -#endif - -// #define JOY_INVERT_Y -#define JOY_XAXIS 0 -#define JOY_YAXIS 1 -// buttons -#define JOY_BUT_LMOUSE 0 -#define JOY_BUT_RMOUSE 2 -#define JOY_BUT_ESCAPE 3 -#define JOY_BUT_PERIOD 1 -#define JOY_BUT_SPACE 4 -#define JOY_BUT_F5 5 - - - - -static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) { - if (key >= SDLK_F1 && key <= SDLK_F9) { - return key - SDLK_F1 + Common::ASCII_F1; - } else if (key >= SDLK_KP0 && key <= SDLK_KP9) { - return key - SDLK_KP0 + '0'; - } else if (key >= SDLK_UP && key <= SDLK_PAGEDOWN) { - return key; - } else if (unicode) { - return unicode; - } else if (key >= 'a' && key <= 'z' && (mod & KMOD_SHIFT)) { - return key & ~0x20; - } else if (key >= SDLK_NUMLOCK && key <= SDLK_EURO) { - return 0; - } - return key; -} - -void OSystem_SDL::fillMouseEvent(Common::Event &event, int x, int y) { - event.mouse.x = x; - event.mouse.y = y; - - // Update the "keyboard mouse" coords - _km.x = x; - _km.y = y; - - // Adjust for the screen scaling - /*if (!_overlayVisible) { // FIXME - event.mouse.x /= _videoMode.scaleFactor; - event.mouse.y /= _videoMode.scaleFactor; - if (_videoMode.aspectRatioCorrection) - event.mouse.y = aspect2Real(event.mouse.y); - }*/ -} - -void OSystem_SDL::handleKbdMouse() { - uint32 curTime = getMillis(); - if (curTime >= _km.last_time + _km.delay_time) { - _km.last_time = curTime; - if (_km.x_down_count == 1) { - _km.x_down_time = curTime; - _km.x_down_count = 2; - } - if (_km.y_down_count == 1) { - _km.y_down_time = curTime; - _km.y_down_count = 2; - } - - if (_km.x_vel || _km.y_vel) { - if (_km.x_down_count) { - if (curTime > _km.x_down_time + _km.delay_time * 12) { - if (_km.x_vel > 0) - _km.x_vel++; - else - _km.x_vel--; - } else if (curTime > _km.x_down_time + _km.delay_time * 8) { - if (_km.x_vel > 0) - _km.x_vel = 5; - else - _km.x_vel = -5; - } - } - if (_km.y_down_count) { - if (curTime > _km.y_down_time + _km.delay_time * 12) { - if (_km.y_vel > 0) - _km.y_vel++; - else - _km.y_vel--; - } else if (curTime > _km.y_down_time + _km.delay_time * 8) { - if (_km.y_vel > 0) - _km.y_vel = 5; - else - _km.y_vel = -5; - } - } - - _km.x += _km.x_vel; - _km.y += _km.y_vel; - - if (_km.x < 0) { - _km.x = 0; - _km.x_vel = -1; - _km.x_down_count = 1; - } else if (_km.x > _km.x_max) { - _km.x = _km.x_max; - _km.x_vel = 1; - _km.x_down_count = 1; - } - - if (_km.y < 0) { - _km.y = 0; - _km.y_vel = -1; - _km.y_down_count = 1; - } else if (_km.y > _km.y_max) { - _km.y = _km.y_max; - _km.y_vel = 1; - _km.y_down_count = 1; - } - - SDL_WarpMouse((Uint16)_km.x, (Uint16)_km.y); - } - } -} - -static void SDLModToOSystemKeyFlags(SDLMod mod, Common::Event &event) { - - event.kbd.flags = 0; - -#ifdef LINUPY - // Yopy has no ALT key, steal the SHIFT key - // (which isn't used much anyway) - if (mod & KMOD_SHIFT) - event.kbd.flags |= Common::KBD_ALT; -#else - if (mod & KMOD_SHIFT) - event.kbd.flags |= Common::KBD_SHIFT; - if (mod & KMOD_ALT) - event.kbd.flags |= Common::KBD_ALT; -#endif - if (mod & KMOD_CTRL) - event.kbd.flags |= Common::KBD_CTRL; - - // Sticky flags - if (mod & KMOD_NUM) - event.kbd.flags |= Common::KBD_NUM; - if (mod & KMOD_CAPS) - event.kbd.flags |= Common::KBD_CAPS; -} - -bool OSystem_SDL::pollEvent(Common::Event &event) { - SDL_Event ev; - - handleKbdMouse(); - - // If the screen mode changed, send an Common::EVENT_SCREEN_CHANGED - /*if (_graphicsManager->_modeChanged) { // TODO: use getScreenChangeID - _graphicsManager->_modeChanged = false; - event.type = Common::EVENT_SCREEN_CHANGED; - return true; - }*/ - - while (SDL_PollEvent(&ev)) { - preprocessEvents(&ev); - if (dispatchSDLEvent(ev, event)) - return true; - } - return false; -} - -bool OSystem_SDL::dispatchSDLEvent(SDL_Event &ev, Common::Event &event) { - switch (ev.type) { - case SDL_KEYDOWN: - return handleKeyDown(ev, event); - case SDL_KEYUP: - return handleKeyUp(ev, event); - case SDL_MOUSEMOTION: - return handleMouseMotion(ev, event); - case SDL_MOUSEBUTTONDOWN: - return handleMouseButtonDown(ev, event); - case SDL_MOUSEBUTTONUP: - return handleMouseButtonUp(ev, event); - case SDL_JOYBUTTONDOWN: - return handleJoyButtonDown(ev, event); - case SDL_JOYBUTTONUP: - return handleJoyButtonUp(ev, event); - case SDL_JOYAXISMOTION: - return handleJoyAxisMotion(ev, event); - - case SDL_VIDEOEXPOSE: - ((SdlGraphicsManager *)_graphicsManager)->forceFullRedraw(); - break; - - case SDL_QUIT: - event.type = Common::EVENT_QUIT; - return true; - - } - - return false; -} - - -bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) { - - SDLModToOSystemKeyFlags(SDL_GetModState(), event); - - // Handle scroll lock as a key modifier - if (ev.key.keysym.sym == SDLK_SCROLLOCK) - _scrollLock = !_scrollLock; - - if (_scrollLock) - event.kbd.flags |= Common::KBD_SCRL; - - // Alt-Return and Alt-Enter toggle full screen mode - // TODO: make a function in graphics manager for this - /*if (event.kbd.hasFlags(Common::KBD_ALT) && (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_KP_ENTER)) { - beginGFXTransaction(); - setFullscreenMode(!_videoMode.fullscreen); - endGFXTransaction(); -#ifdef USE_OSD - if (_videoMode.fullscreen) - displayMessageOnOSD("Fullscreen mode"); - else - displayMessageOnOSD("Windowed mode"); -#endif - - return false; - }*/ - - // Alt-S: Create a screenshot - // TODO: make a function in graphics manager for this - /*if (event.kbd.hasFlags(Common::KBD_ALT) && ev.key.keysym.sym == 's') { - char filename[20]; - - for (int n = 0;; n++) { - SDL_RWops *file; - - sprintf(filename, "scummvm%05d.bmp", n); - file = SDL_RWFromFile(filename, "r"); - if (!file) - break; - SDL_RWclose(file); - } - if (saveScreenshot(filename)) - printf("Saved '%s'\n", filename); - else - printf("Could not save screenshot!\n"); - return false; - }*/ - - // Ctrl-m toggles mouse capture - if (event.kbd.hasFlags(Common::KBD_CTRL) && ev.key.keysym.sym == 'm') { - toggleMouseGrab(); - return false; - } - -#if defined(MACOSX) - // On Macintosh', Cmd-Q quits - if ((ev.key.keysym.mod & KMOD_META) && ev.key.keysym.sym == 'q') { - event.type = Common::EVENT_QUIT; - return true; - } -#elif defined(UNIX) - // On other unices, Control-Q quits - if ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym == 'q') { - event.type = Common::EVENT_QUIT; - return true; - } -#else - // Ctrl-z and Alt-X quit - if ((event.kbd.hasFlags(Common::KBD_CTRL) && ev.key.keysym.sym == 'z') || (event.kbd.hasFlags(Common::KBD_ALT) && ev.key.keysym.sym == 'x')) { - event.type = Common::EVENT_QUIT; - return true; - } -#endif - - if ((ev.key.keysym.mod & KMOD_CTRL) && ev.key.keysym.sym == 'u') { - event.type = Common::EVENT_MUTE; - return true; - } - - // Ctrl-Alt- will change the GFX mode - if ((event.kbd.flags & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) { - if (((SdlGraphicsManager *)_graphicsManager)->handleScalerHotkeys(ev.key)) - return false; - } - - if (remapKey(ev, event)) - return true; - - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; - event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); - - return true; -} - -bool OSystem_SDL::handleKeyUp(SDL_Event &ev, Common::Event &event) { - if (remapKey(ev, event)) - return true; - - event.type = Common::EVENT_KEYUP; - event.kbd.keycode = (Common::KeyCode)ev.key.keysym.sym; - event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); - - // Ctrl-Alt- will change the GFX mode - SDLModToOSystemKeyFlags(SDL_GetModState(), event); - - // Set the scroll lock sticky flag - if (_scrollLock) - event.kbd.flags |= Common::KBD_SCRL; - - if (((SdlGraphicsManager *)_graphicsManager)->isScalerHotkey(event)) - // Swallow these key up events - return false; - - return true; -} - -bool OSystem_SDL::handleMouseMotion(SDL_Event &ev, Common::Event &event) { - event.type = Common::EVENT_MOUSEMOVE; - fillMouseEvent(event, ev.motion.x, ev.motion.y); - - ((SdlGraphicsManager *)_graphicsManager)->setMousePos(event.mouse.x, event.mouse.y); - return true; -} - -bool OSystem_SDL::handleMouseButtonDown(SDL_Event &ev, Common::Event &event) { - if (ev.button.button == SDL_BUTTON_LEFT) - event.type = Common::EVENT_LBUTTONDOWN; - else if (ev.button.button == SDL_BUTTON_RIGHT) - event.type = Common::EVENT_RBUTTONDOWN; -#if defined(SDL_BUTTON_WHEELUP) && defined(SDL_BUTTON_WHEELDOWN) - else if (ev.button.button == SDL_BUTTON_WHEELUP) - event.type = Common::EVENT_WHEELUP; - else if (ev.button.button == SDL_BUTTON_WHEELDOWN) - event.type = Common::EVENT_WHEELDOWN; -#endif -#if defined(SDL_BUTTON_MIDDLE) - else if (ev.button.button == SDL_BUTTON_MIDDLE) - event.type = Common::EVENT_MBUTTONDOWN; -#endif - else - return false; - - fillMouseEvent(event, ev.button.x, ev.button.y); - - return true; -} - -bool OSystem_SDL::handleMouseButtonUp(SDL_Event &ev, Common::Event &event) { - if (ev.button.button == SDL_BUTTON_LEFT) - event.type = Common::EVENT_LBUTTONUP; - else if (ev.button.button == SDL_BUTTON_RIGHT) - event.type = Common::EVENT_RBUTTONUP; -#if defined(SDL_BUTTON_MIDDLE) - else if (ev.button.button == SDL_BUTTON_MIDDLE) - event.type = Common::EVENT_MBUTTONUP; -#endif - else - return false; - fillMouseEvent(event, ev.button.x, ev.button.y); - - return true; -} - -bool OSystem_SDL::handleJoyButtonDown(SDL_Event &ev, Common::Event &event) { - if (ev.jbutton.button == JOY_BUT_LMOUSE) { - event.type = Common::EVENT_LBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); - } else if (ev.jbutton.button == JOY_BUT_RMOUSE) { - event.type = Common::EVENT_RBUTTONDOWN; - fillMouseEvent(event, _km.x, _km.y); - } else { - event.type = Common::EVENT_KEYDOWN; - switch (ev.jbutton.button) { - case JOY_BUT_ESCAPE: - event.kbd.keycode = Common::KEYCODE_ESCAPE; - event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); - break; - case JOY_BUT_PERIOD: - event.kbd.keycode = Common::KEYCODE_PERIOD; - event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); - break; - case JOY_BUT_SPACE: - event.kbd.keycode = Common::KEYCODE_SPACE; - event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); - break; - case JOY_BUT_F5: - event.kbd.keycode = Common::KEYCODE_F5; - event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); - break; - } - } - return true; -} - -bool OSystem_SDL::handleJoyButtonUp(SDL_Event &ev, Common::Event &event) { - if (ev.jbutton.button == JOY_BUT_LMOUSE) { - event.type = Common::EVENT_LBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); - } else if (ev.jbutton.button == JOY_BUT_RMOUSE) { - event.type = Common::EVENT_RBUTTONUP; - fillMouseEvent(event, _km.x, _km.y); - } else { - event.type = Common::EVENT_KEYUP; - switch (ev.jbutton.button) { - case JOY_BUT_ESCAPE: - event.kbd.keycode = Common::KEYCODE_ESCAPE; - event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); - break; - case JOY_BUT_PERIOD: - event.kbd.keycode = Common::KEYCODE_PERIOD; - event.kbd.ascii = mapKey(SDLK_PERIOD, ev.key.keysym.mod, 0); - break; - case JOY_BUT_SPACE: - event.kbd.keycode = Common::KEYCODE_SPACE; - event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); - break; - case JOY_BUT_F5: - event.kbd.keycode = Common::KEYCODE_F5; - event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); - break; - } - } - return true; -} - -bool OSystem_SDL::handleJoyAxisMotion(SDL_Event &ev, Common::Event &event) { - int axis = ev.jaxis.value; - if ( axis > JOY_DEADZONE) { - axis -= JOY_DEADZONE; - event.type = Common::EVENT_MOUSEMOVE; - } else if ( axis < -JOY_DEADZONE ) { - axis += JOY_DEADZONE; - event.type = Common::EVENT_MOUSEMOVE; - } else - axis = 0; - - if ( ev.jaxis.axis == JOY_XAXIS) { -#ifdef JOY_ANALOG - _km.x_vel = axis/2000; - _km.x_down_count = 0; -#else - if (axis != 0) { - _km.x_vel = (axis > 0) ? 1:-1; - _km.x_down_count = 1; - } else { - _km.x_vel = 0; - _km.x_down_count = 0; - } -#endif - - } else if (ev.jaxis.axis == JOY_YAXIS) { -#ifndef JOY_INVERT_Y - axis = -axis; -#endif -#ifdef JOY_ANALOG - _km.y_vel = -axis / 2000; - _km.y_down_count = 0; -#else - if (axis != 0) { - _km.y_vel = (-axis > 0) ? 1: -1; - _km.y_down_count = 1; - } else { - _km.y_vel = 0; - _km.y_down_count = 0; - } -#endif - } - - fillMouseEvent(event, _km.x, _km.y); - - return true; -} - -bool OSystem_SDL::remapKey(SDL_Event &ev, Common::Event &event) { -#ifdef LINUPY - // On Yopy map the End button to quit - if ((ev.key.keysym.sym == 293)) { - event.type = Common::EVENT_QUIT; - return true; - } - // Map menu key to f5 (scumm menu) - if (ev.key.keysym.sym == 306) { - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_F5; - event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); - return true; - } - // Map action key to action - if (ev.key.keysym.sym == 291) { - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_TAB; - event.kbd.ascii = mapKey(SDLK_TAB, ev.key.keysym.mod, 0); - return true; - } - // Map OK key to skip cinematic - if (ev.key.keysym.sym == 292) { - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_ESCAPE; - event.kbd.ascii = mapKey(SDLK_ESCAPE, ev.key.keysym.mod, 0); - return true; - } -#endif - -#ifdef QTOPIA - // Quit on fn+backspace on zaurus - if (ev.key.keysym.sym == 127) { - event.type = Common::EVENT_QUIT; - return true; - } - - // Map menu key (f11) to f5 (scumm menu) - if (ev.key.keysym.sym == SDLK_F11) { - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_F5; - event.kbd.ascii = mapKey(SDLK_F5, ev.key.keysym.mod, 0); - } - // Nap center (space) to tab (default action ) - // I wanted to map the calendar button but the calendar comes up - // - else if (ev.key.keysym.sym == SDLK_SPACE) { - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_TAB; - event.kbd.ascii = mapKey(SDLK_TAB, ev.key.keysym.mod, 0); - } - // Since we stole space (pause) above we'll rebind it to the tab key on the keyboard - else if (ev.key.keysym.sym == SDLK_TAB) { - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_SPACE; - event.kbd.ascii = mapKey(SDLK_SPACE, ev.key.keysym.mod, 0); - } else { - // Let the events fall through if we didn't change them, this may not be the best way to - // set it up, but i'm not sure how sdl would like it if we let if fall through then redid it though. - // and yes i have an huge terminal size so i dont wrap soon enough. - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = ev.key.keysym.sym; - event.kbd.ascii = mapKey(ev.key.keysym.sym, ev.key.keysym.mod, ev.key.keysym.unicode); - } -#endif - return false; -} - -void OSystem_SDL::toggleMouseGrab() { - if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) - SDL_WM_GrabInput(SDL_GRAB_ON); - else - SDL_WM_GrabInput(SDL_GRAB_OFF); -} diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 76e795004d..46984d1c8e 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -45,6 +45,8 @@ #include "backends/mixer/sdl/sdl-mixer.h" +#include "backends/events/sdl/sdl-events.h" + #include "icons/scummvm.xpm" #include // for getTimeAndDate() @@ -86,15 +88,11 @@ static Uint32 timer_handler(Uint32 interval, void *param) { void OSystem_SDL::initBackend() { assert(!_inited); - int joystick_num = ConfMan.getInt("joystick_num"); uint32 sdlFlags = 0; if (ConfMan.hasKey("disable_sdl_parachute")) sdlFlags |= SDL_INIT_NOPARACHUTE; - if (joystick_num > -1) - sdlFlags |= SDL_INIT_JOYSTICK; - if (SDL_Init(sdlFlags) == -1) { error("Could not initialize SDL: %s", SDL_GetError()); } @@ -108,16 +106,10 @@ void OSystem_SDL::initBackend() { _mutexManager = new SdlMutexManager(); } - // enable joystick - if (joystick_num > -1 && SDL_NumJoysticks() > 0) { - printf("Using joystick: %s\n", SDL_JoystickName(0)); - _joystick = SDL_JoystickOpen(joystick_num); - } - // Create and hook up the event manager, if none exists yet (we check for // this to allow subclasses to provide their own). if (_eventManager == 0) { - _eventManager = new DefaultEventManager(this); + _eventManager = new SdlEventManager(this); } // Create the savefile manager, if none exists yet (we check for this to @@ -177,14 +169,7 @@ void OSystem_SDL::initBackend() { OSystem_SDL::OSystem_SDL() : - _scrollLock(false), - _joystick(0) { - - // reset mouse state - memset(&_km, 0, sizeof(_km)); - - _inited = false; - + _inited(false) { #if defined(__amigaos4__) _fsFactory = new AmigaOSFilesystemFactory(); #elif defined(UNIX) @@ -351,9 +336,6 @@ void OSystem_SDL::setWindowCaption(const char *caption) { } void OSystem_SDL::deinit() { - if (_joystick) - SDL_JoystickClose(_joystick); - SDL_ShowCursor(SDL_ENABLE); SDL_RemoveTimer(_timerID); @@ -366,7 +348,7 @@ void OSystem_SDL::deinit() { // Event Manager requires save manager for storing // recorded events - delete getEventManager(); + delete _eventManager; delete _savefileManager; } @@ -429,3 +411,13 @@ void OSystem_SDL::setupIcon() { SDL_FreeSurface(sdl_surf); free(icon); } + +SdlGraphicsManager *OSystem_SDL::getGraphicsManager() { + assert(_graphicsManager); + return (SdlGraphicsManager *)_graphicsManager; +} + +bool OSystem_SDL::pollEvent(Common::Event &event) { + assert(_eventManager); + return ((SdlEventManager *)_eventManager)->pollSdlEvent(event); +} diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index cb157b003e..5a621a8645 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -65,15 +65,9 @@ public: virtual void getTimeAndDate(TimeDate &t) const; - // Get the next event. - // Returns true if an event was retrieved. - virtual bool pollEvent(Common::Event &event); // overloaded by CE backend - // Define all hardware keys for keymapper virtual Common::HardwareKeySet *getHardwareKeySet(); - virtual void preprocessEvents(SDL_Event *event) {} - // Quit virtual void quit(); // overloaded by CE backend @@ -85,50 +79,16 @@ public: virtual Common::SeekableReadStream *createConfigReadStream(); virtual Common::WriteStream *createConfigWriteStream(); + SdlGraphicsManager *getGraphicsManager(); + + virtual bool pollEvent(Common::Event &event); + protected: bool _inited; - // Keyboard mouse emulation. Disabled by fingolfin 2004-12-18. - // I am keeping the rest of the code in for now, since the joystick - // code (or rather, "hack") uses it, too. - struct KbdMouse { - int16 x, y, x_vel, y_vel, x_max, y_max, x_down_count, y_down_count; - uint32 last_time, delay_time, x_down_time, y_down_time; - }; - - KbdMouse _km; - - // Scroll lock state - since SDL doesn't track it - bool _scrollLock; - - // joystick - SDL_Joystick *_joystick; - - virtual bool dispatchSDLEvent(SDL_Event &ev, Common::Event &event); - - // Handlers for specific SDL events, called by pollEvent. - // This way, if a backend inherits fromt the SDL backend, it can - // change the behavior of only a single event, without having to override all - // of pollEvent. - virtual bool handleKeyDown(SDL_Event &ev, Common::Event &event); - virtual bool handleKeyUp(SDL_Event &ev, Common::Event &event); - virtual bool handleMouseMotion(SDL_Event &ev, Common::Event &event); - virtual bool handleMouseButtonDown(SDL_Event &ev, Common::Event &event); - virtual bool handleMouseButtonUp(SDL_Event &ev, Common::Event &event); - virtual bool handleJoyButtonDown(SDL_Event &ev, Common::Event &event); - virtual bool handleJoyButtonUp(SDL_Event &ev, Common::Event &event); - virtual bool handleJoyAxisMotion(SDL_Event &ev, Common::Event &event); - SDL_TimerID _timerID; - virtual void fillMouseEvent(Common::Event &event, int x, int y); // overloaded by CE backend - void toggleMouseGrab(); - - void handleKbdMouse(); - void setupIcon(); - - virtual bool remapKey(SDL_Event &ev, Common::Event &event); }; #endif -- cgit v1.2.3 From a77738e53b8c52ebe8bf56fa753692832f851956 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sun, 13 Jun 2010 20:33:54 +0000 Subject: Updated makefiles. svn-id: r49636 --- backends/platform/sdl/module.mk | 1 - 1 file changed, 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index a9cce272aa..0d3928f1ea 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -1,7 +1,6 @@ MODULE := backends/platform/sdl MODULE_OBJS := \ - events.o \ hardwarekeys.o \ main.o \ sdl.o -- cgit v1.2.3 From 77f114b835eaafcc334ad38c407faaa04cb62eb8 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sun, 13 Jun 2010 21:09:52 +0000 Subject: Added SdlTimerManager. Added getMillis, delayMillis and getTimeAndDate to Common::TimerManager, DefaultTimerManager and ModularBackend. Removed timer code from OSystem_SDL. svn-id: r49637 --- backends/platform/sdl/sdl.cpp | 51 +++++-------------------------------------- backends/platform/sdl/sdl.h | 25 --------------------- 2 files changed, 5 insertions(+), 71 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 46984d1c8e..225c3180b7 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -33,7 +33,6 @@ #include "common/archive.h" #include "common/config-manager.h" #include "common/debug.h" -#include "common/EventRecorder.h" #include "common/util.h" #ifdef UNIX @@ -41,16 +40,14 @@ #else #include "backends/saves/default/default-saves.h" #endif -#include "backends/timer/default/default-timer.h" - -#include "backends/mixer/sdl/sdl-mixer.h" - +#include "backends/audiocd/sdl/sdl-audiocd.h" #include "backends/events/sdl/sdl-events.h" +#include "backends/mutex/sdl/sdl-mutex.h" +#include "backends/mixer/sdl/sdl-mixer.h" +#include "backends/timer/sdl/sdl-timer.h" #include "icons/scummvm.xpm" -#include // for getTimeAndDate() - /* * Include header files needed for the getFilesystemFactory() method. */ @@ -62,7 +59,6 @@ #include "backends/fs/windows/windows-fs-factory.h" #endif - #if defined(UNIX) #ifdef MACOSX #define DEFAULT_CONFIG_FILE "Library/Preferences/ScummVM Preferences" @@ -80,11 +76,6 @@ #endif -static Uint32 timer_handler(Uint32 interval, void *param) { - ((DefaultTimerManager *)param)->handler(); - return interval; -} - void OSystem_SDL::initBackend() { assert(!_inited); @@ -135,13 +126,7 @@ void OSystem_SDL::initBackend() { // Create and hook up the timer manager, if none exists yet (we check for // this to allow subclasses to provide their own). if (_timerManager == 0) { - // TODO: Implement SdlTimerManager - if (SDL_InitSubSystem(SDL_INIT_TIMER) == -1) { - error("Could not initialize SDL: %s", SDL_GetError()); - } - - _timerManager = new DefaultTimerManager(); - _timerID = SDL_AddTimer(10, &timer_handler, _timerManager); + _timerManager = new SdlTimerManager(); } // Create and hook up the graphics manager, if none exists yet (we check for @@ -184,34 +169,11 @@ OSystem_SDL::OSystem_SDL() } OSystem_SDL::~OSystem_SDL() { - SDL_RemoveTimer(_timerID); - delete _mixer; delete _savefileManager; delete _timerManager; } -uint32 OSystem_SDL::getMillis() { - uint32 millis = SDL_GetTicks(); - g_eventRec.processMillis(millis); - return millis; -} - -void OSystem_SDL::delayMillis(uint msecs) { - SDL_Delay(msecs); -} - -void OSystem_SDL::getTimeAndDate(TimeDate &td) const { - time_t curTime = time(0); - struct tm t = *localtime(&curTime); - td.tm_sec = t.tm_sec; - td.tm_min = t.tm_min; - td.tm_hour = t.tm_hour; - td.tm_mday = t.tm_mday; - td.tm_mon = t.tm_mon; - td.tm_year = t.tm_year; -} - void OSystem_SDL::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { #ifdef DATA_PATH @@ -241,7 +203,6 @@ void OSystem_SDL::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) } - static Common::String getDefaultConfigFileName() { char configFile[MAXPATHLEN]; #if defined (WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) @@ -338,8 +299,6 @@ void OSystem_SDL::setWindowCaption(const char *caption) { void OSystem_SDL::deinit() { SDL_ShowCursor(SDL_ENABLE); - SDL_RemoveTimer(_timerID); - delete _mixer; delete _timerManager; diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 5a621a8645..8dae6a779c 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -33,22 +33,7 @@ #endif #include "backends/modular-backend.h" - -#include "backends/mutex/sdl/sdl-mutex.h" #include "backends/graphics/sdl/sdl-graphics.h" -#include "backends/audiocd/sdl/sdl-audiocd.h" - -#include "graphics/scaler.h" - - -namespace Audio { - class MixerImpl; -} - -#if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) -// Uncomment this to enable the 'on screen display' code. -#define USE_OSD 1 -#endif class OSystem_SDL : public ModularBackend { public: @@ -57,14 +42,6 @@ public: virtual void initBackend(); - // Get the number of milliseconds since the program was started. - uint32 getMillis(); - - // Delay for a specified amount of milliseconds - void delayMillis(uint msecs); - - virtual void getTimeAndDate(TimeDate &t) const; - // Define all hardware keys for keymapper virtual Common::HardwareKeySet *getHardwareKeySet(); @@ -86,8 +63,6 @@ public: protected: bool _inited; - SDL_TimerID _timerID; - void setupIcon(); }; -- cgit v1.2.3 From d2f9355aee5ad0dae6a2ebf34847901730cc441b Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Tue, 15 Jun 2010 05:15:34 +0000 Subject: Improved ModularBackend and OSystem_SDL destructors. svn-id: r49679 --- backends/platform/sdl/main.cpp | 2 +- backends/platform/sdl/sdl.cpp | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp index 13e614a4a2..69eca9f8a2 100644 --- a/backends/platform/sdl/main.cpp +++ b/backends/platform/sdl/main.cpp @@ -63,7 +63,7 @@ int main(int argc, char *argv[]) { // Invoke the actual ScummVM main entry point: int res = scummvm_main(argc, argv); - ((OSystem_SDL *)g_system)->deinit(); + delete (OSystem_SDL *)g_system; return res; } diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 225c3180b7..37c01dfc1f 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -169,9 +169,7 @@ OSystem_SDL::OSystem_SDL() } OSystem_SDL::~OSystem_SDL() { - delete _mixer; - delete _savefileManager; - delete _timerManager; + deinit(); } void OSystem_SDL::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { @@ -299,16 +297,22 @@ void OSystem_SDL::setWindowCaption(const char *caption) { void OSystem_SDL::deinit() { SDL_ShowCursor(SDL_ENABLE); + delete _eventManager; + _eventManager = 0; + delete _savefileManager; + _savefileManager = 0; + delete _graphicsManager; + _graphicsManager = 0; + delete _audiocdManager; + _audiocdManager = 0; delete _mixer; - + _mixer = 0; delete _timerManager; + _timerManager = 0; + delete _mutexManager; + _mutexManager = 0; SDL_Quit(); - - // Event Manager requires save manager for storing - // recorded events - delete _eventManager; - delete _savefileManager; } void OSystem_SDL::quit() { -- cgit v1.2.3 From 4a850209d739111b539fc39bcf003abd6e061538 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sun, 20 Jun 2010 20:11:30 +0000 Subject: Removed getMillis, delayMillis and getTimeAndDate functions from TimerManager. svn-id: r50095 --- backends/platform/sdl/sdl.cpp | 23 +++++++++++++++++++++++ backends/platform/sdl/sdl.h | 4 ++++ 2 files changed, 27 insertions(+) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 37c01dfc1f..3387503204 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -34,6 +34,7 @@ #include "common/config-manager.h" #include "common/debug.h" #include "common/util.h" +#include "common/EventRecorder.h" #ifdef UNIX #include "backends/saves/posix/posix-saves.h" @@ -75,6 +76,7 @@ #include "CoreFoundation/CoreFoundation.h" #endif +#include void OSystem_SDL::initBackend() { assert(!_inited); @@ -384,3 +386,24 @@ bool OSystem_SDL::pollEvent(Common::Event &event) { assert(_eventManager); return ((SdlEventManager *)_eventManager)->pollSdlEvent(event); } + +uint32 OSystem_SDL::getMillis() { + uint32 millis = SDL_GetTicks(); + g_eventRec.processMillis(millis); + return millis; +} + +void OSystem_SDL::delayMillis(uint msecs) { + SDL_Delay(msecs); +} + +void OSystem_SDL::getTimeAndDate(TimeDate &td) const { + time_t curTime = time(0); + struct tm t = *localtime(&curTime); + td.tm_sec = t.tm_sec; + td.tm_min = t.tm_min; + td.tm_hour = t.tm_hour; + td.tm_mday = t.tm_mday; + td.tm_mon = t.tm_mon; + td.tm_year = t.tm_year; +} diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 8dae6a779c..46053faf46 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -60,6 +60,10 @@ public: virtual bool pollEvent(Common::Event &event); + uint32 getMillis(); + void delayMillis(uint msecs); + void getTimeAndDate(TimeDate &td) const; + protected: bool _inited; -- cgit v1.2.3 From 9d41a45976767a6337d756e547fd9b7c2d6ef4aa Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sun, 20 Jun 2010 22:45:09 +0000 Subject: Created win32 port from sdl backend. svn-id: r50103 --- backends/platform/sdl/main.cpp | 19 +------------------ backends/platform/sdl/sdl.cpp | 4 +--- backends/platform/sdl/sdl.h | 10 ++++++---- 3 files changed, 8 insertions(+), 25 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp index 69eca9f8a2..73e3dc36ae 100644 --- a/backends/platform/sdl/main.cpp +++ b/backends/platform/sdl/main.cpp @@ -23,34 +23,17 @@ * */ -// Fix for bug #2895217 "MSVC compilation broken with r47595": -// We need to keep this on top of the "common/scummsys.h" include, -// otherwise we will get errors about the windows headers redefining -// "ARRAYSIZE" for example. -#if defined(WIN32) && !defined(__SYMBIAN32__) -#include -// winnt.h defines ARRAYSIZE, but we want our own one... -#undef ARRAYSIZE -#endif - #include "common/scummsys.h" // Several SDL based ports use a custom main, and hence do not want to compile // of this file. The following "#if" ensures that. -#if !defined(__MAEMO__) && !defined(_WIN32_WCE) && !defined(GP2XWIZ)&& !defined(LINUXMOTO) && !defined(__SYMBIAN32__) +#if !defined(__MAEMO__) && !defined(_WIN32_WCE) && !defined(GP2XWIZ)&& !defined(LINUXMOTO) && !defined(__SYMBIAN32__) && !defined(WIN32) #include "backends/platform/sdl/sdl.h" #include "backends/plugins/sdl/sdl-provider.h" #include "base/main.h" -#ifdef WIN32 -int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpCmdLine*/, int /*iShowCmd*/) { - SDL_SetModuleHandle(GetModuleHandle(NULL)); - return main(__argc, __argv); -} -#endif - int main(int argc, char *argv[]) { // Create our OSystem instance diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 3387503204..2c1ecd2f27 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -203,7 +203,7 @@ void OSystem_SDL::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) } -static Common::String getDefaultConfigFileName() { +Common::String OSystem_SDL::getDefaultConfigFileName() { char configFile[MAXPATHLEN]; #if defined (WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) OSVERSIONINFO win32OsVersion; @@ -320,9 +320,7 @@ void OSystem_SDL::deinit() { void OSystem_SDL::quit() { deinit(); -#if !defined(SAMSUNGTV) exit(0); -#endif } void OSystem_SDL::setupIcon() { diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 46053faf46..f5289edbe8 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -48,7 +48,7 @@ public: // Quit virtual void quit(); // overloaded by CE backend - void deinit(); + virtual void deinit(); virtual void setWindowCaption(const char *caption); @@ -60,14 +60,16 @@ public: virtual bool pollEvent(Common::Event &event); - uint32 getMillis(); - void delayMillis(uint msecs); - void getTimeAndDate(TimeDate &td) const; + virtual uint32 getMillis(); + virtual void delayMillis(uint msecs); + virtual void getTimeAndDate(TimeDate &td) const; protected: bool _inited; void setupIcon(); + + virtual Common::String getDefaultConfigFileName(); }; #endif -- cgit v1.2.3 From 1811e86648e1afa7951284604f50a6b1557ac738 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Tue, 22 Jun 2010 23:55:25 +0000 Subject: Created posix port subclassed from sdl backend. Removed unnecessary #include in win32.cpp svn-id: r50173 --- backends/platform/sdl/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp index 73e3dc36ae..75e535428a 100644 --- a/backends/platform/sdl/main.cpp +++ b/backends/platform/sdl/main.cpp @@ -27,7 +27,7 @@ // Several SDL based ports use a custom main, and hence do not want to compile // of this file. The following "#if" ensures that. -#if !defined(__MAEMO__) && !defined(_WIN32_WCE) && !defined(GP2XWIZ)&& !defined(LINUXMOTO) && !defined(__SYMBIAN32__) && !defined(WIN32) +#if !defined(__MAEMO__) && !defined(_WIN32_WCE) && !defined(GP2XWIZ)&& !defined(LINUXMOTO) && !defined(__SYMBIAN32__) && !defined(WIN32) && !defined(UNIX) #include "backends/platform/sdl/sdl.h" -- cgit v1.2.3 From 04dce6a10646d1060813c90c9270be46c36c02cd Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Wed, 23 Jun 2010 19:34:07 +0000 Subject: Fixed AudioCDManager not having a public inheritance. Backend code cleanup. svn-id: r50189 --- backends/platform/sdl/sdl.cpp | 222 ++++++++---------------------------------- backends/platform/sdl/sdl.h | 12 +-- 2 files changed, 46 insertions(+), 188 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 2c1ecd2f27..b3b99a2e3a 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -23,12 +23,6 @@ * */ -#if defined(WIN32) -#include -// winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h -#undef ARRAYSIZE -#endif - #include "backends/platform/sdl/sdl.h" #include "common/archive.h" #include "common/config-manager.h" @@ -36,11 +30,7 @@ #include "common/util.h" #include "common/EventRecorder.h" -#ifdef UNIX - #include "backends/saves/posix/posix-saves.h" -#else - #include "backends/saves/default/default-saves.h" -#endif +#include "backends/saves/default/default-saves.h" #include "backends/audiocd/sdl/sdl-audiocd.h" #include "backends/events/sdl/sdl-events.h" #include "backends/mutex/sdl/sdl-mutex.h" @@ -49,129 +39,73 @@ #include "icons/scummvm.xpm" -/* - * Include header files needed for the getFilesystemFactory() method. - */ -#if defined(__amigaos4__) - #include "backends/fs/amigaos4/amigaos4-fs-factory.h" -#elif defined(UNIX) - #include "backends/fs/posix/posix-fs-factory.h" -#elif defined(WIN32) - #include "backends/fs/windows/windows-fs-factory.h" -#endif - -#if defined(UNIX) -#ifdef MACOSX -#define DEFAULT_CONFIG_FILE "Library/Preferences/ScummVM Preferences" -#elif defined(SAMSUNGTV) -#define DEFAULT_CONFIG_FILE "/dtv/usb/sda1/.scummvmrc" -#else -#define DEFAULT_CONFIG_FILE ".scummvmrc" -#endif -#else #define DEFAULT_CONFIG_FILE "scummvm.ini" -#endif - -#if defined(MACOSX) || defined(IPHONE) -#include "CoreFoundation/CoreFoundation.h" -#endif #include -void OSystem_SDL::initBackend() { - assert(!_inited); +OSystem_SDL::OSystem_SDL() + : + _inited(false), + _initedSDL(false) { - uint32 sdlFlags = 0; +} - if (ConfMan.hasKey("disable_sdl_parachute")) - sdlFlags |= SDL_INIT_NOPARACHUTE; +OSystem_SDL::~OSystem_SDL() { + deinit(); +} - if (SDL_Init(sdlFlags) == -1) { - error("Could not initialize SDL: %s", SDL_GetError()); - } +void OSystem_SDL::initBackend() { + // Check if backend has not been initialized + assert(!_inited); - // Enable unicode support if possible - SDL_EnableUNICODE(1); + // Initialize SDL + initSDL(); - // Create and hook up the mutex manager, if none exists yet (we check for - // this to allow subclasses to provide their own). - if (_mutexManager == 0) { + // Creates the backend managers, if they don't exist yet (we check + // for this to allow subclasses to provide their own). + if (_mutexManager == 0) _mutexManager = new SdlMutexManager(); - } - // Create and hook up the event manager, if none exists yet (we check for - // this to allow subclasses to provide their own). - if (_eventManager == 0) { + if (_eventManager == 0) _eventManager = new SdlEventManager(this); - } - // Create the savefile manager, if none exists yet (we check for this to - // allow subclasses to provide their own). - if (_savefileManager == 0) { -#ifdef UNIX - _savefileManager = new POSIXSaveFileManager(); -#else - _savefileManager = new DefaultSaveFileManager(); -#endif - } - - // Create and hook up the mixer, if none exists yet (we check for this to - // allow subclasses to provide their own). - if (_mixer == 0) { - if (SDL_InitSubSystem(SDL_INIT_AUDIO) == -1) { - error("Could not initialize SDL: %s", SDL_GetError()); - } + if (_savefileManager == 0) + _savefileManager = new DefaultSaveFileManager(); + if (_mixer == 0) _mixer = new SdlMixerImpl(this); - } - // Create and hook up the timer manager, if none exists yet (we check for - // this to allow subclasses to provide their own). - if (_timerManager == 0) { + if (_timerManager == 0) _timerManager = new SdlTimerManager(); - } - // Create and hook up the graphics manager, if none exists yet (we check for - // this to allow subclasses to provide their own). - if (_graphicsManager == 0) { + if (_graphicsManager == 0) _graphicsManager = new SdlGraphicsManager(); - } - if (_audiocdManager == 0) { - _audiocdManager = (AudioCDManager *)new SdlAudioCDManager(); - } + if (_audiocdManager == 0) + _audiocdManager = new SdlAudioCDManager(); -#if !defined(MACOSX) && !defined(__SYMBIAN32__) // Setup a custom program icon. - // Don't set icon on OS X, as we use a nicer external icon there. - // Don't for Symbian: it uses the EScummVM.aif file for the icon. setupIcon(); -#endif - - // Invoke parent implementation of this method - OSystem::initBackend(); _inited = true; } -OSystem_SDL::OSystem_SDL() - : - _inited(false) { - #if defined(__amigaos4__) - _fsFactory = new AmigaOSFilesystemFactory(); - #elif defined(UNIX) - _fsFactory = new POSIXFilesystemFactory(); - #elif defined(WIN32) - _fsFactory = new WindowsFilesystemFactory(); - #elif defined(__SYMBIAN32__) - // Do nothing since its handled by the Symbian SDL inheritance - #else - #error Unknown and unsupported FS backend - #endif -} +void OSystem_SDL::initSDL() { + // Check if SDL has not been initialized + if (!_initedSDL) { + uint32 sdlFlags = 0; + if (ConfMan.hasKey("disable_sdl_parachute")) + sdlFlags |= SDL_INIT_NOPARACHUTE; -OSystem_SDL::~OSystem_SDL() { - deinit(); + // Initialize SDL (SDL Subsystems are initiliazed in the corresponding sdl managers) + if (SDL_Init(sdlFlags) == -1) + error("Could not initialize SDL: %s", SDL_GetError()); + + // Enable unicode support if possible + SDL_EnableUNICODE(1); + + _initedSDL = true; + } } void OSystem_SDL::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { @@ -185,86 +119,11 @@ void OSystem_SDL::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) } #endif -#ifdef MACOSX - // Get URL of the Resource directory of the .app bundle - CFURLRef fileUrl = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); - if (fileUrl) { - // Try to convert the URL to an absolute path - UInt8 buf[MAXPATHLEN]; - if (CFURLGetFileSystemRepresentation(fileUrl, true, buf, sizeof(buf))) { - // Success: Add it to the search path - Common::String bundlePath((const char *)buf); - s.add("__OSX_BUNDLE__", new Common::FSDirectory(bundlePath), priority); - } - CFRelease(fileUrl); - } - -#endif - } Common::String OSystem_SDL::getDefaultConfigFileName() { char configFile[MAXPATHLEN]; -#if defined (WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) - OSVERSIONINFO win32OsVersion; - ZeroMemory(&win32OsVersion, sizeof(OSVERSIONINFO)); - win32OsVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&win32OsVersion); - // Check for non-9X version of Windows. - if (win32OsVersion.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS) { - // Use the Application Data directory of the user profile. - if (win32OsVersion.dwMajorVersion >= 5) { - if (!GetEnvironmentVariable("APPDATA", configFile, sizeof(configFile))) - error("Unable to access application data directory"); - } else { - if (!GetEnvironmentVariable("USERPROFILE", configFile, sizeof(configFile))) - error("Unable to access user profile directory"); - - strcat(configFile, "\\Application Data"); - CreateDirectory(configFile, NULL); - } - - strcat(configFile, "\\ScummVM"); - CreateDirectory(configFile, NULL); - strcat(configFile, "\\" DEFAULT_CONFIG_FILE); - - FILE *tmp = NULL; - if ((tmp = fopen(configFile, "r")) == NULL) { - // Check windows directory - char oldConfigFile[MAXPATHLEN]; - GetWindowsDirectory(oldConfigFile, MAXPATHLEN); - strcat(oldConfigFile, "\\" DEFAULT_CONFIG_FILE); - if ((tmp = fopen(oldConfigFile, "r"))) { - strcpy(configFile, oldConfigFile); - - fclose(tmp); - } - } else { - fclose(tmp); - } - } else { - // Check windows directory - GetWindowsDirectory(configFile, MAXPATHLEN); - strcat(configFile, "\\" DEFAULT_CONFIG_FILE); - } -#elif defined(UNIX) - // On UNIX type systems, by default we store the config file inside - // to the HOME directory of the user. - // - // GP2X is Linux based but Home dir can be read only so do not use - // it and put the config in the executable dir. - // - // On the iPhone, the home dir of the user when you launch the app - // from the Springboard, is /. Which we don't want. - const char *home = getenv("HOME"); - if (home != NULL && strlen(home) < MAXPATHLEN) - snprintf(configFile, MAXPATHLEN, "%s/%s", home, DEFAULT_CONFIG_FILE); - else - strcpy(configFile, DEFAULT_CONFIG_FILE); -#else strcpy(configFile, DEFAULT_CONFIG_FILE); -#endif - return configFile; } @@ -319,7 +178,6 @@ void OSystem_SDL::deinit() { void OSystem_SDL::quit() { deinit(); - exit(0); } diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index f5289edbe8..40fbcd9d37 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -42,12 +42,9 @@ public: virtual void initBackend(); - // Define all hardware keys for keymapper virtual Common::HardwareKeySet *getHardwareKeySet(); - // Quit - virtual void quit(); // overloaded by CE backend - + virtual void quit(); virtual void deinit(); virtual void setWindowCaption(const char *caption); @@ -56,7 +53,7 @@ public: virtual Common::SeekableReadStream *createConfigReadStream(); virtual Common::WriteStream *createConfigWriteStream(); - SdlGraphicsManager *getGraphicsManager(); + virtual SdlGraphicsManager *getGraphicsManager(); virtual bool pollEvent(Common::Event &event); @@ -66,8 +63,11 @@ public: protected: bool _inited; + bool _initedSDL; + + virtual void initSDL(); - void setupIcon(); + virtual void setupIcon(); virtual Common::String getDefaultConfigFileName(); }; -- cgit v1.2.3 From 0fb9d3ccfa3c2f0ddaa9019702a0039c96112c34 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Wed, 23 Jun 2010 20:55:36 +0000 Subject: Relocated Win32 and Posix ports. (Part 1) svn-id: r50191 --- backends/platform/sdl/posix/main.cpp | 46 ++++++++++++++++ backends/platform/sdl/posix/module.mk | 11 ++++ backends/platform/sdl/posix/posix.cpp | 76 +++++++++++++++++++++++++++ backends/platform/sdl/posix/posix.h | 42 +++++++++++++++ backends/platform/sdl/win32/main.cpp | 59 +++++++++++++++++++++ backends/platform/sdl/win32/module.mk | 11 ++++ backends/platform/sdl/win32/win32.cpp | 98 +++++++++++++++++++++++++++++++++++ backends/platform/sdl/win32/win32.h | 40 ++++++++++++++ 8 files changed, 383 insertions(+) create mode 100644 backends/platform/sdl/posix/main.cpp create mode 100644 backends/platform/sdl/posix/module.mk create mode 100644 backends/platform/sdl/posix/posix.cpp create mode 100644 backends/platform/sdl/posix/posix.h create mode 100644 backends/platform/sdl/win32/main.cpp create mode 100644 backends/platform/sdl/win32/module.mk create mode 100644 backends/platform/sdl/win32/win32.cpp create mode 100644 backends/platform/sdl/win32/win32.h (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/posix/main.cpp b/backends/platform/sdl/posix/main.cpp new file mode 100644 index 0000000000..35813291c1 --- /dev/null +++ b/backends/platform/sdl/posix/main.cpp @@ -0,0 +1,46 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "common/scummsys.h" + +#include "backends/platform/posix/posix.h" +#include "backends/plugins/sdl/sdl-provider.h" +#include "base/main.h" + +int main(int argc, char *argv[]) { + + // Create our OSystem instance + g_system = new OSystem_POSIX(); + assert(g_system); + +#ifdef DYNAMIC_MODULES + PluginManager::instance().addPluginProvider(new SDLPluginProvider()); +#endif + + // Invoke the actual ScummVM main entry point: + int res = scummvm_main(argc, argv); + delete (OSystem_POSIX *)g_system; + return res; +} diff --git a/backends/platform/sdl/posix/module.mk b/backends/platform/sdl/posix/module.mk new file mode 100644 index 0000000000..b1827c7578 --- /dev/null +++ b/backends/platform/sdl/posix/module.mk @@ -0,0 +1,11 @@ +MODULE := backends/platform/posix + +MODULE_OBJS := \ + main.o \ + posix.o + +MODULE_DIRS += \ + backends/platform/posix/ + +# We don't use the rules.mk here on purpose +OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp new file mode 100644 index 0000000000..61871c7f82 --- /dev/null +++ b/backends/platform/sdl/posix/posix.cpp @@ -0,0 +1,76 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#include "backends/platform/posix/posix.h" +#include "common/archive.h" +#include "common/config-manager.h" +#include "common/debug.h" +#include "common/util.h" +#include "common/EventRecorder.h" + +#include "backends/saves/posix/posix-saves.h" +#include "backends/audiocd/sdl/sdl-audiocd.h" +#include "backends/events/sdl/sdl-events.h" +#include "backends/mutex/sdl/sdl-mutex.h" +#include "backends/mixer/sdl/sdl-mixer.h" +#include "backends/timer/sdl/sdl-timer.h" + +#include "backends/fs/posix/posix-fs-factory.h" + +#define DEFAULT_CONFIG_FILE ".scummvmrc" + +OSystem_POSIX::OSystem_POSIX() { + // Initialze File System Factory + _fsFactory = new POSIXFilesystemFactory(); +} + +void OSystem_POSIX::initBackend() { + // Create the savefile manager + if (_savefileManager == 0) + _savefileManager = new POSIXSaveFileManager(); + + // Invoke parent implementation of this method + OSystem_SDL::initBackend(); +} + +Common::String OSystem_POSIX::getDefaultConfigFileName() { + char configFile[MAXPATHLEN]; + + // On UNIX type systems, by default we store the config file inside + // to the HOME directory of the user. + // + // GP2X is Linux based but Home dir can be read only so do not use + // it and put the config in the executable dir. + // + // On the iPhone, the home dir of the user when you launch the app + // from the Springboard, is /. Which we don't want. + const char *home = getenv("HOME"); + if (home != NULL && strlen(home) < MAXPATHLEN) + snprintf(configFile, MAXPATHLEN, "%s/%s", home, DEFAULT_CONFIG_FILE); + else + strcpy(configFile, DEFAULT_CONFIG_FILE); + + return configFile; +} diff --git a/backends/platform/sdl/posix/posix.h b/backends/platform/sdl/posix/posix.h new file mode 100644 index 0000000000..5d8098b31c --- /dev/null +++ b/backends/platform/sdl/posix/posix.h @@ -0,0 +1,42 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef PLATFORM_POSIX_H +#define PLATFORM_POSIX_H + +#include "backends/platform/sdl/sdl.h" + +class OSystem_POSIX : public OSystem_SDL { +public: + OSystem_POSIX(); + virtual ~OSystem_POSIX(); + + virtual void initBackend(); + +protected: + virtual Common::String getDefaultConfigFileName(); +}; + +#endif diff --git a/backends/platform/sdl/win32/main.cpp b/backends/platform/sdl/win32/main.cpp new file mode 100644 index 0000000000..803d2e1475 --- /dev/null +++ b/backends/platform/sdl/win32/main.cpp @@ -0,0 +1,59 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +// Fix for bug #2895217 "MSVC compilation broken with r47595": +// We need to keep this on top of the "common/scummsys.h" include, +// otherwise we will get errors about the windows headers redefining +// "ARRAYSIZE" for example. +#include +// winnt.h defines ARRAYSIZE, but we want our own one... +#undef ARRAYSIZE + +#include "common/scummsys.h" + +#include "backends/platform/win32/win32.h" +#include "backends/plugins/sdl/sdl-provider.h" +#include "base/main.h" + +int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpCmdLine*/, int /*iShowCmd*/) { + SDL_SetModuleHandle(GetModuleHandle(NULL)); + return main(__argc, __argv); +} + +int main(int argc, char *argv[]) { + + // Create our OSystem instance + g_system = new OSystem_Win32(); + assert(g_system); + +#ifdef DYNAMIC_MODULES + PluginManager::instance().addPluginProvider(new SDLPluginProvider()); +#endif + + // Invoke the actual ScummVM main entry point: + int res = scummvm_main(argc, argv); + delete (OSystem_Win32 *)g_system; + return res; +} diff --git a/backends/platform/sdl/win32/module.mk b/backends/platform/sdl/win32/module.mk new file mode 100644 index 0000000000..a10aa6c717 --- /dev/null +++ b/backends/platform/sdl/win32/module.mk @@ -0,0 +1,11 @@ +MODULE := backends/platform/win32 + +MODULE_OBJS := \ + main.o \ + win32.o + +MODULE_DIRS += \ + backends/platform/win32/ + +# We don't use the rules.mk here on purpose +OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) \ No newline at end of file diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp new file mode 100644 index 0000000000..2e039a6059 --- /dev/null +++ b/backends/platform/sdl/win32/win32.cpp @@ -0,0 +1,98 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include +// winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h +#undef ARRAYSIZE + +#include "backends/platform/win32/win32.h" +#include "common/archive.h" +#include "common/config-manager.h" +#include "common/debug.h" +#include "common/util.h" + +#include "backends/saves/default/default-saves.h" +#include "backends/audiocd/sdl/sdl-audiocd.h" +#include "backends/events/sdl/sdl-events.h" +#include "backends/mutex/sdl/sdl-mutex.h" +#include "backends/mixer/sdl/sdl-mixer.h" +#include "backends/timer/sdl/sdl-timer.h" + +#include "backends/fs/windows/windows-fs-factory.h" + +#define DEFAULT_CONFIG_FILE "scummvm.ini" + +OSystem_Win32::OSystem_Win32() { + // Initialze File System Factory + _fsFactory = new WindowsFilesystemFactory(); +} + +Common::String OSystem_Win32::getDefaultConfigFileName() { + char configFile[MAXPATHLEN]; + + OSVERSIONINFO win32OsVersion; + ZeroMemory(&win32OsVersion, sizeof(OSVERSIONINFO)); + win32OsVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&win32OsVersion); + // Check for non-9X version of Windows. + if (win32OsVersion.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS) { + // Use the Application Data directory of the user profile. + if (win32OsVersion.dwMajorVersion >= 5) { + if (!GetEnvironmentVariable("APPDATA", configFile, sizeof(configFile))) + error("Unable to access application data directory"); + } else { + if (!GetEnvironmentVariable("USERPROFILE", configFile, sizeof(configFile))) + error("Unable to access user profile directory"); + + strcat(configFile, "\\Application Data"); + CreateDirectory(configFile, NULL); + } + + strcat(configFile, "\\ScummVM"); + CreateDirectory(configFile, NULL); + strcat(configFile, "\\" DEFAULT_CONFIG_FILE); + + FILE *tmp = NULL; + if ((tmp = fopen(configFile, "r")) == NULL) { + // Check windows directory + char oldConfigFile[MAXPATHLEN]; + GetWindowsDirectory(oldConfigFile, MAXPATHLEN); + strcat(oldConfigFile, "\\" DEFAULT_CONFIG_FILE); + if ((tmp = fopen(oldConfigFile, "r"))) { + strcpy(configFile, oldConfigFile); + + fclose(tmp); + } + } else { + fclose(tmp); + } + } else { + // Check windows directory + GetWindowsDirectory(configFile, MAXPATHLEN); + strcat(configFile, "\\" DEFAULT_CONFIG_FILE); + } + + return configFile; +} diff --git a/backends/platform/sdl/win32/win32.h b/backends/platform/sdl/win32/win32.h new file mode 100644 index 0000000000..2bcb0c59b3 --- /dev/null +++ b/backends/platform/sdl/win32/win32.h @@ -0,0 +1,40 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef PLATFORM_WIN32_H +#define PLATFORM_WIN32_H + +#include "backends/platform/sdl/sdl.h" + +class OSystem_Win32 : public OSystem_SDL { +public: + OSystem_Win32(); + ~OSystem_Win32() {} + +protected: + Common::String getDefaultConfigFileName(); +}; + +#endif -- cgit v1.2.3 From 3af9282c1943b3a8a2e2dbb992bbeb863e2430aa Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Wed, 23 Jun 2010 21:07:03 +0000 Subject: Relocated Win32 and Posix ports. (Part 2) svn-id: r50193 --- backends/platform/sdl/module.mk | 4 ++++ backends/platform/sdl/posix/main.cpp | 6 +++++- backends/platform/sdl/posix/module.mk | 11 ----------- backends/platform/sdl/posix/posix.cpp | 6 +++++- backends/platform/sdl/win32/main.cpp | 6 +++++- backends/platform/sdl/win32/module.mk | 11 ----------- backends/platform/sdl/win32/win32.cpp | 6 +++++- 7 files changed, 24 insertions(+), 26 deletions(-) delete mode 100644 backends/platform/sdl/posix/module.mk delete mode 100644 backends/platform/sdl/win32/module.mk (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index 0d3928f1ea..e4659659d2 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -1,6 +1,10 @@ MODULE := backends/platform/sdl MODULE_OBJS := \ + posix/main.o \ + posix/posix.o \ + win32/main.o \ + win32/win32.o \ hardwarekeys.o \ main.o \ sdl.o diff --git a/backends/platform/sdl/posix/main.cpp b/backends/platform/sdl/posix/main.cpp index 35813291c1..cf1bc6ff2f 100644 --- a/backends/platform/sdl/posix/main.cpp +++ b/backends/platform/sdl/posix/main.cpp @@ -23,9 +23,11 @@ * */ +#ifdef UNIX + #include "common/scummsys.h" -#include "backends/platform/posix/posix.h" +#include "backends/platform/sdl/posix/posix.h" #include "backends/plugins/sdl/sdl-provider.h" #include "base/main.h" @@ -44,3 +46,5 @@ int main(int argc, char *argv[]) { delete (OSystem_POSIX *)g_system; return res; } + +#endif diff --git a/backends/platform/sdl/posix/module.mk b/backends/platform/sdl/posix/module.mk deleted file mode 100644 index b1827c7578..0000000000 --- a/backends/platform/sdl/posix/module.mk +++ /dev/null @@ -1,11 +0,0 @@ -MODULE := backends/platform/posix - -MODULE_OBJS := \ - main.o \ - posix.o - -MODULE_DIRS += \ - backends/platform/posix/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index 61871c7f82..aec36de910 100644 --- a/backends/platform/sdl/posix/posix.cpp +++ b/backends/platform/sdl/posix/posix.cpp @@ -23,7 +23,9 @@ * */ -#include "backends/platform/posix/posix.h" +#ifdef UNIX + +#include "backends/platform/sdl/posix/posix.h" #include "common/archive.h" #include "common/config-manager.h" #include "common/debug.h" @@ -74,3 +76,5 @@ Common::String OSystem_POSIX::getDefaultConfigFileName() { return configFile; } + +#endif diff --git a/backends/platform/sdl/win32/main.cpp b/backends/platform/sdl/win32/main.cpp index 803d2e1475..6c0508835e 100644 --- a/backends/platform/sdl/win32/main.cpp +++ b/backends/platform/sdl/win32/main.cpp @@ -23,6 +23,8 @@ * */ +#ifdef WIN32 + // Fix for bug #2895217 "MSVC compilation broken with r47595": // We need to keep this on top of the "common/scummsys.h" include, // otherwise we will get errors about the windows headers redefining @@ -33,7 +35,7 @@ #include "common/scummsys.h" -#include "backends/platform/win32/win32.h" +#include "backends/platform/sdl/win32/win32.h" #include "backends/plugins/sdl/sdl-provider.h" #include "base/main.h" @@ -57,3 +59,5 @@ int main(int argc, char *argv[]) { delete (OSystem_Win32 *)g_system; return res; } + +#endif diff --git a/backends/platform/sdl/win32/module.mk b/backends/platform/sdl/win32/module.mk deleted file mode 100644 index a10aa6c717..0000000000 --- a/backends/platform/sdl/win32/module.mk +++ /dev/null @@ -1,11 +0,0 @@ -MODULE := backends/platform/win32 - -MODULE_OBJS := \ - main.o \ - win32.o - -MODULE_DIRS += \ - backends/platform/win32/ - -# We don't use the rules.mk here on purpose -OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) \ No newline at end of file diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp index 2e039a6059..0eb4c467b4 100644 --- a/backends/platform/sdl/win32/win32.cpp +++ b/backends/platform/sdl/win32/win32.cpp @@ -23,11 +23,13 @@ * */ +#ifdef WIN32 + #include // winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h #undef ARRAYSIZE -#include "backends/platform/win32/win32.h" +#include "backends/platform/sdl/win32/win32.h" #include "common/archive.h" #include "common/config-manager.h" #include "common/debug.h" @@ -96,3 +98,5 @@ Common::String OSystem_Win32::getDefaultConfigFileName() { return configFile; } + +#endif -- cgit v1.2.3 From 3029e505286acc0ca2c65f0a6c009643fa39bdd8 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Wed, 23 Jun 2010 22:02:00 +0000 Subject: Fixed Posix port problem with destructor and configure. svn-id: r50194 --- backends/platform/sdl/posix/posix.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/posix/posix.h b/backends/platform/sdl/posix/posix.h index 5d8098b31c..2e87709598 100644 --- a/backends/platform/sdl/posix/posix.h +++ b/backends/platform/sdl/posix/posix.h @@ -31,7 +31,7 @@ class OSystem_POSIX : public OSystem_SDL { public: OSystem_POSIX(); - virtual ~OSystem_POSIX(); + virtual ~OSystem_POSIX() {} virtual void initBackend(); -- cgit v1.2.3 From d89cb33bcbca0334344501a86d30655d6a055262 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Thu, 24 Jun 2010 04:11:54 +0000 Subject: Refactored SDL mixer manager. Created a SdlMixerManager subclass for Mac OSX. svn-id: r50198 --- backends/platform/sdl/sdl.cpp | 21 +++++++++++++++------ backends/platform/sdl/sdl.h | 4 ++++ 2 files changed, 19 insertions(+), 6 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index b3b99a2e3a..e9b35fae32 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -34,7 +34,6 @@ #include "backends/audiocd/sdl/sdl-audiocd.h" #include "backends/events/sdl/sdl-events.h" #include "backends/mutex/sdl/sdl-mutex.h" -#include "backends/mixer/sdl/sdl-mixer.h" #include "backends/timer/sdl/sdl-timer.h" #include "icons/scummvm.xpm" @@ -46,7 +45,8 @@ OSystem_SDL::OSystem_SDL() : _inited(false), - _initedSDL(false) { + _initedSDL(false), + _mixerManager(0) { } @@ -72,8 +72,12 @@ void OSystem_SDL::initBackend() { if (_savefileManager == 0) _savefileManager = new DefaultSaveFileManager(); - if (_mixer == 0) - _mixer = new SdlMixerImpl(this); + if (_mixerManager == 0) { + _mixerManager = new SdlMixerManager(); + + // Setup and start mixer + _mixerManager->init(); + } if (_timerManager == 0) _timerManager = new SdlTimerManager(); @@ -166,8 +170,8 @@ void OSystem_SDL::deinit() { _graphicsManager = 0; delete _audiocdManager; _audiocdManager = 0; - delete _mixer; - _mixer = 0; + delete _mixerManager; + _mixerManager = 0; delete _timerManager; _timerManager = 0; delete _mutexManager; @@ -263,3 +267,8 @@ void OSystem_SDL::getTimeAndDate(TimeDate &td) const { td.tm_mon = t.tm_mon; td.tm_year = t.tm_year; } + +Audio::Mixer *OSystem_SDL::getMixer() { + assert(_mixerManager); + return _mixerManager->getMixer(); +} diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 40fbcd9d37..ec6432830b 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -34,6 +34,7 @@ #include "backends/modular-backend.h" #include "backends/graphics/sdl/sdl-graphics.h" +#include "backends/mixer/sdl/sdl-mixer.h" class OSystem_SDL : public ModularBackend { public: @@ -61,9 +62,12 @@ public: virtual void delayMillis(uint msecs); virtual void getTimeAndDate(TimeDate &td) const; + virtual Audio::Mixer *getMixer(); + protected: bool _inited; bool _initedSDL; + SdlMixerManager *_mixerManager; virtual void initSDL(); -- cgit v1.2.3 From 307d7aeb4fc044d925295b6ed1d4c7c359a99920 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Thu, 24 Jun 2010 17:37:09 +0000 Subject: Added a init function to OSystem_SDL for early backend setup, and so allowing better sub classing. svn-id: r50224 --- backends/platform/sdl/main.cpp | 6 ++++++ backends/platform/sdl/posix/main.cpp | 6 ++++++ backends/platform/sdl/posix/posix.cpp | 6 ++++++ backends/platform/sdl/posix/posix.h | 2 ++ backends/platform/sdl/sdl.cpp | 22 +++++++++++++--------- backends/platform/sdl/sdl.h | 6 ++++++ backends/platform/sdl/win32/main.cpp | 6 ++++++ backends/platform/sdl/win32/win32.cpp | 6 ++++++ backends/platform/sdl/win32/win32.h | 2 ++ 9 files changed, 53 insertions(+), 9 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp index 75e535428a..75d248841e 100644 --- a/backends/platform/sdl/main.cpp +++ b/backends/platform/sdl/main.cpp @@ -40,13 +40,19 @@ int main(int argc, char *argv[]) { g_system = new OSystem_SDL(); assert(g_system); + // Pre initialize the backend + ((OSystem_SDL *)g_system)->init(); + #ifdef DYNAMIC_MODULES PluginManager::instance().addPluginProvider(new SDLPluginProvider()); #endif // Invoke the actual ScummVM main entry point: int res = scummvm_main(argc, argv); + + // Free OSystem delete (OSystem_SDL *)g_system; + return res; } diff --git a/backends/platform/sdl/posix/main.cpp b/backends/platform/sdl/posix/main.cpp index cf1bc6ff2f..5f734e6b0e 100644 --- a/backends/platform/sdl/posix/main.cpp +++ b/backends/platform/sdl/posix/main.cpp @@ -37,13 +37,19 @@ int main(int argc, char *argv[]) { g_system = new OSystem_POSIX(); assert(g_system); + // Pre initialize the backend + ((OSystem_POSIX *)g_system)->init(); + #ifdef DYNAMIC_MODULES PluginManager::instance().addPluginProvider(new SDLPluginProvider()); #endif // Invoke the actual ScummVM main entry point: int res = scummvm_main(argc, argv); + + // Free OSystem delete (OSystem_POSIX *)g_system; + return res; } diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index aec36de910..e92a4398d9 100644 --- a/backends/platform/sdl/posix/posix.cpp +++ b/backends/platform/sdl/posix/posix.cpp @@ -44,8 +44,14 @@ #define DEFAULT_CONFIG_FILE ".scummvmrc" OSystem_POSIX::OSystem_POSIX() { +} + +void OSystem_Win32::init() { // Initialze File System Factory _fsFactory = new POSIXFilesystemFactory(); + + // Invoke parent implementation of this method + OSystem_SDL::init(); } void OSystem_POSIX::initBackend() { diff --git a/backends/platform/sdl/posix/posix.h b/backends/platform/sdl/posix/posix.h index 2e87709598..a8d5e9a23b 100644 --- a/backends/platform/sdl/posix/posix.h +++ b/backends/platform/sdl/posix/posix.h @@ -33,6 +33,8 @@ public: OSystem_POSIX(); virtual ~OSystem_POSIX() {} + virtual void init(); + virtual void initBackend(); protected: diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index e9b35fae32..85506c9520 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -54,18 +54,25 @@ OSystem_SDL::~OSystem_SDL() { deinit(); } -void OSystem_SDL::initBackend() { - // Check if backend has not been initialized - assert(!_inited); - +void OSystem_SDL::init() { // Initialize SDL initSDL(); - // Creates the backend managers, if they don't exist yet (we check - // for this to allow subclasses to provide their own). + // Creates the early needed managers, if they don't exist yet + // (we check for this to allow subclasses to provide their own). if (_mutexManager == 0) _mutexManager = new SdlMutexManager(); + if (_timerManager == 0) + _timerManager = new SdlTimerManager(); +} + +void OSystem_SDL::initBackend() { + // Check if backend has not been initialized + assert(!_inited); + + // Creates the backend managers, if they don't exist yet (we check + // for this to allow subclasses to provide their own). if (_eventManager == 0) _eventManager = new SdlEventManager(this); @@ -79,9 +86,6 @@ void OSystem_SDL::initBackend() { _mixerManager->init(); } - if (_timerManager == 0) - _timerManager = new SdlTimerManager(); - if (_graphicsManager == 0) _graphicsManager = new SdlGraphicsManager(); diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index ec6432830b..8740b82b9f 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -41,6 +41,12 @@ public: OSystem_SDL(); virtual ~OSystem_SDL(); + /** Pre-initialize backend, it should be called after + * instantiating the backend. Early needed managers + * are created here. + */ + virtual void init(); + virtual void initBackend(); virtual Common::HardwareKeySet *getHardwareKeySet(); diff --git a/backends/platform/sdl/win32/main.cpp b/backends/platform/sdl/win32/main.cpp index 6c0508835e..ffabeffc9d 100644 --- a/backends/platform/sdl/win32/main.cpp +++ b/backends/platform/sdl/win32/main.cpp @@ -50,13 +50,19 @@ int main(int argc, char *argv[]) { g_system = new OSystem_Win32(); assert(g_system); + // Pre initialize the backend + ((OSystem_Win32 *)g_system)->init(); + #ifdef DYNAMIC_MODULES PluginManager::instance().addPluginProvider(new SDLPluginProvider()); #endif // Invoke the actual ScummVM main entry point: int res = scummvm_main(argc, argv); + + // Free OSystem delete (OSystem_Win32 *)g_system; + return res; } diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp index 0eb4c467b4..4d585add77 100644 --- a/backends/platform/sdl/win32/win32.cpp +++ b/backends/platform/sdl/win32/win32.cpp @@ -47,8 +47,14 @@ #define DEFAULT_CONFIG_FILE "scummvm.ini" OSystem_Win32::OSystem_Win32() { +} + +void OSystem_Win32::init() { // Initialze File System Factory _fsFactory = new WindowsFilesystemFactory(); + + // Invoke parent implementation of this method + OSystem_SDL::init(); } Common::String OSystem_Win32::getDefaultConfigFileName() { diff --git a/backends/platform/sdl/win32/win32.h b/backends/platform/sdl/win32/win32.h index 2bcb0c59b3..eea7f9ee12 100644 --- a/backends/platform/sdl/win32/win32.h +++ b/backends/platform/sdl/win32/win32.h @@ -33,6 +33,8 @@ public: OSystem_Win32(); ~OSystem_Win32() {} + void init(); + protected: Common::String getDefaultConfigFileName(); }; -- cgit v1.2.3 From 419e05bb89122bb89163e7b6c88dc0c0fe7f9cdd Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Thu, 24 Jun 2010 19:05:59 +0000 Subject: Created macosx port from sdl backend. svn-id: r50228 --- backends/platform/sdl/macosx/macosx.cpp | 83 +++++++++++++++++++++++++++++++++ backends/platform/sdl/macosx/macosx.h | 44 +++++++++++++++++ backends/platform/sdl/macosx/main.cpp | 56 ++++++++++++++++++++++ backends/platform/sdl/module.mk | 2 + backends/platform/sdl/posix/posix.h | 4 +- backends/platform/sdl/win32/win32.h | 4 +- 6 files changed, 189 insertions(+), 4 deletions(-) create mode 100644 backends/platform/sdl/macosx/macosx.cpp create mode 100644 backends/platform/sdl/macosx/macosx.h create mode 100644 backends/platform/sdl/macosx/main.cpp (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp new file mode 100644 index 0000000000..bf70089d3f --- /dev/null +++ b/backends/platform/sdl/macosx/macosx.cpp @@ -0,0 +1,83 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifdef MACOSX + +#include "backends/platform/sdl/macosx/macosx.h" +#include "backends/mixer/bufferingsdl/bufferingsdl-mixer.h" + +#include "CoreFoundation/CoreFoundation.h" + +#define DEFAULT_CONFIG_FILE "Library/Preferences/ScummVM Preferences" + +OSystem_MacOSX::OSystem_MacOSX() { +} + +void OSystem_MacOSX::initBackend() { + // Create the mixer manager + if (_mixer == 0) { + _mixerManager = new BufferingSDLMixerManager(); + + // Setup and start mixer + _mixerManager->init(); + } + + // Invoke parent implementation of this method + OSystem_POSIX::initBackend(); +} + +Common::String OSystem_MacOSX::getDefaultConfigFileName() { + char configFile[MAXPATHLEN]; + + // On UNIX type systems, by default we store the config file inside + // to the HOME directory of the user. + const char *home = getenv("HOME"); + if (home != NULL && strlen(home) < MAXPATHLEN) + snprintf(configFile, MAXPATHLEN, "%s/%s", home, DEFAULT_CONFIG_FILE); + else + strcpy(configFile, DEFAULT_CONFIG_FILE); + + return configFile; +} + +void OSystem_MacOSX::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { + // Invoke parent implementation of this method + OSystem_POSIX::addSysArchivesToSearchSet(s, priority); + + // Get URL of the Resource directory of the .app bundle + CFURLRef fileUrl = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); + if (fileUrl) { + // Try to convert the URL to an absolute path + UInt8 buf[MAXPATHLEN]; + if (CFURLGetFileSystemRepresentation(fileUrl, true, buf, sizeof(buf))) { + // Success: Add it to the search path + Common::String bundlePath((const char *)buf); + s.add("__OSX_BUNDLE__", new Common::FSDirectory(bundlePath), priority); + } + CFRelease(fileUrl); + } +} + +#endif diff --git a/backends/platform/sdl/macosx/macosx.h b/backends/platform/sdl/macosx/macosx.h new file mode 100644 index 0000000000..0b665d1132 --- /dev/null +++ b/backends/platform/sdl/macosx/macosx.h @@ -0,0 +1,44 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef PLATFORM_SDL_MACOSX_H +#define PLATFORM_SDL_MACOSX_H + +#include "backends/platform/sdl/posix/posix.h" + +class OSystem_MacOSX : public OSystem_POSIX { +public: + OSystem_MacOSX(); + ~OSystem_MacOSX() {} + + void initBackend(); + + void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); + +protected: + Common::String getDefaultConfigFileName(); +}; + +#endif diff --git a/backends/platform/sdl/macosx/main.cpp b/backends/platform/sdl/macosx/main.cpp new file mode 100644 index 0000000000..1df811624f --- /dev/null +++ b/backends/platform/sdl/macosx/main.cpp @@ -0,0 +1,56 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifdef MACOSX + +#include "common/scummsys.h" + +#include "backends/platform/sdl/macosx/macosx.h" +#include "backends/plugins/sdl/sdl-provider.h" +#include "base/main.h" + +int main(int argc, char *argv[]) { + + // Create our OSystem instance + g_system = new OSystem_MacOSX(); + assert(g_system); + + // Pre initialize the backend + ((OSystem_MacOSX *)g_system)->init(); + +#ifdef DYNAMIC_MODULES + PluginManager::instance().addPluginProvider(new SDLPluginProvider()); +#endif + + // Invoke the actual ScummVM main entry point: + int res = scummvm_main(argc, argv); + + // Free OSystem + delete (OSystem_MacOSX *)g_system; + + return res; +} + +#endif diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index e4659659d2..74a6a263f9 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -1,6 +1,8 @@ MODULE := backends/platform/sdl MODULE_OBJS := \ + macosx/main.o \ + macosx/macosx.o \ posix/main.o \ posix/posix.o \ win32/main.o \ diff --git a/backends/platform/sdl/posix/posix.h b/backends/platform/sdl/posix/posix.h index a8d5e9a23b..ca912c9d87 100644 --- a/backends/platform/sdl/posix/posix.h +++ b/backends/platform/sdl/posix/posix.h @@ -23,8 +23,8 @@ * */ -#ifndef PLATFORM_POSIX_H -#define PLATFORM_POSIX_H +#ifndef PLATFORM_SDL_POSIX_H +#define PLATFORM_SDL_POSIX_H #include "backends/platform/sdl/sdl.h" diff --git a/backends/platform/sdl/win32/win32.h b/backends/platform/sdl/win32/win32.h index eea7f9ee12..e4541e314d 100644 --- a/backends/platform/sdl/win32/win32.h +++ b/backends/platform/sdl/win32/win32.h @@ -23,8 +23,8 @@ * */ -#ifndef PLATFORM_WIN32_H -#define PLATFORM_WIN32_H +#ifndef PLATFORM_SDL_WIN32_H +#define PLATFORM_SDL_WIN32_H #include "backends/platform/sdl/sdl.h" -- cgit v1.2.3 From de2b74e15a52cd51218d4cff1e011810f5e074e3 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Thu, 24 Jun 2010 23:41:27 +0000 Subject: Added missing header. svn-id: r50253 --- backends/platform/sdl/macosx/macosx.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp index bf70089d3f..63c724dbb7 100644 --- a/backends/platform/sdl/macosx/macosx.cpp +++ b/backends/platform/sdl/macosx/macosx.cpp @@ -28,6 +28,8 @@ #include "backends/platform/sdl/macosx/macosx.h" #include "backends/mixer/bufferingsdl/bufferingsdl-mixer.h" +#include "common/archive.h" + #include "CoreFoundation/CoreFoundation.h" #define DEFAULT_CONFIG_FILE "Library/Preferences/ScummVM Preferences" -- cgit v1.2.3 From a8120dd9d6cd1852c7979453e9f6efe15c78668a Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Thu, 24 Jun 2010 23:51:02 +0000 Subject: Fix compile on Mac OS X (and probably *nix systems). svn-id: r50254 --- backends/platform/sdl/macosx/macosx.cpp | 1 + backends/platform/sdl/posix/posix.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp index 63c724dbb7..446c41dd4e 100644 --- a/backends/platform/sdl/macosx/macosx.cpp +++ b/backends/platform/sdl/macosx/macosx.cpp @@ -29,6 +29,7 @@ #include "backends/mixer/bufferingsdl/bufferingsdl-mixer.h" #include "common/archive.h" +#include "common/fs.h" #include "CoreFoundation/CoreFoundation.h" diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index e92a4398d9..75f09c3555 100644 --- a/backends/platform/sdl/posix/posix.cpp +++ b/backends/platform/sdl/posix/posix.cpp @@ -46,7 +46,7 @@ OSystem_POSIX::OSystem_POSIX() { } -void OSystem_Win32::init() { +void OSystem_POSIX::init() { // Initialze File System Factory _fsFactory = new POSIXFilesystemFactory(); -- cgit v1.2.3 From e9c12368fc79e770c07e250a2ebf25767b8f3220 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Fri, 25 Jun 2010 00:02:58 +0000 Subject: Fix link error with duplicated name files. svn-id: r50255 --- backends/platform/sdl/macosx/macosx-main.cpp | 56 ++++++++++++++++++++++ backends/platform/sdl/macosx/main.cpp | 56 ---------------------- backends/platform/sdl/module.mk | 6 +-- backends/platform/sdl/posix/main.cpp | 56 ---------------------- backends/platform/sdl/posix/posix-main.cpp | 56 ++++++++++++++++++++++ backends/platform/sdl/win32/main.cpp | 69 ---------------------------- backends/platform/sdl/win32/win32-main.cpp | 69 ++++++++++++++++++++++++++++ 7 files changed, 184 insertions(+), 184 deletions(-) create mode 100644 backends/platform/sdl/macosx/macosx-main.cpp delete mode 100644 backends/platform/sdl/macosx/main.cpp delete mode 100644 backends/platform/sdl/posix/main.cpp create mode 100644 backends/platform/sdl/posix/posix-main.cpp delete mode 100644 backends/platform/sdl/win32/main.cpp create mode 100644 backends/platform/sdl/win32/win32-main.cpp (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/macosx/macosx-main.cpp b/backends/platform/sdl/macosx/macosx-main.cpp new file mode 100644 index 0000000000..1df811624f --- /dev/null +++ b/backends/platform/sdl/macosx/macosx-main.cpp @@ -0,0 +1,56 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifdef MACOSX + +#include "common/scummsys.h" + +#include "backends/platform/sdl/macosx/macosx.h" +#include "backends/plugins/sdl/sdl-provider.h" +#include "base/main.h" + +int main(int argc, char *argv[]) { + + // Create our OSystem instance + g_system = new OSystem_MacOSX(); + assert(g_system); + + // Pre initialize the backend + ((OSystem_MacOSX *)g_system)->init(); + +#ifdef DYNAMIC_MODULES + PluginManager::instance().addPluginProvider(new SDLPluginProvider()); +#endif + + // Invoke the actual ScummVM main entry point: + int res = scummvm_main(argc, argv); + + // Free OSystem + delete (OSystem_MacOSX *)g_system; + + return res; +} + +#endif diff --git a/backends/platform/sdl/macosx/main.cpp b/backends/platform/sdl/macosx/main.cpp deleted file mode 100644 index 1df811624f..0000000000 --- a/backends/platform/sdl/macosx/main.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifdef MACOSX - -#include "common/scummsys.h" - -#include "backends/platform/sdl/macosx/macosx.h" -#include "backends/plugins/sdl/sdl-provider.h" -#include "base/main.h" - -int main(int argc, char *argv[]) { - - // Create our OSystem instance - g_system = new OSystem_MacOSX(); - assert(g_system); - - // Pre initialize the backend - ((OSystem_MacOSX *)g_system)->init(); - -#ifdef DYNAMIC_MODULES - PluginManager::instance().addPluginProvider(new SDLPluginProvider()); -#endif - - // Invoke the actual ScummVM main entry point: - int res = scummvm_main(argc, argv); - - // Free OSystem - delete (OSystem_MacOSX *)g_system; - - return res; -} - -#endif diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index 74a6a263f9..a22d97ce91 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -1,11 +1,11 @@ MODULE := backends/platform/sdl MODULE_OBJS := \ - macosx/main.o \ + macosx/macosx-main.o \ macosx/macosx.o \ - posix/main.o \ + posix/posix-main.o \ posix/posix.o \ - win32/main.o \ + win32/win32-main.o \ win32/win32.o \ hardwarekeys.o \ main.o \ diff --git a/backends/platform/sdl/posix/main.cpp b/backends/platform/sdl/posix/main.cpp deleted file mode 100644 index 5f734e6b0e..0000000000 --- a/backends/platform/sdl/posix/main.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifdef UNIX - -#include "common/scummsys.h" - -#include "backends/platform/sdl/posix/posix.h" -#include "backends/plugins/sdl/sdl-provider.h" -#include "base/main.h" - -int main(int argc, char *argv[]) { - - // Create our OSystem instance - g_system = new OSystem_POSIX(); - assert(g_system); - - // Pre initialize the backend - ((OSystem_POSIX *)g_system)->init(); - -#ifdef DYNAMIC_MODULES - PluginManager::instance().addPluginProvider(new SDLPluginProvider()); -#endif - - // Invoke the actual ScummVM main entry point: - int res = scummvm_main(argc, argv); - - // Free OSystem - delete (OSystem_POSIX *)g_system; - - return res; -} - -#endif diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp new file mode 100644 index 0000000000..5f734e6b0e --- /dev/null +++ b/backends/platform/sdl/posix/posix-main.cpp @@ -0,0 +1,56 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifdef UNIX + +#include "common/scummsys.h" + +#include "backends/platform/sdl/posix/posix.h" +#include "backends/plugins/sdl/sdl-provider.h" +#include "base/main.h" + +int main(int argc, char *argv[]) { + + // Create our OSystem instance + g_system = new OSystem_POSIX(); + assert(g_system); + + // Pre initialize the backend + ((OSystem_POSIX *)g_system)->init(); + +#ifdef DYNAMIC_MODULES + PluginManager::instance().addPluginProvider(new SDLPluginProvider()); +#endif + + // Invoke the actual ScummVM main entry point: + int res = scummvm_main(argc, argv); + + // Free OSystem + delete (OSystem_POSIX *)g_system; + + return res; +} + +#endif diff --git a/backends/platform/sdl/win32/main.cpp b/backends/platform/sdl/win32/main.cpp deleted file mode 100644 index ffabeffc9d..0000000000 --- a/backends/platform/sdl/win32/main.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifdef WIN32 - -// Fix for bug #2895217 "MSVC compilation broken with r47595": -// We need to keep this on top of the "common/scummsys.h" include, -// otherwise we will get errors about the windows headers redefining -// "ARRAYSIZE" for example. -#include -// winnt.h defines ARRAYSIZE, but we want our own one... -#undef ARRAYSIZE - -#include "common/scummsys.h" - -#include "backends/platform/sdl/win32/win32.h" -#include "backends/plugins/sdl/sdl-provider.h" -#include "base/main.h" - -int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpCmdLine*/, int /*iShowCmd*/) { - SDL_SetModuleHandle(GetModuleHandle(NULL)); - return main(__argc, __argv); -} - -int main(int argc, char *argv[]) { - - // Create our OSystem instance - g_system = new OSystem_Win32(); - assert(g_system); - - // Pre initialize the backend - ((OSystem_Win32 *)g_system)->init(); - -#ifdef DYNAMIC_MODULES - PluginManager::instance().addPluginProvider(new SDLPluginProvider()); -#endif - - // Invoke the actual ScummVM main entry point: - int res = scummvm_main(argc, argv); - - // Free OSystem - delete (OSystem_Win32 *)g_system; - - return res; -} - -#endif diff --git a/backends/platform/sdl/win32/win32-main.cpp b/backends/platform/sdl/win32/win32-main.cpp new file mode 100644 index 0000000000..ffabeffc9d --- /dev/null +++ b/backends/platform/sdl/win32/win32-main.cpp @@ -0,0 +1,69 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#ifdef WIN32 + +// Fix for bug #2895217 "MSVC compilation broken with r47595": +// We need to keep this on top of the "common/scummsys.h" include, +// otherwise we will get errors about the windows headers redefining +// "ARRAYSIZE" for example. +#include +// winnt.h defines ARRAYSIZE, but we want our own one... +#undef ARRAYSIZE + +#include "common/scummsys.h" + +#include "backends/platform/sdl/win32/win32.h" +#include "backends/plugins/sdl/sdl-provider.h" +#include "base/main.h" + +int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpCmdLine*/, int /*iShowCmd*/) { + SDL_SetModuleHandle(GetModuleHandle(NULL)); + return main(__argc, __argv); +} + +int main(int argc, char *argv[]) { + + // Create our OSystem instance + g_system = new OSystem_Win32(); + assert(g_system); + + // Pre initialize the backend + ((OSystem_Win32 *)g_system)->init(); + +#ifdef DYNAMIC_MODULES + PluginManager::instance().addPluginProvider(new SDLPluginProvider()); +#endif + + // Invoke the actual ScummVM main entry point: + int res = scummvm_main(argc, argv); + + // Free OSystem + delete (OSystem_Win32 *)g_system; + + return res; +} + +#endif -- cgit v1.2.3 From 96b9c3aa08d47bd0e6714b201ed5ac561633b9f7 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Fri, 25 Jun 2010 00:14:09 +0000 Subject: Fix linking on Mac OS X. svn-id: r50256 --- backends/platform/sdl/module.mk | 16 ++++++++++++---- backends/platform/sdl/posix/posix-main.cpp | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index a22d97ce91..d4a003f574 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -1,16 +1,24 @@ MODULE := backends/platform/sdl MODULE_OBJS := \ - macosx/macosx-main.o \ - macosx/macosx.o \ posix/posix-main.o \ posix/posix.o \ - win32/win32-main.o \ - win32/win32.o \ hardwarekeys.o \ main.o \ sdl.o +ifdef MACOSX +MODULE_OBJS += \ + macosx/macosx-main.o \ + macosx/macosx.o +endif + +ifdef WIN32 +MODULE_OBJS += \ + win32/win32-main.o \ + win32/win32.o +endif + MODULE_DIRS += \ backends/platform/sdl/ diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp index 5f734e6b0e..bce3ecae7f 100644 --- a/backends/platform/sdl/posix/posix-main.cpp +++ b/backends/platform/sdl/posix/posix-main.cpp @@ -23,7 +23,7 @@ * */ -#ifdef UNIX +#if defined(UNIX) && !defined(MACOSX) #include "common/scummsys.h" -- cgit v1.2.3 From d04a2a266dff688cc88931b4e11432ae8f4a7130 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Fri, 25 Jun 2010 05:02:40 +0000 Subject: Modularized Samsung TV port. svn-id: r50258 --- backends/platform/sdl/posix/posix-main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp index bce3ecae7f..5d865ca325 100644 --- a/backends/platform/sdl/posix/posix-main.cpp +++ b/backends/platform/sdl/posix/posix-main.cpp @@ -23,7 +23,7 @@ * */ -#if defined(UNIX) && !defined(MACOSX) +#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) #include "common/scummsys.h" -- cgit v1.2.3 From 70e9a5b951e9086eb08aed8ce95b22eab0354637 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sat, 26 Jun 2010 03:44:47 +0000 Subject: Removed DEFAULT_CONFIG_FILE define in favor of new getConfigFileNameString function. svn-id: r50301 --- backends/platform/sdl/macosx/macosx.cpp | 16 ++-------------- backends/platform/sdl/macosx/macosx.h | 1 + backends/platform/sdl/posix/posix.cpp | 10 ++++++---- backends/platform/sdl/posix/posix.h | 1 + backends/platform/sdl/sdl.cpp | 8 +++++--- backends/platform/sdl/sdl.h | 1 + backends/platform/sdl/win32/win32.cpp | 12 +++++++----- backends/platform/sdl/win32/win32.h | 1 + 8 files changed, 24 insertions(+), 26 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp index 446c41dd4e..d6faf40294 100644 --- a/backends/platform/sdl/macosx/macosx.cpp +++ b/backends/platform/sdl/macosx/macosx.cpp @@ -33,8 +33,6 @@ #include "CoreFoundation/CoreFoundation.h" -#define DEFAULT_CONFIG_FILE "Library/Preferences/ScummVM Preferences" - OSystem_MacOSX::OSystem_MacOSX() { } @@ -51,18 +49,8 @@ void OSystem_MacOSX::initBackend() { OSystem_POSIX::initBackend(); } -Common::String OSystem_MacOSX::getDefaultConfigFileName() { - char configFile[MAXPATHLEN]; - - // On UNIX type systems, by default we store the config file inside - // to the HOME directory of the user. - const char *home = getenv("HOME"); - if (home != NULL && strlen(home) < MAXPATHLEN) - snprintf(configFile, MAXPATHLEN, "%s/%s", home, DEFAULT_CONFIG_FILE); - else - strcpy(configFile, DEFAULT_CONFIG_FILE); - - return configFile; +const char *OSystem_MacOSX::getConfigFileNameString() { + return "Library/Preferences/ScummVM Preferences"; } void OSystem_MacOSX::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { diff --git a/backends/platform/sdl/macosx/macosx.h b/backends/platform/sdl/macosx/macosx.h index 0b665d1132..a6f902b97b 100644 --- a/backends/platform/sdl/macosx/macosx.h +++ b/backends/platform/sdl/macosx/macosx.h @@ -38,6 +38,7 @@ public: void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); protected: + const char *getConfigFileNameString(); Common::String getDefaultConfigFileName(); }; diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index 75f09c3555..0b770bc512 100644 --- a/backends/platform/sdl/posix/posix.cpp +++ b/backends/platform/sdl/posix/posix.cpp @@ -41,8 +41,6 @@ #include "backends/fs/posix/posix-fs-factory.h" -#define DEFAULT_CONFIG_FILE ".scummvmrc" - OSystem_POSIX::OSystem_POSIX() { } @@ -63,6 +61,10 @@ void OSystem_POSIX::initBackend() { OSystem_SDL::initBackend(); } +const char *OSystem_POSIX::getConfigFileNameString() { + return ".scummvmrc"; +} + Common::String OSystem_POSIX::getDefaultConfigFileName() { char configFile[MAXPATHLEN]; @@ -76,9 +78,9 @@ Common::String OSystem_POSIX::getDefaultConfigFileName() { // from the Springboard, is /. Which we don't want. const char *home = getenv("HOME"); if (home != NULL && strlen(home) < MAXPATHLEN) - snprintf(configFile, MAXPATHLEN, "%s/%s", home, DEFAULT_CONFIG_FILE); + snprintf(configFile, MAXPATHLEN, "%s/%s", home, getConfigFileNameString()); else - strcpy(configFile, DEFAULT_CONFIG_FILE); + strcpy(configFile, getConfigFileNameString()); return configFile; } diff --git a/backends/platform/sdl/posix/posix.h b/backends/platform/sdl/posix/posix.h index ca912c9d87..7e7e388229 100644 --- a/backends/platform/sdl/posix/posix.h +++ b/backends/platform/sdl/posix/posix.h @@ -38,6 +38,7 @@ public: virtual void initBackend(); protected: + virtual const char *getConfigFileNameString(); virtual Common::String getDefaultConfigFileName(); }; diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 85506c9520..832f6ffb78 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -38,8 +38,6 @@ #include "icons/scummvm.xpm" -#define DEFAULT_CONFIG_FILE "scummvm.ini" - #include OSystem_SDL::OSystem_SDL() @@ -129,9 +127,13 @@ void OSystem_SDL::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) } +const char *OSystem_SDL::getConfigFileNameString() { + return "scummvm.ini"; +} + Common::String OSystem_SDL::getDefaultConfigFileName() { char configFile[MAXPATHLEN]; - strcpy(configFile, DEFAULT_CONFIG_FILE); + strcpy(configFile, getConfigFileNameString()); return configFile; } diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 8740b82b9f..53b38d1dd6 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -79,6 +79,7 @@ protected: virtual void setupIcon(); + virtual const char *getConfigFileNameString(); virtual Common::String getDefaultConfigFileName(); }; diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp index 4d585add77..907059feaf 100644 --- a/backends/platform/sdl/win32/win32.cpp +++ b/backends/platform/sdl/win32/win32.cpp @@ -44,8 +44,6 @@ #include "backends/fs/windows/windows-fs-factory.h" -#define DEFAULT_CONFIG_FILE "scummvm.ini" - OSystem_Win32::OSystem_Win32() { } @@ -57,6 +55,10 @@ void OSystem_Win32::init() { OSystem_SDL::init(); } +const char *OSystem_Win32::getConfigFileNameString() { + return "\\scummvm.ini"; +} + Common::String OSystem_Win32::getDefaultConfigFileName() { char configFile[MAXPATHLEN]; @@ -80,14 +82,14 @@ Common::String OSystem_Win32::getDefaultConfigFileName() { strcat(configFile, "\\ScummVM"); CreateDirectory(configFile, NULL); - strcat(configFile, "\\" DEFAULT_CONFIG_FILE); + strcat(configFile, getConfigFileNameString()); FILE *tmp = NULL; if ((tmp = fopen(configFile, "r")) == NULL) { // Check windows directory char oldConfigFile[MAXPATHLEN]; GetWindowsDirectory(oldConfigFile, MAXPATHLEN); - strcat(oldConfigFile, "\\" DEFAULT_CONFIG_FILE); + strcat(oldConfigFile, getConfigFileNameString()); if ((tmp = fopen(oldConfigFile, "r"))) { strcpy(configFile, oldConfigFile); @@ -99,7 +101,7 @@ Common::String OSystem_Win32::getDefaultConfigFileName() { } else { // Check windows directory GetWindowsDirectory(configFile, MAXPATHLEN); - strcat(configFile, "\\" DEFAULT_CONFIG_FILE); + strcat(configFile, getConfigFileNameString()); } return configFile; diff --git a/backends/platform/sdl/win32/win32.h b/backends/platform/sdl/win32/win32.h index e4541e314d..e8bc255459 100644 --- a/backends/platform/sdl/win32/win32.h +++ b/backends/platform/sdl/win32/win32.h @@ -36,6 +36,7 @@ public: void init(); protected: + const char *getConfigFileNameString(); Common::String getDefaultConfigFileName(); }; -- cgit v1.2.3 From 32b5f5e4ae80a498cf09577765ac7bde6686a079 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sat, 26 Jun 2010 21:05:34 +0000 Subject: Removed unused function, fixing a linker error. svn-id: r50343 --- backends/platform/sdl/macosx/macosx.h | 1 - 1 file changed, 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/macosx/macosx.h b/backends/platform/sdl/macosx/macosx.h index a6f902b97b..cf50307ca8 100644 --- a/backends/platform/sdl/macosx/macosx.h +++ b/backends/platform/sdl/macosx/macosx.h @@ -39,7 +39,6 @@ public: protected: const char *getConfigFileNameString(); - Common::String getDefaultConfigFileName(); }; #endif -- cgit v1.2.3 From 936f5585794972bb76b25164890315786dbe3401 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sun, 27 Jun 2010 05:12:37 +0000 Subject: Improved getDefaultConfigFileName(). Code cleanup. svn-id: r50364 --- backends/platform/sdl/macosx/macosx.cpp | 8 +++----- backends/platform/sdl/macosx/macosx.h | 4 ---- backends/platform/sdl/posix/posix.cpp | 30 +++++------------------------- backends/platform/sdl/posix/posix.h | 9 ++++++--- backends/platform/sdl/sdl.cpp | 11 +---------- backends/platform/sdl/sdl.h | 12 +++++++++--- backends/platform/sdl/win32/win32.cpp | 25 ++++--------------------- backends/platform/sdl/win32/win32.h | 4 ---- 8 files changed, 28 insertions(+), 75 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp index d6faf40294..458db07c31 100644 --- a/backends/platform/sdl/macosx/macosx.cpp +++ b/backends/platform/sdl/macosx/macosx.cpp @@ -33,7 +33,9 @@ #include "CoreFoundation/CoreFoundation.h" -OSystem_MacOSX::OSystem_MacOSX() { +OSystem_MacOSX::OSystem_MacOSX() + : + OSystem_POSIX("Library/Preferences/ScummVM Preferences") { } void OSystem_MacOSX::initBackend() { @@ -49,10 +51,6 @@ void OSystem_MacOSX::initBackend() { OSystem_POSIX::initBackend(); } -const char *OSystem_MacOSX::getConfigFileNameString() { - return "Library/Preferences/ScummVM Preferences"; -} - void OSystem_MacOSX::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) { // Invoke parent implementation of this method OSystem_POSIX::addSysArchivesToSearchSet(s, priority); diff --git a/backends/platform/sdl/macosx/macosx.h b/backends/platform/sdl/macosx/macosx.h index cf50307ca8..e3a819f592 100644 --- a/backends/platform/sdl/macosx/macosx.h +++ b/backends/platform/sdl/macosx/macosx.h @@ -34,11 +34,7 @@ public: ~OSystem_MacOSX() {} void initBackend(); - void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); - -protected: - const char *getConfigFileNameString(); }; #endif diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index 0b770bc512..7279bb2507 100644 --- a/backends/platform/sdl/posix/posix.cpp +++ b/backends/platform/sdl/posix/posix.cpp @@ -26,22 +26,12 @@ #ifdef UNIX #include "backends/platform/sdl/posix/posix.h" -#include "common/archive.h" -#include "common/config-manager.h" -#include "common/debug.h" -#include "common/util.h" -#include "common/EventRecorder.h" - #include "backends/saves/posix/posix-saves.h" -#include "backends/audiocd/sdl/sdl-audiocd.h" -#include "backends/events/sdl/sdl-events.h" -#include "backends/mutex/sdl/sdl-mutex.h" -#include "backends/mixer/sdl/sdl-mixer.h" -#include "backends/timer/sdl/sdl-timer.h" - #include "backends/fs/posix/posix-fs-factory.h" -OSystem_POSIX::OSystem_POSIX() { +OSystem_POSIX::OSystem_POSIX(Common::String baseConfigName) + : + _baseConfigName(baseConfigName) { } void OSystem_POSIX::init() { @@ -61,26 +51,16 @@ void OSystem_POSIX::initBackend() { OSystem_SDL::initBackend(); } -const char *OSystem_POSIX::getConfigFileNameString() { - return ".scummvmrc"; -} - Common::String OSystem_POSIX::getDefaultConfigFileName() { char configFile[MAXPATHLEN]; // On UNIX type systems, by default we store the config file inside // to the HOME directory of the user. - // - // GP2X is Linux based but Home dir can be read only so do not use - // it and put the config in the executable dir. - // - // On the iPhone, the home dir of the user when you launch the app - // from the Springboard, is /. Which we don't want. const char *home = getenv("HOME"); if (home != NULL && strlen(home) < MAXPATHLEN) - snprintf(configFile, MAXPATHLEN, "%s/%s", home, getConfigFileNameString()); + snprintf(configFile, MAXPATHLEN, "%s/%s", home, _baseConfigName); else - strcpy(configFile, getConfigFileNameString()); + strcpy(configFile, _baseConfigName); return configFile; } diff --git a/backends/platform/sdl/posix/posix.h b/backends/platform/sdl/posix/posix.h index 7e7e388229..13f9304f1e 100644 --- a/backends/platform/sdl/posix/posix.h +++ b/backends/platform/sdl/posix/posix.h @@ -30,15 +30,18 @@ class OSystem_POSIX : public OSystem_SDL { public: - OSystem_POSIX(); + // Let the subclasses be able to change _baseConfigName in the constructor + OSystem_POSIX(Common::String baseConfigName = ".scummvmrc"); virtual ~OSystem_POSIX() {} virtual void init(); - virtual void initBackend(); protected: - virtual const char *getConfigFileNameString(); + // Base string for creating the default path and filename + // for the configuration file + Common::String _baseConfigName; + virtual Common::String getDefaultConfigFileName(); }; diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 832f6ffb78..574eeb5a9a 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -24,10 +24,7 @@ */ #include "backends/platform/sdl/sdl.h" -#include "common/archive.h" #include "common/config-manager.h" -#include "common/debug.h" -#include "common/util.h" #include "common/EventRecorder.h" #include "backends/saves/default/default-saves.h" @@ -127,14 +124,8 @@ void OSystem_SDL::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) } -const char *OSystem_SDL::getConfigFileNameString() { - return "scummvm.ini"; -} - Common::String OSystem_SDL::getDefaultConfigFileName() { - char configFile[MAXPATHLEN]; - strcpy(configFile, getConfigFileNameString()); - return configFile; + return "scummvm.ini"; } Common::SeekableReadStream *OSystem_SDL::createConfigReadStream() { diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 53b38d1dd6..c61b8c810f 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -60,8 +60,6 @@ public: virtual Common::SeekableReadStream *createConfigReadStream(); virtual Common::WriteStream *createConfigWriteStream(); - virtual SdlGraphicsManager *getGraphicsManager(); - virtual bool pollEvent(Common::Event &event); virtual uint32 getMillis(); @@ -70,16 +68,24 @@ public: virtual Audio::Mixer *getMixer(); + // Get the Graphics Manager instance, used by other managers + virtual SdlGraphicsManager *getGraphicsManager(); + protected: bool _inited; bool _initedSDL; + + // Mixer manager that encapsulates the actual Audio::Mixer SdlMixerManager *_mixerManager; + // Initialze SDL library virtual void initSDL(); + // Setup the window icon virtual void setupIcon(); - virtual const char *getConfigFileNameString(); + // Get the file path where the user configuration + // of ScummVM will be saved virtual Common::String getDefaultConfigFileName(); }; diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp index 907059feaf..28cb13def4 100644 --- a/backends/platform/sdl/win32/win32.cpp +++ b/backends/platform/sdl/win32/win32.cpp @@ -30,22 +30,9 @@ #undef ARRAYSIZE #include "backends/platform/sdl/win32/win32.h" -#include "common/archive.h" -#include "common/config-manager.h" -#include "common/debug.h" -#include "common/util.h" - -#include "backends/saves/default/default-saves.h" -#include "backends/audiocd/sdl/sdl-audiocd.h" -#include "backends/events/sdl/sdl-events.h" -#include "backends/mutex/sdl/sdl-mutex.h" -#include "backends/mixer/sdl/sdl-mixer.h" -#include "backends/timer/sdl/sdl-timer.h" - #include "backends/fs/windows/windows-fs-factory.h" -OSystem_Win32::OSystem_Win32() { -} +#define DEFAULT_CONFIG_FILE "scummvm.ini" void OSystem_Win32::init() { // Initialze File System Factory @@ -55,10 +42,6 @@ void OSystem_Win32::init() { OSystem_SDL::init(); } -const char *OSystem_Win32::getConfigFileNameString() { - return "\\scummvm.ini"; -} - Common::String OSystem_Win32::getDefaultConfigFileName() { char configFile[MAXPATHLEN]; @@ -82,14 +65,14 @@ Common::String OSystem_Win32::getDefaultConfigFileName() { strcat(configFile, "\\ScummVM"); CreateDirectory(configFile, NULL); - strcat(configFile, getConfigFileNameString()); + strcat(configFile, "\\" DEFAULT_CONFIG_FILE); FILE *tmp = NULL; if ((tmp = fopen(configFile, "r")) == NULL) { // Check windows directory char oldConfigFile[MAXPATHLEN]; GetWindowsDirectory(oldConfigFile, MAXPATHLEN); - strcat(oldConfigFile, getConfigFileNameString()); + strcat(oldConfigFile, "\\" DEFAULT_CONFIG_FILE); if ((tmp = fopen(oldConfigFile, "r"))) { strcpy(configFile, oldConfigFile); @@ -101,7 +84,7 @@ Common::String OSystem_Win32::getDefaultConfigFileName() { } else { // Check windows directory GetWindowsDirectory(configFile, MAXPATHLEN); - strcat(configFile, getConfigFileNameString()); + strcat(configFile, "\\" DEFAULT_CONFIG_FILE); } return configFile; diff --git a/backends/platform/sdl/win32/win32.h b/backends/platform/sdl/win32/win32.h index e8bc255459..7ae8802fc1 100644 --- a/backends/platform/sdl/win32/win32.h +++ b/backends/platform/sdl/win32/win32.h @@ -30,13 +30,9 @@ class OSystem_Win32 : public OSystem_SDL { public: - OSystem_Win32(); - ~OSystem_Win32() {} - void init(); protected: - const char *getConfigFileNameString(); Common::String getDefaultConfigFileName(); }; -- cgit v1.2.3 From c2bc48a772ecfff2cc8cf746608f5ad9fd035bd8 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sun, 27 Jun 2010 06:10:09 +0000 Subject: Fixed String conversion error. svn-id: r50370 --- backends/platform/sdl/posix/posix.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/posix/posix.cpp b/backends/platform/sdl/posix/posix.cpp index 7279bb2507..c9c7304c0f 100644 --- a/backends/platform/sdl/posix/posix.cpp +++ b/backends/platform/sdl/posix/posix.cpp @@ -58,9 +58,9 @@ Common::String OSystem_POSIX::getDefaultConfigFileName() { // to the HOME directory of the user. const char *home = getenv("HOME"); if (home != NULL && strlen(home) < MAXPATHLEN) - snprintf(configFile, MAXPATHLEN, "%s/%s", home, _baseConfigName); + snprintf(configFile, MAXPATHLEN, "%s/%s", home, _baseConfigName.c_str()); else - strcpy(configFile, _baseConfigName); + strcpy(configFile, _baseConfigName.c_str()); return configFile; } -- cgit v1.2.3 From 494755cc36d4bd6bac46c63b6624fe5a294c493a Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Mon, 28 Jun 2010 20:41:08 +0000 Subject: Renamed BufferingSDLMixerManager to DoubleBufferSDLMixerManager. svn-id: r50458 --- backends/platform/sdl/macosx/macosx.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp index 458db07c31..8cbdae7aa7 100644 --- a/backends/platform/sdl/macosx/macosx.cpp +++ b/backends/platform/sdl/macosx/macosx.cpp @@ -26,7 +26,7 @@ #ifdef MACOSX #include "backends/platform/sdl/macosx/macosx.h" -#include "backends/mixer/bufferingsdl/bufferingsdl-mixer.h" +#include "backends/mixer/doublebuffersdl/doublebuffersdl-mixer.h" #include "common/archive.h" #include "common/fs.h" @@ -41,7 +41,7 @@ OSystem_MacOSX::OSystem_MacOSX() void OSystem_MacOSX::initBackend() { // Create the mixer manager if (_mixer == 0) { - _mixerManager = new BufferingSDLMixerManager(); + _mixerManager = new DoubleBufferSDLMixerManager(); // Setup and start mixer _mixerManager->init(); -- cgit v1.2.3 From fd77e4b09c8ca80c8e449ad7266afaa494f98500 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Tue, 29 Jun 2010 01:08:36 +0000 Subject: Modularized Linuxmoto port. svn-id: r50474 --- backends/platform/sdl/sdl.cpp | 5 +++++ backends/platform/sdl/sdl.h | 3 +++ 2 files changed, 8 insertions(+) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 574eeb5a9a..742f40511a 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -269,3 +269,8 @@ Audio::Mixer *OSystem_SDL::getMixer() { assert(_mixerManager); return _mixerManager->getMixer(); } + +SdlMixerManager *OSystem_SDL::getMixerManager() { + assert(_mixerManager); + return _mixerManager; +} diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index c61b8c810f..c238422906 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -71,6 +71,9 @@ public: // Get the Graphics Manager instance, used by other managers virtual SdlGraphicsManager *getGraphicsManager(); + // Get the Sdl Mixer Manager instance (not the Audio::Mixer) + virtual SdlMixerManager *getMixerManager(); + protected: bool _inited; bool _initedSDL; -- cgit v1.2.3 From 06290230d5ac664bdad864d9181fb9c9b3358af2 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Tue, 29 Jun 2010 01:21:30 +0000 Subject: Updated makefile. Fixed compile errors. svn-id: r50475 --- backends/platform/sdl/posix/posix-main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp index 5d865ca325..85dd0750c9 100644 --- a/backends/platform/sdl/posix/posix-main.cpp +++ b/backends/platform/sdl/posix/posix-main.cpp @@ -23,7 +23,7 @@ * */ -#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) +#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(LINUXMOTO) #include "common/scummsys.h" -- cgit v1.2.3 From cd5546f1d16c9efe471206846ddfdcd3b81f4f63 Mon Sep 17 00:00:00 2001 From: Matthew Hoops Date: Tue, 29 Jun 2010 01:59:10 +0000 Subject: Override setupIcon() for both Mac OS X and SymbianOS, they have their own icons. svn-id: r50476 --- backends/platform/sdl/macosx/macosx.cpp | 4 ++++ backends/platform/sdl/macosx/macosx.h | 1 + 2 files changed, 5 insertions(+) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/macosx/macosx.cpp b/backends/platform/sdl/macosx/macosx.cpp index 8cbdae7aa7..a36769b417 100644 --- a/backends/platform/sdl/macosx/macosx.cpp +++ b/backends/platform/sdl/macosx/macosx.cpp @@ -69,4 +69,8 @@ void OSystem_MacOSX::addSysArchivesToSearchSet(Common::SearchSet &s, int priorit } } +void OSystem_MacOSX::setupIcon() { + // Don't set icon on OS X, as we use a nicer external icon there. +} + #endif diff --git a/backends/platform/sdl/macosx/macosx.h b/backends/platform/sdl/macosx/macosx.h index e3a819f592..1febd1a51d 100644 --- a/backends/platform/sdl/macosx/macosx.h +++ b/backends/platform/sdl/macosx/macosx.h @@ -35,6 +35,7 @@ public: void initBackend(); void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); + void setupIcon(); }; #endif -- cgit v1.2.3 From c174d5327bfaf55d998cf67f3e4f49a0eaf2ed39 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Wed, 30 Jun 2010 04:46:55 +0000 Subject: Modularized GP2XWIZ backend. svn-id: r50514 --- backends/platform/sdl/posix/posix-main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp index 85dd0750c9..e2bc2c8682 100644 --- a/backends/platform/sdl/posix/posix-main.cpp +++ b/backends/platform/sdl/posix/posix-main.cpp @@ -23,7 +23,7 @@ * */ -#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(LINUXMOTO) +#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(LINUXMOTO) && !defined(GP2XWIZ) #include "common/scummsys.h" -- cgit v1.2.3 From f9c3a4547cbf1b1942402d618fa403a7fb1cb656 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Fri, 2 Jul 2010 06:44:42 +0000 Subject: Cleanup and documentation. svn-id: r50589 --- backends/platform/sdl/macosx/macosx-main.cpp | 2 - backends/platform/sdl/macosx/macosx.h | 8 ++-- backends/platform/sdl/main.cpp | 5 +-- backends/platform/sdl/posix/posix-main.cpp | 4 +- backends/platform/sdl/sdl.h | 59 +++++++++++++++++----------- backends/platform/sdl/win32/win32-main.cpp | 9 ++--- backends/platform/sdl/win32/win32.cpp | 4 +- backends/platform/sdl/win32/win32.h | 4 +- 8 files changed, 49 insertions(+), 46 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/macosx/macosx-main.cpp b/backends/platform/sdl/macosx/macosx-main.cpp index 1df811624f..023860b19f 100644 --- a/backends/platform/sdl/macosx/macosx-main.cpp +++ b/backends/platform/sdl/macosx/macosx-main.cpp @@ -25,8 +25,6 @@ #ifdef MACOSX -#include "common/scummsys.h" - #include "backends/platform/sdl/macosx/macosx.h" #include "backends/plugins/sdl/sdl-provider.h" #include "base/main.h" diff --git a/backends/platform/sdl/macosx/macosx.h b/backends/platform/sdl/macosx/macosx.h index 1febd1a51d..3c583a0ac0 100644 --- a/backends/platform/sdl/macosx/macosx.h +++ b/backends/platform/sdl/macosx/macosx.h @@ -31,11 +31,11 @@ class OSystem_MacOSX : public OSystem_POSIX { public: OSystem_MacOSX(); - ~OSystem_MacOSX() {} + virtual ~OSystem_MacOSX() {} - void initBackend(); - void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); - void setupIcon(); + virtual void initBackend(); + virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); + virtual void setupIcon(); }; #endif diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp index 75d248841e..38d0259121 100644 --- a/backends/platform/sdl/main.cpp +++ b/backends/platform/sdl/main.cpp @@ -23,12 +23,9 @@ * */ -#include "common/scummsys.h" - // Several SDL based ports use a custom main, and hence do not want to compile // of this file. The following "#if" ensures that. -#if !defined(__MAEMO__) && !defined(_WIN32_WCE) && !defined(GP2XWIZ)&& !defined(LINUXMOTO) && !defined(__SYMBIAN32__) && !defined(WIN32) && !defined(UNIX) - +#if !defined(UNIX) && !defined(WIN32) && !defined(__MAEMO__) && !defined(__SYMBIAN32__) #include "backends/platform/sdl/sdl.h" #include "backends/plugins/sdl/sdl-provider.h" diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp index e2bc2c8682..ad11fc230e 100644 --- a/backends/platform/sdl/posix/posix-main.cpp +++ b/backends/platform/sdl/posix/posix-main.cpp @@ -23,9 +23,7 @@ * */ -#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(LINUXMOTO) && !defined(GP2XWIZ) - -#include "common/scummsys.h" +#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(LINUXMOTO) && !defined(GP2XWIZ) && !defined(GP2X) #include "backends/platform/sdl/posix/posix.h" #include "backends/plugins/sdl/sdl-provider.h" diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index c238422906..f2b513752f 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -23,8 +23,8 @@ * */ -#ifndef SDL_COMMON_H -#define SDL_COMMON_H +#ifndef PLATFORM_SDL_H +#define PLATFORM_SDL_H #if defined(__SYMBIAN32__) #include @@ -36,59 +36,72 @@ #include "backends/graphics/sdl/sdl-graphics.h" #include "backends/mixer/sdl/sdl-mixer.h" +/** + * Base OSystem class for all SDL ports. + */ class OSystem_SDL : public ModularBackend { public: OSystem_SDL(); virtual ~OSystem_SDL(); - /** Pre-initialize backend, it should be called after - * instantiating the backend. Early needed managers - * are created here. + /** + * Pre-initialize backend. It should be called after + * instantiating the backend. Early needed managers are + * created here. */ virtual void init(); - virtual void initBackend(); + /** + * Get the Graphics Manager instance. Used by other managers. + */ + virtual SdlGraphicsManager *getGraphicsManager(); - virtual Common::HardwareKeySet *getHardwareKeySet(); + /** + * Get the Mixer Manager instance. Not to confuse with getMixer(), + * that returns Audio::Mixer. The Mixer Manager is a SDL wrapper class + * for the Audio::Mixer. Used by other managers. + */ + virtual SdlMixerManager *getMixerManager(); + // Override functions from ModularBackend + virtual void initBackend(); + virtual Common::HardwareKeySet *getHardwareKeySet(); virtual void quit(); virtual void deinit(); - virtual void setWindowCaption(const char *caption); - virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); virtual Common::SeekableReadStream *createConfigReadStream(); virtual Common::WriteStream *createConfigWriteStream(); - virtual bool pollEvent(Common::Event &event); - virtual uint32 getMillis(); virtual void delayMillis(uint msecs); virtual void getTimeAndDate(TimeDate &td) const; - virtual Audio::Mixer *getMixer(); - // Get the Graphics Manager instance, used by other managers - virtual SdlGraphicsManager *getGraphicsManager(); - - // Get the Sdl Mixer Manager instance (not the Audio::Mixer) - virtual SdlMixerManager *getMixerManager(); - protected: bool _inited; bool _initedSDL; - // Mixer manager that encapsulates the actual Audio::Mixer + /** + * Mixer manager that configures and setups SDL for + * the wrapped Audio::Mixer, the true mixer. + */ SdlMixerManager *_mixerManager; - // Initialze SDL library + /** + * Initialze the SDL library. + */ virtual void initSDL(); - // Setup the window icon + /** + * Setup the window icon. + */ virtual void setupIcon(); - // Get the file path where the user configuration - // of ScummVM will be saved + /** + * Get the file path where the user configuration + * of ScummVM will be saved. + */ virtual Common::String getDefaultConfigFileName(); }; diff --git a/backends/platform/sdl/win32/win32-main.cpp b/backends/platform/sdl/win32/win32-main.cpp index ffabeffc9d..25f208ddac 100644 --- a/backends/platform/sdl/win32/win32-main.cpp +++ b/backends/platform/sdl/win32/win32-main.cpp @@ -26,14 +26,12 @@ #ifdef WIN32 // Fix for bug #2895217 "MSVC compilation broken with r47595": -// We need to keep this on top of the "common/scummsys.h" include, +// We need to keep this on top of the "common/scummsys.h"(base/main.h) include, // otherwise we will get errors about the windows headers redefining // "ARRAYSIZE" for example. +#define WIN32_LEAN_AND_MEAN #include -// winnt.h defines ARRAYSIZE, but we want our own one... -#undef ARRAYSIZE - -#include "common/scummsys.h" +#undef ARRAYSIZE // winnt.h defines ARRAYSIZE, but we want our own one... #include "backends/platform/sdl/win32/win32.h" #include "backends/plugins/sdl/sdl-provider.h" @@ -45,7 +43,6 @@ int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpC } int main(int argc, char *argv[]) { - // Create our OSystem instance g_system = new OSystem_Win32(); assert(g_system); diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp index 28cb13def4..05005dee6f 100644 --- a/backends/platform/sdl/win32/win32.cpp +++ b/backends/platform/sdl/win32/win32.cpp @@ -26,8 +26,8 @@ #ifdef WIN32 #include -// winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h -#undef ARRAYSIZE +#define WIN32_LEAN_AND_MEAN +#undef ARRAYSIZE // winnt.h defines ARRAYSIZE, but we want our own one... #include "backends/platform/sdl/win32/win32.h" #include "backends/fs/windows/windows-fs-factory.h" diff --git a/backends/platform/sdl/win32/win32.h b/backends/platform/sdl/win32/win32.h index 7ae8802fc1..f18ee6ead1 100644 --- a/backends/platform/sdl/win32/win32.h +++ b/backends/platform/sdl/win32/win32.h @@ -30,10 +30,10 @@ class OSystem_Win32 : public OSystem_SDL { public: - void init(); + virtual void init(); protected: - Common::String getDefaultConfigFileName(); + virtual Common::String getDefaultConfigFileName(); }; #endif -- cgit v1.2.3 From 4e50b23005b1f27d7598b7dc1373a00cd0175e65 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sat, 3 Jul 2010 00:25:06 +0000 Subject: Cleanup and documentation. svn-id: r50610 --- backends/platform/sdl/sdl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index f2b513752f..eb3d22d524 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -63,7 +63,7 @@ public: */ virtual SdlMixerManager *getMixerManager(); - // Override functions from ModularBackend + // Override functions from ModularBackend and OSystem virtual void initBackend(); virtual Common::HardwareKeySet *getHardwareKeySet(); virtual void quit(); -- cgit v1.2.3 From 85034dc730148dab3eb85b47be3f3984337e9484 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sat, 10 Jul 2010 22:47:29 +0000 Subject: Added BaseSdlGraphicsManager. Added GLTexture. svn-id: r50795 --- backends/platform/sdl/sdl.cpp | 15 +++++++++++---- backends/platform/sdl/sdl.h | 4 ++-- 2 files changed, 13 insertions(+), 6 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 742f40511a..52a2b335aa 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -32,6 +32,8 @@ #include "backends/events/sdl/sdl-events.h" #include "backends/mutex/sdl/sdl-mutex.h" #include "backends/timer/sdl/sdl-timer.h" +//#include "backends/graphics/sdl/sdl-graphics.h" +#include "backends/graphics/openglsdl/openglsdl-graphics.h" #include "icons/scummvm.xpm" @@ -81,8 +83,13 @@ void OSystem_SDL::initBackend() { _mixerManager->init(); } - if (_graphicsManager == 0) - _graphicsManager = new SdlGraphicsManager(); + if (_graphicsManager == 0) { + // Changed to OpenGL for testing + //_graphicsManager = new SdlGraphicsManager(); + _graphicsManager = new OpenGLSDLGraphicsManager(); + + ((OpenGLSDLGraphicsManager *)_graphicsManager)->init(); + } if (_audiocdManager == 0) _audiocdManager = new SdlAudioCDManager(); @@ -234,9 +241,9 @@ void OSystem_SDL::setupIcon() { free(icon); } -SdlGraphicsManager *OSystem_SDL::getGraphicsManager() { +BaseSdlGraphicsManager *OSystem_SDL::getGraphicsManager() { assert(_graphicsManager); - return (SdlGraphicsManager *)_graphicsManager; + return (BaseSdlGraphicsManager *)_graphicsManager; } bool OSystem_SDL::pollEvent(Common::Event &event) { diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index eb3d22d524..97c91966c1 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -33,7 +33,7 @@ #endif #include "backends/modular-backend.h" -#include "backends/graphics/sdl/sdl-graphics.h" +#include "backends/graphics/sdl/basesdl-graphics.h" #include "backends/mixer/sdl/sdl-mixer.h" /** @@ -54,7 +54,7 @@ public: /** * Get the Graphics Manager instance. Used by other managers. */ - virtual SdlGraphicsManager *getGraphicsManager(); + virtual BaseSdlGraphicsManager *getGraphicsManager(); /** * Get the Mixer Manager instance. Not to confuse with getMixer(), -- cgit v1.2.3 From 4dca7c7e02a111a950124ee26a6d46090a0f755c Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sun, 11 Jul 2010 04:32:24 +0000 Subject: Moved getGraphicsManager() from OSystem_SDL to ModularBackend. Moved public SDL graphics manager functions to graphics manager (Allowing OpenGLSdlGraphicsMaanger to be used with other SDL managers easily). Removed BaseSdlGraphicsManager. Implemented in the opengl manager basic screen functions. svn-id: r50796 --- backends/platform/sdl/sdl.cpp | 9 ++------- backends/platform/sdl/sdl.h | 6 ------ 2 files changed, 2 insertions(+), 13 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 52a2b335aa..e5ae3bb523 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -86,9 +86,9 @@ void OSystem_SDL::initBackend() { if (_graphicsManager == 0) { // Changed to OpenGL for testing //_graphicsManager = new SdlGraphicsManager(); - _graphicsManager = new OpenGLSDLGraphicsManager(); + _graphicsManager = new OpenGLSdlGraphicsManager(); - ((OpenGLSDLGraphicsManager *)_graphicsManager)->init(); + ((OpenGLSdlGraphicsManager *)_graphicsManager)->init(); } if (_audiocdManager == 0) @@ -241,11 +241,6 @@ void OSystem_SDL::setupIcon() { free(icon); } -BaseSdlGraphicsManager *OSystem_SDL::getGraphicsManager() { - assert(_graphicsManager); - return (BaseSdlGraphicsManager *)_graphicsManager; -} - bool OSystem_SDL::pollEvent(Common::Event &event) { assert(_eventManager); return ((SdlEventManager *)_eventManager)->pollSdlEvent(event); diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 97c91966c1..3bb09683b5 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -33,7 +33,6 @@ #endif #include "backends/modular-backend.h" -#include "backends/graphics/sdl/basesdl-graphics.h" #include "backends/mixer/sdl/sdl-mixer.h" /** @@ -51,11 +50,6 @@ public: */ virtual void init(); - /** - * Get the Graphics Manager instance. Used by other managers. - */ - virtual BaseSdlGraphicsManager *getGraphicsManager(); - /** * Get the Mixer Manager instance. Not to confuse with getMixer(), * that returns Audio::Mixer. The Mixer Manager is a SDL wrapper class -- cgit v1.2.3 From 84ceae932852fe684ea553daee712b52da83add6 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Tue, 13 Jul 2010 05:38:10 +0000 Subject: Check if USE_OPENGL is defined for compiling OpenGL code. svn-id: r50842 --- backends/platform/sdl/sdl.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index e5ae3bb523..58e4167a7c 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -32,8 +32,10 @@ #include "backends/events/sdl/sdl-events.h" #include "backends/mutex/sdl/sdl-mutex.h" #include "backends/timer/sdl/sdl-timer.h" -//#include "backends/graphics/sdl/sdl-graphics.h" +#include "backends/graphics/sdl/sdl-graphics.h" +#ifdef USE_OPENGL #include "backends/graphics/openglsdl/openglsdl-graphics.h" +#endif #include "icons/scummvm.xpm" @@ -84,11 +86,31 @@ void OSystem_SDL::initBackend() { } if (_graphicsManager == 0) { - // Changed to OpenGL for testing - //_graphicsManager = new SdlGraphicsManager(); - _graphicsManager = new OpenGLSdlGraphicsManager(); +#ifdef USE_OPENGL + /*if (ConfMan.hasKey("gfx_mode")) { + Common::String gfxMode(ConfMan.get("gfx_mode")); + + _openglGraphicsMode = OpenGLSdlGraphicsManager::getSupportedGraphicsModes(); + + bool use_opengl = false; + while (_openglGraphicsMode->name) { + if (scumm_stricmp(_openglGraphicsMode->name, gfxMode.c_str()) == 0) + use_opengl = true; + + _openglGraphicsMode++; + } + + if (use_opengl) { + _graphicsManager = new OpenGLSdlGraphicsManager(); + ((OpenGLSdlGraphicsManager *)_graphicsManager)->init(); + } + }*/ + _graphicsManager = new OpenGLSdlGraphicsManager(); ((OpenGLSdlGraphicsManager *)_graphicsManager)->init(); +#endif + if (_graphicsManager == 0) + _graphicsManager = new SdlGraphicsManager(); } if (_audiocdManager == 0) -- cgit v1.2.3 From 9ef2fc4744f88837c63150b09655ae3e51023b7e Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Thu, 15 Jul 2010 04:01:41 +0000 Subject: Fixed doing OpenGL calls before a graphical context was created. svn-id: r50905 --- backends/platform/sdl/sdl.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 58e4167a7c..781cff46cb 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -107,7 +107,6 @@ void OSystem_SDL::initBackend() { } }*/ _graphicsManager = new OpenGLSdlGraphicsManager(); - ((OpenGLSdlGraphicsManager *)_graphicsManager)->init(); #endif if (_graphicsManager == 0) _graphicsManager = new SdlGraphicsManager(); -- cgit v1.2.3 From 0e748c5a9784d19d10c23bb5c72f032a2331567b Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Fri, 16 Jul 2010 23:50:46 +0000 Subject: Added basic cursor drawing. svn-id: r50954 --- backends/platform/sdl/sdl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 781cff46cb..3db6d047f8 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -187,12 +187,12 @@ void OSystem_SDL::setWindowCaption(const char *caption) { void OSystem_SDL::deinit() { SDL_ShowCursor(SDL_ENABLE); - delete _eventManager; - _eventManager = 0; delete _savefileManager; _savefileManager = 0; delete _graphicsManager; _graphicsManager = 0; + delete _eventManager; + _eventManager = 0; delete _audiocdManager; _audiocdManager = 0; delete _mixerManager; -- cgit v1.2.3 From 38b4098f676cd222ba6c5f638d3a6a61974d5f88 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Mon, 19 Jul 2010 05:33:58 +0000 Subject: SDL: Hack to handle special SDL events. svn-id: r51015 --- backends/platform/sdl/sdl.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 3bb09683b5..cf02438e91 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -72,6 +72,12 @@ public: virtual void getTimeAndDate(TimeDate &td) const; virtual Audio::Mixer *getMixer(); + // HACK: Special SDL events types + enum SdlEvent { + kSdlEventExpose = 100, + kSdlEventResize = 101 + }; + protected: bool _inited; bool _initedSDL; -- cgit v1.2.3 From ffb5868ac5d998bd6537a5c018dd00358cff2c26 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Fri, 30 Jul 2010 00:48:10 +0000 Subject: SDL: Add SDL backend subfolders paths to makefile MODULE_DIRS. This should fix subfolders sources not recompiling after a header change. svn-id: r51489 --- backends/platform/sdl/module.mk | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index d4a003f574..22c2fb95a7 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -20,7 +20,10 @@ MODULE_OBJS += \ endif MODULE_DIRS += \ - backends/platform/sdl/ + backends/platform/sdl/ \ + backends/platform/sdl/macosx/ \ + backends/platform/sdl/posix/ \ + backends/platform/sdl/win32/ # We don't use the rules.mk here on purpose OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) -- cgit v1.2.3 From 7b070bbef8275ff25dfc2cbc3106acfdc8de74a5 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Fri, 30 Jul 2010 03:31:05 +0000 Subject: SDL/OPENGL: Add ability to switch between SDL and OpenGL graphics managers. OSystem_SDL will create a merged list of all graphics modes from SDL and OpenGL. When the user changes the graphics mode in options and restarts ScummVM should switch to that graphics mode in the corresponding graphics manager. svn-id: r51493 --- backends/platform/sdl/sdl.cpp | 122 +++++++++++++++++++++++++++++++++++++----- backends/platform/sdl/sdl.h | 17 ++++++ 2 files changed, 126 insertions(+), 13 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 3db6d047f8..cf6d44ebb7 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -43,6 +43,12 @@ OSystem_SDL::OSystem_SDL() : +#ifdef USE_OPENGL + _graphicsModes(0), + _graphicsMode(0), + _sdlModesCount(0), + _glModesCount(0), +#endif _inited(false), _initedSDL(false), _mixerManager(0) { @@ -87,26 +93,24 @@ void OSystem_SDL::initBackend() { if (_graphicsManager == 0) { #ifdef USE_OPENGL - /*if (ConfMan.hasKey("gfx_mode")) { - Common::String gfxMode(ConfMan.get("gfx_mode")); - - _openglGraphicsMode = OpenGLSdlGraphicsManager::getSupportedGraphicsModes(); + // Setup a list with both SDL and OpenGL graphics modes + setupGraphicsModes(); + if (ConfMan.hasKey("gfx_mode")) { + Common::String gfxMode(ConfMan.get("gfx_mode")); bool use_opengl = false; - - while (_openglGraphicsMode->name) { - if (scumm_stricmp(_openglGraphicsMode->name, gfxMode.c_str()) == 0) + const OSystem::GraphicsMode *mode = OpenGLSdlGraphicsManager::supportedGraphicsModes(); + while (mode->name) { + if (scumm_stricmp(mode->name, gfxMode.c_str()) == 0) use_opengl = true; - _openglGraphicsMode++; + mode++; } - if (use_opengl) { + // If the gfx_mode is from OpenGL, create the OpenGL graphics manager + if (use_opengl) _graphicsManager = new OpenGLSdlGraphicsManager(); - ((OpenGLSdlGraphicsManager *)_graphicsManager)->init(); - } - }*/ - _graphicsManager = new OpenGLSdlGraphicsManager(); + } #endif if (_graphicsManager == 0) _graphicsManager = new SdlGraphicsManager(); @@ -202,6 +206,10 @@ void OSystem_SDL::deinit() { delete _mutexManager; _mutexManager = 0; +#ifdef USE_OPENGL + free((void *)_graphicsModes), +#endif + SDL_Quit(); } @@ -297,3 +305,91 @@ SdlMixerManager *OSystem_SDL::getMixerManager() { assert(_mixerManager); return _mixerManager; } + +#ifdef USE_OPENGL + +const OSystem::GraphicsMode *OSystem_SDL::getSupportedGraphicsModes() const { + return _graphicsModes; +} + +int OSystem_SDL::getDefaultGraphicsMode() const { + if (_graphicsMode < _sdlModesCount) + return _graphicsManager->getDefaultGraphicsMode(); + else + return _graphicsManager->getDefaultGraphicsMode() + _sdlModesCount; +} + +bool OSystem_SDL::setGraphicsMode(int mode) { + const OSystem::GraphicsMode *srcMode; + int i; + if (mode < _sdlModesCount) { + srcMode = SdlGraphicsManager::supportedGraphicsModes(); + i = 0; + } else { + srcMode = OpenGLSdlGraphicsManager::supportedGraphicsModes(); + i = _sdlModesCount; + } + while (srcMode->name) { + if (i == mode) { + if (_graphicsMode >= _sdlModesCount && mode < _sdlModesCount) { + delete _graphicsManager; + _graphicsManager = new SdlGraphicsManager(); + _graphicsManager->beginGFXTransaction(); + } else if (_graphicsMode < _sdlModesCount && mode >= _sdlModesCount) { + delete _graphicsManager; + _graphicsManager = new OpenGLSdlGraphicsManager(); + _graphicsManager->beginGFXTransaction(); + } + _graphicsMode = mode; + return _graphicsManager->setGraphicsMode(srcMode->id); + } + i++; + srcMode++; + } + return false; +} + +int OSystem_SDL::getGraphicsMode() const { + return _graphicsMode; +} + +void OSystem_SDL::setupGraphicsModes() { + const OSystem::GraphicsMode *sdlGraphicsModes = SdlGraphicsManager::supportedGraphicsModes(); + const OSystem::GraphicsMode *openglGraphicsModes = OpenGLSdlGraphicsManager::supportedGraphicsModes(); + _sdlModesCount = 0; + _glModesCount = 0; + + // Count the number of graphics modes + const OSystem::GraphicsMode *srcMode = sdlGraphicsModes; + while (srcMode->name) { + _sdlModesCount++; + srcMode++; + } + srcMode = openglGraphicsModes; + while (srcMode->name) { + _glModesCount ++; + srcMode++; + } + + // Allocate enough space for merged array of modes + _graphicsModes = (OSystem::GraphicsMode *)malloc(sizeof(OSystem::GraphicsMode) * (_glModesCount + _sdlModesCount + 1)); + + // Copy SDL graphics modes + memcpy((void *)_graphicsModes, sdlGraphicsModes, _sdlModesCount * sizeof(OSystem::GraphicsMode)); + + // Copy OpenGL graphics modes + memcpy((void *)(_graphicsModes + _sdlModesCount), openglGraphicsModes, _glModesCount * sizeof(OSystem::GraphicsMode)); + + // Set a null mode at the end + memset((void *)(_graphicsModes + _sdlModesCount + _glModesCount), 0, sizeof(OSystem::GraphicsMode)); + + // Set new internal ids for all modes + int i = 0; + OSystem::GraphicsMode * mode = _graphicsModes; + while (mode->name) { + mode->id = i++; + mode++; + } +} + +#endif diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index cf02438e91..17d4dc4ed9 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -103,6 +103,23 @@ protected: * of ScummVM will be saved. */ virtual Common::String getDefaultConfigFileName(); + +#ifdef USE_OPENGL + OSystem::GraphicsMode *_graphicsModes; + int _graphicsMode; + int _sdlModesCount; + int _glModesCount; + + /** + * Creates the merged graphics modes list + */ + virtual void setupGraphicsModes(); + + virtual const OSystem::GraphicsMode *getSupportedGraphicsModes() const; + virtual int getDefaultGraphicsMode() const; + virtual bool setGraphicsMode(int mode); + virtual int getGraphicsMode() const; +#endif }; #endif -- cgit v1.2.3 From 7dbe257da8fcfd0996b21bdfe0d3851e3e2e1927 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Sat, 31 Jul 2010 22:54:10 +0000 Subject: OPENGL: Add support for BGR and rgb(a) reversed formats (Not available for GLES). General cleanup and commenting. svn-id: r51559 --- backends/platform/sdl/sdl.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index cf6d44ebb7..2385c33458 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -313,6 +313,7 @@ const OSystem::GraphicsMode *OSystem_SDL::getSupportedGraphicsModes() const { } int OSystem_SDL::getDefaultGraphicsMode() const { + // Return the default graphics mode from the current graphics manager if (_graphicsMode < _sdlModesCount) return _graphicsManager->getDefaultGraphicsMode(); else @@ -322,6 +323,7 @@ int OSystem_SDL::getDefaultGraphicsMode() const { bool OSystem_SDL::setGraphicsMode(int mode) { const OSystem::GraphicsMode *srcMode; int i; + // Check if mode is from SDL or OpenGL if (mode < _sdlModesCount) { srcMode = SdlGraphicsManager::supportedGraphicsModes(); i = 0; @@ -329,8 +331,11 @@ bool OSystem_SDL::setGraphicsMode(int mode) { srcMode = OpenGLSdlGraphicsManager::supportedGraphicsModes(); i = _sdlModesCount; } + // Loop through modes while (srcMode->name) { if (i == mode) { + // If the new mode and the current mode are not from the same graphics + // manager, delete and create the new mode graphics manager if (_graphicsMode >= _sdlModesCount && mode < _sdlModesCount) { delete _graphicsManager; _graphicsManager = new SdlGraphicsManager(); -- cgit v1.2.3 From 6164d1c0cbff4ec0426409d7f6d1a2cc202a3609 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Mon, 23 Aug 2010 18:37:17 +0000 Subject: AMIGAOS: Fix build. svn-id: r52303 --- backends/platform/sdl/amigaos/amigaos-main.cpp | 54 ++++++++++++++++++++++++++ backends/platform/sdl/amigaos/amigaos.cpp | 39 +++++++++++++++++++ backends/platform/sdl/amigaos/amigaos.h | 39 +++++++++++++++++++ backends/platform/sdl/module.mk | 5 +++ 4 files changed, 137 insertions(+) create mode 100644 backends/platform/sdl/amigaos/amigaos-main.cpp create mode 100644 backends/platform/sdl/amigaos/amigaos.cpp create mode 100644 backends/platform/sdl/amigaos/amigaos.h (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/amigaos/amigaos-main.cpp b/backends/platform/sdl/amigaos/amigaos-main.cpp new file mode 100644 index 0000000000..db4598e879 --- /dev/null +++ b/backends/platform/sdl/amigaos/amigaos-main.cpp @@ -0,0 +1,54 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#if defined(__amigaos4__) + +#include "backends/platform/sdl/amigaos/amigaos.h" +#include "backends/plugins/sdl/sdl-provider.h" +#include "base/main.h" + +int main(int argc, char *argv[]) { + + // Create our OSystem instance + g_system = new OSystem_AmigaOS(); + assert(g_system); + + // Pre initialize the backend + ((OSystem_AmigaOS *)g_system)->init(); + +#ifdef DYNAMIC_MODULES + PluginManager::instance().addPluginProvider(new SDLPluginProvider()); +#endif + + // Invoke the actual ScummVM main entry point: + int res = scummvm_main(argc, argv); + + // Free OSystem + delete (OSystem_AmigaOS *)g_system; + + return res; +} + +#endif diff --git a/backends/platform/sdl/amigaos/amigaos.cpp b/backends/platform/sdl/amigaos/amigaos.cpp new file mode 100644 index 0000000000..d2924445a3 --- /dev/null +++ b/backends/platform/sdl/amigaos/amigaos.cpp @@ -0,0 +1,39 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifdef __amigaos4__ + +#include "backends/platform/sdl/amigaos/amigaos.h" +#include "backends/fs/amigaos4/amigaos4-fs-factory.h" + +void OSystem_AmigaOS::init() { + // Initialze File System Factory + _fsFactory = new AmigaOSFilesystemFactory(); + + // Invoke parent implementation of this method + OSystem_SDL::init(); +} + +#endif diff --git a/backends/platform/sdl/amigaos/amigaos.h b/backends/platform/sdl/amigaos/amigaos.h new file mode 100644 index 0000000000..92232ec98a --- /dev/null +++ b/backends/platform/sdl/amigaos/amigaos.h @@ -0,0 +1,39 @@ +/* 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. + * + * $URL$ + * $Id$ + * + */ + +#ifndef PLATFORM_SDL_AMIGAOS_H +#define PLATFORM_SDL_AMIGAOS_H + +#include "backends/platform/sdl/sdl.h" + +class OSystem_AmigaOS : public OSystem_SDL { +public: + OSystem_AmigaOS() {} + virtual ~OSystem_AmigaOS() {} + + virtual void init(); +}; + +#endif diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index a26c57f46c..ce360667d2 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -19,6 +19,11 @@ MODULE_OBJS += \ win32/win32.o endif +ifdef AMIGAOS + amigaos/amigaos-main.o \ + amigaos/amigaos.o +endif + # We don't use the rules.mk here on purpose MODULE_OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) OBJS := $(MODULE_OBJS) $(OBJS) -- cgit v1.2.3 From f27a4df5485b23c1e0c4b6bca0dfaf310d291947 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Mon, 23 Aug 2010 18:52:10 +0000 Subject: AMIGAOS: Again, fix build. svn-id: r52304 --- backends/platform/sdl/module.mk | 1 + 1 file changed, 1 insertion(+) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/module.mk b/backends/platform/sdl/module.mk index ce360667d2..b00bb64718 100644 --- a/backends/platform/sdl/module.mk +++ b/backends/platform/sdl/module.mk @@ -20,6 +20,7 @@ MODULE_OBJS += \ endif ifdef AMIGAOS +MODULE_OBJS += \ amigaos/amigaos-main.o \ amigaos/amigaos.o endif -- cgit v1.2.3 From 0df6bdde1cf7657cda2ac7895d319308ef8bbf8f Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Mon, 23 Aug 2010 19:40:18 +0000 Subject: AMIGAOS: Fix build. svn-id: r52306 --- backends/platform/sdl/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/main.cpp b/backends/platform/sdl/main.cpp index 38d0259121..f917c51048 100644 --- a/backends/platform/sdl/main.cpp +++ b/backends/platform/sdl/main.cpp @@ -25,7 +25,7 @@ // Several SDL based ports use a custom main, and hence do not want to compile // of this file. The following "#if" ensures that. -#if !defined(UNIX) && !defined(WIN32) && !defined(__MAEMO__) && !defined(__SYMBIAN32__) +#if !defined(UNIX) && !defined(WIN32) && !defined(__MAEMO__) && !defined(__SYMBIAN32__) && !defined(__amigaos4__) #include "backends/platform/sdl/sdl.h" #include "backends/plugins/sdl/sdl-provider.h" -- cgit v1.2.3 From 5c392df4471f9928f5cc71a72d07ead4fd2767f1 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Mon, 23 Aug 2010 19:44:39 +0000 Subject: SDL/OPENGL: Fix segfault when using -g command line option. svn-id: r52307 --- backends/platform/sdl/sdl.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 2385c33458..37c29a34f1 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -70,6 +70,11 @@ void OSystem_SDL::init() { if (_timerManager == 0) _timerManager = new SdlTimerManager(); + + #ifdef USE_OPENGL + // Setup a list with both SDL and OpenGL graphics modes + setupGraphicsModes(); + #endif } void OSystem_SDL::initBackend() { @@ -93,9 +98,6 @@ void OSystem_SDL::initBackend() { if (_graphicsManager == 0) { #ifdef USE_OPENGL - // Setup a list with both SDL and OpenGL graphics modes - setupGraphicsModes(); - if (ConfMan.hasKey("gfx_mode")) { Common::String gfxMode(ConfMan.get("gfx_mode")); bool use_opengl = false; -- cgit v1.2.3 From 91367241102badf06c5955423d95aedf524ed864 Mon Sep 17 00:00:00 2001 From: Alejandro Marzini Date: Fri, 3 Sep 2010 04:23:01 +0000 Subject: SDL/OPENGL: Fix backend initialization when building with ENABLE_VKEYBD. svn-id: r52503 --- backends/platform/sdl/sdl.cpp | 49 +++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 16 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 37c29a34f1..3808a50780 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -81,20 +81,7 @@ void OSystem_SDL::initBackend() { // Check if backend has not been initialized assert(!_inited); - // Creates the backend managers, if they don't exist yet (we check - // for this to allow subclasses to provide their own). - if (_eventManager == 0) - _eventManager = new SdlEventManager(this); - - if (_savefileManager == 0) - _savefileManager = new DefaultSaveFileManager(); - - if (_mixerManager == 0) { - _mixerManager = new SdlMixerManager(); - - // Setup and start mixer - _mixerManager->init(); - } + int graphicsManagerType = 0; if (_graphicsManager == 0) { #ifdef USE_OPENGL @@ -110,12 +97,42 @@ void OSystem_SDL::initBackend() { } // If the gfx_mode is from OpenGL, create the OpenGL graphics manager - if (use_opengl) + if (use_opengl) { _graphicsManager = new OpenGLSdlGraphicsManager(); + graphicsManagerType = 1; + } } #endif - if (_graphicsManager == 0) + if (_graphicsManager == 0) { _graphicsManager = new SdlGraphicsManager(); + graphicsManagerType = 0; + } + } + + // Creates the backend managers, if they don't exist yet (we check + // for this to allow subclasses to provide their own). + if (_eventManager == 0) + _eventManager = new SdlEventManager(this); + + // We have to initialize the graphics manager before the event manager + // so the virtual keyboard can be initialized, but we have to add the + // graphics manager as an event observer after initializing the event + // manager. + if (graphicsManagerType == 0) + ((SdlGraphicsManager *)_graphicsManager)->initEventObserver(); +#ifdef USE_OPENGL + else if (graphicsManagerType == 1) + ((OpenGLSdlGraphicsManager *)_graphicsManager)->initEventObserver(); +#endif + + if (_savefileManager == 0) + _savefileManager = new DefaultSaveFileManager(); + + if (_mixerManager == 0) { + _mixerManager = new SdlMixerManager(); + + // Setup and start mixer + _mixerManager->init(); } if (_audiocdManager == 0) -- cgit v1.2.3 From 48ee83b88957dab86bc763e9ef21a70179fa8679 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Fri, 3 Sep 2010 15:52:31 +0000 Subject: OPENGL: Properly initialize the graphics manager again. Starting with r52503 the graphics manager's only initialize their event observer when initEventObserver is called. It seems like it was an oversight that this was not done in OSystem_SDL::setGraphicsMode, when a new graphics manager was initialized. This should fix window resizing with the OpenGL graphic's manager and mouse movement. svn-id: r52506 --- backends/platform/sdl/sdl.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 3808a50780..5b38cbb9b4 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -358,10 +358,12 @@ bool OSystem_SDL::setGraphicsMode(int mode) { if (_graphicsMode >= _sdlModesCount && mode < _sdlModesCount) { delete _graphicsManager; _graphicsManager = new SdlGraphicsManager(); + ((SdlGraphicsManager *)_graphicsManager)->initEventObserver(); _graphicsManager->beginGFXTransaction(); } else if (_graphicsMode < _sdlModesCount && mode >= _sdlModesCount) { delete _graphicsManager; _graphicsManager = new OpenGLSdlGraphicsManager(); + ((OpenGLSdlGraphicsManager *)_graphicsManager)->initEventObserver(); _graphicsManager->beginGFXTransaction(); } _graphicsMode = mode; -- cgit v1.2.3 From a2b96a2516cd87203b22f7496a8d5a6b65749da3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 13 Oct 2010 15:42:16 +0000 Subject: OPENGL: Replace SdlEventManager by SdlEventSource. Formerly SdlEventManager was a subclass of DefaultEventManager but did not really have anything in common with the idea of our EventManager interface. Now I made a new object SdlEventSource which only subclasses EventSource and which is responsible for obtaining events from SDL (and processing them). svn-id: r53433 --- backends/platform/sdl/sdl.cpp | 7 +------ backends/platform/sdl/sdl.h | 4 ++-- 2 files changed, 3 insertions(+), 8 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 5b38cbb9b4..38bf4d0ba9 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -112,7 +112,7 @@ void OSystem_SDL::initBackend() { // Creates the backend managers, if they don't exist yet (we check // for this to allow subclasses to provide their own). if (_eventManager == 0) - _eventManager = new SdlEventManager(this); + _eventManager = new DefaultEventManager(this); // We have to initialize the graphics manager before the event manager // so the virtual keyboard can be initialized, but we have to add the @@ -289,11 +289,6 @@ void OSystem_SDL::setupIcon() { free(icon); } -bool OSystem_SDL::pollEvent(Common::Event &event) { - assert(_eventManager); - return ((SdlEventManager *)_eventManager)->pollSdlEvent(event); -} - uint32 OSystem_SDL::getMillis() { uint32 millis = SDL_GetTicks(); g_eventRec.processMillis(millis); diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 17d4dc4ed9..9ef2573dad 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -34,11 +34,12 @@ #include "backends/modular-backend.h" #include "backends/mixer/sdl/sdl-mixer.h" +#include "backends/events/sdl/sdl-events.h" /** * Base OSystem class for all SDL ports. */ -class OSystem_SDL : public ModularBackend { +class OSystem_SDL : public ModularBackend, public SdlEventSource { public: OSystem_SDL(); virtual ~OSystem_SDL(); @@ -66,7 +67,6 @@ public: virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority = 0); virtual Common::SeekableReadStream *createConfigReadStream(); virtual Common::WriteStream *createConfigWriteStream(); - virtual bool pollEvent(Common::Event &event); virtual uint32 getMillis(); virtual void delayMillis(uint msecs); virtual void getTimeAndDate(TimeDate &td) const; -- cgit v1.2.3 From 34302765caecabf21cc884de95805b3e1d8f8ea1 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 13 Oct 2010 15:42:53 +0000 Subject: OPENGL: Get rid of one ugly cast. svn-id: r53435 --- backends/platform/sdl/sdl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 38bf4d0ba9..f3609d8212 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -104,7 +104,7 @@ void OSystem_SDL::initBackend() { } #endif if (_graphicsManager == 0) { - _graphicsManager = new SdlGraphicsManager(); + _graphicsManager = new SdlGraphicsManager(this); graphicsManagerType = 0; } } @@ -352,7 +352,7 @@ bool OSystem_SDL::setGraphicsMode(int mode) { // manager, delete and create the new mode graphics manager if (_graphicsMode >= _sdlModesCount && mode < _sdlModesCount) { delete _graphicsManager; - _graphicsManager = new SdlGraphicsManager(); + _graphicsManager = new SdlGraphicsManager(this); ((SdlGraphicsManager *)_graphicsManager)->initEventObserver(); _graphicsManager->beginGFXTransaction(); } else if (_graphicsMode < _sdlModesCount && mode >= _sdlModesCount) { -- cgit v1.2.3 From 54f559dc516d8de6ec916176ece4988f55f25d32 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Wed, 13 Oct 2010 15:43:08 +0000 Subject: OPENGL: Cleanup. svn-id: r53436 --- backends/platform/sdl/sdl.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index f3609d8212..5428a791e0 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -226,7 +226,7 @@ void OSystem_SDL::deinit() { _mutexManager = 0; #ifdef USE_OPENGL - free((void *)_graphicsModes), + delete[] _graphicsModes; #endif SDL_Quit(); @@ -388,12 +388,12 @@ void OSystem_SDL::setupGraphicsModes() { } srcMode = openglGraphicsModes; while (srcMode->name) { - _glModesCount ++; + _glModesCount++; srcMode++; } // Allocate enough space for merged array of modes - _graphicsModes = (OSystem::GraphicsMode *)malloc(sizeof(OSystem::GraphicsMode) * (_glModesCount + _sdlModesCount + 1)); + _graphicsModes = new OSystem::GraphicsMode[_glModesCount + _sdlModesCount + 1]; // Copy SDL graphics modes memcpy((void *)_graphicsModes, sdlGraphicsModes, _sdlModesCount * sizeof(OSystem::GraphicsMode)); @@ -406,7 +406,7 @@ void OSystem_SDL::setupGraphicsModes() { // Set new internal ids for all modes int i = 0; - OSystem::GraphicsMode * mode = _graphicsModes; + OSystem::GraphicsMode *mode = _graphicsModes; while (mode->name) { mode->id = i++; mode++; -- cgit v1.2.3 From b713beed189b439853be50fa330d06b3275f9713 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Thu, 21 Oct 2010 18:13:13 +0000 Subject: OPENGL: Add an SdlEventSource member to OSystem_SDL instead of subclassing SdlEventSource. Derived backends are allowed to overwrite that member in case they need special handling of SDL events. svn-id: r53675 --- backends/platform/sdl/sdl.cpp | 16 ++++++++++++---- backends/platform/sdl/sdl.h | 7 ++++++- 2 files changed, 18 insertions(+), 5 deletions(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 5428a791e0..fbfb83fa1d 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -51,7 +51,8 @@ OSystem_SDL::OSystem_SDL() #endif _inited(false), _initedSDL(false), - _mixerManager(0) { + _mixerManager(0), + _eventSource(0) { } @@ -81,6 +82,11 @@ void OSystem_SDL::initBackend() { // Check if backend has not been initialized assert(!_inited); + // Create the default event source, in case a custom backend + // manager didn't provide one yet. + if (_eventSource == 0) + _eventSource = new SdlEventSource(); + int graphicsManagerType = 0; if (_graphicsManager == 0) { @@ -104,7 +110,7 @@ void OSystem_SDL::initBackend() { } #endif if (_graphicsManager == 0) { - _graphicsManager = new SdlGraphicsManager(this); + _graphicsManager = new SdlGraphicsManager(_eventSource); graphicsManagerType = 0; } } @@ -112,7 +118,7 @@ void OSystem_SDL::initBackend() { // Creates the backend managers, if they don't exist yet (we check // for this to allow subclasses to provide their own). if (_eventManager == 0) - _eventManager = new DefaultEventManager(this); + _eventManager = new DefaultEventManager(_eventSource); // We have to initialize the graphics manager before the event manager // so the virtual keyboard can be initialized, but we have to add the @@ -216,6 +222,8 @@ void OSystem_SDL::deinit() { _graphicsManager = 0; delete _eventManager; _eventManager = 0; + delete _eventSource; + _eventSource = 0; delete _audiocdManager; _audiocdManager = 0; delete _mixerManager; @@ -352,7 +360,7 @@ bool OSystem_SDL::setGraphicsMode(int mode) { // manager, delete and create the new mode graphics manager if (_graphicsMode >= _sdlModesCount && mode < _sdlModesCount) { delete _graphicsManager; - _graphicsManager = new SdlGraphicsManager(this); + _graphicsManager = new SdlGraphicsManager(_eventSource); ((SdlGraphicsManager *)_graphicsManager)->initEventObserver(); _graphicsManager->beginGFXTransaction(); } else if (_graphicsMode < _sdlModesCount && mode >= _sdlModesCount) { diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 9ef2573dad..5b1ce8f803 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -39,7 +39,7 @@ /** * Base OSystem class for all SDL ports. */ -class OSystem_SDL : public ModularBackend, public SdlEventSource { +class OSystem_SDL : public ModularBackend { public: OSystem_SDL(); virtual ~OSystem_SDL(); @@ -88,6 +88,11 @@ protected: */ SdlMixerManager *_mixerManager; + /** + * The event source we use for obtaining SDL events. + */ + SdlEventSource *_eventSource; + /** * Initialze the SDL library. */ -- cgit v1.2.3 From 74a53df11b51fa4956745c086b2e6351b8383568 Mon Sep 17 00:00:00 2001 From: Fabio Battaglia Date: Sat, 23 Oct 2010 09:30:26 +0000 Subject: DINGUX: fix compilation for the opengl branch Moved events related code to backends/events/dinguxsdl/* and move graphics related code to backends/graphics/dinguxsdl/* Subclass OSystem_POSIX instead of OSystem_SDL svn-id: r53730 --- backends/platform/sdl/posix/posix-main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backends/platform/sdl') diff --git a/backends/platform/sdl/posix/posix-main.cpp b/backends/platform/sdl/posix/posix-main.cpp index ad11fc230e..de9eb2b7ef 100644 --- a/backends/platform/sdl/posix/posix-main.cpp +++ b/backends/platform/sdl/posix/posix-main.cpp @@ -23,7 +23,7 @@ * */ -#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(LINUXMOTO) && !defined(GP2XWIZ) && !defined(GP2X) +#if defined(UNIX) && !defined(MACOSX) && !defined(SAMSUNGTV) && !defined(LINUXMOTO) && !defined(GP2XWIZ) && !defined(GP2X) && !defined(DINGUX) #include "backends/platform/sdl/posix/posix.h" #include "backends/plugins/sdl/sdl-provider.h" -- cgit v1.2.3