Different platforms have different levels of support of encodings and often have slight variations. We already have tables for most encoding with only CJK missing. Full transcoding inclusion allows us to get reliable encoding results independently of platform. The biggest con is the need for external tables encoding.dat. It removes a duplicate table for korean in graphics/korfont.cpp
249 lines
6.5 KiB
C++
249 lines
6.5 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
#include <time.h>
|
|
#ifdef POSIX
|
|
#include <sys/time.h>
|
|
#include <unistd.h>
|
|
#include <signal.h>
|
|
#endif
|
|
|
|
// We use some stdio.h functionality here thus we need to allow some
|
|
// symbols. Alternatively, we could simply allow everything by defining
|
|
// FORBIDDEN_SYMBOL_ALLOW_ALL
|
|
#define FORBIDDEN_SYMBOL_EXCEPTION_FILE
|
|
#define FORBIDDEN_SYMBOL_EXCEPTION_stdout
|
|
#define FORBIDDEN_SYMBOL_EXCEPTION_stderr
|
|
#define FORBIDDEN_SYMBOL_EXCEPTION_fputs
|
|
#define FORBIDDEN_SYMBOL_EXCEPTION_exit
|
|
#define FORBIDDEN_SYMBOL_EXCEPTION_time_h
|
|
|
|
#include "backends/modular-backend.h"
|
|
#include "base/main.h"
|
|
|
|
#if defined(USE_NULL_DRIVER)
|
|
#include "backends/saves/default/default-saves.h"
|
|
#include "backends/timer/default/default-timer.h"
|
|
#include "backends/events/default/default-events.h"
|
|
#include "backends/mixer/null/null-mixer.h"
|
|
#include "backends/mutex/null/null-mutex.h"
|
|
#include "backends/graphics/null/null-graphics.h"
|
|
#include "audio/mixer_intern.h"
|
|
#include "common/scummsys.h"
|
|
#include "gui/debugger.h"
|
|
|
|
/*
|
|
* Include header files needed for the getFilesystemFactory() method.
|
|
*/
|
|
#if defined(__amigaos4__)
|
|
#include "backends/fs/amigaos4/amigaos4-fs-factory.h"
|
|
#elif defined(__MORPHOS__)
|
|
#include "backends/fs/morphos/morphos-fs-factory.h"
|
|
#elif defined(POSIX)
|
|
#include "backends/fs/posix/posix-fs-factory.h"
|
|
#elif defined(RISCOS)
|
|
#include "backends/fs/riscos/riscos-fs-factory.h"
|
|
#elif defined(WIN32)
|
|
#include "backends/fs/windows/windows-fs-factory.h"
|
|
#endif
|
|
|
|
class OSystem_NULL : public ModularMutexBackend, public ModularMixerBackend, public ModularGraphicsBackend, Common::EventSource {
|
|
public:
|
|
OSystem_NULL();
|
|
virtual ~OSystem_NULL();
|
|
|
|
virtual void initBackend();
|
|
|
|
virtual bool pollEvent(Common::Event &event);
|
|
|
|
virtual uint32 getMillis(bool skipRecord = false);
|
|
virtual void delayMillis(uint msecs);
|
|
virtual void getTimeAndDate(TimeDate &t) const;
|
|
|
|
virtual void quit();
|
|
|
|
virtual void logMessage(LogMessageType::Type type, const char *message);
|
|
|
|
#ifdef NULL_DRIVER_USE_FOR_TEST
|
|
virtual void addSysArchivesToSearchSet(Common::SearchSet &s, int priority);
|
|
#endif
|
|
|
|
private:
|
|
#ifdef POSIX
|
|
timeval _startTime;
|
|
#endif
|
|
};
|
|
|
|
OSystem_NULL::OSystem_NULL() {
|
|
#if defined(__amigaos4__)
|
|
_fsFactory = new AmigaOSFilesystemFactory();
|
|
#elif defined(__MORPHOS__)
|
|
_fsFactory = new MorphOSFilesystemFactory();
|
|
#elif defined(POSIX)
|
|
_fsFactory = new POSIXFilesystemFactory();
|
|
#elif defined(RISCOS)
|
|
_fsFactory = new RISCOSFilesystemFactory();
|
|
#elif defined(WIN32)
|
|
_fsFactory = new WindowsFilesystemFactory();
|
|
#else
|
|
#error Unknown and unsupported FS backend
|
|
#endif
|
|
}
|
|
|
|
OSystem_NULL::~OSystem_NULL() {
|
|
}
|
|
|
|
#if defined(POSIX) && !defined(NULL_DRIVER_USE_FOR_TEST)
|
|
static volatile bool intReceived = false;
|
|
|
|
static sighandler_t last_handler;
|
|
|
|
void intHandler(int dummy) {
|
|
signal(SIGINT, last_handler);
|
|
intReceived = true;
|
|
}
|
|
#endif
|
|
|
|
void OSystem_NULL::initBackend() {
|
|
#ifdef POSIX
|
|
gettimeofday(&_startTime, 0);
|
|
#endif
|
|
#if defined(POSIX) && !defined(NULL_DRIVER_USE_FOR_TEST)
|
|
last_handler = signal(SIGINT, intHandler);
|
|
#endif
|
|
|
|
_mutexManager = new NullMutexManager();
|
|
_timerManager = new DefaultTimerManager();
|
|
_eventManager = new DefaultEventManager(this);
|
|
_savefileManager = new DefaultSaveFileManager();
|
|
_graphicsManager = new NullGraphicsManager();
|
|
_mixerManager = new NullMixerManager();
|
|
// Setup and start mixer
|
|
_mixerManager->init();
|
|
|
|
BaseBackend::initBackend();
|
|
}
|
|
|
|
bool OSystem_NULL::pollEvent(Common::Event &event) {
|
|
((DefaultTimerManager *)getTimerManager())->checkTimers();
|
|
((NullMixerManager *)_mixerManager)->update(1);
|
|
|
|
#if defined(POSIX) && !defined(NULL_DRIVER_USE_FOR_TEST)
|
|
if (intReceived) {
|
|
intReceived = false;
|
|
|
|
#ifdef USE_TEXT_CONSOLE_FOR_DEBUGGER
|
|
GUI::Debugger *debugger = g_engine ? g_engine->getOrCreateDebugger() : nullptr;
|
|
if (debugger && !debugger->isActive()) {
|
|
last_handler = signal(SIGINT, intHandler);
|
|
event.type = Common::EVENT_DEBUGGER;
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
event.type = Common::EVENT_QUIT;
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
return false;
|
|
}
|
|
|
|
uint32 OSystem_NULL::getMillis(bool skipRecord) {
|
|
#ifdef POSIX
|
|
timeval curTime;
|
|
|
|
gettimeofday(&curTime, 0);
|
|
|
|
return (uint32)(((curTime.tv_sec - _startTime.tv_sec) * 1000) +
|
|
((curTime.tv_usec - _startTime.tv_usec) / 1000));
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
void OSystem_NULL::delayMillis(uint msecs) {
|
|
#ifdef POSIX
|
|
usleep(msecs * 1000);
|
|
#endif
|
|
}
|
|
|
|
void OSystem_NULL::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;
|
|
td.tm_wday = t.tm_wday;
|
|
}
|
|
|
|
void OSystem_NULL::quit() {
|
|
exit(0);
|
|
}
|
|
|
|
void OSystem_NULL::logMessage(LogMessageType::Type type, const char *message) {
|
|
FILE *output = 0;
|
|
|
|
if (type == LogMessageType::kInfo || type == LogMessageType::kDebug)
|
|
output = stdout;
|
|
else
|
|
output = stderr;
|
|
|
|
fputs(message, output);
|
|
fflush(output);
|
|
}
|
|
|
|
OSystem *OSystem_NULL_create() {
|
|
return new OSystem_NULL();
|
|
}
|
|
|
|
#ifndef NULL_DRIVER_USE_FOR_TEST
|
|
int main(int argc, char *argv[]) {
|
|
g_system = OSystem_NULL_create();
|
|
assert(g_system);
|
|
|
|
// Invoke the actual ScummVM main entry point:
|
|
int res = scummvm_main(argc, argv);
|
|
g_system->destroy();
|
|
return res;
|
|
}
|
|
#else
|
|
void OSystem_NULL::addSysArchivesToSearchSet(Common::SearchSet &s, int priority) {
|
|
Common::String dataPath = "dists/engine-data";
|
|
Common::FSNode dataNode(dataPath);
|
|
s.add(dataPath, new Common::FSDirectory(dataNode, 4), priority);
|
|
}
|
|
void Common::install_null_g_system() {
|
|
g_system = OSystem_NULL_create();
|
|
}
|
|
#endif
|
|
|
|
#else /* USE_NULL_DRIVER */
|
|
|
|
OSystem *OSystem_NULL_create() {
|
|
return NULL;
|
|
}
|
|
|
|
#endif
|