synced code with scummvm trunk
This commit is contained in:
parent
c8436afa36
commit
edadbb35be
140 changed files with 5146 additions and 2956 deletions
|
@ -29,6 +29,9 @@ MODULES += \
|
|||
backends \
|
||||
common \
|
||||
|
||||
ifdef USE_MT32EMU
|
||||
MODULES += sound/softsynth/mt32
|
||||
endif
|
||||
|
||||
######################################################################
|
||||
# The build rules follow - normally you should have no need to
|
||||
|
@ -68,7 +71,7 @@ endif
|
|||
|
||||
# The build rule for the Residual executable
|
||||
$(EXECUTABLE): $(OBJS)
|
||||
$(QUIET_LINK)$(CXX) $(LDFLAGS) $(PRE_OBJS_FLAGS) $+ $(POST_OBJS_FLAGS) $(LIBS) -o $@
|
||||
$(QUIET_LINK)$(LD) $(LDFLAGS) $(PRE_OBJS_FLAGS) $+ $(POST_OBJS_FLAGS) $(LIBS) -o $@
|
||||
|
||||
distclean: clean
|
||||
$(RM) config.h config.mk config.log
|
||||
|
@ -90,7 +93,12 @@ ifdef CXX_UPDATE_DEP_FLAG
|
|||
$(QUIET)$(MKDIR) $(*D)/$(DEPDIR)
|
||||
$(QUIET_CXX)$(CXX) $(CXX_UPDATE_DEP_FLAG) $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o
|
||||
|
||||
# Build rule for Objective-C files. Strictly speaking, this is for OS X only.
|
||||
|
||||
# Build rules for Objective-C and Objective-C++ files. Strictly speaking, this is for OS X only.
|
||||
%.o: %.mm
|
||||
$(QUIET)$(MKDIR) $(*D)/$(DEPDIR)
|
||||
$(QUIET_CXX)$(CXX) $(CXX_UPDATE_DEP_FLAG) $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o
|
||||
|
||||
%.o: %.m
|
||||
$(QUIET)$(MKDIR) $(*D)/$(DEPDIR)
|
||||
$(QUIET_CXX)$(CXX) $(CXX_UPDATE_DEP_FLAG) $(OBJCFLAGS) -c $(<) -o $*.o
|
||||
|
@ -104,18 +112,31 @@ else
|
|||
|
||||
endif
|
||||
|
||||
|
||||
# Build rule for assembler files
|
||||
%.o: %.s
|
||||
$(QUIET)$(MKDIR) $(*D)
|
||||
$(QUIET_AS)$(AS) $(ASFLAGS) $(<) -o $*.o
|
||||
|
||||
# Build rule for assembler files with preprocessing
|
||||
%.o: %.S
|
||||
$(QUIET)$(MKDIR) $(*D)/$(DEPDIR)
|
||||
$(QUIET_AS)$(CXX) $(CXX_UPDATE_DEP_FLAG) $(ASFLAGS) -c $(<) -o $*.o
|
||||
|
||||
ifdef HAVE_NASM
|
||||
# Build rule for NASM assembler files
|
||||
%.o: %.asm
|
||||
$(QUIET)$(MKDIR) $(*D)
|
||||
$(QUIET_NASM)$(NASM) -O1 $(NASMFLAGS) -g -o $*.o $(<)
|
||||
endif
|
||||
|
||||
# Include the dependency tracking files.
|
||||
-include $(wildcard $(addsuffix /*.d,$(DEPDIRS)))
|
||||
|
||||
# Mark *.d files and most *.mk files as PHONY. This stops make from trying to
|
||||
# recreate them (which it can't), and in particular from looking for potential
|
||||
# source files. This can save quite a bit of disk access time.
|
||||
.PHONY: $(wildcard $(addsuffix /*.d,$(DEPDIRS))) $(addprefix $(srcdir)/, $(addsuffix /module.mk,$(MODULES))) \
|
||||
$(srcdir)/$(port_mk) $(srcdir)/rules.mk $(srcdir)/engines/engines.mk
|
||||
|
||||
######################################################################
|
||||
# Get the current version information
|
||||
|
|
|
@ -46,13 +46,15 @@ Common::EventManager *BaseBackend::getEventManager() {
|
|||
}
|
||||
|
||||
#if defined(UNIX)
|
||||
#ifdef MACOSX
|
||||
#define DEFAULT_CONFIG_FILE "Library/Preferences/Residual Preferences"
|
||||
#if defined(SAMSUNGTV)
|
||||
#define DEFAULT_CONFIG_FILE "/dtv/usb/sda1/.scummvmrc"
|
||||
#else
|
||||
#define DEFAULT_CONFIG_FILE ".residualrc"
|
||||
#endif
|
||||
#else
|
||||
#define DEFAULT_CONFIG_FILE "residual.ini"
|
||||
#endif
|
||||
|
||||
#if !defined(UNIX)
|
||||
#define DEFAULT_CONFIG_FILE "scummvm.ini"
|
||||
#endif
|
||||
|
||||
Common::SeekableReadStream *BaseBackend::createConfigReadStream() {
|
||||
|
|
|
@ -172,7 +172,7 @@ AmigaOSFilesystemNode::AmigaOSFilesystemNode(const Common::String &p) {
|
|||
_nProt = pExd->Protection;
|
||||
if (EXD_IS_DIRECTORY(pExd)) {
|
||||
_bIsDirectory = true;
|
||||
_pFileLock = IDOS->Lock((CONST_STRPTR)_sPath.c_str(), SHARED_LOCK);;
|
||||
_pFileLock = IDOS->Lock((CONST_STRPTR)_sPath.c_str(), SHARED_LOCK);
|
||||
_bIsValid = (_pFileLock != 0);
|
||||
|
||||
// Add a trailing slash if it is needed
|
||||
|
|
|
@ -20,77 +20,11 @@
|
|||
*
|
||||
* $URL$
|
||||
* $Id$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "backends/fs/stdiostream.h"
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(MACOSX) || defined(IPHONE)
|
||||
#include "CoreFoundation/CoreFoundation.h"
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __PLAYSTATION2__
|
||||
// for those replaced fopen/fread/etc functions
|
||||
typedef unsigned long uint64;
|
||||
typedef signed long int64;
|
||||
#include "backends/platform/ps2/fileio.h"
|
||||
|
||||
#define fopen(a, b) ps2_fopen(a, b)
|
||||
#define fclose(a) ps2_fclose(a)
|
||||
#define fseek(a, b, c) ps2_fseek(a, b, c)
|
||||
#define ftell(a) ps2_ftell(a)
|
||||
#define feof(a) ps2_feof(a)
|
||||
#define fread(a, b, c, d) ps2_fread(a, b, c, d)
|
||||
#define fwrite(a, b, c, d) ps2_fwrite(a, b, c, d)
|
||||
|
||||
#define fprintf ps2_fprintf // used in common/util.cpp
|
||||
#define fflush(a) ps2_fflush(a) // used in common/util.cpp
|
||||
#define ferror(a) ps2_ferror(a)
|
||||
#define clearerr(a) ps2_clearerr(a)
|
||||
|
||||
//#define fgetc(a) ps2_fgetc(a) // not used
|
||||
//#define fgets(a, b, c) ps2_fgets(a, b, c) // not used
|
||||
//#define fputc(a, b) ps2_fputc(a, b) // not used
|
||||
//#define fputs(a, b) ps2_fputs(a, b) // not used
|
||||
|
||||
//#define fsize(a) ps2_fsize(a) // not used -- and it is not a standard function either
|
||||
#endif
|
||||
|
||||
#ifdef __DS__
|
||||
|
||||
// These functions replace the standard library functions of the same name.
|
||||
// As this header is included after the standard one, I have the chance to #define
|
||||
// all of these to my own code.
|
||||
//
|
||||
// A #define is the only way, as redefinig the functions would cause linker errors.
|
||||
|
||||
// These functions need to be #undef'ed, as their original definition
|
||||
// in devkitarm is done with #includes (ugh!)
|
||||
#undef feof
|
||||
#undef clearerr
|
||||
//#undef getc
|
||||
//#undef ferror
|
||||
|
||||
#include "backends/fs/ds/ds-fs.h"
|
||||
|
||||
|
||||
// Only functions used in the ScummVM source have been defined here!
|
||||
#define fopen(name, mode) DS::std_fopen(name, mode)
|
||||
#define fclose(handle) DS::std_fclose(handle)
|
||||
#define fread(ptr, size, items, file) DS::std_fread(ptr, size, items, file)
|
||||
#define fwrite(ptr, size, items, file) DS::std_fwrite(ptr, size, items, file)
|
||||
#define feof(handle) DS::std_feof(handle)
|
||||
#define ftell(handle) DS::std_ftell(handle)
|
||||
#define fseek(handle, offset, whence) DS::std_fseek(handle, offset, whence)
|
||||
#define clearerr(handle) DS::std_clearerr(handle)
|
||||
#define fflush(file) DS::std_fflush(file)
|
||||
#undef ferror
|
||||
#define ferror(handle) DS::std_ferror(handle)
|
||||
|
||||
#endif
|
||||
|
||||
StdioStream::StdioStream(void *handle) : _handle(handle) {
|
||||
assert(handle);
|
||||
}
|
||||
|
|
|
@ -57,6 +57,6 @@ const HardwareKey *Action::getMappedKey() const {
|
|||
return _hwKey;
|
||||
}
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_KEYMAPPER
|
||||
|
|
|
@ -119,7 +119,7 @@ struct ActionPriorityComp : public BinaryFunction<Action, Action, bool> {
|
|||
}
|
||||
};
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_KEYMAPPER
|
||||
|
||||
|
|
|
@ -131,7 +131,7 @@ private:
|
|||
};
|
||||
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_KEYMAPPER
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ namespace Common {
|
|||
Keymap::Keymap(const Keymap& km) : _actions(km._actions), _keymap(), _configDomain(0) {
|
||||
List<Action*>::iterator it;
|
||||
|
||||
for (it = _actions.begin(); it != _actions.end(); it++) {
|
||||
for (it = _actions.begin(); it != _actions.end(); ++it) {
|
||||
const HardwareKey *hwKey = (*it)->getMappedKey();
|
||||
|
||||
if (hwKey) {
|
||||
|
@ -48,7 +48,7 @@ Keymap::Keymap(const Keymap& km) : _actions(km._actions), _keymap(), _configDoma
|
|||
Keymap::~Keymap() {
|
||||
List<Action*>::iterator it;
|
||||
|
||||
for (it = _actions.begin(); it != _actions.end(); it++)
|
||||
for (it = _actions.begin(); it != _actions.end(); ++it)
|
||||
delete *it;
|
||||
}
|
||||
|
||||
|
@ -87,7 +87,7 @@ Action *Keymap::getAction(const char *id) {
|
|||
Action *Keymap::findAction(const char *id) {
|
||||
List<Action*>::iterator it;
|
||||
|
||||
for (it = _actions.begin(); it != _actions.end(); it++) {
|
||||
for (it = _actions.begin(); it != _actions.end(); ++it) {
|
||||
if (strncmp((*it)->id, id, ACTION_ID_SIZE) == 0)
|
||||
return *it;
|
||||
}
|
||||
|
@ -97,7 +97,7 @@ Action *Keymap::findAction(const char *id) {
|
|||
const Action *Keymap::findAction(const char *id) const {
|
||||
List<Action*>::const_iterator it;
|
||||
|
||||
for (it = _actions.begin(); it != _actions.end(); it++) {
|
||||
for (it = _actions.begin(); it != _actions.end(); ++it) {
|
||||
if (strncmp((*it)->id, id, ACTION_ID_SIZE) == 0)
|
||||
return *it;
|
||||
}
|
||||
|
@ -127,7 +127,7 @@ void Keymap::loadMappings(const HardwareKeySet *hwKeys) {
|
|||
ConfigManager::Domain::iterator it;
|
||||
String prefix = KEYMAP_KEY_PREFIX + _name + "_";
|
||||
|
||||
for (it = _configDomain->begin(); it != _configDomain->end(); it++) {
|
||||
for (it = _configDomain->begin(); it != _configDomain->end(); ++it) {
|
||||
const String& key = it->_key;
|
||||
|
||||
if (!key.hasPrefix(prefix.c_str()))
|
||||
|
@ -164,7 +164,7 @@ void Keymap::saveMappings() {
|
|||
List<Action*>::const_iterator it;
|
||||
String prefix = KEYMAP_KEY_PREFIX + _name + "_";
|
||||
|
||||
for (it = _actions.begin(); it != _actions.end(); it++) {
|
||||
for (it = _actions.begin(); it != _actions.end(); ++it) {
|
||||
uint actIdLen = strlen((*it)->id);
|
||||
|
||||
actIdLen = (actIdLen > ACTION_ID_SIZE) ? ACTION_ID_SIZE : actIdLen;
|
||||
|
@ -186,7 +186,7 @@ bool Keymap::isComplete(const HardwareKeySet *hwKeys) {
|
|||
bool allMapped = true;
|
||||
uint numberMapped = 0;
|
||||
|
||||
for (it = _actions.begin(); it != _actions.end(); it++) {
|
||||
for (it = _actions.begin(); it != _actions.end(); ++it) {
|
||||
if ((*it)->getMappedKey()) {
|
||||
numberMapped++;
|
||||
} else {
|
||||
|
@ -336,6 +336,6 @@ Action *Keymap::getParentMappedAction(KeyState key) {
|
|||
}
|
||||
}
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_KEYMAPPER
|
||||
|
|
|
@ -147,7 +147,7 @@ private:
|
|||
};
|
||||
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_KEYMAPPER
|
||||
|
||||
|
|
|
@ -272,6 +272,6 @@ const HardwareKey *Keymapper::findHardwareKey(const KeyState& key) {
|
|||
return (_hardwareKeys) ? _hardwareKeys->findHardwareKey(key) : 0;
|
||||
}
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_KEYMAPPER
|
||||
|
|
|
@ -197,7 +197,7 @@ private:
|
|||
|
||||
};
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_KEYMAPPER
|
||||
|
||||
|
|
|
@ -94,7 +94,7 @@ void RemapDialog::open() {
|
|||
if (_globalKeymaps) {
|
||||
if (divider)
|
||||
_kmPopUp->appendEntry("");
|
||||
for (it = _globalKeymaps->begin(); it != _globalKeymaps->end(); it++) {
|
||||
for (it = _globalKeymaps->begin(); it != _globalKeymaps->end(); ++it) {
|
||||
_kmPopUp->appendEntry(it->_value->getName() + " (Global)", idx);
|
||||
_keymapTable[idx++] = it->_value;
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ void RemapDialog::open() {
|
|||
if (_gameKeymaps) {
|
||||
if (divider)
|
||||
_kmPopUp->appendEntry("");
|
||||
for (it = _gameKeymaps->begin(); it != _gameKeymaps->end(); it++) {
|
||||
for (it = _gameKeymaps->begin(); it != _gameKeymaps->end(); ++it) {
|
||||
_kmPopUp->appendEntry(it->_value->getName() + " (Game)", idx);
|
||||
_keymapTable[idx++] = it->_value;
|
||||
}
|
||||
|
@ -317,7 +317,7 @@ void RemapDialog::loadKeymap() {
|
|||
|
||||
List<Action*>::iterator it;
|
||||
|
||||
for (it = km->getActions().begin(); it != km->getActions().end(); it++) {
|
||||
for (it = km->getActions().begin(); it != km->getActions().end(); ++it) {
|
||||
ActionInfo info = {*it, false, (*it)->description};
|
||||
|
||||
_currentActions.push_back(info);
|
||||
|
@ -380,6 +380,6 @@ void RemapDialog::refreshKeymap() {
|
|||
}
|
||||
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_KEYMAPPER
|
||||
|
|
|
@ -92,7 +92,7 @@ protected:
|
|||
|
||||
};
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_KEYMAPPER
|
||||
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifndef COMMON_TYPES_H
|
||||
#define COMMON_TYPES_H
|
||||
#ifndef KEYMAPPER_TYPES_H
|
||||
#define KEYMAPPER_TYPES_H
|
||||
|
||||
#include "common/scummsys.h"
|
||||
|
||||
|
@ -70,8 +70,8 @@ enum ActionType {
|
|||
kActionTypeMax
|
||||
};
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_KEYMAPPER
|
||||
|
||||
#endif // #ifndef COMMON_TYPES_H
|
||||
#endif // #ifndef KEYMAPPER_TYPES_H
|
||||
|
|
|
@ -174,8 +174,6 @@ static byte SDLModToOSystemKeyFlags(SDLMod mod) {
|
|||
|
||||
bool OSystem_SDL::pollEvent(Common::Event &event) {
|
||||
SDL_Event ev;
|
||||
int axis;
|
||||
byte b = 0;
|
||||
|
||||
handleKbdMouse();
|
||||
/* Residual doesn't support this
|
||||
|
@ -188,279 +186,308 @@ bool OSystem_SDL::pollEvent(Common::Event &event) {
|
|||
*/
|
||||
while (SDL_PollEvent(&ev)) {
|
||||
preprocessEvents(&ev);
|
||||
|
||||
switch (ev.type) {
|
||||
case SDL_KEYDOWN:{
|
||||
b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());
|
||||
|
||||
/* Residual doesn't support this
|
||||
// Alt-Return and Alt-Enter toggle full screen mode
|
||||
if (b == 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
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// Alt-S: Create a screenshot
|
||||
if (b == 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");
|
||||
break;
|
||||
}
|
||||
*/
|
||||
// Ctrl-m toggles mouse capture
|
||||
if (b == Common::KBD_CTRL && ev.key.keysym.sym == 'm') {
|
||||
toggleMouseGrab();
|
||||
break;
|
||||
}
|
||||
|
||||
#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 ((b == Common::KBD_CTRL && ev.key.keysym.sym == 'z') || (b == 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;
|
||||
}
|
||||
/* Residual doesn't support this
|
||||
// Ctrl-Alt-<key> will change the GFX mode
|
||||
if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
|
||||
|
||||
handleScalerHotkeys(ev.key);
|
||||
break;
|
||||
}*/
|
||||
const bool event_complete = remapKey(ev, event);
|
||||
|
||||
if (event_complete)
|
||||
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);
|
||||
|
||||
if (dispatchSDLEvent(ev, event))
|
||||
return true;
|
||||
}
|
||||
case SDL_KEYUP:
|
||||
{
|
||||
const bool event_complete = remapKey(ev,event);
|
||||
|
||||
if (event_complete)
|
||||
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);
|
||||
b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());
|
||||
|
||||
// Ctrl-Alt-<key> will change the GFX mode
|
||||
if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
|
||||
// Swallow these key up events
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
case SDL_MOUSEMOTION:
|
||||
event.type = Common::EVENT_MOUSEMOVE;
|
||||
fillMouseEvent(event, ev.motion.x, ev.motion.y);
|
||||
|
||||
//setMousePos(event.mouse.x, event.mouse.y);
|
||||
return true;
|
||||
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
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
|
||||
break;
|
||||
|
||||
fillMouseEvent(event, ev.button.x, ev.button.y);
|
||||
|
||||
return true;
|
||||
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
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
|
||||
break;
|
||||
fillMouseEvent(event, ev.button.x, ev.button.y);
|
||||
|
||||
return true;
|
||||
|
||||
case SDL_JOYBUTTONDOWN:
|
||||
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;
|
||||
|
||||
case SDL_JOYBUTTONUP:
|
||||
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;
|
||||
|
||||
case SDL_JOYAXISMOTION:
|
||||
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;
|
||||
|
||||
case SDL_VIDEOEXPOSE:
|
||||
event.type = Common::EVENT_SCREEN_CHANGED; // this two lines are Residual change
|
||||
return true;
|
||||
|
||||
case SDL_QUIT:
|
||||
event.type = Common::EVENT_QUIT;
|
||||
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:
|
||||
//_forceFull = true;
|
||||
break;
|
||||
|
||||
case SDL_QUIT:
|
||||
event.type = Common::EVENT_QUIT;
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool OSystem_SDL::handleKeyDown(SDL_Event &ev, Common::Event &event) {
|
||||
byte b = 0;
|
||||
b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());
|
||||
|
||||
/* Residual doesn't support this
|
||||
// Alt-Return and Alt-Enter toggle full screen mode
|
||||
if (b == 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
|
||||
if (b == Common::KBD_ALT && ev.key.keysym.sym == 's') {
|
||||
char filename[20];
|
||||
|
||||
for (int n = 0;; n++) {
|
||||
SDL_RWops *file;
|
||||
|
||||
sprintf(filename, "residual%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 (b == 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 ((b == Common::KBD_CTRL && ev.key.keysym.sym == 'z') || (b == 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;
|
||||
}
|
||||
/* Residual doesn't support this
|
||||
// Ctrl-Alt-<key> will change the GFX mode
|
||||
if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
|
||||
if (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-<key> will change the GFX mode
|
||||
byte b = event.kbd.flags = SDLModToOSystemKeyFlags(SDL_GetModState());
|
||||
if ((b & (Common::KBD_CTRL|Common::KBD_ALT)) == (Common::KBD_CTRL|Common::KBD_ALT)) {
|
||||
// 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);
|
||||
|
||||
//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
|
||||
|
|
|
@ -424,13 +424,18 @@ void OSystem_SDL::setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x,
|
|||
_cursorFormat = Graphics::PixelFormat::createFormatCLUT8();
|
||||
else if (format->bytesPerPixel <= _screenFormat.bytesPerPixel)
|
||||
_cursorFormat = *format;
|
||||
keycolor &= (1 << (_cursorFormat.bytesPerPixel << 3)) - 1;
|
||||
|
||||
if (_cursorFormat.bytesPerPixel < 4)
|
||||
assert(keycolor < (uint)(1 << (_cursorFormat.bytesPerPixel << 3)));
|
||||
#else
|
||||
keycolor &= 0xFF;
|
||||
assert(keycolor <= 0xFF);
|
||||
#endif
|
||||
|
||||
if (w == 0 || h == 0)
|
||||
return;
|
||||
|
||||
|
||||
|
||||
/* Residual doesn't support this
|
||||
_mouseCurState.hotX = hotspot_x;
|
||||
_mouseCurState.hotY = hotspot_y;
|
||||
|
@ -439,6 +444,22 @@ void OSystem_SDL::setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x,
|
|||
|
||||
_cursorTargetScale = cursorTargetScale;
|
||||
|
||||
_mouseTextureId = new GLuint[1];
|
||||
glGenTextures(1, _mouseTextureId);
|
||||
glBindTexture(GL_TEXTURE_2D, _overlayTexIds[i]);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, BITMAP_TEXTURE_SIZE, BITMAP_TEXTURE_SIZE, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, NULL);
|
||||
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 2);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, _overlayWidth);
|
||||
glBindTexture(GL_TEXTURE_2D, _overlayTexIds[curTexIdx]);
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _mouseWidth, _mouseHeight, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, (byte *)buf + (y * 2 * _mouseWidth) + (2 * x));
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||
|
||||
if (_mouseCurState.w != (int)w || _mouseCurState.h != (int)h) {
|
||||
_mouseCurState.w = w;
|
||||
_mouseCurState.h = h;
|
||||
|
@ -446,10 +467,9 @@ void OSystem_SDL::setMouseCursor(const byte *buf, uint w, uint h, int hotspot_x,
|
|||
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,
|
||||
_mouseCurState.w,
|
||||
_mouseCurState.h,
|
||||
16,
|
||||
_hwscreen->format->Rmask,
|
||||
_hwscreen->format->Gmask,
|
||||
|
|
|
@ -23,23 +23,28 @@
|
|||
*
|
||||
*/
|
||||
|
||||
// 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 <windows.h>
|
||||
// winnt.h defines ARRAYSIZE, but we want our own one...
|
||||
#undef ARRAYSIZE
|
||||
#endif
|
||||
|
||||
#include "common/sys.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__)
|
||||
|
||||
|
||||
#include "backends/platform/sdl/sdl.h"
|
||||
#include "backends/plugins/sdl/sdl-provider.h"
|
||||
#include "base/main.h"
|
||||
|
||||
#if defined(__SYMBIAN32__)
|
||||
#include "SymbianOs.h"
|
||||
#endif
|
||||
|
||||
#if !defined(__MAEMO__) && !defined(_WIN32_WCE) && !defined(GP2XWIZ)&& !defined(LINUXMOTO)
|
||||
|
||||
#if defined (WIN32)
|
||||
#ifdef WIN32
|
||||
int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpCmdLine*/, int /*iShowCmd*/) {
|
||||
SDL_SetModuleHandle(GetModuleHandle(NULL));
|
||||
return main(__argc, __argv);
|
||||
|
@ -48,56 +53,8 @@ int __stdcall WinMain(HINSTANCE /*hInst*/, HINSTANCE /*hPrevInst*/, LPSTR /*lpC
|
|||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
#if defined(__SYMBIAN32__)
|
||||
//
|
||||
// Set up redirects for stdout/stderr under Windows and Symbian.
|
||||
// Code copied from SDL_main.
|
||||
//
|
||||
|
||||
// Symbian does not like any output to the console through any *print* function
|
||||
char STDOUT_FILE[256], STDERR_FILE[256]; // shhh, don't tell anybody :)
|
||||
strcpy(STDOUT_FILE, Symbian::GetExecutablePath());
|
||||
strcpy(STDERR_FILE, Symbian::GetExecutablePath());
|
||||
strcat(STDOUT_FILE, "residual.stdout.txt");
|
||||
strcat(STDERR_FILE, "residual.stderr.txt");
|
||||
|
||||
/* Flush the output in case anything is queued */
|
||||
fclose(stdout);
|
||||
fclose(stderr);
|
||||
|
||||
/* Redirect standard input and standard output */
|
||||
FILE *newfp = freopen(STDOUT_FILE, "w", stdout);
|
||||
if (newfp == NULL) { /* This happens on NT */
|
||||
#if !defined(stdout)
|
||||
stdout = fopen(STDOUT_FILE, "w");
|
||||
#else
|
||||
newfp = fopen(STDOUT_FILE, "w");
|
||||
if (newfp) {
|
||||
*stdout = *newfp;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
newfp = freopen(STDERR_FILE, "w", stderr);
|
||||
if (newfp == NULL) { /* This happens on NT */
|
||||
#if !defined(stderr)
|
||||
stderr = fopen(STDERR_FILE, "w");
|
||||
#else
|
||||
newfp = fopen(STDERR_FILE, "w");
|
||||
if (newfp) {
|
||||
*stderr = *newfp;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
setbuf(stderr, NULL); /* No buffering */
|
||||
|
||||
#endif // defined(__SYMBIAN32__)
|
||||
|
||||
// Create our OSystem instance
|
||||
#if defined(__SYMBIAN32__)
|
||||
g_system = new OSystem_SDL_Symbian();
|
||||
#else
|
||||
g_system = new OSystem_SDL();
|
||||
#endif
|
||||
assert(g_system);
|
||||
|
||||
#ifdef DYNAMIC_MODULES
|
||||
|
|
|
@ -68,6 +68,8 @@
|
|||
#if defined(UNIX)
|
||||
#ifdef MACOSX
|
||||
#define DEFAULT_CONFIG_FILE "Library/Preferences/Residual Preferences"
|
||||
#elif defined(SAMSUNGTV)
|
||||
#define DEFAULT_CONFIG_FILE "/dtv/usb/sda1/.residualrc"
|
||||
#else
|
||||
#define DEFAULT_CONFIG_FILE ".residualrc"
|
||||
#endif
|
||||
|
@ -177,7 +179,7 @@ OSystem_SDL::OSystem_SDL()
|
|||
_cdrom(0),
|
||||
|
||||
_joystick(0),
|
||||
#ifdef MIXER_DOUBLE_BUFFERING
|
||||
#if MIXER_DOUBLE_BUFFERING
|
||||
_soundMutex(0), _soundCond(0), _soundThread(0),
|
||||
_soundThreadIsRunning(false), _soundThreadShouldQuit(false),
|
||||
#endif
|
||||
|
@ -223,9 +225,15 @@ void OSystem_SDL::delayMillis(uint msecs) {
|
|||
SDL_Delay(msecs);
|
||||
}
|
||||
|
||||
void OSystem_SDL::getTimeAndDate(struct tm &t) const {
|
||||
void OSystem_SDL::getTimeAndDate(TimeDate &td) const {
|
||||
time_t curTime = time(0);
|
||||
t = *localtime(&curTime);
|
||||
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 *OSystem_SDL::getTimerManager() {
|
||||
|
@ -398,6 +406,7 @@ void OSystem_SDL::quit() {
|
|||
}
|
||||
if (_joystick)
|
||||
SDL_JoystickClose(_joystick);
|
||||
|
||||
SDL_ShowCursor(SDL_ENABLE);
|
||||
|
||||
SDL_RemoveTimer(_timerID);
|
||||
|
@ -412,6 +421,10 @@ void OSystem_SDL::quit() {
|
|||
// recorded events
|
||||
delete getEventManager();
|
||||
delete _savefile;
|
||||
|
||||
#if !defined(SAMSUNGTV)
|
||||
exit(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
void OSystem_SDL::setupIcon() {
|
||||
|
@ -466,7 +479,7 @@ void OSystem_SDL::setupIcon() {
|
|||
free(icon);
|
||||
}
|
||||
|
||||
OSystem::MutexRef OSystem_SDL::createMutex(void) {
|
||||
OSystem::MutexRef OSystem_SDL::createMutex() {
|
||||
return (MutexRef) SDL_CreateMutex();
|
||||
}
|
||||
|
||||
|
@ -486,7 +499,7 @@ void OSystem_SDL::deleteMutex(MutexRef mutex) {
|
|||
#pragma mark --- Audio ---
|
||||
#pragma mark -
|
||||
|
||||
#ifdef MIXER_DOUBLE_BUFFERING
|
||||
#if MIXER_DOUBLE_BUFFERING
|
||||
|
||||
void OSystem_SDL::mixerProducerThread() {
|
||||
byte nextSoundBuffer;
|
||||
|
@ -636,7 +649,7 @@ void OSystem_SDL::setupMixer() {
|
|||
_mixer->setOutputRate(_samplesPerSec);
|
||||
_mixer->setReady(true);
|
||||
|
||||
#ifdef MIXER_DOUBLE_BUFFERING
|
||||
#if MIXER_DOUBLE_BUFFERING
|
||||
initThreadedMixer(_mixer, _obtainedRate.samples * 4);
|
||||
#endif
|
||||
|
||||
|
@ -654,7 +667,7 @@ void OSystem_SDL::closeMixer() {
|
|||
delete _mixer;
|
||||
_mixer = 0;
|
||||
|
||||
#ifdef MIXER_DOUBLE_BUFFERING
|
||||
#if MIXER_DOUBLE_BUFFERING
|
||||
deinitThreadedMixer();
|
||||
#endif
|
||||
|
||||
|
|
|
@ -89,6 +89,25 @@ public:
|
|||
// 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();
|
||||
|
||||
|
@ -116,7 +135,7 @@ public:
|
|||
// Quit
|
||||
virtual void quit(); // overloaded by CE backend
|
||||
|
||||
virtual void getTimeAndDate(struct tm &t) const;
|
||||
virtual void getTimeAndDate(TimeDate &t) const;
|
||||
virtual Common::TimerManager *getTimerManager();
|
||||
|
||||
// Mutex handling
|
||||
|
@ -232,7 +251,7 @@ protected:
|
|||
|
||||
virtual bool remapKey(SDL_Event &ev, Common::Event &event);
|
||||
|
||||
void handleScalerHotkeys(const SDL_KeyboardEvent &key);
|
||||
bool handleScalerHotkeys(const SDL_KeyboardEvent &key);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -44,6 +44,9 @@
|
|||
|
||||
POSIXSaveFileManager::POSIXSaveFileManager() {
|
||||
// Register default savepath based on HOME
|
||||
#if defined(SAMSUNGTV)
|
||||
ConfMan.registerDefault("savepath", "/dtv/usb/sda1/.residual");
|
||||
#else
|
||||
Common::String savePath;
|
||||
const char *home = getenv("HOME");
|
||||
if (home && *home && strlen(home) < MAXPATHLEN) {
|
||||
|
@ -51,6 +54,7 @@ POSIXSaveFileManager::POSIXSaveFileManager() {
|
|||
savePath += "/" DEFAULT_SAVE_PATH;
|
||||
ConfMan.registerDefault("savepath", savePath);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
POSIXSaveFileManager::POSIXSaveFileManager(const Common::String &defaultSavepath)
|
||||
|
|
|
@ -54,6 +54,6 @@ bool Polygon::contains(int16 x, int16 y) const {
|
|||
return inside_flag;
|
||||
}
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_VKEYBD
|
||||
|
|
|
@ -107,7 +107,7 @@ private:
|
|||
Rect _bound;
|
||||
};
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_VKEYBD
|
||||
|
||||
|
|
|
@ -443,7 +443,7 @@ void VirtualKeyboardGUI::setupCursor() {
|
|||
};
|
||||
|
||||
CursorMan.pushCursorPalette(palette, 0, 4);
|
||||
CursorMan.pushCursor(NULL, 0, 0, 0, 0);
|
||||
CursorMan.pushCursor(NULL, 0, 0, 0, 0, 0);
|
||||
CursorMan.showMouse(true);
|
||||
}
|
||||
|
||||
|
@ -457,7 +457,7 @@ void VirtualKeyboardGUI::animateCursor() {
|
|||
}
|
||||
}
|
||||
|
||||
CursorMan.replaceCursor(_cursor, 16, 16, 7, 7);
|
||||
CursorMan.replaceCursor(_cursor, 16, 16, 7, 7, 255);
|
||||
|
||||
_cursorAnimateTimer = time;
|
||||
_cursorAnimateCounter = (_cursorAnimateCounter + 1) % 4;
|
||||
|
@ -469,6 +469,6 @@ void VirtualKeyboardGUI::removeCursor() {
|
|||
CursorMan.popCursorPalette();
|
||||
}
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_VKEYBD
|
||||
|
|
|
@ -151,7 +151,7 @@ private:
|
|||
|
||||
};
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_VKEYBD
|
||||
|
||||
|
|
|
@ -154,8 +154,11 @@ bool VirtualKeyboardParser::parserCallback_mode(ParserNode *node) {
|
|||
} else {
|
||||
// remove data relating to old resolution
|
||||
_mode->bitmapName.clear();
|
||||
delete _mode->image;
|
||||
_mode->image = 0;
|
||||
if (_mode->image) {
|
||||
_mode->image->free();
|
||||
delete _mode->image;
|
||||
_mode->image = 0;
|
||||
}
|
||||
_mode->imageMap.removeAllAreas();
|
||||
_mode->displayArea = Rect();
|
||||
}
|
||||
|
@ -371,6 +374,6 @@ bool VirtualKeyboardParser::parseRectAsPolygon(Polygon &poly, const String& coor
|
|||
return true;
|
||||
}
|
||||
|
||||
} // end of namespace GUI
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif // #ifdef ENABLE_VKEYBD
|
||||
|
|
|
@ -265,7 +265,7 @@ protected:
|
|||
bool parseRectAsPolygon(Polygon &poly, const String& coords);
|
||||
};
|
||||
|
||||
} // end of namespace GUI
|
||||
} // End of namespace GUI
|
||||
|
||||
#endif // #ifdef ENABLE_VKEYBD
|
||||
|
||||
|
|
|
@ -416,7 +416,7 @@ bool VirtualKeyboard::KeyPressQueue::hasStringChanged() {
|
|||
return ret;
|
||||
}
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
#endif // #ifdef ENABLE_VKEYBD
|
||||
|
||||
|
|
|
@ -121,7 +121,13 @@ protected:
|
|||
OverlayColor displayFontColor;
|
||||
|
||||
Mode() : image(0) {}
|
||||
~Mode() { delete image; }
|
||||
~Mode() {
|
||||
if (image) {
|
||||
image->free();
|
||||
delete image;
|
||||
image = 0;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
typedef HashMap<String, Mode, IgnoreCase_Hash, IgnoreCase_EqualTo> ModeMap;
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
#include "common/system.h"
|
||||
#include "common/fs.h"
|
||||
|
||||
#include "sound/mididrv.h"
|
||||
|
||||
#include "gui/ThemeEngine.h"
|
||||
|
||||
#define DETECTOR_TESTING_HACK
|
||||
|
@ -69,6 +71,7 @@ static const char HELP_STRING[] =
|
|||
" --gui-theme=THEME Select GUI theme\n"
|
||||
" --themepath=PATH Path to where GUI themes are stored\n"
|
||||
" --list-themes Display list of all usable GUI themes\n"
|
||||
" -e, --music-driver=MODE Select music driver\n"
|
||||
" -m, --music-volume=NUM Set the music volume, 0-127 (default: 127)\n"
|
||||
" -s, --sfx-volume=NUM Set the sfx volume, 0-127 (default: 127)\n"
|
||||
" -r, --speech-volume=NUM Set the speech volume, 0-127 (default: 127)\n"
|
||||
|
@ -78,8 +81,15 @@ static const char HELP_STRING[] =
|
|||
" --debugflags=FLAGS Enables engine specific debug flags\n"
|
||||
" --savepath=PATH Path to where savegames are stored\n"
|
||||
" --extrapath=PATH Extra path to additional game data\n"
|
||||
" --soundfont=FILE Select the SoundFont for MIDI playback (only\n"
|
||||
" supported by some MIDI drivers)\n"
|
||||
" --multi-midi Enable combination AdLib and native MIDI\n"
|
||||
" --native-mt32 True Roland MT-32 (disable GM emulation)\n"
|
||||
" --enable-gs Enable Roland GS mode for MIDI playback\n"
|
||||
" --output-rate=RATE Select output sample rate in Hz (e.g. 22050)\n"
|
||||
" --opl-driver=DRIVER Select AdLib (OPL) emulator (db, mame)\n"
|
||||
" --show-fps=BOOL Set the turn on/off display FPS info: true/false\n"
|
||||
|
||||
"\n"
|
||||
;
|
||||
#endif
|
||||
|
@ -115,6 +125,11 @@ void registerDefaults() {
|
|||
ConfMan.registerDefault("speech_volume", 127);
|
||||
ConfMan.registerDefault("speech_mode", "3");
|
||||
|
||||
ConfMan.registerDefault("multi_midi", false);
|
||||
ConfMan.registerDefault("native_mt32", false);
|
||||
ConfMan.registerDefault("enable_gs", false);
|
||||
ConfMan.registerDefault("midi_gain", 100);
|
||||
|
||||
ConfMan.registerDefault("path", ".");
|
||||
|
||||
ConfMan.registerDefault("soft_renderer", "true");
|
||||
|
@ -260,12 +275,20 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, const cha
|
|||
DO_LONG_OPTION("debugflags")
|
||||
END_OPTION
|
||||
|
||||
DO_OPTION('e', "music-driver")
|
||||
if (MidiDriver::findMusicDriver(option) == 0)
|
||||
usage("Unrecognized music driver '%s'", option);
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION_INT("output-rate")
|
||||
END_OPTION
|
||||
|
||||
DO_OPTION_BOOL('f', "fullscreen")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION("opl-driver")
|
||||
END_OPTION
|
||||
|
||||
DO_OPTION_INT('m', "music-volume")
|
||||
END_OPTION
|
||||
|
||||
|
@ -289,6 +312,9 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, const cha
|
|||
DO_OPTION_INT('r', "speech-volume")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION_INT("midi-gain")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION_INT("cdrom")
|
||||
END_OPTION
|
||||
|
||||
|
@ -303,12 +329,33 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, const cha
|
|||
DO_LONG_OPTION("soft-renderer")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION("soundfont")
|
||||
Common::FSNode path(option);
|
||||
if (!path.exists()) {
|
||||
usage("Non-existent soundfont path '%s'", option);
|
||||
} else if (!path.isReadable()) {
|
||||
usage("Non-readable soundfont path '%s'", option);
|
||||
}
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION_BOOL("disable-sdl-parachute")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION("engine-speed")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION_BOOL("multi-midi")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION_BOOL("native-mt32")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION_BOOL("enable-gs")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION_BOOL("aspect-ratio")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION("gamma")
|
||||
END_OPTION
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
|
||||
int pluginTypeVersions[PLUGIN_TYPE_MAX] = {
|
||||
PLUGIN_TYPE_ENGINE_VERSION,
|
||||
PLUGIN_TYPE_MUSIC_VERSION,
|
||||
};
|
||||
|
||||
|
||||
|
@ -297,3 +298,14 @@ GameList EngineManager::detectGames(const Common::FSList &fslist) const {
|
|||
const EnginePlugin::List &EngineManager::getPlugins() const {
|
||||
return (const EnginePlugin::List &)PluginManager::instance().getPlugins(PLUGIN_TYPE_ENGINE);
|
||||
}
|
||||
|
||||
|
||||
// Music plugins
|
||||
|
||||
#include "sound/musicplugin.h"
|
||||
|
||||
DECLARE_SINGLETON(MusicManager);
|
||||
|
||||
const MusicPlugin::List &MusicManager::getPlugins() const {
|
||||
return (const MusicPlugin::List &)PluginManager::instance().getPlugins(PLUGIN_TYPE_MUSIC);
|
||||
}
|
||||
|
|
|
@ -64,6 +64,7 @@ namespace Common {
|
|||
|
||||
enum PluginType {
|
||||
PLUGIN_TYPE_ENGINE = 0,
|
||||
PLUGIN_TYPE_MUSIC,
|
||||
|
||||
PLUGIN_TYPE_MAX
|
||||
};
|
||||
|
@ -71,6 +72,7 @@ enum PluginType {
|
|||
// TODO: Make the engine API version depend on ScummVM's version
|
||||
// because of the backlinking (posibly from the SVN revision)
|
||||
#define PLUGIN_TYPE_ENGINE_VERSION 1
|
||||
#define PLUGIN_TYPE_MUSIC_VERSION 1
|
||||
|
||||
extern int pluginTypeVersions[PLUGIN_TYPE_MAX];
|
||||
|
||||
|
|
|
@ -93,5 +93,9 @@ const char *gResidualFeatures = ""
|
|||
#ifdef USE_ZLIB
|
||||
"zLib "
|
||||
#endif
|
||||
|
||||
#ifdef USE_FLUIDSYNTH
|
||||
"FluidSynth "
|
||||
#endif
|
||||
;
|
||||
|
||||
|
|
|
@ -72,8 +72,7 @@ void EventDispatcher::dispatch() {
|
|||
}
|
||||
|
||||
void EventDispatcher::registerMapper(EventMapper *mapper) {
|
||||
if (_mapper)
|
||||
delete _mapper;
|
||||
delete _mapper;
|
||||
_mapper = mapper;
|
||||
}
|
||||
|
||||
|
@ -134,5 +133,5 @@ void EventDispatcher::dispatchEvent(const Event &event) {
|
|||
}
|
||||
}
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
|
|
|
@ -203,12 +203,8 @@ void EventRecorder::deinit() {
|
|||
g_system->unlockMutex(_timeMutex);
|
||||
g_system->unlockMutex(_recorderMutex);
|
||||
|
||||
if (_playbackFile != NULL) {
|
||||
delete _playbackFile;
|
||||
}
|
||||
if (_playbackTimeFile != NULL) {
|
||||
delete _playbackTimeFile;
|
||||
}
|
||||
delete _playbackFile;
|
||||
delete _playbackTimeFile;
|
||||
|
||||
if (_recordFile != NULL) {
|
||||
_recordFile->finalize();
|
||||
|
@ -363,5 +359,5 @@ bool EventRecorder::pollEvent(Common::Event &ev) {
|
|||
return false;
|
||||
}
|
||||
|
||||
} // end of namespace Common
|
||||
} // End of namespace Common
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#define COMMON_ALGORITHM_H
|
||||
|
||||
#include "common/sys.h"
|
||||
#include "common/func.h"
|
||||
|
||||
namespace Common {
|
||||
|
||||
|
@ -145,57 +146,81 @@ Op for_each(In first, In last, Op f) {
|
|||
return f;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple sort function, modeled after std::sort.
|
||||
* Use it like this: sort(container.begin(), container.end()).
|
||||
* Also works on plain old i.e. int arrays etc. For comperance
|
||||
* operator < is used.
|
||||
*/
|
||||
template<class T>
|
||||
void sort(T first, T last) {
|
||||
if (first == last)
|
||||
return;
|
||||
template<typename T>
|
||||
unsigned int distance(T *first, T *last) {
|
||||
return last - first;
|
||||
}
|
||||
|
||||
// Simple selection sort
|
||||
T i(first);
|
||||
for (; i != last; ++i) {
|
||||
T minElem(i);
|
||||
T j(i);
|
||||
++j;
|
||||
for (; j != last; ++j)
|
||||
if (*j < *minElem)
|
||||
minElem = j;
|
||||
if (minElem != i)
|
||||
SWAP(*minElem, *i);
|
||||
template<typename T>
|
||||
unsigned int distance(T first, T last) {
|
||||
unsigned int n = 0;
|
||||
while (first != last) {
|
||||
++n;
|
||||
++first;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T *sortChoosePivot(T *first, T *last) {
|
||||
return first + distance(first, last) / 2;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T sortChoosePivot(T first, T last) {
|
||||
unsigned int n = distance(first, last);
|
||||
n /= 2;
|
||||
while (n--)
|
||||
++first;
|
||||
return first;
|
||||
}
|
||||
|
||||
template<typename T, class StrictWeakOrdering>
|
||||
T sortPartition(T first, T last, T pivot, StrictWeakOrdering &comp) {
|
||||
--last;
|
||||
SWAP(*pivot, *last);
|
||||
|
||||
T sorted;
|
||||
for (sorted = first; first != last; ++first) {
|
||||
if (!comp(*last, *first)) {
|
||||
if (first != sorted)
|
||||
SWAP(*first, *sorted);
|
||||
++sorted;
|
||||
}
|
||||
}
|
||||
|
||||
SWAP(*last, *sorted);
|
||||
return sorted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple sort function, modeled after std::sort.
|
||||
* It compares data with the given comparator object comp.
|
||||
*
|
||||
* Note: Using this with: Common::Less from common/func.h
|
||||
* will give the same results as the plain sort function.
|
||||
*/
|
||||
template<class T, class StrictWeakOrdering>
|
||||
template<typename T, class StrictWeakOrdering>
|
||||
void sort(T first, T last, StrictWeakOrdering comp) {
|
||||
if (first == last)
|
||||
return;
|
||||
|
||||
// Simple selection sort
|
||||
T i(first);
|
||||
for (; i != last; ++i) {
|
||||
T minElem(i);
|
||||
T j(i);
|
||||
++j;
|
||||
for (; j != last; ++j)
|
||||
if (comp(*j, *minElem))
|
||||
minElem = j;
|
||||
if (minElem != i)
|
||||
SWAP(*minElem, *i);
|
||||
}
|
||||
T pivot = sortChoosePivot(first, last);
|
||||
pivot = sortPartition(first, last, pivot, comp);
|
||||
sort<T, StrictWeakOrdering>(first, pivot, comp);
|
||||
sort<T, StrictWeakOrdering>(++pivot, last, comp);
|
||||
}
|
||||
|
||||
} // end of namespace Common
|
||||
/**
|
||||
* Simple sort function, modeled after std::sort.
|
||||
*/
|
||||
template<typename T>
|
||||
void sort(T *first, T *last) {
|
||||
sort(first, last, Common::Less<T>());
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void sort(T first, T last) {
|
||||
sort(first, last, Common::Less<typename T::ValueType>());
|
||||
}
|
||||
|
||||
} // End of namespace Common
|
||||
#endif
|
||||
|
||||
|
|
|
@ -50,13 +50,11 @@ int Archive::listMatchingMembers(ArchiveMemberList &list, const String &pattern)
|
|||
|
||||
int matches = 0;
|
||||
|
||||
// need to match lowercase key
|
||||
String lowercasePattern = pattern;
|
||||
lowercasePattern.toLowercase();
|
||||
|
||||
ArchiveMemberList::iterator it = allNames.begin();
|
||||
for ( ; it != allNames.end(); ++it) {
|
||||
if ((*it)->getName().matchString(lowercasePattern, false, true)) {
|
||||
// TODO: We match case-insenstivie for now, our API does not define whether that's ok or not though...
|
||||
// For our use case case-insensitive is probably what we want to have though.
|
||||
if ((*it)->getName().matchString(pattern, true, true)) {
|
||||
list.push_back(*it);
|
||||
matches++;
|
||||
}
|
||||
|
|
|
@ -199,6 +199,21 @@ public:
|
|||
return (_size == 0);
|
||||
}
|
||||
|
||||
bool operator==(const Array<T> &other) const {
|
||||
if (this == &other)
|
||||
return true;
|
||||
if (_size != other._size)
|
||||
return false;
|
||||
for (uint i = 0; i < _size; ++i) {
|
||||
if (_storage[i] != other._storage[i])
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool operator!=(const Array<T> &other) const {
|
||||
return !(*this == other);
|
||||
}
|
||||
|
||||
|
||||
iterator begin() {
|
||||
return _storage;
|
||||
|
|
|
@ -98,7 +98,8 @@ bool ConfigFile::loadFromStream(SeekableReadStream &stream) {
|
|||
} else if (line[0] == '#') {
|
||||
// Accumulate comments here. Once we encounter either the start
|
||||
// of a new section, or a key-value-pair, we associate the value
|
||||
// of the 'comment' variable with that entity.
|
||||
// of the 'comment' variable with that entity. The semicolon
|
||||
// comment is used for Living Books games in Mohawk.
|
||||
comment += line;
|
||||
#ifdef _WIN32
|
||||
comment += "\r\n";
|
||||
|
@ -124,8 +125,9 @@ bool ConfigFile::loadFromStream(SeekableReadStream &stream) {
|
|||
const char *p = line.c_str() + 1;
|
||||
// Get the section name, and check whether it's valid (that
|
||||
// is, verify that it only consists of alphanumerics,
|
||||
// dashes and underscores).
|
||||
while (*p && (isalnum(*p) || *p == '-' || *p == '_'))
|
||||
// periods, dashes and underscores). Mohawk Living Books games
|
||||
// can have periods in their section names.
|
||||
while (*p && (isalnum(*p) || *p == '-' || *p == '_' || *p == '.'))
|
||||
p++;
|
||||
|
||||
if (*p == '\0')
|
||||
|
|
|
@ -40,17 +40,6 @@ static bool isValidDomainName(const Common::String &domName) {
|
|||
|
||||
namespace Common {
|
||||
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
|
||||
const String ConfigManager::kApplicationDomain("residual");
|
||||
const String ConfigManager::kTransientDomain("__TRANSIENT");
|
||||
|
||||
#ifdef ENABLE_KEYMAPPER
|
||||
const String ConfigManager::kKeymapperDomain("keymapper");
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
const char *ConfigManager::kApplicationDomain = "residual";
|
||||
const char *ConfigManager::kTransientDomain = "__TRANSIENT";
|
||||
|
||||
|
@ -58,13 +47,10 @@ const char *ConfigManager::kTransientDomain = "__TRANSIENT";
|
|||
const char *ConfigManager::kKeymapperDomain = "keymapper";
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#pragma mark -
|
||||
|
||||
|
||||
ConfigManager::ConfigManager()
|
||||
: _activeDomain(0) {
|
||||
ConfigManager::ConfigManager() : _activeDomain(0) {
|
||||
}
|
||||
|
||||
|
||||
|
@ -426,11 +412,7 @@ const String & ConfigManager::get(const String &key) const {
|
|||
else if (_defaultsDomain.contains(key))
|
||||
return _defaultsDomain[key];
|
||||
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
return String::emptyString;
|
||||
#else
|
||||
return ConfMan._emptyString;
|
||||
#endif
|
||||
return _emptyString;
|
||||
}
|
||||
|
||||
const String & ConfigManager::get(const String &key, const String &domName) const {
|
||||
|
@ -453,11 +435,7 @@ const String & ConfigManager::get(const String &key, const String &domName) cons
|
|||
|
||||
if (!domain->contains(key)) {
|
||||
#if 1
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
return String::emptyString;
|
||||
#else
|
||||
return ConfMan._emptyString;
|
||||
#endif
|
||||
return _emptyString;
|
||||
#else
|
||||
error("ConfigManager::get(%s,%s) called on non-existent key",
|
||||
key.c_str(), domName.c_str());
|
||||
|
@ -661,11 +639,7 @@ const String &ConfigManager::Domain::get(const String &key) const {
|
|||
if (iter != end())
|
||||
return iter->_value;
|
||||
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
return String::emptyString;
|
||||
#else
|
||||
return ConfMan._emptyString;
|
||||
#endif
|
||||
}
|
||||
|
||||
void ConfigManager::Domain::setDomainComment(const String &comment) {
|
||||
|
|
|
@ -68,29 +68,15 @@ public:
|
|||
|
||||
typedef HashMap<String, Domain, IgnoreCase_Hash, IgnoreCase_EqualTo> DomainMap;
|
||||
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
/** The name of the application domain (normally 'scummvm'). */
|
||||
static const String kApplicationDomain;
|
||||
static const char *kApplicationDomain;
|
||||
|
||||
/** The transient (pseudo) domain. */
|
||||
static const String kTransientDomain;
|
||||
|
||||
#ifdef ENABLE_KEYMAPPER
|
||||
/** The name of keymapper domain used to store the key maps */
|
||||
static const String kKeymapperDomain;
|
||||
#endif
|
||||
|
||||
#else
|
||||
static const char *kApplicationDomain;
|
||||
static const char *kTransientDomain;
|
||||
|
||||
const String _emptyString;
|
||||
|
||||
#ifdef ENABLE_KEYMAPPER
|
||||
/** The name of keymapper domain used to store the key maps */
|
||||
static const char *kKeymapperDomain;
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
void loadDefaultConfigFile();
|
||||
|
@ -179,6 +165,8 @@ private:
|
|||
Domain * _activeDomain;
|
||||
|
||||
String _filename;
|
||||
|
||||
const String _emptyString;
|
||||
};
|
||||
|
||||
} // End of namespace Common
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "common/debug.h"
|
||||
#include "common/util.h"
|
||||
#include "common/hashmap.h"
|
||||
#include "common/hash-str.h"
|
||||
|
||||
#include "engines/engine.h"
|
||||
|
||||
|
@ -37,7 +38,6 @@
|
|||
typedef signed long int64;
|
||||
#include "backends/platform/ps2/fileio.h"
|
||||
|
||||
#define fprintf ps2_fprintf
|
||||
#define fputs(str, file) ps2_fputs(str, file)
|
||||
#define fflush(a) ps2_fflush(a)
|
||||
#endif
|
||||
|
@ -45,14 +45,14 @@
|
|||
#ifdef __DS__
|
||||
#include "backends/fs/ds/ds-fs.h"
|
||||
|
||||
void std_fprintf(FILE* handle, const char* fmt, ...);
|
||||
void std_fflush(FILE* handle);
|
||||
|
||||
#define fprintf(file, fmt, ...) do { char str[128]; sprintf(str, fmt, ##__VA_ARGS__); DS::std_fwrite(str, strlen(str), 1, file); } while(0)
|
||||
#define fputs(str, file) DS::std_fwrite(str, strlen(str), 1, file)
|
||||
#define fflush(file) DS::std_fflush(file)
|
||||
#define fputs(str, file) DS::std_fwrite(str, strlen(str), 1, file)
|
||||
#define fflush(file) DS::std_fflush(file)
|
||||
#endif
|
||||
|
||||
// TODO: Move gDebugLevel into namespace Common.
|
||||
int gDebugLevel = -1;
|
||||
|
||||
|
||||
|
||||
namespace Common {
|
||||
|
||||
|
@ -142,11 +142,16 @@ bool isDebugChannelEnabled(const String &name) {
|
|||
}
|
||||
|
||||
|
||||
|
||||
static OutputFormatter s_debugOutputFormatter = 0;
|
||||
|
||||
void setDebugOutputFormatter(OutputFormatter f) {
|
||||
s_debugOutputFormatter = f;
|
||||
}
|
||||
|
||||
} // End of namespace Common
|
||||
|
||||
|
||||
int gDebugLevel = -1;
|
||||
|
||||
#ifndef DISABLE_TEXT_CONSOLE
|
||||
|
||||
static void debugHelper(const char *s, va_list va, bool caret = true) {
|
||||
|
@ -156,8 +161,8 @@ static void debugHelper(const char *s, va_list va, bool caret = true) {
|
|||
|
||||
// Next, give the active engine (if any) a chance to augment the message,
|
||||
// but only if not used from debugN.
|
||||
if (g_engine && caret) {
|
||||
g_engine->errorString(in_buf, buf, STRINGBUFLEN);
|
||||
if (Common::s_debugOutputFormatter) {
|
||||
(*Common::s_debugOutputFormatter)(buf, in_buf, STRINGBUFLEN);
|
||||
} else {
|
||||
strncpy(buf, in_buf, STRINGBUFLEN);
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#define COMMON_DEBUG_H
|
||||
|
||||
#include "common/sys.h"
|
||||
#include "common/textconsole.h"
|
||||
#include "common/list.h"
|
||||
#include "common/str.h"
|
||||
|
||||
|
@ -96,6 +97,12 @@ bool isDebugChannelEnabled(uint32 level);
|
|||
bool isDebugChannelEnabled(const String &name);
|
||||
|
||||
|
||||
/**
|
||||
* Set the output formatter used by debug() and related functions.
|
||||
*/
|
||||
void setDebugOutputFormatter(OutputFormatter f);
|
||||
|
||||
|
||||
} // End of namespace Common
|
||||
|
||||
|
||||
|
|
|
@ -44,26 +44,26 @@ namespace Common {
|
|||
* kPathInvalid, kPathIsInvalid, kInvalidPathError
|
||||
*/
|
||||
enum Error {
|
||||
kNoError = 0, //!< No error occured
|
||||
kInvalidPathError, //!< Engine initialization: Invalid game path was passed
|
||||
kNoGameDataFoundError, //!< Engine initialization: No game data was found in the specified location
|
||||
kUnsupportedGameidError, //!< Engine initialization: Gameid not supported by this (Meta)Engine
|
||||
kUnsupportedColorMode, //!< Engine initialization: Engine does not support backend's color mode
|
||||
kNoError = 0, ///< No error occured
|
||||
kInvalidPathError, ///< Engine initialization: Invalid game path was passed
|
||||
kNoGameDataFoundError, ///< Engine initialization: No game data was found in the specified location
|
||||
kUnsupportedGameidError, ///< Engine initialization: Gameid not supported by this (Meta)Engine
|
||||
kUnsupportedColorMode, ///< Engine initialization: Engine does not support backend's color mode
|
||||
|
||||
|
||||
kReadPermissionDenied, //!< Unable to read data due to missing read permission
|
||||
kWritePermissionDenied, //!< Unable to write data due to missing write permission
|
||||
kReadPermissionDenied, ///< Unable to read data due to missing read permission
|
||||
kWritePermissionDenied, ///< Unable to write data due to missing write permission
|
||||
|
||||
// The following three overlap a bit with kInvalidPathError and each other. Which to keep?
|
||||
kPathDoesNotExist, //!< The specified path does not exist
|
||||
kPathNotDirectory, //!< The specified path does not point to a directory
|
||||
kPathNotFile, //!< The specified path does not point to a file
|
||||
kPathDoesNotExist, ///< The specified path does not exist
|
||||
kPathNotDirectory, ///< The specified path does not point to a directory
|
||||
kPathNotFile, ///< The specified path does not point to a file
|
||||
|
||||
kCreatingFileFailed,
|
||||
kReadingFailed, //!< Failed creating a (savestate) file
|
||||
kWritingFailed, //!< Failure to write data -- disk full?
|
||||
kReadingFailed, ///< Failed creating a (savestate) file
|
||||
kWritingFailed, ///< Failure to write data -- disk full?
|
||||
|
||||
kUnknownError //!< Catch-all error, used if no other error code matches
|
||||
kUnknownError ///< Catch-all error, used if no other error code matches
|
||||
};
|
||||
|
||||
} // End of namespace Common
|
||||
|
|
|
@ -198,9 +198,9 @@ public:
|
|||
virtual ~EventObserver() {}
|
||||
|
||||
/**
|
||||
* Notifies the source of an incoming event.
|
||||
* Notifies the observer of an incoming event.
|
||||
*
|
||||
* An obeser is supposed to eat the event, with returning true, when
|
||||
* An observer is supposed to eat the event, with returning true, when
|
||||
* it might want prevent other observers from preventing to receive
|
||||
* the event. An usage example here is the keymapper:
|
||||
* If it processes an Event, it should 'eat' it and create a new
|
||||
|
|
|
@ -314,6 +314,8 @@ int FSDirectory::listMatchingMembers(ArchiveMemberList &list, const String &patt
|
|||
// Cache dir data
|
||||
ensureCached();
|
||||
|
||||
// need to match lowercase key, since all entries in our file cache are
|
||||
// stored as lowercase.
|
||||
String lowercasePattern(pattern);
|
||||
lowercasePattern.toLowercase();
|
||||
|
||||
|
|
|
@ -423,7 +423,7 @@ private:
|
|||
* warning("Unimplemented opcode %d", opcodeNum);
|
||||
*
|
||||
* If you want to see an real world example check the kyra engine.
|
||||
* Files: engines/kyra/script.cpp and .h and engine/kyra/script_*.cpp
|
||||
* Files: engines/kyra/script.cpp and .h and engines/kyra/script_*.cpp
|
||||
* are interesting for that matter.
|
||||
*/
|
||||
template<class Arg, class Res>
|
||||
|
|
|
@ -53,6 +53,7 @@ namespace ListInternal {
|
|||
typedef Node<T> * NodePtr;
|
||||
typedef T & ValueRef;
|
||||
typedef T * ValuePtr;
|
||||
typedef T ValueType;
|
||||
|
||||
NodeBase *_node;
|
||||
|
||||
|
|
145
common/md5.cpp
145
common/md5.cpp
|
@ -31,20 +31,19 @@
|
|||
#include "common/file.h"
|
||||
#include "common/fs.h"
|
||||
#include "common/md5.h"
|
||||
#include "common/util.h"
|
||||
#include "common/endian.h"
|
||||
|
||||
namespace Common {
|
||||
|
||||
typedef struct {
|
||||
struct md5_context {
|
||||
uint32 total[2];
|
||||
uint32 state[4];
|
||||
uint8 buffer[64];
|
||||
} md5_context;
|
||||
};
|
||||
|
||||
void md5_starts(md5_context *ctx);
|
||||
void md5_update(md5_context *ctx, const uint8 *input, uint32 length);
|
||||
void md5_finish(md5_context *ctx, uint8 digest[16]);
|
||||
static void md5_starts(md5_context *ctx);
|
||||
static void md5_update(md5_context *ctx, const uint8 *input, uint32 length);
|
||||
static void md5_finish(md5_context *ctx, uint8 digest[16]);
|
||||
|
||||
|
||||
#define GET_UINT32(n, b, i) (n) = READ_LE_UINT32(b + i)
|
||||
|
@ -246,41 +245,6 @@ void md5_finish(md5_context *ctx, uint8 digest[16]) {
|
|||
PUT_UINT32(ctx->state[3], digest, 12);
|
||||
}
|
||||
|
||||
bool md5_file(const FSNode &file, uint8 digest[16], uint32 length) {
|
||||
if (!file.exists()) {
|
||||
warning("md5_file: using an inexistent FSNode");
|
||||
return false;
|
||||
} else if (!file.isReadable()) {
|
||||
warning("md5_file: using an unreadable FSNode");
|
||||
return false;
|
||||
} else if (file.isDirectory()) {
|
||||
warning("md5_file: using a directory FSNode");
|
||||
return false;
|
||||
}
|
||||
|
||||
ReadStream *stream = file.createReadStream();
|
||||
if (!stream) {
|
||||
warning("md5_file: failed to open '%s'", file.getPath().c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
bool result = md5_file(*stream, digest, length);
|
||||
delete stream;
|
||||
return result;
|
||||
}
|
||||
|
||||
bool md5_file(const char *name, uint8 digest[16], uint32 length) {
|
||||
File f;
|
||||
|
||||
f.open(name);
|
||||
if (!f.isOpen()) {
|
||||
warning("md5_file couldn't open '%s'", name);
|
||||
return false;
|
||||
}
|
||||
|
||||
return md5_file(f, digest, length);
|
||||
}
|
||||
|
||||
|
||||
bool md5_file(ReadStream &stream, uint8 digest[16], uint32 length) {
|
||||
|
||||
|
@ -316,30 +280,6 @@ bool md5_file(ReadStream &stream, uint8 digest[16], uint32 length) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool md5_file_string(const FSNode &file, char *md5str, uint32 length) {
|
||||
uint8 digest[16];
|
||||
if (!md5_file(file, digest, length))
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < 16; i++) {
|
||||
snprintf(md5str + i*2, 3, "%02x", (int)digest[i]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool md5_file_string(const char *name, char *md5str, uint32 length) {
|
||||
uint8 digest[16];
|
||||
if (!md5_file(name, digest, length))
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < 16; i++) {
|
||||
snprintf(md5str + i*2, 3, "%02x", (int)digest[i]);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool md5_file_string(ReadStream &stream, char *md5str, uint32 length) {
|
||||
uint8 digest[16];
|
||||
if (!md5_file(stream, digest, length))
|
||||
|
@ -353,78 +293,3 @@ bool md5_file_string(ReadStream &stream, char *md5str, uint32 length) {
|
|||
}
|
||||
|
||||
} // End of namespace Common
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/*
|
||||
* those are the standard RFC 1321 test vectors
|
||||
*/
|
||||
|
||||
static const char *msg[] = {
|
||||
"",
|
||||
"a",
|
||||
"abc",
|
||||
"message digest",
|
||||
"abcdefghijklmnopqrstuvwxyz",
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
|
||||
"12345678901234567890123456789012345678901234567890123456789012" \
|
||||
"345678901234567890"
|
||||
};
|
||||
|
||||
static const char *val[] = {
|
||||
"d41d8cd98f00b204e9800998ecf8427e",
|
||||
"0cc175b9c0f1b6a831c399e269772661",
|
||||
"900150983cd24fb0d6963f7d28e17f72",
|
||||
"f96b697d7cb7938d525a2f31aaf161d0",
|
||||
"c3fcd3d76192e4007dfb496cca67e13b",
|
||||
"d174ab98d277d9f5a5611c2c9f419d9f",
|
||||
"57edf4a22be3c955ac49da2e2107b67a"
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
int i, j;
|
||||
char output[33];
|
||||
md5_context ctx;
|
||||
unsigned char md5sum[16];
|
||||
|
||||
if (argc < 2) {
|
||||
printf("\n MD5 Validation Tests:\n\n");
|
||||
|
||||
for (i = 0; i < 7; i++) {
|
||||
printf(" Test %d ", i + 1);
|
||||
|
||||
md5_starts(&ctx);
|
||||
md5_update(&ctx, (const uint8 *)msg[i], strlen(msg[i]));
|
||||
md5_finish(&ctx, md5sum);
|
||||
|
||||
for (j = 0; j < 16; j++) {
|
||||
sprintf(output + j * 2, "%02x", md5sum[j]);
|
||||
}
|
||||
|
||||
if (memcmp(output, val[i], 32)) {
|
||||
printf("failed!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("passed.\n");
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
} else {
|
||||
for (i = 1; i < argc; i++) {
|
||||
md5_file(argv[i], md5sum);
|
||||
for (j = 0; j < 16; j++) {
|
||||
printf("%02x", md5sum[j]);
|
||||
}
|
||||
|
||||
printf(" %s\n", argv[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
10
common/md5.h
10
common/md5.h
|
@ -29,22 +29,16 @@
|
|||
|
||||
namespace Common {
|
||||
|
||||
class FSNode;
|
||||
class ReadStream;
|
||||
|
||||
bool md5_file(const char *name, uint8 digest[16], uint32 length = 0);
|
||||
bool md5_file(const FSNode &file, uint8 digest[16], uint32 length = 0);
|
||||
bool md5_file(ReadStream &stream, uint8 digest[16], uint32 length = 0);
|
||||
|
||||
// The following two methods work similar to the above two, but
|
||||
// instead of computing the binary MD5 digest, they produce
|
||||
// The following method work similar to the above one, but
|
||||
// instead of computing the binary MD5 digest, it produces
|
||||
// a human readable lowercase hexstring representing the digest.
|
||||
// The md5str parameter must point to a buffer of 32+1 chars.
|
||||
bool md5_file_string(const char *name, char *md5str, uint32 length = 0);
|
||||
bool md5_file_string(const FSNode &file, char *md5str, uint32 length = 0);
|
||||
bool md5_file_string(ReadStream &stream, char *md5str, uint32 length = 0);
|
||||
|
||||
|
||||
} // End of namespace Common
|
||||
|
||||
#endif
|
||||
|
|
|
@ -32,13 +32,19 @@ enum {
|
|||
INITIAL_CHUNKS_PER_PAGE = 8
|
||||
};
|
||||
|
||||
|
||||
MemoryPool::MemoryPool(size_t chunkSize) {
|
||||
static size_t adjustChunkSize(size_t chunkSize) {
|
||||
// You must at least fit the pointer in the node (technically unneeded considering the next rounding statement)
|
||||
_chunkSize = MAX(chunkSize, sizeof(void*));
|
||||
chunkSize = MAX(chunkSize, sizeof(void*));
|
||||
// There might be an alignment problem on some platforms when trying to load a void* on a non natural boundary
|
||||
// so we round to the next sizeof(void*)
|
||||
_chunkSize = (_chunkSize + sizeof(void*) - 1) & (~(sizeof(void*) - 1));
|
||||
chunkSize = (chunkSize + sizeof(void*) - 1) & (~(sizeof(void*) - 1));
|
||||
|
||||
return chunkSize;
|
||||
}
|
||||
|
||||
|
||||
MemoryPool::MemoryPool(size_t chunkSize)
|
||||
: _chunkSize(adjustChunkSize(chunkSize)) {
|
||||
|
||||
_next = NULL;
|
||||
|
||||
|
|
|
@ -32,6 +32,16 @@
|
|||
|
||||
namespace Common {
|
||||
|
||||
/**
|
||||
* This class provides a pool of memory 'chunks' of identical size.
|
||||
* The size of a chunk is determined when creating the memory pool.
|
||||
*
|
||||
* Using a memory pool may yield better performance and memory usage
|
||||
* when allocating and deallocating many memory blocks of equal size.
|
||||
* E.g. the Common::String class uses a memory pool for the refCount
|
||||
* variables (each the size of an int) it allocates for each string
|
||||
* instance.
|
||||
*/
|
||||
class MemoryPool {
|
||||
protected:
|
||||
MemoryPool(const MemoryPool&);
|
||||
|
@ -42,7 +52,7 @@ protected:
|
|||
size_t numChunks;
|
||||
};
|
||||
|
||||
size_t _chunkSize;
|
||||
const size_t _chunkSize;
|
||||
Array<Page> _pages;
|
||||
void *_next;
|
||||
size_t _chunksPerPage;
|
||||
|
@ -52,17 +62,48 @@ protected:
|
|||
bool isPointerInPage(void *ptr, const Page &page);
|
||||
|
||||
public:
|
||||
/**
|
||||
* Constructor for a memory pool with the given chunk size.
|
||||
* @param chunkSize the chunk size of this memory pool
|
||||
*/
|
||||
MemoryPool(size_t chunkSize);
|
||||
~MemoryPool();
|
||||
|
||||
/**
|
||||
* Allocate a new chunk from the memory pool.
|
||||
*/
|
||||
void *allocChunk();
|
||||
/**
|
||||
* Return a chunk to the memory pool. The given pointer must have
|
||||
* been obtained from calling the allocChunk() method of the very
|
||||
* same MemoryPool instance. Passing any other pointer (e.g. to
|
||||
* a chunk from another MemoryPool, or a malloc'ed memory block)
|
||||
* will lead to undefined behavior and may result in a crash (if
|
||||
* you are lucky) or in silent data corruption.
|
||||
*/
|
||||
void freeChunk(void *ptr);
|
||||
|
||||
/**
|
||||
* Perform garbage collection. The memory pool stores all the
|
||||
* chunks it manages in memory 'pages' obtained via the classic
|
||||
* memory allocation APIs (i.e. malloc/free). Ordinarily, once
|
||||
* a page has been allocated, it won't be released again during
|
||||
* the life time of the memory pool. The exception is when this
|
||||
* method is called.
|
||||
*/
|
||||
void freeUnusedPages();
|
||||
|
||||
/**
|
||||
* Return the chunk size used by this memory pool.
|
||||
*/
|
||||
size_t getChunkSize() const { return _chunkSize; }
|
||||
};
|
||||
|
||||
/**
|
||||
* This is a memory pool which already contains in itself some storage
|
||||
* space for a fixed number of chunks. Thus if the memory pool is only
|
||||
* lightly used, no malloc() calls have to be made at all.
|
||||
*/
|
||||
template<size_t CHUNK_SIZE, size_t NUM_INTERNAL_CHUNKS = 32>
|
||||
class FixedSizeMemoryPool : public MemoryPool {
|
||||
private:
|
||||
|
@ -80,32 +121,39 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
// Ensure NUM_INTERNAL_CHUNKS == 0 results in a compile error
|
||||
template<size_t CHUNK_SIZE>
|
||||
class FixedSizeMemoryPool<CHUNK_SIZE,0> : public MemoryPool {
|
||||
public:
|
||||
FixedSizeMemoryPool() : MemoryPool(CHUNK_SIZE) {}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A memory pool for C++ objects.
|
||||
*/
|
||||
template<class T, size_t NUM_INTERNAL_CHUNKS = 32>
|
||||
class ObjectPool : public FixedSizeMemoryPool<sizeof(T), NUM_INTERNAL_CHUNKS> {
|
||||
public:
|
||||
/**
|
||||
* Return the memory chunk used as storage for the given object back
|
||||
* to the pool, after calling its destructor.
|
||||
*/
|
||||
void deleteChunk(T *ptr) {
|
||||
ptr->~T();
|
||||
freeChunk(ptr);
|
||||
this->freeChunk(ptr);
|
||||
}
|
||||
};
|
||||
|
||||
} // End of namespace Common
|
||||
|
||||
// Provide a custom placement new operator, using an arbitrary
|
||||
// MemoryPool.
|
||||
//
|
||||
// This *should* work with all C++ implementations, but may not.
|
||||
//
|
||||
// For details on using placement new for custom allocators, see e.g.
|
||||
// <http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.14>
|
||||
|
||||
/**
|
||||
* A custom placement new operator, using an arbitrary MemoryPool.
|
||||
*
|
||||
* This *should* work with all C++ implementations, but may not.
|
||||
*
|
||||
* For details on using placement new for custom allocators, see e.g.
|
||||
* <http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.14>
|
||||
*/
|
||||
inline void* operator new(size_t nbytes, Common::MemoryPool& pool) {
|
||||
assert(nbytes <= pool.getChunkSize());
|
||||
return pool.allocChunk();
|
||||
|
|
27
common/pack-end.h
Normal file
27
common/pack-end.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* Residual - A 3D game interpreter
|
||||
*
|
||||
* Residual is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the AUTHORS
|
||||
* 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(SCUMMVM_USE_PRAGMA_PACK)
|
||||
#pragma pack()
|
||||
#endif
|
27
common/pack-start.h
Normal file
27
common/pack-start.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* Residual - A 3D game interpreter
|
||||
*
|
||||
* Residual is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the AUTHORS
|
||||
* 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(SCUMMVM_USE_PRAGMA_PACK)
|
||||
#pragma pack(1)
|
||||
#endif
|
|
@ -36,13 +36,13 @@ namespace Common {
|
|||
* Simple class for handling both 2D position and size.
|
||||
*/
|
||||
struct Point {
|
||||
int16 x; //!< The horizontal part of the point
|
||||
int16 y; //!< The vertical part of the point
|
||||
int16 x; ///< The horizontal part of the point
|
||||
int16 y; ///< The vertical part of the point
|
||||
|
||||
Point() : x(0), y(0) {}
|
||||
Point(int16 x1, int16 y1) : x(x1), y(y1) {}
|
||||
bool operator==(const Point & p) const { return x == p.x && y == p.y; };
|
||||
bool operator!=(const Point & p) const { return x != p.x || y != p.y; };
|
||||
bool operator==(const Point &p) const { return x == p.x && y == p.y; };
|
||||
bool operator!=(const Point &p) const { return x != p.x || y != p.y; };
|
||||
|
||||
/**
|
||||
* Return the square of the distance between this point and the point p.
|
||||
|
@ -50,7 +50,7 @@ struct Point {
|
|||
* @param p the other point
|
||||
* @return the distance between this and p
|
||||
*/
|
||||
uint sqrDist(const Point & p) const {
|
||||
uint sqrDist(const Point &p) const {
|
||||
int diffx = ABS(p.x - x);
|
||||
if (diffx >= 0x1000)
|
||||
return 0xFFFFFF;
|
||||
|
@ -59,7 +59,7 @@ struct Point {
|
|||
if (diffy >= 0x1000)
|
||||
return 0xFFFFFF;
|
||||
|
||||
return uint(diffx*diffx + diffy*diffy);
|
||||
return uint(diffx * diffx + diffy * diffy);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -82,8 +82,8 @@ struct Point {
|
|||
* When writing code using our Rect class, always keep this principle in mind!
|
||||
*/
|
||||
struct Rect {
|
||||
int16 top, left; //!< The point at the top left of the rectangle (part of the rect).
|
||||
int16 bottom, right; //!< The point at the bottom right of the rectangle (not part of the rect).
|
||||
int16 top, left; ///< The point at the top left of the rectangle (part of the rect).
|
||||
int16 bottom, right; ///< The point at the bottom right of the rectangle (not part of the rect).
|
||||
|
||||
Rect() : top(0), left(0), bottom(0), right(0) {}
|
||||
Rect(int16 w, int16 h) : top(0), left(0), bottom(h), right(w) {}
|
||||
|
@ -198,7 +198,7 @@ struct Rect {
|
|||
else if (right < r.left) right = r.left;
|
||||
}
|
||||
|
||||
void clip(int maxw, int maxh) {
|
||||
void clip(int16 maxw, int16 maxh) {
|
||||
clip(Rect(0, 0, maxw, maxh));
|
||||
}
|
||||
|
||||
|
|
|
@ -37,13 +37,6 @@
|
|||
|
||||
namespace Common {
|
||||
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
const String String::emptyString;
|
||||
#else
|
||||
const char *String::emptyString = "";
|
||||
#endif
|
||||
|
||||
|
||||
MemoryPool *g_refCountPool = 0; // FIXME: This is never freed right now
|
||||
|
||||
static uint32 computeCapacity(uint32 len) {
|
||||
|
@ -464,6 +457,7 @@ String String::printf(const char *fmt, ...) {
|
|||
len = vsnprintf(output._str, size, fmt, va);
|
||||
va_end(va);
|
||||
} while (len == -1 || len >= size);
|
||||
output._size = len;
|
||||
} else if (len < (int)_builtinCapacity) {
|
||||
// vsnprintf succeeded
|
||||
output._size = len;
|
||||
|
|
|
@ -90,12 +90,6 @@ protected:
|
|||
}
|
||||
|
||||
public:
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
static const String emptyString;
|
||||
#else
|
||||
static const char *emptyString;
|
||||
#endif
|
||||
|
||||
/** Construct a new empty string. */
|
||||
String() : _size(0), _str(_storage) { _storage[0] = 0; }
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ MemoryReadStream *ReadStream::readStream(uint32 dataSize) {
|
|||
void *buf = malloc(dataSize);
|
||||
dataSize = read(buf, dataSize);
|
||||
assert(dataSize > 0);
|
||||
return new MemoryReadStream((byte *)buf, dataSize, true);
|
||||
return new MemoryReadStream((byte *)buf, dataSize, DisposeAfterUse::YES);
|
||||
}
|
||||
|
||||
|
||||
|
@ -94,7 +94,7 @@ enum {
|
|||
CR = 0x0D
|
||||
};
|
||||
|
||||
char *SeekableReadStream::readLine_NEW(char *buf, size_t bufSize) {
|
||||
char *SeekableReadStream::readLine(char *buf, size_t bufSize) {
|
||||
assert(buf != 0 && bufSize > 1);
|
||||
char *p = buf;
|
||||
size_t len = 0;
|
||||
|
@ -162,7 +162,7 @@ String SeekableReadStream::readLine() {
|
|||
String line;
|
||||
while (line.lastChar() != '\n') {
|
||||
char buf[256];
|
||||
if (!readLine_NEW(buf, 256))
|
||||
if (!readLine(buf, 256))
|
||||
break;
|
||||
line += buf;
|
||||
}
|
||||
|
@ -188,7 +188,7 @@ uint32 SubReadStream::read(void *dataPtr, uint32 dataSize) {
|
|||
return dataSize;
|
||||
}
|
||||
|
||||
SeekableSubReadStream::SeekableSubReadStream(SeekableReadStream *parentStream, uint32 begin, uint32 end, bool disposeParentStream)
|
||||
SeekableSubReadStream::SeekableSubReadStream(SeekableReadStream *parentStream, uint32 begin, uint32 end, DisposeAfterUse::Flag disposeParentStream)
|
||||
: SubReadStream(parentStream, end, disposeParentStream),
|
||||
_parentStream(parentStream),
|
||||
_begin(begin) {
|
||||
|
@ -222,7 +222,7 @@ bool SeekableSubReadStream::seek(int32 offset, int whence) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
BufferedReadStream::BufferedReadStream(ReadStream *parentStream, uint32 bufSize, bool disposeParentStream)
|
||||
BufferedReadStream::BufferedReadStream(ReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream)
|
||||
: _parentStream(parentStream),
|
||||
_disposeParentStream(disposeParentStream),
|
||||
_pos(0),
|
||||
|
@ -279,7 +279,7 @@ uint32 BufferedReadStream::read(void *dataPtr, uint32 dataSize) {
|
|||
return alreadyRead + dataSize;
|
||||
}
|
||||
|
||||
BufferedSeekableReadStream::BufferedSeekableReadStream(SeekableReadStream *parentStream, uint32 bufSize, bool disposeParentStream)
|
||||
BufferedSeekableReadStream::BufferedSeekableReadStream(SeekableReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream)
|
||||
: BufferedReadStream(parentStream, bufSize, disposeParentStream),
|
||||
_parentStream(parentStream) {
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#include "common/sys.h"
|
||||
#include "common/endian.h"
|
||||
#include "common/types.h"
|
||||
|
||||
namespace Common {
|
||||
|
||||
|
@ -176,12 +177,6 @@ public:
|
|||
// The remaining methods all have default implementations; subclasses
|
||||
// in general should not overload them.
|
||||
|
||||
/**
|
||||
* DEPRECATED
|
||||
* Default implementation for backward compatibility
|
||||
*/
|
||||
inline bool ioFailed() { return (eos() || err()); }
|
||||
|
||||
/**
|
||||
* Read an unsigned byte from the stream and return it.
|
||||
* Performs no error checking. The return value is undefined
|
||||
|
@ -380,7 +375,7 @@ public:
|
|||
* @param bufSize the size of the buffer
|
||||
* @return a pointer to the read string, or NULL if an error occurred
|
||||
*/
|
||||
virtual char *readLine_NEW(char *s, size_t bufSize);
|
||||
virtual char *readLine(char *s, size_t bufSize);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -390,12 +385,13 @@ public:
|
|||
*
|
||||
* Upon successful completion, return a string with the content
|
||||
* of the line, *without* the end of a line marker. This method
|
||||
* does not indicate whether an error occured. Callers must use
|
||||
* does not indicate whether an error occurred. Callers must use
|
||||
* err() or eos() to determine whether an exception occurred.
|
||||
*/
|
||||
virtual String readLine();
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* SubReadStream provides access to a ReadStream restricted to the range
|
||||
* [currentPosition, currentPosition+end).
|
||||
|
@ -407,12 +403,12 @@ public:
|
|||
class SubReadStream : virtual public ReadStream {
|
||||
protected:
|
||||
ReadStream *_parentStream;
|
||||
bool _disposeParentStream;
|
||||
DisposeAfterUse::Flag _disposeParentStream;
|
||||
uint32 _pos;
|
||||
uint32 _end;
|
||||
bool _eos;
|
||||
public:
|
||||
SubReadStream(ReadStream *parentStream, uint32 end, bool disposeParentStream = false)
|
||||
SubReadStream(ReadStream *parentStream, uint32 end, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO)
|
||||
: _parentStream(parentStream),
|
||||
_disposeParentStream(disposeParentStream),
|
||||
_pos(0),
|
||||
|
@ -421,7 +417,8 @@ public:
|
|||
assert(parentStream);
|
||||
}
|
||||
~SubReadStream() {
|
||||
if (_disposeParentStream) delete _parentStream;
|
||||
if (_disposeParentStream)
|
||||
delete _parentStream;
|
||||
}
|
||||
|
||||
virtual bool eos() const { return _eos; }
|
||||
|
@ -443,7 +440,7 @@ protected:
|
|||
SeekableReadStream *_parentStream;
|
||||
uint32 _begin;
|
||||
public:
|
||||
SeekableSubReadStream(SeekableReadStream *parentStream, uint32 begin, uint32 end, bool disposeParentStream = false);
|
||||
SeekableSubReadStream(SeekableReadStream *parentStream, uint32 begin, uint32 end, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO);
|
||||
|
||||
virtual int32 pos() const { return _pos - _begin; }
|
||||
virtual int32 size() const { return _end - _begin; }
|
||||
|
@ -463,7 +460,7 @@ private:
|
|||
const bool _bigEndian;
|
||||
|
||||
public:
|
||||
SeekableSubReadStreamEndian(SeekableReadStream *parentStream, uint32 begin, uint32 end, bool bigEndian = false, bool disposeParentStream = false)
|
||||
SeekableSubReadStreamEndian(SeekableReadStream *parentStream, uint32 begin, uint32 end, bool bigEndian = false, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO)
|
||||
: SeekableSubReadStream(parentStream, begin, end, disposeParentStream), _bigEndian(bigEndian) {
|
||||
}
|
||||
|
||||
|
@ -496,14 +493,14 @@ public:
|
|||
class BufferedReadStream : virtual public ReadStream {
|
||||
protected:
|
||||
ReadStream *_parentStream;
|
||||
bool _disposeParentStream;
|
||||
DisposeAfterUse::Flag _disposeParentStream;
|
||||
byte *_buf;
|
||||
uint32 _pos;
|
||||
uint32 _bufSize;
|
||||
uint32 _realBufSize;
|
||||
|
||||
public:
|
||||
BufferedReadStream(ReadStream *parentStream, uint32 bufSize, bool disposeParentStream = false);
|
||||
BufferedReadStream(ReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO);
|
||||
~BufferedReadStream();
|
||||
|
||||
virtual bool eos() const { return (_pos == _bufSize) && _parentStream->eos(); }
|
||||
|
@ -521,7 +518,7 @@ class BufferedSeekableReadStream : public BufferedReadStream, public SeekableRea
|
|||
protected:
|
||||
SeekableReadStream *_parentStream;
|
||||
public:
|
||||
BufferedSeekableReadStream(SeekableReadStream *parentStream, uint32 bufSize, bool disposeParentStream = false);
|
||||
BufferedSeekableReadStream(SeekableReadStream *parentStream, uint32 bufSize, DisposeAfterUse::Flag disposeParentStream = DisposeAfterUse::NO);
|
||||
|
||||
virtual int32 pos() const { return _parentStream->pos() - (_bufSize - _pos); }
|
||||
virtual int32 size() const { return _parentStream->size(); }
|
||||
|
@ -542,7 +539,7 @@ private:
|
|||
const uint32 _size;
|
||||
uint32 _pos;
|
||||
byte _encbyte;
|
||||
bool _disposeMemory;
|
||||
DisposeAfterUse::Flag _disposeMemory;
|
||||
bool _eos;
|
||||
|
||||
public:
|
||||
|
@ -552,7 +549,7 @@ public:
|
|||
* wraps it. If disposeMemory is true, the MemoryReadStream takes ownership
|
||||
* of the buffer and hence free's it when destructed.
|
||||
*/
|
||||
MemoryReadStream(const byte *dataPtr, uint32 dataSize, bool disposeMemory = false) :
|
||||
MemoryReadStream(const byte *dataPtr, uint32 dataSize, DisposeAfterUse::Flag disposeMemory = DisposeAfterUse::NO) :
|
||||
_ptrOrig(dataPtr),
|
||||
_ptr(dataPtr),
|
||||
_size(dataSize),
|
||||
|
@ -649,7 +646,7 @@ private:
|
|||
byte *_ptr;
|
||||
byte *_data;
|
||||
uint32 _pos;
|
||||
bool _disposeMemory;
|
||||
DisposeAfterUse::Flag _disposeMemory;
|
||||
|
||||
void ensureCapacity(uint32 new_len) {
|
||||
if (new_len <= _capacity)
|
||||
|
@ -670,7 +667,7 @@ private:
|
|||
_size = new_len;
|
||||
}
|
||||
public:
|
||||
MemoryWriteStreamDynamic(bool disposeMemory = false) : _capacity(0), _size(0), _ptr(0), _data(0), _pos(0), _disposeMemory(disposeMemory) {}
|
||||
MemoryWriteStreamDynamic(DisposeAfterUse::Flag disposeMemory = DisposeAfterUse::NO) : _capacity(0), _size(0), _ptr(0), _data(0), _pos(0), _disposeMemory(disposeMemory) {}
|
||||
|
||||
~MemoryWriteStreamDynamic() {
|
||||
if (_disposeMemory)
|
||||
|
|
89
common/sys.h
89
common/sys.h
|
@ -79,9 +79,6 @@
|
|||
// - Define this on a big endian target
|
||||
// SYSTEM_NEED_ALIGNMENT
|
||||
// - Define this if your system has problems reading e.g. an int32 from an odd address
|
||||
// SYSTEM_USE_LONG_INT
|
||||
// - Define this if your port needs to use 'long' for the int32 datatype
|
||||
// (i.e. an integer with exactly 32 bits).
|
||||
// SYSTEM_DONT_DEFINE_TYPES
|
||||
// - Define this if you need to provide your own typedefs, e.g. because your
|
||||
// system headers conflict with our typenames, or because you have odd
|
||||
|
@ -97,6 +94,20 @@
|
|||
#endif
|
||||
|
||||
|
||||
//
|
||||
// By default we try to use pragma push/pop to ensure various structs we use
|
||||
// are "packed". If your compiler doesn't support this pragma, you are in for
|
||||
// a problem. If you are lucky, there is a compiler switch, or another pragma,
|
||||
// doing the same thing -- in that case, try to modify common/pack-begin.h and
|
||||
// common/pack-end.h accordingly. Or maybe your port simply *always* packs
|
||||
// everything, in which case you could #undefine SCUMMVM_USE_PRAGMA_PACK.
|
||||
//
|
||||
// If neither is possible, tough luck. Try to contact the team, maybe we can
|
||||
// come up with a solution, though I wouldn't hold my breath on it :-/.
|
||||
//
|
||||
#define SYSTEM_USE_PRAGMA_PACK
|
||||
|
||||
|
||||
#if defined(__SYMBIAN32__)
|
||||
|
||||
#define SYSTEM_LITTLE_ENDIAN
|
||||
|
@ -127,17 +138,17 @@
|
|||
#define snprintf _snprintf
|
||||
|
||||
#define SYSTEM_LITTLE_ENDIAN
|
||||
#define SYSTEM_NEED_ALIGNMENT
|
||||
|
||||
#ifndef __GNUC__
|
||||
#define FORCEINLINE __forceinline
|
||||
#define NORETURN_PRE __declspec(noreturn)
|
||||
#endif
|
||||
#define PLUGIN_EXPORT __declspec(dllexport)
|
||||
|
||||
#if _WIN32_WCE < 300
|
||||
#define SMALL_SCREEN_DEVICE
|
||||
#endif
|
||||
|
||||
typedef signed char int8_t;
|
||||
typedef signed short int16_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned short uint16_t;
|
||||
|
||||
#elif defined(_MSC_VER)
|
||||
|
||||
#define strcasecmp stricmp
|
||||
|
@ -145,15 +156,10 @@
|
|||
|
||||
#define SYSTEM_LITTLE_ENDIAN
|
||||
|
||||
typedef signed char int8_t;
|
||||
typedef signed short int16_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned short uint16_t;
|
||||
#define FORCEINLINE __forceinline
|
||||
#define NORETURN_PRE __declspec(noreturn)
|
||||
#define PLUGIN_EXPORT __declspec(dllexport)
|
||||
|
||||
// #if !defined(SDL_COMPILEDVERSION) || (SDL_COMPILEDVERSION < 1210)
|
||||
// typedef signed long int32_t;
|
||||
// typedef unsigned long uint32_t;
|
||||
// #endif
|
||||
|
||||
#elif defined(__MINGW32__)
|
||||
|
||||
|
@ -161,6 +167,8 @@
|
|||
|
||||
#define SYSTEM_LITTLE_ENDIAN
|
||||
|
||||
#define PLUGIN_EXPORT __declspec(dllexport)
|
||||
|
||||
#elif defined(UNIX)
|
||||
|
||||
#ifndef CONFIG_H
|
||||
|
@ -233,6 +241,30 @@
|
|||
|
||||
#define SYSTEM_LITTLE_ENDIAN
|
||||
#define SYSTEM_NEED_ALIGNMENT
|
||||
#elif defined(__N64__)
|
||||
|
||||
#define scumm_stricmp strcasecmp
|
||||
#define scumm_strnicmp strncasecmp
|
||||
|
||||
#define SCUMM_BIG_ENDIAN
|
||||
#define SCUMM_NEED_ALIGNMENT
|
||||
|
||||
#define STRINGBUFLEN 256
|
||||
|
||||
#define SCUMMVM_DONT_DEFINE_TYPES
|
||||
typedef unsigned char byte;
|
||||
|
||||
typedef unsigned char uint8;
|
||||
typedef signed char int8;
|
||||
|
||||
typedef unsigned short int uint16;
|
||||
typedef signed short int int16;
|
||||
|
||||
typedef unsigned int uint32;
|
||||
typedef signed int int32;
|
||||
|
||||
typedef unsigned long long uint64;
|
||||
typedef signed long long int64;
|
||||
|
||||
#elif defined(__PSP__)
|
||||
|
||||
|
@ -268,6 +300,7 @@
|
|||
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// GCC specific stuff
|
||||
//
|
||||
|
@ -291,8 +324,12 @@
|
|||
#define PLUGIN_EXPORT
|
||||
#endif
|
||||
|
||||
#ifndef NORETURN
|
||||
#define NORETURN
|
||||
#ifndef NORETURN_PRE
|
||||
#define NORETURN_PRE
|
||||
#endif
|
||||
|
||||
#ifndef NORETURN_POST
|
||||
#define NORETURN_POST
|
||||
#endif
|
||||
|
||||
#ifndef STRINGBUFLEN
|
||||
|
@ -303,32 +340,20 @@
|
|||
#define MAXPATHLEN 256
|
||||
#endif
|
||||
|
||||
#ifndef NORETURN
|
||||
#define NORETURN
|
||||
#endif
|
||||
|
||||
//
|
||||
// Typedef our system types unless SYSTEM_DONT_DEFINE_TYPES is set.
|
||||
//
|
||||
#ifndef SYSTEM_DONT_DEFINE_TYPES
|
||||
|
||||
typedef unsigned char byte;
|
||||
|
||||
typedef unsigned char uint8;
|
||||
typedef signed char int8;
|
||||
|
||||
typedef unsigned short uint16;
|
||||
typedef signed short int16;
|
||||
|
||||
#ifdef SYSTEM_USE_LONG_INT
|
||||
typedef unsigned long uint32;
|
||||
typedef signed long int32;
|
||||
typedef unsigned long uint;
|
||||
#else
|
||||
typedef unsigned int uint32;
|
||||
typedef signed int int32;
|
||||
typedef unsigned int uint;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#endif // COMMON_SYS_H
|
||||
|
|
|
@ -55,6 +55,24 @@ namespace Common {
|
|||
|
||||
class FilesystemFactory;
|
||||
|
||||
/**
|
||||
* A structure describing time and date. This is a clone of struct tm
|
||||
* from time.h. We roll our own since not all systems provide time.h.
|
||||
* We also do not imitate all files of struct tm, only those we
|
||||
* actually need.
|
||||
*
|
||||
* @note For now, the members are named exactly as in struct tm to ease
|
||||
* the transition.
|
||||
*/
|
||||
struct TimeDate {
|
||||
int tm_sec; ///< seconds (0 - 60)
|
||||
int tm_min; ///< minutes (0 - 59)
|
||||
int tm_hour; ///< hours (0 - 23)
|
||||
int tm_mday; ///< day of month (1 - 31)
|
||||
int tm_mon; ///< month of year (0 - 11)
|
||||
int tm_year; ///< year - 1900
|
||||
};
|
||||
|
||||
/**
|
||||
* Interface for Residual backends.
|
||||
*/
|
||||
|
@ -183,6 +201,8 @@ public:
|
|||
*/
|
||||
virtual void launcherInitSize(uint width, uint height) = 0;
|
||||
|
||||
virtual int getScreenChangeID() const { return 0; }
|
||||
|
||||
/**
|
||||
* Set the size of the screen.
|
||||
|
||||
|
@ -193,8 +213,6 @@ public:
|
|||
*/
|
||||
virtual byte *setupScreen(int screenW, int screenH, bool fullscreen, bool accel3d) = 0;
|
||||
|
||||
int getScreenChangeID() const { return 0; }
|
||||
|
||||
/**
|
||||
* Returns the currently set virtual screen height.
|
||||
* @see initSize
|
||||
|
@ -300,7 +318,18 @@ public:
|
|||
*/
|
||||
//@{
|
||||
|
||||
/** Show or hide the mouse cursor. */
|
||||
/**
|
||||
* Show or hide the mouse cursor.
|
||||
*
|
||||
* Currently the backend is not required to immediately draw the
|
||||
* mouse cursor on showMouse(true).
|
||||
*
|
||||
* TODO: We might want to reconsider this fact,
|
||||
* check Graphics::CursorManager::showMouse for some details about
|
||||
* this.
|
||||
*
|
||||
* @see Graphics::CursorManager::showMouse
|
||||
*/
|
||||
virtual bool showMouse(bool visible) = 0;
|
||||
|
||||
/**
|
||||
|
@ -314,16 +343,18 @@ public:
|
|||
/**
|
||||
* Set the bitmap used for drawing the cursor.
|
||||
*
|
||||
* @param buf the pixmap data to be used (8bit/pixel)
|
||||
* @param buf the pixmap data to be used
|
||||
* @param w width of the mouse cursor
|
||||
* @param h height of the mouse cursor
|
||||
* @param hotspotX horizontal offset from the left side to the hotspot
|
||||
* @param hotspotY vertical offset from the top side to the hotspot
|
||||
* @param keycolor transparency color index
|
||||
* @param keycolor transparency color value. This should not exceed the maximum color value of the specified format.
|
||||
* In case it does the behavior is undefined. The backend might just error out or simply ignore the
|
||||
* value. (The SDL backend will just assert to prevent abuse of this).
|
||||
* @param cursorTargetScale scale factor which cursor is designed for
|
||||
* @param format pointer to the pixel format which cursor graphic uses
|
||||
* @param format pointer to the pixel format which cursor graphic uses (0 means CLUT8)
|
||||
*/
|
||||
virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor = 0xFFFFFFFF, int cursorTargetScale = 1, const Graphics::PixelFormat *format = NULL) = 0;
|
||||
virtual void setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int cursorTargetScale = 1, const Graphics::PixelFormat *format = NULL) = 0;
|
||||
|
||||
//@}
|
||||
|
||||
|
@ -343,7 +374,7 @@ public:
|
|||
* Corresponds on many systems to the combination of time()
|
||||
* and localtime().
|
||||
*/
|
||||
virtual void getTimeAndDate(struct tm &t) const = 0;
|
||||
virtual void getTimeAndDate(TimeDate &t) const = 0;
|
||||
|
||||
/**
|
||||
* Return the timer manager singleton. For more information, refer
|
||||
|
|
144
common/textconsole.cpp
Normal file
144
common/textconsole.cpp
Normal file
|
@ -0,0 +1,144 @@
|
|||
/* Residual - A 3D game interpreter
|
||||
*
|
||||
* Residual is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the AUTHORS
|
||||
* 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/textconsole.h"
|
||||
#include "common/system.h"
|
||||
|
||||
namespace Common {
|
||||
|
||||
static OutputFormatter s_errorOutputFormatter = 0;
|
||||
|
||||
void setErrorOutputFormatter(OutputFormatter f) {
|
||||
s_errorOutputFormatter = f;
|
||||
}
|
||||
|
||||
static ErrorHandler s_errorHandler = 0;
|
||||
|
||||
void setErrorHandler(ErrorHandler handler) {
|
||||
s_errorHandler = handler;
|
||||
}
|
||||
|
||||
|
||||
} // End of namespace Common
|
||||
|
||||
|
||||
#ifndef DISABLE_TEXT_CONSOLE
|
||||
|
||||
void warning(const char *s, ...) {
|
||||
char buf[STRINGBUFLEN];
|
||||
va_list va;
|
||||
|
||||
va_start(va, s);
|
||||
vsnprintf(buf, STRINGBUFLEN, s, va);
|
||||
va_end(va);
|
||||
|
||||
#if !defined (__SYMBIAN32__)
|
||||
fputs("WARNING: ", stderr);
|
||||
fputs(buf, stderr);
|
||||
fputs("!\n", stderr);
|
||||
#endif
|
||||
|
||||
#if defined( USE_WINDBG )
|
||||
strcat(buf, "\n");
|
||||
#if defined( _WIN32_WCE )
|
||||
TCHAR buf_unicode[1024];
|
||||
MultiByteToWideChar(CP_ACP, 0, buf, strlen(buf) + 1, buf_unicode, sizeof(buf_unicode));
|
||||
OutputDebugString(buf_unicode);
|
||||
#else
|
||||
OutputDebugString(buf);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void NORETURN_PRE error(const char *s, ...) {
|
||||
char buf_input[STRINGBUFLEN];
|
||||
char buf_output[STRINGBUFLEN];
|
||||
va_list va;
|
||||
|
||||
// Generate the full error message
|
||||
va_start(va, s);
|
||||
vsnprintf(buf_input, STRINGBUFLEN, s, va);
|
||||
va_end(va);
|
||||
|
||||
|
||||
// Next, give the active engine (if any) a chance to augment the message
|
||||
if (Common::s_errorOutputFormatter) {
|
||||
(*Common::s_errorOutputFormatter)(buf_output, buf_input, STRINGBUFLEN);
|
||||
} else {
|
||||
strncpy(buf_output, buf_input, STRINGBUFLEN);
|
||||
}
|
||||
|
||||
buf_output[STRINGBUFLEN-3] = '\0';
|
||||
buf_output[STRINGBUFLEN-2] = '\0';
|
||||
buf_output[STRINGBUFLEN-1] = '\0';
|
||||
strcat(buf_output, "!\n");
|
||||
|
||||
|
||||
// Print the error message to stderr
|
||||
fputs(buf_output, stderr);
|
||||
|
||||
// If there is an error handler, invoke it now
|
||||
if (Common::s_errorHandler)
|
||||
(*Common::s_errorHandler)(buf_output);
|
||||
|
||||
// TODO: Add a OSystem::fatalError() method and invoke it here.
|
||||
// The default implementation would just call OSystem::quit().
|
||||
|
||||
#if defined( USE_WINDBG )
|
||||
#if defined( _WIN32_WCE )
|
||||
TCHAR buf_output_unicode[1024];
|
||||
MultiByteToWideChar(CP_ACP, 0, buf_output, strlen(buf_output) + 1, buf_output_unicode, sizeof(buf_output_unicode));
|
||||
OutputDebugString(buf_output_unicode);
|
||||
#ifndef DEBUG
|
||||
drawError(buf_output);
|
||||
#else
|
||||
int cmon_break_into_the_debugger_if_you_please = *(int *)(buf_output + 1); // bus error
|
||||
printf("%d", cmon_break_into_the_debugger_if_you_please); // don't optimize the int out
|
||||
#endif
|
||||
#else
|
||||
OutputDebugString(buf_output);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef PALMOS_MODE
|
||||
extern void PalmFatalError(const char *err);
|
||||
PalmFatalError(buf_output);
|
||||
#endif
|
||||
|
||||
#ifdef __SYMBIAN32__
|
||||
Symbian::FatalError(buf_output);
|
||||
#endif
|
||||
// Finally exit. quit() will terminate the program if g_system is present
|
||||
if (g_system)
|
||||
g_system->quit();
|
||||
|
||||
#if defined(SAMSUNGTV)
|
||||
// FIXME
|
||||
for (;;) {}
|
||||
#else
|
||||
exit(1);
|
||||
#endif
|
||||
}
|
85
common/textconsole.h
Normal file
85
common/textconsole.h
Normal file
|
@ -0,0 +1,85 @@
|
|||
/* Residual - A 3D game interpreter
|
||||
*
|
||||
* Residual is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the AUTHORS
|
||||
* 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 COMMON_CONSOLE_H
|
||||
#define COMMON_CONSOLE_H
|
||||
|
||||
#include "common/sys.h"
|
||||
|
||||
namespace Common {
|
||||
|
||||
/**
|
||||
* An output formatter takes a source string and 'decorates' it with
|
||||
* extra information, storing the result in a destination buffer.
|
||||
* A typical use is to (optionally) enhance the output given by
|
||||
* the error() and debug() functions with extra information on
|
||||
* the state of the active engine.
|
||||
*/
|
||||
typedef void (*OutputFormatter)(char *dst, const char *src, size_t dstSize);
|
||||
|
||||
/**
|
||||
* Set the output formatter used by error().
|
||||
*/
|
||||
void setErrorOutputFormatter(OutputFormatter f);
|
||||
|
||||
|
||||
/**
|
||||
* A callback which is invoked by error() just before aborting.
|
||||
* A typical example would be a function which shows a debug
|
||||
* console and displays the given message in it.
|
||||
*/
|
||||
typedef void (*ErrorHandler)(const char *msg);
|
||||
|
||||
/**
|
||||
* Set a callback that is invoked by error() after the error
|
||||
* message has been printed, but before the application is
|
||||
* terminated.
|
||||
* This can be used to e.g. show a debugger console.
|
||||
*/
|
||||
void setErrorHandler(ErrorHandler handler);
|
||||
|
||||
} // End of namespace Common
|
||||
|
||||
|
||||
void NORETURN_PRE error(const char *s, ...) GCC_PRINTF(1, 2) NORETURN_POST;
|
||||
|
||||
#ifdef DISABLE_TEXT_CONSOLE
|
||||
|
||||
inline int printf(const char *s, ...) { return 0; }
|
||||
|
||||
inline void warning(const char *s, ...) {}
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* Print a warning message to the text console (stderr).
|
||||
* Automatically prepends the text "WARNING: " and appends
|
||||
* an exclamation mark and a newline.
|
||||
*/
|
||||
void warning(const char *s, ...) GCC_PRINTF(1, 2);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
35
common/types.h
Normal file
35
common/types.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* Residual - A 3D game interpreter
|
||||
*
|
||||
* Residual is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the AUTHORS
|
||||
* 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 COMMON_TYPES_H
|
||||
#define COMMON_TYPES_H
|
||||
|
||||
#include "common/sys.h"
|
||||
|
||||
namespace DisposeAfterUse {
|
||||
enum Flag { NO, YES };
|
||||
}
|
||||
|
||||
|
||||
#endif
|
|
@ -1442,7 +1442,7 @@ Common::SeekableReadStream *ZipArchive::createReadStreamForMember(const Common::
|
|||
assert(buffer);
|
||||
unzReadCurrentFile(_zipFile, buffer, fileInfo.uncompressed_size);
|
||||
unzCloseCurrentFile(_zipFile);
|
||||
return new Common::MemoryReadStream(buffer, fileInfo.uncompressed_size+1, true);
|
||||
return new Common::MemoryReadStream(buffer, fileInfo.uncompressed_size+1, DisposeAfterUse::YES);
|
||||
|
||||
// FIXME: instead of reading all into a memory stream, we could
|
||||
// instead create a new ZipStream class. But then we have to be
|
||||
|
|
130
common/util.cpp
130
common/util.cpp
|
@ -25,14 +25,12 @@
|
|||
#include "common/util.h"
|
||||
#include "common/system.h"
|
||||
#include "common/config-manager.h"
|
||||
#include "gui/debugger.h"
|
||||
#include "engines/engine.h"
|
||||
|
||||
#include <stdarg.h> // For va_list etc.
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
// This is required for the debugger attachment
|
||||
extern bool isSmartphone(void);
|
||||
extern bool isSmartphone();
|
||||
#endif
|
||||
|
||||
#ifdef __PLAYSTATION2__
|
||||
|
@ -41,23 +39,15 @@ extern bool isSmartphone(void);
|
|||
typedef signed long int64;
|
||||
#include "backends/platform/ps2/fileio.h"
|
||||
|
||||
#define fprintf ps2_fprintf
|
||||
#define fputs(str, file) ps2_fputs(str, file)
|
||||
#define fflush(a) ps2_fflush(a)
|
||||
#endif
|
||||
|
||||
#ifdef __DS__
|
||||
#include "backends/fs/ds/ds-fs.h"
|
||||
|
||||
void std_fprintf(FILE* handle, const char* fmt, ...);
|
||||
void std_fflush(FILE* handle);
|
||||
|
||||
#define fprintf(file, fmt, ...) do { char str[128]; sprintf(str, fmt, ##__VA_ARGS__); DS::std_fwrite(str, strlen(str), 1, file); } while(0)
|
||||
#define fputs(str, file) DS::std_fwrite(str, strlen(str), 1, file)
|
||||
#define fflush(file) DS::std_fflush(file)
|
||||
#define fputs(str, file) DS::std_fwrite(str, strlen(str), 1, file)
|
||||
#endif
|
||||
|
||||
|
||||
namespace Common {
|
||||
|
||||
StringTokenizer::StringTokenizer(const String &str, const String &delimiters) : _str(str), _delimiters(delimiters) {
|
||||
|
@ -150,7 +140,7 @@ String tag2string(uint32 tag) {
|
|||
str[4] = '\0';
|
||||
// Replace non-printable chars by dot
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
if (!isprint(str[i]))
|
||||
if (!isprint((unsigned char)str[i]))
|
||||
str[i] = '.';
|
||||
}
|
||||
return Common::String(str);
|
||||
|
@ -178,7 +168,7 @@ uint RandomSource::getRandomNumber(uint max) {
|
|||
return _randSeed % (max + 1);
|
||||
}
|
||||
|
||||
uint RandomSource::getRandomBit(void) {
|
||||
uint RandomSource::getRandomBit() {
|
||||
_randSeed = 0xDEADBF03 * (_randSeed + 1);
|
||||
_randSeed = (_randSeed >> 13) | (_randSeed << 19);
|
||||
return _randSeed & 1;
|
||||
|
@ -193,6 +183,7 @@ uint RandomSource::getRandomNumberRng(uint min, uint max) {
|
|||
|
||||
|
||||
const LanguageDescription g_languages[] = {
|
||||
{"zh-cn", "Chinese (China)", ZH_CNA},
|
||||
{"zh", "Chinese (Taiwan)", ZH_TWN},
|
||||
{"cz", "Czech", CZ_CZE},
|
||||
{"nl", "Dutch", NL_NLD},
|
||||
|
@ -203,6 +194,7 @@ const LanguageDescription g_languages[] = {
|
|||
{"de", "German", DE_DEU},
|
||||
{"gr", "Greek", GR_GRE},
|
||||
{"hb", "Hebrew", HB_ISR},
|
||||
{"hu", "Hungarian", HU_HUN},
|
||||
{"it", "Italian", IT_ITA},
|
||||
{"jp", "Japanese", JA_JPN},
|
||||
{"kr", "Korean", KO_KOR},
|
||||
|
@ -212,7 +204,6 @@ const LanguageDescription g_languages[] = {
|
|||
{"ru", "Russian", RU_RUS},
|
||||
{"es", "Spanish", ES_ESP},
|
||||
{"se", "Swedish", SE_SWE},
|
||||
{"hu", "Hungarian", HU_HUN},
|
||||
{0, 0, UNK_LANG}
|
||||
};
|
||||
|
||||
|
@ -252,7 +243,7 @@ const char *getLanguageDescription(Language id) {
|
|||
|
||||
|
||||
const PlatformDescription g_platforms[] = {
|
||||
{"2gs", "2gs", "2gs", "Apple IIgs", kPlatformApple2GS },
|
||||
{"2gs", "2gs", "2gs", "Apple IIgs", kPlatformApple2GS},
|
||||
{"3do", "3do", "3do", "3DO", kPlatform3DO},
|
||||
{"acorn", "acorn", "acorn", "Acorn", kPlatformAcorn},
|
||||
{"amiga", "ami", "amiga", "Amiga", kPlatformAmiga},
|
||||
|
@ -270,12 +261,12 @@ const PlatformDescription g_platforms[] = {
|
|||
|
||||
{"linux", "linux", "linux", "Linux", kPlatformLinux},
|
||||
{"macintosh", "mac", "mac", "Macintosh", kPlatformMacintosh},
|
||||
{"pce", "pce", "pce", "PC-Engine", kPlatformPCEngine },
|
||||
{"pce", "pce", "pce", "PC-Engine", kPlatformPCEngine},
|
||||
{"nes", "nes", "nes", "NES", kPlatformNES},
|
||||
{"segacd", "segacd", "sega", "SegaCD", kPlatformSegaCD},
|
||||
{"windows", "win", "win", "Windows", kPlatformWindows},
|
||||
{"playstation", "psx", "psx", "Sony PlayStation", kPlatformPSX},
|
||||
|
||||
{"cdi", "cdi", "cdi", "Phillips CD-i", kPlatformCDi},
|
||||
|
||||
{0, 0, 0, "Default", kPlatformUnknown}
|
||||
};
|
||||
|
@ -430,106 +421,3 @@ void updateGameGUIOptions(const uint32 options) {
|
|||
}
|
||||
|
||||
} // End of namespace Common
|
||||
|
||||
|
||||
|
||||
#ifndef DISABLE_TEXT_CONSOLE
|
||||
|
||||
void warning(const char *s, ...) {
|
||||
char buf[STRINGBUFLEN];
|
||||
va_list va;
|
||||
|
||||
va_start(va, s);
|
||||
vsnprintf(buf, STRINGBUFLEN, s, va);
|
||||
va_end(va);
|
||||
|
||||
#if !defined (__SYMBIAN32__)
|
||||
fprintf(stderr, "WARNING: %s!\n", buf);
|
||||
#endif
|
||||
|
||||
#if defined( USE_WINDBG )
|
||||
strcat(buf, "\n");
|
||||
#if defined( _WIN32_WCE )
|
||||
TCHAR buf_unicode[1024];
|
||||
MultiByteToWideChar(CP_ACP, 0, buf, strlen(buf) + 1, buf_unicode, sizeof(buf_unicode));
|
||||
OutputDebugString(buf_unicode);
|
||||
#else
|
||||
OutputDebugString(buf);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void NORETURN error(const char *s, ...) {
|
||||
char buf_input[STRINGBUFLEN];
|
||||
char buf_output[STRINGBUFLEN];
|
||||
va_list va;
|
||||
|
||||
// Generate the full error message
|
||||
va_start(va, s);
|
||||
vsnprintf(buf_input, STRINGBUFLEN, s, va);
|
||||
va_end(va);
|
||||
|
||||
|
||||
// Next, give the active engine (if any) a chance to augment the message
|
||||
if (g_engine) {
|
||||
g_engine->errorString(buf_input, buf_output, STRINGBUFLEN);
|
||||
} else {
|
||||
strncpy(buf_output, buf_input, STRINGBUFLEN);
|
||||
}
|
||||
|
||||
buf_output[STRINGBUFLEN-3] = '\0';
|
||||
buf_output[STRINGBUFLEN-2] = '\0';
|
||||
buf_output[STRINGBUFLEN-1] = '\0';
|
||||
strcat(buf_output, "!\n");
|
||||
|
||||
|
||||
// Print the error message to stderr
|
||||
fputs(buf_output, stderr);
|
||||
|
||||
// Unless this error -originated- within the debugger itself, we
|
||||
// now invoke the debugger, if available / supported.
|
||||
if (g_engine) {
|
||||
GUI::Debugger *debugger = g_engine->getDebugger();
|
||||
#ifdef _WIN32_WCE
|
||||
if (isSmartphone())
|
||||
debugger = 0;
|
||||
#endif
|
||||
if (debugger && !debugger->isAttached()) {
|
||||
debugger->attach(buf_output);
|
||||
debugger->onFrame();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if defined( USE_WINDBG )
|
||||
#if defined( _WIN32_WCE )
|
||||
TCHAR buf_output_unicode[1024];
|
||||
MultiByteToWideChar(CP_ACP, 0, buf_output, strlen(buf_output) + 1, buf_output_unicode, sizeof(buf_output_unicode));
|
||||
OutputDebugString(buf_output_unicode);
|
||||
#ifndef DEBUG
|
||||
drawError(buf_output);
|
||||
#else
|
||||
int cmon_break_into_the_debugger_if_you_please = *(int *)(buf_output + 1); // bus error
|
||||
printf("%d", cmon_break_into_the_debugger_if_you_please); // don't optimize the int out
|
||||
#endif
|
||||
#else
|
||||
OutputDebugString(buf_output);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef PALMOS_MODE
|
||||
extern void PalmFatalError(const char *err);
|
||||
PalmFatalError(buf_output);
|
||||
#endif
|
||||
|
||||
#ifdef __SYMBIAN32__
|
||||
Symbian::FatalError(buf_output);
|
||||
#endif
|
||||
// Finally exit. quit() will terminate the program if g_system is present
|
||||
if (g_system)
|
||||
g_system->quit();
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
|
|
@ -26,11 +26,9 @@
|
|||
#define COMMON_UTIL_H
|
||||
|
||||
#include "common/sys.h"
|
||||
#include "common/textconsole.h"
|
||||
#include "common/str.h"
|
||||
|
||||
#if defined(WIN32)
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Check whether a given pointer is aligned correctly.
|
||||
|
@ -89,15 +87,15 @@ public:
|
|||
* @note Uses space, horizontal tab, carriage return, newline, form feed and vertical tab as delimiters by default.
|
||||
*/
|
||||
StringTokenizer(const String &str, const String &delimiters = " \t\r\n\f\v");
|
||||
void reset(); //!< Resets the tokenizer to its initial state
|
||||
bool empty() const; //!< Returns true if there are no more tokens left in the string, false otherwise
|
||||
String nextToken(); //!< Returns the next token from the string (Or an empty string if there are no more tokens)
|
||||
void reset(); ///< Resets the tokenizer to its initial state
|
||||
bool empty() const; ///< Returns true if there are no more tokens left in the string, false otherwise
|
||||
String nextToken(); ///< Returns the next token from the string (Or an empty string if there are no more tokens)
|
||||
|
||||
private:
|
||||
const String _str; //!< The string to be tokenized
|
||||
const String _delimiters; //!< String containing all the delimiter characters
|
||||
uint _tokenBegin; //!< Latest found token's begin (Valid after a call to nextToken(), zero otherwise)
|
||||
uint _tokenEnd; //!< Latest found token's end (Valid after a call to nextToken(), zero otherwise)
|
||||
const String _str; ///< The string to be tokenized
|
||||
const String _delimiters; ///< String containing all the delimiter characters
|
||||
uint _tokenBegin; ///< Latest found token's begin (Valid after a call to nextToken(), zero otherwise)
|
||||
uint _tokenEnd; ///< Latest found token's end (Valid after a call to nextToken(), zero otherwise)
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -149,7 +147,7 @@ public:
|
|||
* Identical to getRandomNumber(1), but faster, hopefully.
|
||||
* @return a random bit, either 0 or 1
|
||||
*/
|
||||
uint getRandomBit(void);
|
||||
uint getRandomBit();
|
||||
/**
|
||||
* Generates a random unsigned integer in the interval [min, max].
|
||||
* @param min the lower bound
|
||||
|
@ -163,6 +161,7 @@ public:
|
|||
* List of game language.
|
||||
*/
|
||||
enum Language {
|
||||
ZH_CNA,
|
||||
ZH_TWN,
|
||||
CZ_CZE,
|
||||
NL_NLD,
|
||||
|
@ -173,6 +172,7 @@ enum Language {
|
|||
DE_DEU,
|
||||
GR_GRE,
|
||||
HB_ISR,
|
||||
HU_HUN,
|
||||
IT_ITA,
|
||||
JA_JPN,
|
||||
KO_KOR,
|
||||
|
@ -182,7 +182,6 @@ enum Language {
|
|||
RU_RUS,
|
||||
ES_ESP,
|
||||
SE_SWE,
|
||||
HU_HUN,
|
||||
|
||||
UNK_LANG = -1 // Use default language (i.e. none specified)
|
||||
};
|
||||
|
@ -222,11 +221,11 @@ enum Platform {
|
|||
kPlatformSegaCD,
|
||||
kPlatform3DO,
|
||||
kPlatformPCEngine,
|
||||
|
||||
kPlatformApple2GS,
|
||||
kPlatformPC98,
|
||||
kPlatformWii,
|
||||
kPlatformPSX,
|
||||
kPlatformCDi,
|
||||
|
||||
kPlatformUnknown = -1
|
||||
};
|
||||
|
@ -303,28 +302,4 @@ void updateGameGUIOptions(const uint32 options);
|
|||
|
||||
} // End of namespace Common
|
||||
|
||||
|
||||
#if defined(__GNUC__)
|
||||
void error(const char *s, ...) GCC_PRINTF(1, 2) NORETURN;
|
||||
#else
|
||||
void NORETURN error(const char *s, ...);
|
||||
#endif
|
||||
|
||||
#ifdef DISABLE_TEXT_CONSOLE
|
||||
|
||||
inline int printf(const char *s, ...) { return 0; }
|
||||
|
||||
inline void warning(const char *s, ...) {}
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* Print a warning message to the text console (stderr).
|
||||
* Automatically prepends the text "WARNING: " and appends
|
||||
* an exclamation mark and a newline.
|
||||
*/
|
||||
void warning(const char *s, ...) GCC_PRINTF(1, 2);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -48,7 +48,7 @@ bool XMLParser::loadFile(const FSNode &node) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool XMLParser::loadBuffer(const byte *buffer, uint32 size, bool disposable) {
|
||||
bool XMLParser::loadBuffer(const byte *buffer, uint32 size, DisposeAfterUse::Flag disposable) {
|
||||
_stream = new MemoryReadStream(buffer, size, disposable);
|
||||
_fileName = "Memory Stream";
|
||||
return true;
|
||||
|
|
|
@ -97,8 +97,6 @@ class FSNode;
|
|||
* @see XMLParser::keyCallback()
|
||||
*/
|
||||
class XMLParser {
|
||||
static const int kErrorMessageWidth = 512;
|
||||
|
||||
public:
|
||||
/**
|
||||
* Parser constructor.
|
||||
|
@ -198,7 +196,7 @@ public:
|
|||
* i.e. if it can be freed safely after it's
|
||||
* no longer needed by the parser.
|
||||
*/
|
||||
bool loadBuffer(const byte *buffer, uint32 size, bool disposable = false);
|
||||
bool loadBuffer(const byte *buffer, uint32 size, DisposeAfterUse::Flag disposable = DisposeAfterUse::NO);
|
||||
|
||||
bool loadStream(Common::SeekableReadStream *stream);
|
||||
|
||||
|
|
27
config.guess
vendored
27
config.guess
vendored
|
@ -4,7 +4,7 @@
|
|||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2009-09-18'
|
||||
timestamp='2009-12-13'
|
||||
|
||||
# This file is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
|
@ -57,7 +57,7 @@ GNU config.guess ($timestamp)
|
|||
|
||||
Originally written by Per Bothner.
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
|
@ -333,6 +333,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
|||
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
|
||||
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit ;;
|
||||
i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
|
||||
echo i386-pc-auroraux${UNAME_RELEASE}
|
||||
exit ;;
|
||||
i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
|
||||
eval $set_cc_for_build
|
||||
SUN_ARCH="i386"
|
||||
|
@ -807,12 +810,12 @@ EOF
|
|||
i*:PW*:*)
|
||||
echo ${UNAME_MACHINE}-pc-pw32
|
||||
exit ;;
|
||||
*:Interix*:[3456]*)
|
||||
*:Interix*:*)
|
||||
case ${UNAME_MACHINE} in
|
||||
x86)
|
||||
echo i586-pc-interix${UNAME_RELEASE}
|
||||
exit ;;
|
||||
EM64T | authenticamd | genuineintel)
|
||||
authenticamd | genuineintel | EM64T)
|
||||
echo x86_64-unknown-interix${UNAME_RELEASE}
|
||||
exit ;;
|
||||
IA64)
|
||||
|
@ -891,7 +894,15 @@ EOF
|
|||
echo frv-unknown-linux-gnu
|
||||
exit ;;
|
||||
i*86:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-linux-gnu
|
||||
LIBC=gnu
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#ifdef __dietlibc__
|
||||
LIBC=dietlibc
|
||||
#endif
|
||||
EOF
|
||||
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
|
||||
echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
|
||||
exit ;;
|
||||
ia64:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
|
@ -918,11 +929,7 @@ EOF
|
|||
#endif
|
||||
#endif
|
||||
EOF
|
||||
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
|
||||
/^CPU/{
|
||||
s: ::g
|
||||
p
|
||||
}'`"
|
||||
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
|
||||
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
|
||||
;;
|
||||
or32:Linux:*:*)
|
||||
|
|
20
config.sub
vendored
20
config.sub
vendored
|
@ -4,7 +4,7 @@
|
|||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2009-08-19'
|
||||
timestamp='2009-12-13'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
|
@ -76,7 +76,7 @@ version="\
|
|||
GNU config.sub ($timestamp)
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
|
@ -287,6 +287,7 @@ case $basic_machine in
|
|||
| pdp10 | pdp11 | pj | pjl \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
||||
| pyramid \
|
||||
| rx \
|
||||
| score \
|
||||
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| sh64 | sh64le \
|
||||
|
@ -294,13 +295,14 @@ case $basic_machine in
|
|||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
||||
| spu | strongarm \
|
||||
| tahoe | thumb | tic4x | tic80 | tron \
|
||||
| ubicom32 \
|
||||
| v850 | v850e \
|
||||
| we32k \
|
||||
| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
|
||||
| z8k | z80)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12)
|
||||
m6811 | m68hc11 | m6812 | m68hc12 | picochip)
|
||||
# Motorola 68HC11/12.
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
|
@ -371,7 +373,7 @@ case $basic_machine in
|
|||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
||||
| pyramid-* \
|
||||
| romp-* | rs6000-* \
|
||||
| romp-* | rs6000-* | rx-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
||||
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
||||
|
@ -380,6 +382,7 @@ case $basic_machine in
|
|||
| tahoe-* | thumb-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
|
||||
| tron-* \
|
||||
| ubicom32-* \
|
||||
| v850-* | v850e-* | vax-* \
|
||||
| we32k-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
|
||||
|
@ -1253,6 +1256,9 @@ case $os in
|
|||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# -solaris* is a basic system type, with this one exception.
|
||||
-auroraux)
|
||||
os=-auroraux
|
||||
;;
|
||||
-solaris1 | -solaris1.*)
|
||||
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||
;;
|
||||
|
@ -1274,8 +1280,8 @@ case $os in
|
|||
# -sysv* is not here because it comes later, after sysvr4.
|
||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||
| -kopensolaris* \
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
|
||||
| -sym* | -kopensolaris* \
|
||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||
| -aos* | -aros* \
|
||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||
|
@ -1296,7 +1302,7 @@ case $os in
|
|||
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
||||
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
|
||||
# Remember, each alternative MUST END IN *, to match a version number.
|
||||
;;
|
||||
-qnx*)
|
||||
|
|
479
configure
vendored
479
configure
vendored
|
@ -86,6 +86,13 @@ _vorbis=auto
|
|||
_tremor=auto
|
||||
_flac=auto
|
||||
_mad=auto
|
||||
_alsa=auto
|
||||
_fluidsynth=auto
|
||||
# Default option behaviour yes/no
|
||||
_debug_build=auto
|
||||
_release_build=auto
|
||||
_text_console=no
|
||||
_mt32emu=yes
|
||||
# Default vkeybd/keymapper options
|
||||
_vkeybd=no
|
||||
_keymapper=no
|
||||
|
@ -198,7 +205,7 @@ add_to_config_mk_if_no() {
|
|||
#
|
||||
# Determine sdl-config
|
||||
#
|
||||
# TODO: small bit of code to test sdl useability
|
||||
# TODO: small bit of code to test sdl usability
|
||||
find_sdlconfig() {
|
||||
echo_n "Looking for sdl-config... "
|
||||
sdlconfigs="$_sdlconfig:sdl-config:sdl11-config:sdl12-config"
|
||||
|
@ -248,7 +255,7 @@ get_system_exe_extension() {
|
|||
gp2x-linux)
|
||||
_exeext=".gp2x"
|
||||
;;
|
||||
dreamcast | wii | gamecube | nds | psp)
|
||||
dreamcast | wii | gamecube | nds | psp | ps2)
|
||||
_exeext=".elf"
|
||||
;;
|
||||
*)
|
||||
|
@ -504,7 +511,7 @@ Usage: $0 [OPTIONS]...
|
|||
|
||||
Configuration:
|
||||
-h, --help display this help and exit
|
||||
--backend=BACKEND backend to build (sdl, dc, gp2x, gp2xwiz, iphone, morphos, nds, psp, wii, wince, linuxmoto, null) [sdl]
|
||||
--backend=BACKEND backend to build (sdl, dc, gp2x, gp2xwiz, iphone, morphos, nds, psp, ps2, wii, wince, linuxmoto, null) [sdl]
|
||||
|
||||
Installation directories:
|
||||
--prefix=DIR use this prefix for installing Residual [/usr/local]
|
||||
|
@ -518,11 +525,12 @@ Special configuration feature:
|
|||
special targets: linupy for Yopy PDA
|
||||
dreamcast for Sega Dreamcast
|
||||
wii for Nintendo Wii
|
||||
gamecube for Nintendo Gamecube
|
||||
gamecube for Nintendo GameCube
|
||||
nds for Nintendo DS
|
||||
iphone for Apple iPhone
|
||||
wince for Windows CE
|
||||
psp for PlayStation Portable
|
||||
ps2 for PlayStation 2
|
||||
|
||||
Game engines:
|
||||
--enable-all-engines enable all engines
|
||||
|
@ -533,11 +541,16 @@ Optional Features:
|
|||
--enable-Werror treat warnings as errors
|
||||
--enable-plugins enable the support for dynamic plugins
|
||||
--default-dynamic make plugins dynamic by default
|
||||
--disable-mt32emu don't enable the integrated MT-32 emulator
|
||||
--enable-profiling enable building with gprof profile information
|
||||
--enable-release set flags to build release binary
|
||||
--enable-text-console use text console instead of graphical console
|
||||
--enable-verbose-build enable regular echoing of commands during build process
|
||||
|
||||
Optional Libraries:
|
||||
--with-alsa-prefix=DIR Prefix where alsa is installed (optional)
|
||||
--disable-alsa disable ALSA midi sound support [autodetect]
|
||||
|
||||
--with-ogg-prefix=DIR Prefix where libogg is installed (optional)
|
||||
--with-vorbis-prefix=DIR Prefix where libvorbis is installed (optional)
|
||||
--disable-vorbis disable Ogg Vorbis support [autodetect]
|
||||
|
@ -552,6 +565,8 @@ Optional Libraries:
|
|||
--disable-flac disable FLAC support [autodetect]
|
||||
|
||||
--with-zlib-prefix=DIR Prefix where zlib is installed (optional)
|
||||
--with-fluidsynth-prefix=DIR Prefix where libfluidsynth is installed (optional)
|
||||
--disable-fluidsynth disable fluidsynth MIDI driver [autodetect]
|
||||
|
||||
--with-sdl-prefix=DIR Prefix where the sdl-config script is installed (optional)
|
||||
|
||||
|
@ -574,6 +589,8 @@ DEBFLAGS="-g"
|
|||
|
||||
for ac_option in $@; do
|
||||
case "$ac_option" in
|
||||
--enable-alsa) _alsa=yes ;;
|
||||
--disable-alsa) _alsa=no ;;
|
||||
--enable-vorbis) _vorbis=yes ;;
|
||||
--disable-vorbis) _vorbis=no ;;
|
||||
--enable-tremor) _tremor=yes ;;
|
||||
|
@ -583,13 +600,28 @@ for ac_option in $@; do
|
|||
--enable-mad) _mad=yes ;;
|
||||
--disable-mad) _mad=no ;;
|
||||
|
||||
--disable-fluidsynth) _fluidsynth=no ;;
|
||||
--enable-verbose-build) _verbose_build=yes ;;
|
||||
--enable-plugins) _dynamic_modules=yes ;;
|
||||
--default-dynamic) _plugins_default=dynamic ;;
|
||||
--enable-mt32emu) _mt32emu=yes ;;
|
||||
--disable-mt32emu) _mt32emu=no ;;
|
||||
--enable-vkeybd) _vkeybd=yes ;;
|
||||
--disable-vkeybd) _vkeybd=no ;;
|
||||
--enable-keymapper) _keymapper=yes ;;
|
||||
--disable-keymapper) _keymapper=no ;;
|
||||
--enable-text-console) _text_console=yes ;;
|
||||
--disable-text-console) _text_console=no ;;
|
||||
--with-fluidsynth-prefix=*)
|
||||
arg=`echo $ac_option | cut -d '=' -f 2`
|
||||
FLUIDSYNTH_CFLAGS="-I$arg/include"
|
||||
FLUIDSYNTH_LIBS="-L$arg/lib"
|
||||
;;
|
||||
--with-alsa-prefix=*)
|
||||
arg=`echo $ac_option | cut -d '=' -f 2`
|
||||
ALSA_CFLAGS="-I$arg/include"
|
||||
ALSA_LIBS="-L$arg/lib"
|
||||
;;
|
||||
--with-ogg-prefix=*)
|
||||
arg=`echo $ac_option | cut -d '=' -f 2`
|
||||
OGG_CFLAGS="-I$arg/include"
|
||||
|
@ -703,6 +735,11 @@ motomagx)
|
|||
_host_cpu=arm
|
||||
_host_alias=arm-linux-gnueabi
|
||||
;;
|
||||
samsungtv)
|
||||
_host_os=linux
|
||||
_host_cpu=arm
|
||||
_host_alias=arm-linux-gnueabi
|
||||
;;
|
||||
arm-riscos)
|
||||
_host_os=riscos
|
||||
_host_cpu=arm
|
||||
|
@ -765,8 +802,29 @@ psp)
|
|||
_host_os=psp
|
||||
_host_cpu=mipsallegrexel
|
||||
_host_alias=psp
|
||||
if test -z "$PSPDEV"; then
|
||||
PSPDEV=$(psp-config --pspdev-path)
|
||||
fi
|
||||
if test -d "$PSPDEV/psp/lib"; then
|
||||
LDFLAGS="$LDFLAGS -L$PSPDEV/psp/lib"
|
||||
fi
|
||||
LDFLAGS="$LDFLAGS -L$PSPDEV/psp/sdk/lib -specs=$_srcdir/backends/platform/psp/psp.spec"
|
||||
;;
|
||||
ps2)
|
||||
_host_os=ps2
|
||||
_host_cpu=mips64r5900el
|
||||
_host_alias=ee
|
||||
if test "$_debug_build" = auto; then
|
||||
# Disable debug mode by default. The resulting binaries are far too big in general,
|
||||
# and one has to disable multiple engines to make it usable.
|
||||
_debug_build=no
|
||||
fi
|
||||
|
||||
if test "$_release_build" = auto; then
|
||||
# Enable release build by default.
|
||||
_release_build=yes
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if test -n "$_host"; then
|
||||
guessed_host=`$_srcdir/config.sub $_host`
|
||||
|
@ -824,8 +882,15 @@ wii | gamecube | nds)
|
|||
fi
|
||||
;;
|
||||
psp)
|
||||
if test -z "$PSPDEV"; then
|
||||
echo "Please set PSPDEV in your environment. export PSPDEV=<path to psp toolchain>"
|
||||
PSPSDK=$(psp-config --pspsdk-path)
|
||||
if test -z "$PSPSDK"; then
|
||||
echo "Please set the path to PSPSDK in your environment."
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
ps2)
|
||||
if test -z "$PS2SDK"; then
|
||||
echo "Please set PS2SDK in your environment. export PS2SDK=<path to ps2 sdk>"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
@ -849,7 +914,7 @@ EOF
|
|||
|
||||
if test -n "$_host"; then
|
||||
# In cross-compiling mode, we cannot run the result
|
||||
eval "$1 $CXXFLAGS $LDFLAGS -o tmp_cxx_compiler$HOSTEXEEXT tmp_cxx_compiler.cpp" 2> /dev/null && rm -f tmp_cxx_compiler$HOSTEXEEXT tmp_cxx_compiler.cpp
|
||||
eval "$1 $CXXFLAGS $LDFLAGS -o tmp_cxx_compiler$HOSTEXEEXT -c tmp_cxx_compiler.cpp" 2> /dev/null && rm -f tmp_cxx_compiler$HOSTEXEEXT tmp_cxx_compiler.cpp
|
||||
else
|
||||
eval "$1 $CXXFLAGS $LDFLAGS -o tmp_cxx_compiler$HOSTEXEEXT tmp_cxx_compiler.cpp" 2> /dev/null && eval "./tmp_cxx_compiler$HOSTEXEEXT 2> /dev/null" && rm -rf tmp_cxx_compiler$HOSTEXEEXT tmp_cxx_compiler.dSYM tmp_cxx_compiler.cpp
|
||||
fi
|
||||
|
@ -882,6 +947,9 @@ if test -z "$CXX"; then
|
|||
exit 1
|
||||
fi
|
||||
|
||||
# By default, use the C++ compiler as linker
|
||||
LD=$CXX
|
||||
|
||||
#
|
||||
# Determine the compiler version
|
||||
#
|
||||
|
@ -1096,9 +1164,19 @@ echo "$_have_x86"
|
|||
echo_n "Checking hosttype... "
|
||||
echo $_host_os
|
||||
case $_host_os in
|
||||
linux* | uclinux* | openbsd* | netbsd* | bsd* | sunos* | hpux*)
|
||||
linux* | uclinux*)
|
||||
# When not cross-compiling, enable large file support, but don't
|
||||
# care if getconf doesn't exist or doesn't recognize LFS_CFLAGS.
|
||||
if test -z "$_host"; then
|
||||
CXXFLAGS="$CXXFLAGS $(getconf LFS_CFLAGS 2>/dev/null)"
|
||||
fi
|
||||
DEFINES="$DEFINES -DUNIX -DUSE_OPENGL"
|
||||
LIBS="$LIBS -lGL -lGLU -L/usr/X11/lib"
|
||||
;;
|
||||
openbsd* | netbsd* | bsd* | sunos* | hpux*)
|
||||
DEFINES="$DEFINES -DUNIX -DUSE_OPENGL"
|
||||
LIBS="$LIBS -lGL -lGLU -L/usr/X11/lib"
|
||||
|
||||
;;
|
||||
freebsd*)
|
||||
DEFINES="$DEFINES -DUNIX -DUSE_OPENGL"
|
||||
|
@ -1108,42 +1186,46 @@ case $_host_os in
|
|||
;;
|
||||
beos*)
|
||||
DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE"
|
||||
# Needs -lbind -lsocket for the timidity MIDI driver
|
||||
LDFLAGS="-L/boot/home/config/lib"
|
||||
CFLAGS="-I/boot/home/config/include"
|
||||
CXXFLAGS="$CXXFLAGS -fhuge-objects"
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='long'
|
||||
LIBS="$LIBS -lbind -lsocket"
|
||||
# FIXME: Please document why 'long' has to be used instead of int
|
||||
#type_4_byte='long'
|
||||
;;
|
||||
haiku*)
|
||||
DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE"
|
||||
# Needs -lnetwork for the timidity MIDI driver
|
||||
LIBS="$LIBS -lnetwork"
|
||||
CXXFLAGS="$CXXFLAGS -fhuge-objects"
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='long'
|
||||
# FIXME: Please document why 'long' has to be used instead of int
|
||||
#type_4_byte='long'
|
||||
;;
|
||||
solaris*)
|
||||
DEFINES="$DEFINES -DUNIX -DSOLARIS -DSYSTEM_NOT_SUPPORTING_D_TYPE"
|
||||
LIBS="$LIBS -lnsl"
|
||||
# Needs -lbind -lsocket for the timidity MIDI driver
|
||||
LIBS="$LIBS -lnsl -lsocket"
|
||||
;;
|
||||
irix*)
|
||||
DEFINES="$DEFINES -DUNIX -DIRIX -DSYSTEM_NOT_SUPPORTING_D_TYPE"
|
||||
LIBS="$LIBS -lmd"
|
||||
LIBS="$LIBS -lmd -lfastm -lm"
|
||||
_ranlib=:
|
||||
;;
|
||||
darwin*)
|
||||
DEFINES="$DEFINES -DUNIX -DMACOSX -DUSE_OPENGL"
|
||||
LIBS="$LIBS -framework QuickTime -framework AudioUnit -framework AudioToolbox -framework Carbon -framework OpenGL \
|
||||
LIBS="$LIBS -framework QuickTime -framework AudioUnit -framework AudioToolbox -framework Carbon -framework CoreMIDI -framework OpenGL \
|
||||
-dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib"
|
||||
add_line_to_config_mk 'MACOSX = 1'
|
||||
;;
|
||||
mingw*)
|
||||
DEFINES="$DEFINES -DWIN32 -D__USE_MINGW_ANSI_STDIO=0 -DUSE_OPENGL"
|
||||
LIBS="$LIBS -lmingw32 -lopengl32 -lglu32"
|
||||
LIBS="$LIBS -lmingw32 -lwinmm -lopengl32 -lglu32"
|
||||
OBJS="$OBJS residualico.o"
|
||||
;;
|
||||
cygwin*)
|
||||
echo ERROR: Cygwin building is not supported by ScummVM anymore. Consider using MinGW.
|
||||
exit 0
|
||||
exit 1
|
||||
;;
|
||||
os2-emx*)
|
||||
DEFINES="$DEFINES -DUNIX"
|
||||
|
@ -1156,8 +1238,8 @@ case $_host_os in
|
|||
CXXFLAGS="$CXXFLAGS -mcrt=newlib -mstrict-align -mcpu=750 -mtune=7400"
|
||||
LDFLAGS="$LDFLAGS -mcrt=newlib -use-dynld -Lsobjs:"
|
||||
LIBS="$LIBS -lGL -lGLU"
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
# We have to use 'long' for our 4 byte typedef because AmigaOS already typedefs (u)int32
|
||||
# as (unsigned) long, and consequently we'd get a compiler error otherwise.
|
||||
type_4_byte='long'
|
||||
;;
|
||||
dreamcast)
|
||||
|
@ -1177,13 +1259,20 @@ case $_host_os in
|
|||
;;
|
||||
nds)
|
||||
# TODO nds
|
||||
DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT"
|
||||
;;
|
||||
psp)
|
||||
CXXFLAGS="$CXXFLAGS -O3 -G0 -I$PSPDEV/psp/sdk/include -D_PSP_FW_VERSION=150"
|
||||
CXXFLAGS="$CXXFLAGS -O3 -I$PSPSDK/include -D_PSP_FW_VERSION=150"
|
||||
;;
|
||||
ps2)
|
||||
# TODO ps2
|
||||
CXXFLAGS="$CXXFLAGS -G2"
|
||||
DEFINES="$DEFINES -D_EE -D__PLAYSTATION2__"
|
||||
;;
|
||||
wince)
|
||||
CXXFLAGS="$CXXFLAGS -O3 -march=armv4 -mtune=xscale -D_WIN32_WCE=300 -D__ARM__ -D_ARM_ -DUNICODE -DFPM_DEFAULT -DNONSTANDARD_PORT"
|
||||
CXXFLAGS="$CXXFLAGS -DWIN32 -Dcdecl= -D__cdecl__="
|
||||
CXXFLAGS="$CXXFLAGS -O3 -march=armv4 -mtune=xscale"
|
||||
DEFINES="$DEFINES -D_WIN32_WCE=300 -D__ARM__ -D_ARM_ -DUNICODE -DFPM_DEFAULT -DNONSTANDARD_PORT"
|
||||
DEFINES="$DEFINES -DWIN32 -Dcdecl= -D__cdecl__="
|
||||
;;
|
||||
# given this is a shell script assume some type of unix
|
||||
*)
|
||||
|
@ -1194,29 +1283,38 @@ esac
|
|||
|
||||
if test -n "$_host"; then
|
||||
# Cross-compiling mode - add your target here if needed
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
case "$_host" in
|
||||
linupy|arm-riscos)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
DEFINES="$DEFINES -DUNIX"
|
||||
#not true for all ARM systems, but the interesting ones are all LE. Most (if not all) BE arm devices don't have a screen
|
||||
_endian=little
|
||||
DEFINES="$DEFINES -DUNIX -DLINUPY"
|
||||
_need_memalign=yes
|
||||
;;
|
||||
arm-linux|arm*-linux-gnueabi|arm-*-linux|*-angstrom-linux)
|
||||
DEFINES="$DEFINES -DUNIX"
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
|
||||
;;
|
||||
motoezx)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
DEFINES="$DEFINES -DUNIX -DMOTOEZX"
|
||||
#not true for all ARM systems, but the interesting ones are all LE. Most (if not all) BE arm devices don't have a screen
|
||||
samsungtv)
|
||||
DEFINES="$DEFINES -DUNIX -DSAMSUNGTV -DDISABLE_COMMAND_LINE"
|
||||
ASFLAGS="$ASFLAGS -mfpu=vfp"
|
||||
HOSTEXEEXT=".so"
|
||||
_need_memalign=yes
|
||||
add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_GFX_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1'
|
||||
_backend="samsungtv"
|
||||
_mt32emu="no"
|
||||
_build_scalers="yes"
|
||||
_build_hq_scalers="yes"
|
||||
_vkeybd="yes"
|
||||
;;
|
||||
motoezx)
|
||||
DEFINES="$DEFINES -DUNIX -DMOTOEZX"
|
||||
ASFLAGS="$ASFLAGS -mfpu=vfp"
|
||||
_endian=little
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_GFX_ASM = 1'
|
||||
|
@ -1225,23 +1323,22 @@ if test -n "$_host"; then
|
|||
_backend="linuxmoto"
|
||||
_build_hq_scalers="no"
|
||||
_mt32emu="no"
|
||||
_vkeybd="yes"
|
||||
_port_mk="backends/platform/linuxmoto/linuxmoto.mk"
|
||||
;;
|
||||
motomagx)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
DEFINES="$DEFINES -DUNIX -DMOTOMAGX"
|
||||
#not true for all ARM systems, but the interesting ones are all LE. Most (if not all) BE arm devices don't have a screen
|
||||
ASFLAGS="$ASFLAGS -mfpu=vfp"
|
||||
_endian=little
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_GFX_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1'
|
||||
_backend="linuxmoto"
|
||||
_build_hq_scalers="no"
|
||||
_mt32emu="no"
|
||||
_vkeybd="yes"
|
||||
_port_mk="backends/platform/linuxmoto/linuxmoto.mk"
|
||||
;;
|
||||
bfin*)
|
||||
|
@ -1252,127 +1349,103 @@ if test -n "$_host"; then
|
|||
_strip=$_host-strip
|
||||
;;
|
||||
gp2xwiz)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
DEFINES="$DEFINES -DUNIX -DGP2XWIZ -DNDEBUG"
|
||||
CXXFLAGS="$CXXFLAGS -mcpu=arm926ej-s -mtune=arm926ej-s"
|
||||
ASFLAGS="$ASFLAGS -mfloat-abi=soft"
|
||||
LDFLAGS="$LDFLAGS"
|
||||
_endian=little
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_GFX_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1'
|
||||
_backend="gp2xwiz"
|
||||
_build_hq_scalers="no"
|
||||
_mt32emu="no"
|
||||
_vkeybd="yes"
|
||||
;;
|
||||
gp2x)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
DEFINES="$DEFINES -DUNIX -DGP2X -DNDEBUG"
|
||||
CXXFLAGS="$CXXFLAGS -march=armv4t"
|
||||
ASFLAGS="$ASFLAGS -mfloat-abi=soft"
|
||||
LDFLAGS="$LDFLAGS -static"
|
||||
_endian=little
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_GFX_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1'
|
||||
_backend="gp2x"
|
||||
_build_hq_scalers="no"
|
||||
_mt32emu="no"
|
||||
_vkeybd="yes"
|
||||
;;
|
||||
neuros)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
DEFINES="$DEFINES -DUNIX -DNEUROS"
|
||||
_endian=little
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
_backend='null'
|
||||
_build_hq_scalers="no"
|
||||
_mt32emu="no"
|
||||
;;
|
||||
ppc-amigaos)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
_endian=big
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='long'
|
||||
# FIXME: Please document why 'long' has to be used instead of int
|
||||
#type_4_byte='long'
|
||||
;;
|
||||
m68k-atari-mint)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
DEFINES="$DEFINES -DUNIX -DSYSTEM_NOT_SUPPORTING_D_TYPE"
|
||||
_endian=big
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='long'
|
||||
# FIXME: Please document why 'long' has to be used instead of int
|
||||
#type_4_byte='long'
|
||||
_ranlib=m68k-atari-mint-ranlib
|
||||
_ar="m68k-atari-mint-ar cru"
|
||||
;;
|
||||
*mingw32*)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
_endian=little
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
_sdlconfig=$_host-sdl-config
|
||||
_windres=$_host-windres
|
||||
_ar="$_host-ar cru"
|
||||
_ranlib=$_host-ranlib
|
||||
;;
|
||||
iphone)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
DEFINES="$DEFINES -DIPHONE -DUNIX"
|
||||
_endian=little
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
|
||||
_backend="iphone"
|
||||
_build_hq_scalers="no"
|
||||
;;
|
||||
wince)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
LDFLAGS="$LDFLAGS -Wl,-Map,scummvm.exe.map -Wl,--stack,65536"
|
||||
_endian=little
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
add_line_to_config_mk 'USE_TREMOLO = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_GFX_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_COSTUME_ASM = 1'
|
||||
add_line_to_config_mk 'USE_ARM_SCALER_ASM = 1'
|
||||
_backend="wince"
|
||||
_mt32emu="no"
|
||||
_port_mk="backends/platform/wince/wince.mk"
|
||||
;;
|
||||
dreamcast)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE"
|
||||
CXXFLAGS="$CXXFLAGS -O3 -funroll-loops -fschedule-insns2 -fomit-frame-pointer -fdelete-null-pointer-checks"
|
||||
_endian=little
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
_backend="dc"
|
||||
_build_scalers="no"
|
||||
_build_hq_scalers="no"
|
||||
_mad="yes"
|
||||
_zlib="yes"
|
||||
add_line_to_config_mk 'include $(srcdir)/backends/platform/dc/dreamcast.mk'
|
||||
;;
|
||||
wii)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
_endian=big
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
_backend="wii"
|
||||
_build_scalers="no"
|
||||
_build_hq_scalers="no"
|
||||
_port_mk="backends/platform/wii/wii.mk"
|
||||
add_line_to_config_mk 'GAMECUBE = 0'
|
||||
add_line_to_config_h "#define DEBUG_WII_USBGECKO"
|
||||
|
@ -1383,13 +1456,12 @@ if test -n "$_host"; then
|
|||
add_line_to_config_h "#define USE_WII_KBD"
|
||||
;;
|
||||
gamecube)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
_endian=big
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
_backend="wii"
|
||||
_build_scalers="no"
|
||||
_build_hq_scalers="no"
|
||||
_mt32emu="no"
|
||||
_port_mk="backends/platform/wii/wii.mk"
|
||||
add_line_to_config_mk 'GAMECUBE = 1'
|
||||
add_line_to_config_h '#define GAMECUBE'
|
||||
|
@ -1398,19 +1470,13 @@ if test -n "$_host"; then
|
|||
add_line_to_config_h "/* #define DEBUG_WII_GDB */"
|
||||
;;
|
||||
nds)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
# TODO: complete this
|
||||
# TODO: Maybe rename nds -> ds (would be more consistent with other backends)
|
||||
DEFINES="$DEFINES -D__DS__ -DNDS -DARM9 -DARM -DNONSTANDARD_PORT"
|
||||
DEFINES="$DEFINES -DDISABLE_FANCY_THEMES -DVECTOR_RENDERER_FORMAT=1555"
|
||||
DEFINES="$DEFINES -DDISABLE_DEFAULT_SAVEFILEMANAGER"
|
||||
DEFINES="$DEFINES -DREDUCE_MEMORY_USAGE"
|
||||
DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE"
|
||||
_endian=little
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
_backend="nds"
|
||||
_build_hq_scalers="no"
|
||||
_mt32emu="no"
|
||||
|
@ -1420,17 +1486,45 @@ if test -n "$_host"; then
|
|||
add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
|
||||
;;
|
||||
psp)
|
||||
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
|
||||
_endian=little
|
||||
_need_memalign=yes
|
||||
type_1_byte='char'
|
||||
type_2_byte='short'
|
||||
type_4_byte='int'
|
||||
_backend="psp"
|
||||
_build_scalers="no"
|
||||
_build_hq_scalers="no"
|
||||
_mt32emu="no"
|
||||
_port_mk="backends/platform/psp/psp.mk"
|
||||
;;
|
||||
ps2)
|
||||
# TODO: complete this
|
||||
DEFINES="$DEFINES -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL"
|
||||
_need_memalign=yes
|
||||
_backend="ps2"
|
||||
_build_scalers="no"
|
||||
_build_hq_scalers="no"
|
||||
_mt32emu="no"
|
||||
# HACK to enable mad & zlib (they are not properly detected due to linker issues).
|
||||
# This trick doesn't work for tremor right now, as the PS2 port the resulting library
|
||||
# libtremor, while our code later on expects it to be called libvorbisidec.
|
||||
# TODO: Enable tremor, e.g. by adding -ltremor or by renaming the lib.
|
||||
_mad="yes"
|
||||
_zlib="yes"
|
||||
# HACK to fix compilation of C source files for now.
|
||||
add_line_to_config_mk 'CC = ee-gcc'
|
||||
# HACK to fix linking for now. It seems ee-g++ does not handle linking correctly.
|
||||
LD=ee-gcc
|
||||
|
||||
if test "$_debug_build" = yes; then
|
||||
# TODO: Setup debug build properly
|
||||
DEFINES="$DEFINES -D__PS2_DEBUG__"
|
||||
#INCLUDES="$INCLUDES -I$(PS2GDB)/ee"
|
||||
#LDFLAGS="$LDFLAGS -L$(PS2GDB)/lib"
|
||||
LDFLAGS="$LDFLAGS -lps2gdbStub -lps2ip -ldebug"
|
||||
else
|
||||
# If not building for debug mode, strip binaries.
|
||||
CXXFLAGS="$CXXFLAGS -s"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo "Continuing with auto-detected values ... if you have problems, please add your target to configure."
|
||||
echo "WARNING: Unknown target, continuing with auto-detected values"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
@ -1621,6 +1715,23 @@ CXXFLAGS += -DDYNAMIC_MODULES
|
|||
PLUGIN_LDFLAGS = -ml -m4-single-only -nostartfiles -Wl,-q,-T$(srcdir)/backends/platform/dc/plugin.x,--just-symbols,$(EXECUTABLE),--retain-symbols-file,$(srcdir)/backends/platform/dc/plugin.syms -L$(ronindir)/lib
|
||||
PRE_OBJS_FLAGS := -Wl,--whole-archive
|
||||
POST_OBJS_FLAGS := -Wl,--no-whole-archive
|
||||
'
|
||||
;;
|
||||
psp)
|
||||
_def_plugin='
|
||||
#define PLUGIN_PREFIX ""
|
||||
#define PLUGIN_SUFFIX ".plg"
|
||||
'
|
||||
_mak_plugins='
|
||||
DYNAMIC_MODULES := 1
|
||||
PLUGIN_PREFIX :=
|
||||
PLUGIN_SUFFIX := .plg
|
||||
PLUGIN_EXTRA_DEPS = $(EXECUTABLE)
|
||||
CXXFLAGS += -DDYNAMIC_MODULES
|
||||
LDFLAGS += -Wl,-T$(srcdir)/backends/platform/psp/main_prog.ld
|
||||
PLUGIN_LDFLAGS = -nostartfiles -Wl,-q,--just-symbols,$(EXECUTABLE),--retain-symbols-file,$(srcdir)/backends/platform/psp/plugin.syms,-T$(srcdir)/backends/platform/psp/plugin.ld -lstdc++ -lc -lm
|
||||
PRE_OBJS_FLAGS := -Wl,--whole-archive
|
||||
POST_OBJS_FLAGS := -Wl,--no-whole-archive
|
||||
'
|
||||
;;
|
||||
*)
|
||||
|
@ -1633,6 +1744,16 @@ POST_OBJS_FLAGS := -Wl,--no-whole-archive
|
|||
fi
|
||||
|
||||
|
||||
#
|
||||
# Check whether integrated MT-32 emulator support is requested
|
||||
#
|
||||
if test "$_mt32emu" = no ; then
|
||||
_def_mt32emu='#undef USE_MT32EMU'
|
||||
else
|
||||
_def_mt32emu='#define USE_MT32EMU'
|
||||
fi
|
||||
add_to_config_mk_if_yes "$_mt32emu" 'USE_MT32EMU = 1'
|
||||
|
||||
#
|
||||
# Check for math lib
|
||||
#
|
||||
|
@ -1745,6 +1866,27 @@ fi
|
|||
add_to_config_mk_if_yes "$_mad" 'USE_MAD = 1'
|
||||
echo "$_mad"
|
||||
|
||||
#
|
||||
# Check for ALSA
|
||||
#
|
||||
echocheck "ALSA >= 0.9"
|
||||
if test "$_alsa" = auto ; then
|
||||
_alsa=no
|
||||
cat > $TMPC << EOF
|
||||
#include <alsa/asoundlib.h>
|
||||
int main(void) { return (!(SND_LIB_MAJOR==0 && SND_LIB_MINOR==9)); }
|
||||
EOF
|
||||
cc_check $LDFLAGS $CXXFLAGS $ALSA_CFLAGS $ALSA_LIBS -lasound && _alsa=yes
|
||||
fi
|
||||
if test "$_alsa" = yes ; then
|
||||
_def_alsa='#define USE_ALSA'
|
||||
LIBS="$LIBS $ALSA_LIBS -lasound"
|
||||
INCLUDES="$INCLUDES $ALSA_CFLAGS"
|
||||
else
|
||||
_def_alsa='#undef USE_ALSA'
|
||||
fi
|
||||
echo "$_alsa"
|
||||
|
||||
#
|
||||
# Check for ZLib
|
||||
#
|
||||
|
@ -1771,6 +1913,78 @@ fi
|
|||
add_to_config_mk_if_yes "$_zlib" 'USE_ZLIB = 1'
|
||||
echo "$_zlib"
|
||||
|
||||
#
|
||||
# Check for libfluidsynth
|
||||
#
|
||||
echocheck "libfluidsynth"
|
||||
if test "$_fluidsynth" = auto ; then
|
||||
_fluidsynth=no
|
||||
cat > $TMPC << EOF
|
||||
#include <fluidsynth.h>
|
||||
int main(void) { return 0; }
|
||||
EOF
|
||||
cc_check $LDFLAGS $CXXFLAGS $FLUIDSYNTH_CFLAGS $FLUIDSYNTH_LIBS -lfluidsynth && _fluidsynth=yes
|
||||
fi
|
||||
if test "$_fluidsynth" = yes ; then
|
||||
_def_fluidsynth='#define USE_FLUIDSYNTH'
|
||||
case $_host_os in
|
||||
mingw*)
|
||||
LIBS="$LIBS $FLUIDSYNTH_LIBS -lfluidsynth -ldsound -lwinmm"
|
||||
;;
|
||||
*)
|
||||
LIBS="$LIBS $FLUIDSYNTH_LIBS -lfluidsynth"
|
||||
;;
|
||||
esac
|
||||
INCLUDES="$INCLUDES $FLUIDSYNTH_CFLAGS"
|
||||
else
|
||||
_def_fluidsynth='#undef USE_FLUIDSYNTH'
|
||||
fi
|
||||
echo "$_fluidsynth"
|
||||
rm -rf $TMPC $TMPO$HOSTEXEEXT $TMPO.dSYM
|
||||
|
||||
#
|
||||
# Check for readline if text_console is enabled
|
||||
#
|
||||
echocheck "readline"
|
||||
if test "$_text_console" = yes ; then
|
||||
_READLINE_LIBS="-lreadline"
|
||||
if test "$_readline" = auto ; then
|
||||
_readline=no
|
||||
cat > $TMPC << EOF
|
||||
#include <stdio.h>
|
||||
#include <readline/readline.h>
|
||||
#include <readline/history.h>
|
||||
|
||||
int main(void) {
|
||||
char *x = readline("");
|
||||
}
|
||||
EOF
|
||||
cc_check $LDFLAGS $CXXFLAGS $READLINE_CFLAGS $READLINE_LIBS $_READLINE_LIBS && _readline=yes
|
||||
if test "$_readline" = no ; then
|
||||
_READLINE_LIBS="-lreadline -ltermcap"
|
||||
cc_check $LDFLAGS $CXXFLAGS $READLINE_CFLAGS $READLINE_LIBS $_READLINE_LIBS && _readline=yes
|
||||
fi
|
||||
fi
|
||||
echo "$_readline"
|
||||
rm -rf $TMPC $TMPO$HOSTEXEEXT $TMPO.dSYM
|
||||
else
|
||||
_readline=no
|
||||
echo "skipping (text console disabled)"
|
||||
fi
|
||||
|
||||
if test "$_readline" = yes ; then
|
||||
_def_readline='#define USE_READLINE'
|
||||
LIBS="$LIBS $READLINE_LIBS $_READLINE_LIBS"
|
||||
INCLUDES="$INCLUDES $READLINE_CFLAGS"
|
||||
else
|
||||
_def_readline='#undef USE_READLINE'
|
||||
fi
|
||||
|
||||
if test "$_text_console" = yes ; then
|
||||
_def_text_console='#define USE_TEXT_CONSOLE'
|
||||
else
|
||||
_def_text_console='#undef USE_TEXT_CONSOLE'
|
||||
fi
|
||||
|
||||
rm -rf $TMPC $TMPO$EXEEXT $TMPO.dSYM
|
||||
|
||||
|
@ -1799,6 +2013,14 @@ DEFINES="$DEFINES -DPLUGIN_DIRECTORY=\\\"$_libdir/residual\\\""
|
|||
echo_n "Backend... "
|
||||
echo_n "$_backend"
|
||||
echo
|
||||
if test "$_mt32emu" = yes ; then
|
||||
echo_n ", MT-32 emu"
|
||||
fi
|
||||
|
||||
if test "$_text_console" = yes ; then
|
||||
echo_n ", text console"
|
||||
fi
|
||||
|
||||
if test "$_vkeybd" = yes ; then
|
||||
echo_n ", virtual keyboard"
|
||||
fi
|
||||
|
@ -1825,6 +2047,15 @@ case $_backend in
|
|||
LIBS="$LIBS `$_sdlconfig --prefix="$_sdlpath" --libs`"
|
||||
DEFINES="$DEFINES -DSDL_BACKEND -DLINUXMOTO"
|
||||
;;
|
||||
samsungtv)
|
||||
_sdlconfig="arm-linux-gnueabi-sdl-config"
|
||||
find_sdlconfig
|
||||
INCLUDES="$INCLUDES `$_sdlconfig --cflags`"
|
||||
LIBS="$LIBS `$_sdlconfig --libs`"
|
||||
DEFINES="$DEFINES -DSDL_BACKEND -DSAMSUNGTV"
|
||||
LDFLAGS="$LDFLAGS -shared -fpic -Wl,-whole-archive"
|
||||
MODULES="$MODULES backends/platform/sdl"
|
||||
;;
|
||||
gp2x)
|
||||
find_sdlconfig
|
||||
INCLUDES="$INCLUDES `$_sdlconfig --prefix="$_sdlpath" --cflags`"
|
||||
|
@ -1869,7 +2100,21 @@ case $_backend in
|
|||
psp)
|
||||
DEFINES="$DEFINES -D__PSP__ -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DDISABLE_DOSBOX_OPL"
|
||||
INCLUDES="$INCLUDES -I$PSPDEV/psp/include/SDL"
|
||||
LIBS="$LIBS -lSDL"
|
||||
LIBS="$LIBS -lpng -lSDL -Wl,-Map,mapfile.txt"
|
||||
SDLLIBS=$($PSPDEV/psp/bin/sdl-config --libs)
|
||||
|
||||
if `echo "$SDLLIBS" | grep ".*-lGL.*" 1>/dev/null 2>&1`
|
||||
then
|
||||
LIBS="$LIBS -lGL"
|
||||
fi
|
||||
;;
|
||||
ps2)
|
||||
# TODO ps2
|
||||
DEFINES="$DEFINES -D_EE -DFORCE_RTL"
|
||||
INCLUDES="$INCLUDES -I$PS2SDK/ee/include -I$PS2SDK/common/include -I$PS2SDK/ports/include"
|
||||
LDFLAGS="$LDFLAGS -mno-crt0 $PS2SDK/ee/startup/crt0.o -T $PS2SDK/ee/startup/linkfile"
|
||||
LDFLAGS="$LDFLAGS -L$PS2SDK/ee/lib -L$PS2SDK/ports/lib"
|
||||
LIBS="$LIBS -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lm -lc -lfileXio -lkernel -lstdc++ "
|
||||
;;
|
||||
*)
|
||||
echo "support for $_backend backend not implemented in configure script yet"
|
||||
|
@ -1879,7 +2124,7 @@ esac
|
|||
MODULES="$MODULES backends/platform/$_backend"
|
||||
|
||||
#
|
||||
# Do CXXFLAGS now we know the compiler version
|
||||
# Do CXXFLAGS now that we know the compiler version
|
||||
#
|
||||
if test "$have_gcc" = yes ; then
|
||||
if test "$_cxx_major" -ge "3" ; then
|
||||
|
@ -1920,6 +2165,9 @@ _engines_built_static=""
|
|||
_engines_built_dynamic=""
|
||||
_engines_skipped=""
|
||||
|
||||
echo "dynamic modules = $_dynamic_modules"
|
||||
echo "plugins default = $_plugins_default"
|
||||
|
||||
for engine in $_engines; do
|
||||
if test "`get_engine_sub $engine`" = "no" ; then
|
||||
# It's a main engine
|
||||
|
@ -2021,7 +2269,14 @@ $_def_vorbis
|
|||
$_def_tremor
|
||||
$_def_flac
|
||||
$_def_mad
|
||||
$_def_alsa
|
||||
$_def_zlib
|
||||
$_def_fluidsynth
|
||||
$_def_readline
|
||||
|
||||
/* Options */
|
||||
$_def_text_console
|
||||
$_def_mt32emu
|
||||
|
||||
/* Plugin settings */
|
||||
$_def_plugin
|
||||
|
@ -2035,6 +2290,7 @@ cat > config.mk << EOF
|
|||
|
||||
CXX := $CXX
|
||||
CXXFLAGS := $CXXFLAGS
|
||||
LD := $LD
|
||||
LIBS += $LIBS
|
||||
RANLIB := $_ranlib
|
||||
STRIP := $_strip
|
||||
|
@ -2082,7 +2338,7 @@ EOF
|
|||
# Create a custom Makefile when building outside the source tree
|
||||
# TODO: Add a better check than just looking for 'Makefile'
|
||||
#
|
||||
if test ! -f Makefile ; then
|
||||
if test ! -f Makefile.common ; then
|
||||
echo "Creating Makefile"
|
||||
|
||||
cat > Makefile << EOF
|
||||
|
@ -2092,6 +2348,7 @@ vpath %.h \$(srcdir)
|
|||
vpath %.cpp \$(srcdir)
|
||||
vpath %.c \$(srcdir)
|
||||
vpath %.m \$(srcdir)
|
||||
vpath %.mm \$(srcdir)
|
||||
vpath %.asm \$(srcdir)
|
||||
vpath %.s \$(srcdir)
|
||||
vpath %.S \$(srcdir)
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -142,15 +142,23 @@ GameDescriptor findGameID(
|
|||
|
||||
static GameDescriptor toGameDescriptor(const ADGameDescription &g, const PlainGameDescriptor *sg) {
|
||||
const char *title = 0;
|
||||
const char *extra;
|
||||
|
||||
while (sg->gameid) {
|
||||
if (!strcasecmp(g.gameid, sg->gameid))
|
||||
title = sg->description;
|
||||
sg++;
|
||||
if (g.flags & ADGF_USEEXTRAASTITLE) {
|
||||
title = g.extra;
|
||||
extra = "";
|
||||
} else {
|
||||
while (sg->gameid) {
|
||||
if (!strcasecmp(g.gameid, sg->gameid))
|
||||
title = sg->description;
|
||||
sg++;
|
||||
}
|
||||
|
||||
extra = g.extra;
|
||||
}
|
||||
|
||||
GameDescriptor gd(g.gameid, title, g.language, g.platform);
|
||||
gd.updateDesc(g.extra);
|
||||
gd.updateDesc(extra);
|
||||
return gd;
|
||||
}
|
||||
|
||||
|
@ -370,17 +378,19 @@ static ADGameDescList detectGame(const Common::FSList &fslist, const ADParams &p
|
|||
debug(3, "+ %s", fname.c_str());
|
||||
|
||||
SizeMD5 tmp;
|
||||
if (!md5_file_string(allFiles[fname], tmp.md5, params.md5Bytes))
|
||||
Common::File testFile;
|
||||
|
||||
if (testFile.open(allFiles[fname])) {
|
||||
tmp.size = (int32)testFile.size();
|
||||
if (!md5_file_string(testFile, tmp.md5, params.md5Bytes))
|
||||
tmp.md5[0] = 0;
|
||||
} else {
|
||||
tmp.size = -1;
|
||||
tmp.md5[0] = 0;
|
||||
}
|
||||
|
||||
debug(3, "> '%s': '%s'", fname.c_str(), tmp.md5);
|
||||
|
||||
Common::File testFile;
|
||||
if (testFile.open(allFiles[fname]))
|
||||
tmp.size = (int32)testFile.size();
|
||||
else
|
||||
tmp.size = -1;
|
||||
|
||||
filesSizeMD5[fname] = tmp;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,11 +43,12 @@ struct ADGameFileDescription {
|
|||
|
||||
enum ADGameFlags {
|
||||
ADGF_NO_FLAGS = 0,
|
||||
ADGF_USEEXTRAASTITLE = (1 << 26), // Extra field value will be used as main game title, not gameid
|
||||
ADGF_KEEPMATCH = (1 << 27), // this entry is kept even when there are matched
|
||||
// entries with more files
|
||||
ADGF_DROPLANGUAGE = (1 << 28), // don't add language to gameid
|
||||
ADGF_CD = (1 << 29), // add "-cd" to gameid
|
||||
ADGF_DEMO = (1 << 30) // add "-demo" to gameid
|
||||
ADGF_CD = (1 << 29), // add "-cd" to gameid
|
||||
ADGF_DEMO = (1 << 30) // add "-demo" to gameid
|
||||
};
|
||||
|
||||
struct ADGameDescription {
|
||||
|
@ -102,7 +103,16 @@ enum ADFlags {
|
|||
* not equal to english) and platform (if not equal to PC).
|
||||
*/
|
||||
kADFlagDontAugmentPreferredTarget = (1 << 0),
|
||||
/**
|
||||
* Warn user about new variant if his version was detected with fallback
|
||||
*/
|
||||
kADFlagPrintWarningOnFileBasedFallback = (1 << 1),
|
||||
/**
|
||||
* Store value of extra field in config file, and use it as a hint
|
||||
* on subsequent runs. Could be used when there is no way to autodetect
|
||||
* game (when more than one game sits in same directory), and user picks
|
||||
* up a variant manually.
|
||||
*/
|
||||
kADFlagUseExtraAsHint = (1 << 2)
|
||||
};
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
* $Id$
|
||||
*/
|
||||
|
||||
#if defined(WIN32)
|
||||
#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
|
||||
#include <windows.h>
|
||||
#include <direct.h>
|
||||
// winnt.h defines ARRAYSIZE, but we want our own one...
|
||||
|
@ -31,11 +31,13 @@
|
|||
|
||||
#include "engines/engine.h"
|
||||
#include "common/config-manager.h"
|
||||
#include "common/debug.h"
|
||||
#include "common/events.h"
|
||||
#include "common/file.h"
|
||||
#include "common/timer.h"
|
||||
#include "common/savefile.h"
|
||||
#include "common/system.h"
|
||||
#include "gui/debugger.h"
|
||||
#include "gui/message.h"
|
||||
#include "gui/GuiManager.h"
|
||||
#include "sound/mixer.h"
|
||||
|
@ -43,12 +45,38 @@
|
|||
#include "engines/metaengine.h"
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
extern bool isSmartphone(void);
|
||||
extern bool isSmartphone();
|
||||
#endif
|
||||
|
||||
// FIXME: HACK for MidiEmu & error()
|
||||
Engine *g_engine = 0;
|
||||
|
||||
// Output formatter for debug() and error() which invokes
|
||||
// the errorString method of the active engine, if any.
|
||||
static void defaultOutputFormatter(char *dst, const char *src, size_t dstSize) {
|
||||
if (g_engine) {
|
||||
g_engine->errorString(src, dst, dstSize);
|
||||
} else {
|
||||
strncpy(dst, src, dstSize);
|
||||
}
|
||||
}
|
||||
|
||||
static void defaultErrorHandler(const char *msg) {
|
||||
// Unless this error -originated- within the debugger itself, we
|
||||
// now invoke the debugger, if available / supported.
|
||||
if (g_engine) {
|
||||
GUI::Debugger *debugger = g_engine->getDebugger();
|
||||
#ifdef _WIN32_WCE
|
||||
if (isSmartphone())
|
||||
debugger = 0;
|
||||
#endif
|
||||
if (debugger && !debugger->isAttached()) {
|
||||
debugger->attach(msg);
|
||||
debugger->onFrame();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Engine::Engine(OSystem *syst)
|
||||
: _system(syst),
|
||||
|
@ -62,6 +90,9 @@ Engine::Engine(OSystem *syst)
|
|||
_mainMenuDialog(NULL) {
|
||||
|
||||
g_engine = this;
|
||||
Common::setDebugOutputFormatter(defaultOutputFormatter);
|
||||
Common::setErrorOutputFormatter(defaultOutputFormatter);
|
||||
Common::setErrorHandler(defaultErrorHandler);
|
||||
|
||||
// FIXME: Get rid of the following again. It is only here temporarily.
|
||||
// We really should never run with a non-working Mixer, so ought to handle
|
||||
|
@ -91,7 +122,7 @@ void GUIErrorMessage(const Common::String msg) {
|
|||
}
|
||||
|
||||
void Engine::checkCD() {
|
||||
#if defined (WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
|
||||
#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__SYMBIAN32__)
|
||||
// It is a known bug under Windows that games that play CD audio cause
|
||||
// ScummVM to crash if the data files are read from the same CD. Check
|
||||
// if this appears to be the case and issue a warning.
|
||||
|
@ -177,7 +208,7 @@ void Engine::pauseEngine(bool pause) {
|
|||
else
|
||||
_pauseLevel--;
|
||||
|
||||
if (_pauseLevel == 1) {
|
||||
if (_pauseLevel == 1 && pause) {
|
||||
pauseEngineIntern(true);
|
||||
} else if (_pauseLevel == 0) {
|
||||
pauseEngineIntern(false);
|
||||
|
|
|
@ -255,6 +255,7 @@ protected:
|
|||
|
||||
};
|
||||
|
||||
// FIXME: HACK for MidiEmu & error()
|
||||
extern Engine *g_engine;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -23,6 +23,13 @@
|
|||
*
|
||||
*/
|
||||
|
||||
|
||||
#if defined(WIN32)
|
||||
#include <windows.h>
|
||||
// winnt.h defines ARRAYSIZE, but we want our own one... - this is needed before including util.h
|
||||
#undef ARRAYSIZE
|
||||
#endif
|
||||
|
||||
#include "common/events.h"
|
||||
#include "common/file.h"
|
||||
#include "common/config-manager.h"
|
||||
|
|
|
@ -30,6 +30,10 @@
|
|||
|
||||
#include "engines/grim/imuse/imuse.h"
|
||||
|
||||
#include "sound/audiostream.h"
|
||||
#include "sound/mixer.h"
|
||||
#include "sound/raw.h"
|
||||
|
||||
namespace Grim {
|
||||
|
||||
Imuse *g_imuse = NULL;
|
||||
|
@ -139,8 +143,10 @@ void Imuse::restoreState(SaveGame *savedState) {
|
|||
if (channels == 2)
|
||||
track->mixerFlags |= kFlagStereo | kFlagReverseStereo;
|
||||
|
||||
track->stream = Audio::makeAppendableAudioStream(freq, makeMixerFlags(track->mixerFlags));
|
||||
g_system->getMixer()->playInputStream(track->getType(), &track->handle, track->stream, -1, track->getVol(), track->getPan());
|
||||
track->stream = Audio::makeQueuingAudioStream(freq, (track->mixerFlags & kFlagStereo) != 0);
|
||||
g_system->getMixer()->playInputStream(track->getType(), &track->handle, track->stream, -1, track->getVol(),
|
||||
track->getPan(), DisposeAfterUse::YES, false,
|
||||
(track->mixerFlags & kFlagReverseStereo) != 0);
|
||||
g_system->getMixer()->pauseHandle(track->handle, true);
|
||||
}
|
||||
savedState->endSection();
|
||||
|
@ -188,14 +194,14 @@ void Imuse::saveState(SaveGame *savedState) {
|
|||
|
||||
int32 Imuse::makeMixerFlags(int32 flags) {
|
||||
int32 mixerFlags = 0;
|
||||
if (flags & kFlagUnsigned)
|
||||
mixerFlags |= Audio::FLAG_UNSIGNED;
|
||||
if (flags & kFlag16Bits)
|
||||
mixerFlags |= Audio::Mixer::FLAG_16BITS;
|
||||
mixerFlags |= Audio::FLAG_16BITS;
|
||||
if (flags & kFlagLittleEndian)
|
||||
mixerFlags |= Audio::Mixer::FLAG_LITTLE_ENDIAN;
|
||||
mixerFlags |= Audio::FLAG_LITTLE_ENDIAN;
|
||||
if (flags & kFlagStereo)
|
||||
mixerFlags |= Audio::Mixer::FLAG_STEREO;
|
||||
if (flags & kFlagReverseStereo)
|
||||
mixerFlags |= Audio::Mixer::FLAG_REVERSE_STEREO;
|
||||
mixerFlags |= Audio::FLAG_STEREO;
|
||||
return mixerFlags;
|
||||
}
|
||||
|
||||
|
@ -301,7 +307,7 @@ void Imuse::callback() {
|
|||
result = mixer_size;
|
||||
|
||||
if (g_system->getMixer()->isReady()) {
|
||||
track->stream->queueBuffer(data, result);
|
||||
track->stream->queueBuffer(data, result, DisposeAfterUse::YES, makeMixerFlags(track->mixerFlags));
|
||||
track->regionOffset += result;
|
||||
} else
|
||||
delete[] data;
|
||||
|
|
|
@ -137,8 +137,10 @@ bool Imuse::startSound(const char *soundName, int volGroupId, int hookId, int vo
|
|||
track->regionOffset = otherTrack->regionOffset;
|
||||
}
|
||||
|
||||
track->stream = Audio::makeAppendableAudioStream(freq, makeMixerFlags(track->mixerFlags));
|
||||
g_system->getMixer()->playInputStream(track->getType(), &track->handle, track->stream, -1, track->getVol(), track->getPan());
|
||||
track->stream = Audio::makeQueuingAudioStream(freq, track->mixerFlags & kFlagStereo);
|
||||
g_system->getMixer()->playInputStream(track->getType(), &track->handle, track->stream, -1,
|
||||
track->getVol(), track->getPan(), DisposeAfterUse::YES,
|
||||
false, (track->mixerFlags & kFlagReverseStereo) != 0);
|
||||
track->used = true;
|
||||
|
||||
return true;
|
||||
|
@ -374,8 +376,10 @@ Track *Imuse::cloneToFadeOutTrack(Track *track, int fadeDelay) {
|
|||
fadeTrack->volFadeUsed = true;
|
||||
|
||||
// Create an appendable output buffer
|
||||
fadeTrack->stream = Audio::makeAppendableAudioStream(_sound->getFreq(fadeTrack->soundDesc), makeMixerFlags(fadeTrack->mixerFlags));
|
||||
g_system->getMixer()->playInputStream(track->getType(), &fadeTrack->handle, fadeTrack->stream, -1, fadeTrack->getVol(), fadeTrack->getPan());
|
||||
fadeTrack->stream = Audio::makeQueuingAudioStream(_sound->getFreq(fadeTrack->soundDesc), track->mixerFlags & kFlagStereo);
|
||||
g_system->getMixer()->playInputStream(track->getType(), &fadeTrack->handle, fadeTrack->stream, -1, fadeTrack->getVol(),
|
||||
fadeTrack->getPan(), DisposeAfterUse::YES, false,
|
||||
(track->mixerFlags & kFlagReverseStereo) != 0);
|
||||
fadeTrack->used = true;
|
||||
|
||||
return fadeTrack;
|
||||
|
|
|
@ -66,7 +66,7 @@ struct Track {
|
|||
|
||||
ImuseSndMgr::SoundDesc *soundDesc;
|
||||
Audio::SoundHandle handle;
|
||||
Audio::AppendableAudioStream *stream;
|
||||
Audio::QueuingAudioStream *stream;
|
||||
|
||||
Track() : used(false), stream(NULL) {
|
||||
soundName[0] = 0;
|
||||
|
|
|
@ -319,7 +319,7 @@ static void io_write() {
|
|||
}
|
||||
|
||||
static void io_date() {
|
||||
tm t;
|
||||
TimeDate t;
|
||||
char b[BUFSIZ];
|
||||
|
||||
g_system->getTimeAndDate(t);
|
||||
|
|
|
@ -1889,7 +1889,7 @@ static void TextFileGetLine() {
|
|||
int pos = (int)lua_getnumber(posObj);
|
||||
file->seek(pos, SEEK_SET);
|
||||
memset(textBuf, 0, 1000);
|
||||
file->readLine_NEW(textBuf, 1000);
|
||||
file->readLine(textBuf, 1000);
|
||||
delete file;
|
||||
|
||||
lua_pushstring(textBuf);
|
||||
|
@ -1923,7 +1923,7 @@ static void TextFileGetLineCount() {
|
|||
int pos = file->pos();
|
||||
lua_pushnumber(pos);
|
||||
lua_settable();
|
||||
file->readLine_NEW(textBuf, 1000);
|
||||
file->readLine(textBuf, 1000);
|
||||
line++;
|
||||
}
|
||||
delete file;
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
#include "common/file.h"
|
||||
#include "common/events.h"
|
||||
|
||||
#include "sound/audiostream.h"
|
||||
#include "sound/mixer.h"
|
||||
#include "sound/raw.h"
|
||||
|
||||
#include "engines/grim/smush/smush.h"
|
||||
#include "engines/grim/grim.h"
|
||||
|
||||
|
@ -127,16 +131,16 @@ void Smush::handleWave(const byte *src, uint32 size) {
|
|||
int16 *dst = new int16[size * _channels];
|
||||
decompressVima(src, dst, size * _channels * 2, smushDestTable);
|
||||
|
||||
int flags = Audio::Mixer::FLAG_16BITS;
|
||||
int flags = Audio::FLAG_16BITS;
|
||||
if (_channels == 2)
|
||||
flags |= Audio::Mixer::FLAG_STEREO;
|
||||
flags |= Audio::FLAG_STEREO;
|
||||
|
||||
if (!_stream) {
|
||||
_stream = Audio::makeAppendableAudioStream(_freq, flags);
|
||||
_stream = Audio::makeQueuingAudioStream(_freq, (_channels == 2));
|
||||
g_system->getMixer()->playInputStream(Audio::Mixer::kMusicSoundType, &_soundHandle, _stream);
|
||||
}
|
||||
if (g_system->getMixer()->isReady()) {
|
||||
_stream->queueBuffer((byte *)dst, size * _channels * 2);
|
||||
_stream->queueBuffer((byte *)dst, size * _channels * 2, DisposeAfterUse::YES, flags);
|
||||
} else {
|
||||
delete[] dst;
|
||||
}
|
||||
|
@ -297,10 +301,10 @@ void Smush::handleIACT(const byte *src, int32 size) {
|
|||
} while (--count);
|
||||
|
||||
if (!_stream) {
|
||||
_stream = Audio::makeAppendableAudioStream(22050, Audio::Mixer::FLAG_STEREO | Audio::Mixer::FLAG_16BITS);
|
||||
_stream = Audio::makeQueuingAudioStream(22050, true);
|
||||
g_system->getMixer()->playInputStream(Audio::Mixer::kSFXSoundType, &_soundHandle, _stream);
|
||||
}
|
||||
_stream->queueBuffer(output_data, 0x1000);
|
||||
_stream->queueBuffer(output_data, 0x1000, DisposeAfterUse::YES, Audio::FLAG_STEREO | Audio::FLAG_16BITS);
|
||||
|
||||
bsize -= len;
|
||||
d_src += len;
|
||||
|
@ -571,7 +575,7 @@ bool zlibFile::setPos(struct SavePos *pos) {
|
|||
return false;
|
||||
}
|
||||
_handle->seek(pos->filePos, SEEK_SET);
|
||||
if (_handle->ioFailed()) {
|
||||
if (_handle->err()) {
|
||||
warning("Unable to rewind SMUSH movie (seek failed)");
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -80,7 +80,7 @@ private:
|
|||
zlibFile _file;
|
||||
Common::File _f;
|
||||
Audio::SoundHandle _soundHandle;
|
||||
Audio::AppendableAudioStream *_stream;
|
||||
Audio::QueuingAudioStream *_stream;
|
||||
|
||||
int32 _frame;
|
||||
bool _updateNeeded;
|
||||
|
|
|
@ -146,4 +146,4 @@ void VectorRenderer::stepGetPositions(const DrawStep &step, const Common::Rect &
|
|||
}
|
||||
}
|
||||
|
||||
} // end of namespace Graphics
|
||||
} // End of namespace Graphics
|
||||
|
|
|
@ -493,6 +493,6 @@ protected:
|
|||
int _gradientBytes[3]; /**< Color bytes of the active gradient, used to speed up calculation */
|
||||
};
|
||||
|
||||
} // end of namespace Graphics
|
||||
} // End of namespace Graphics
|
||||
|
||||
#endif
|
||||
|
|
|
@ -116,10 +116,18 @@ struct ColorMasks<555> {
|
|||
kGreenBits = 5,
|
||||
kBlueBits = 5,
|
||||
|
||||
#ifdef __N64__
|
||||
/* Nintendo 64 uses a BGR555 color format for 16bit display */
|
||||
kAlphaShift = 0,
|
||||
kRedShift = kBlueBits+kGreenBits+1,
|
||||
kGreenShift = kBlueBits + 1,
|
||||
kBlueShift = 1,
|
||||
#else /* RGB555 */
|
||||
kAlphaShift = 0,
|
||||
kRedShift = kGreenBits+kBlueBits,
|
||||
kGreenShift = kBlueBits,
|
||||
kBlueShift = 0,
|
||||
#endif
|
||||
|
||||
kAlphaMask = ((1 << kAlphaBits) - 1) << kAlphaShift,
|
||||
kRedMask = ((1 << kRedBits) - 1) << kRedShift,
|
||||
|
@ -321,6 +329,6 @@ PixelFormat createPixelFormat() {
|
|||
}
|
||||
|
||||
|
||||
} // end of namespace Graphics
|
||||
} // End of namespace Graphics
|
||||
|
||||
#endif
|
||||
|
|
|
@ -31,14 +31,13 @@ DECLARE_SINGLETON(Graphics::CursorManager);
|
|||
|
||||
namespace Graphics {
|
||||
|
||||
static bool g_initialized = false;
|
||||
|
||||
CursorManager::CursorManager() {
|
||||
if (!g_initialized) {
|
||||
g_initialized = true;
|
||||
_cursorStack.clear();
|
||||
_cursorPaletteStack.clear();
|
||||
}
|
||||
CursorManager::~CursorManager() {
|
||||
for (int i = 0; i < _cursorStack.size(); ++i)
|
||||
delete _cursorStack[i];
|
||||
_cursorStack.clear();
|
||||
for (int i = 0; i < _cursorPaletteStack.size(); ++i)
|
||||
delete _cursorPaletteStack[i];
|
||||
_cursorPaletteStack.clear();
|
||||
}
|
||||
|
||||
bool CursorManager::isVisible() {
|
||||
|
@ -157,4 +156,50 @@ void CursorManager::replaceCursorPalette(const byte *colors, uint start, uint nu
|
|||
return;
|
||||
}
|
||||
|
||||
CursorManager::Cursor::Cursor(const byte *data, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int targetScale, const Graphics::PixelFormat *format) {
|
||||
#ifdef USE_RGB_COLOR
|
||||
if (!format)
|
||||
_format = Graphics::PixelFormat::createFormatCLUT8();
|
||||
else
|
||||
_format = *format;
|
||||
_size = w * h * _format.bytesPerPixel;
|
||||
_keycolor = keycolor & ((1 << (_format.bytesPerPixel << 3)) - 1);
|
||||
#else
|
||||
_format = Graphics::PixelFormat::createFormatCLUT8();
|
||||
_size = w * h;
|
||||
_keycolor = keycolor & 0xFF;
|
||||
#endif
|
||||
_data = new byte[_size];
|
||||
if (data && _data)
|
||||
memcpy(_data, data, _size);
|
||||
_width = w;
|
||||
_height = h;
|
||||
_hotspotX = hotspotX;
|
||||
_hotspotY = hotspotY;
|
||||
_targetScale = targetScale;
|
||||
}
|
||||
|
||||
CursorManager::Cursor::~Cursor() {
|
||||
delete[] _data;
|
||||
}
|
||||
|
||||
CursorManager::Palette::Palette(const byte *colors, uint start, uint num) {
|
||||
_start = start;
|
||||
_num = num;
|
||||
_size = 4 * num;
|
||||
|
||||
if (num) {
|
||||
_data = new byte[_size];
|
||||
memcpy(_data, colors, _size);
|
||||
} else {
|
||||
_data = NULL;
|
||||
}
|
||||
|
||||
_disabled = false;
|
||||
}
|
||||
|
||||
CursorManager::Palette::~Palette() {
|
||||
delete[] _data;
|
||||
}
|
||||
|
||||
} // End of namespace Graphics
|
||||
|
|
|
@ -67,7 +67,8 @@ public:
|
|||
* @param h the height
|
||||
* @param hotspotX the hotspot X coordinate
|
||||
* @param hotspotY the hotspot Y coordinate
|
||||
* @param keycolor the index for the transparent color
|
||||
* @param keycolor the color value for the transparent color. This may not exceed
|
||||
* the maximum color value as defined by format.
|
||||
* @param targetScale the scale for which the cursor is designed
|
||||
* @param format a pointer to the pixel format which the cursor graphic uses,
|
||||
* CLUT8 will be used if this is NULL or not specified.
|
||||
|
@ -75,7 +76,7 @@ public:
|
|||
* useful to push a "dummy" cursor and modify it later. The
|
||||
* cursor will be added to the stack, but not to the backend.
|
||||
*/
|
||||
void pushCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor = 0xFFFFFFFF, int targetScale = 1, const Graphics::PixelFormat *format = NULL);
|
||||
void pushCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int targetScale = 1, const Graphics::PixelFormat *format = NULL);
|
||||
|
||||
/**
|
||||
* Pop a cursor from the stack, and restore the previous one to the
|
||||
|
@ -93,12 +94,13 @@ public:
|
|||
* @param h the height
|
||||
* @param hotspotX the hotspot X coordinate
|
||||
* @param hotspotY the hotspot Y coordinate
|
||||
* @param keycolor the index for the transparent color
|
||||
* @param keycolor the color value for the transparent color. This may not exceed
|
||||
* the maximum color value as defined by format.
|
||||
* @param targetScale the scale for which the cursor is designed
|
||||
* @param format a pointer to the pixel format which the cursor graphic uses,
|
||||
* CLUT8 will be used if this is NULL or not specified.
|
||||
*/
|
||||
void replaceCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor = 0xFFFFFFFF, int targetScale = 1, const Graphics::PixelFormat *format = NULL);
|
||||
void replaceCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int targetScale = 1, const Graphics::PixelFormat *format = NULL);
|
||||
|
||||
/**
|
||||
* Pop all of the cursors and cursor palettes from their respective stacks.
|
||||
|
@ -164,7 +166,11 @@ public:
|
|||
|
||||
private:
|
||||
friend class Common::Singleton<SingletonBaseType>;
|
||||
CursorManager();
|
||||
// Even though this is basically the default constructor we implement it
|
||||
// ourselves, so it is private and thus there is no way to create this class
|
||||
// except from the Singleton code.
|
||||
CursorManager() {}
|
||||
~CursorManager();
|
||||
|
||||
struct Cursor {
|
||||
byte *_data;
|
||||
|
@ -175,35 +181,12 @@ private:
|
|||
int _hotspotY;
|
||||
uint32 _keycolor;
|
||||
Graphics::PixelFormat _format;
|
||||
byte _targetScale;
|
||||
int _targetScale;
|
||||
|
||||
uint _size;
|
||||
Cursor(const byte *data, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor = 0xFFFFFFFF, int targetScale = 1, const Graphics::PixelFormat *format = NULL) {
|
||||
#ifdef USE_RGB_COLOR
|
||||
if (!format)
|
||||
_format = Graphics::PixelFormat::createFormatCLUT8();
|
||||
else
|
||||
_format = *format;
|
||||
_size = w * h * _format.bytesPerPixel;
|
||||
_keycolor = keycolor & ((1 << (_format.bytesPerPixel << 3)) - 1);
|
||||
#else
|
||||
_format = Graphics::PixelFormat::createFormatCLUT8();
|
||||
_size = w * h;
|
||||
_keycolor = keycolor & 0xFF;
|
||||
#endif
|
||||
_data = new byte[_size];
|
||||
if (data && _data)
|
||||
memcpy(_data, data, _size);
|
||||
_width = w;
|
||||
_height = h;
|
||||
_hotspotX = hotspotX;
|
||||
_hotspotY = hotspotY;
|
||||
_targetScale = targetScale;
|
||||
}
|
||||
|
||||
~Cursor() {
|
||||
delete[] _data;
|
||||
}
|
||||
Cursor(const byte *data, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int targetScale = 1, const Graphics::PixelFormat *format = NULL);
|
||||
~Cursor();
|
||||
};
|
||||
|
||||
struct Palette {
|
||||
|
@ -214,24 +197,8 @@ private:
|
|||
|
||||
bool _disabled;
|
||||
|
||||
Palette(const byte *colors, uint start, uint num) {
|
||||
_start = start;
|
||||
_num = num;
|
||||
_size = 4 * num;
|
||||
|
||||
if (num) {
|
||||
_data = new byte[_size];
|
||||
memcpy(_data, colors, _size);
|
||||
} else {
|
||||
_data = NULL;
|
||||
}
|
||||
|
||||
_disabled = false;
|
||||
}
|
||||
|
||||
~Palette() {
|
||||
delete[] _data;
|
||||
}
|
||||
Palette(const byte *colors, uint start, uint num);
|
||||
~Palette();
|
||||
};
|
||||
Common::Stack<Cursor *> _cursorStack;
|
||||
Common::Stack<Palette *> _cursorPaletteStack;
|
||||
|
|
|
@ -524,7 +524,7 @@ int bdf_read_bitmaps(Common::SeekableReadStream &fp, NewFontData* pf) {
|
|||
}
|
||||
|
||||
/* read the next non-comment line, returns buf or NULL if EOF*/
|
||||
// TODO: Can we use SeekableReadStream::readLine resp. readLine_NEW instead?
|
||||
// TODO: Can we use SeekableReadStream::readLine instead?
|
||||
char *bdf_getline(Common::SeekableReadStream &fp, char *buf, int len) {
|
||||
int c;
|
||||
char *b;
|
||||
|
@ -782,20 +782,31 @@ int Font::getStringWidth(const Common::String &str) const {
|
|||
return space;
|
||||
}
|
||||
|
||||
void Font::drawString(Surface *dst, const Common::String &s, int x, int y, int w, uint32 color, TextAlign align, int deltax, bool useEllipsis) const {
|
||||
void Font::drawString(Surface *dst, const Common::String &sOld, int x, int y, int w, uint32 color, TextAlign align, int deltax, bool useEllipsis) const {
|
||||
assert(dst != 0);
|
||||
const int leftX = x, rightX = x + w;
|
||||
uint i;
|
||||
Common::String s = sOld;
|
||||
int width = getStringWidth(s);
|
||||
Common::String str;
|
||||
|
||||
if (useEllipsis && width > w && s.hasSuffix("...")) {
|
||||
// String is too wide. Check whether it ends in an ellipsis
|
||||
// ("..."). If so, remove that and try again!
|
||||
s.deleteLastChar();
|
||||
s.deleteLastChar();
|
||||
s.deleteLastChar();
|
||||
width = getStringWidth(s);
|
||||
}
|
||||
|
||||
if (useEllipsis && width > w) {
|
||||
// String is too wide. So we shorten it "intellegently", by replacing
|
||||
// parts of it by an ellipsis ("..."). There are three possibilities
|
||||
// for this: replace the start, the end, or the middle of the string.
|
||||
// What is best really depends on the context; but unless we want to
|
||||
// make this configurable, replacing the middle probably is a good
|
||||
// compromise.
|
||||
// String is too wide. So we shorten it "intelligently" by
|
||||
// replacing parts of the string by an ellipsis. There are
|
||||
// three possibilities for this: replace the start, the end, or
|
||||
// the middle of the string. What is best really depends on the
|
||||
// context; but unless we want to make this configurable,
|
||||
// replacing the middle seems to be a good compromise.
|
||||
|
||||
const int ellipsisWidth = getStringWidth("...");
|
||||
|
||||
// SLOW algorithm to remove enough of the middle. But it is good enough
|
||||
|
@ -816,7 +827,7 @@ void Font::drawString(Surface *dst, const Common::String &s, int x, int y, int w
|
|||
|
||||
// The original string is width wide. Of those we already skipped past
|
||||
// w2 pixels, which means (width - w2) remain.
|
||||
// The new str is (w2+ellipsisWidth) wide, so we can accomodate about
|
||||
// The new str is (w2+ellipsisWidth) wide, so we can accommodate about
|
||||
// (w - (w2+ellipsisWidth)) more pixels.
|
||||
// Thus we skip ((width - w2) - (w - (w2+ellipsisWidth))) =
|
||||
// (width + ellipsisWidth - w)
|
||||
|
@ -831,7 +842,6 @@ void Font::drawString(Surface *dst, const Common::String &s, int x, int y, int w
|
|||
}
|
||||
|
||||
width = getStringWidth(str);
|
||||
|
||||
} else {
|
||||
str = s;
|
||||
}
|
||||
|
|
|
@ -37,9 +37,9 @@ namespace Graphics {
|
|||
/** Text alignment modes */
|
||||
enum TextAlign {
|
||||
kTextAlignInvalid,
|
||||
kTextAlignLeft, //!< Text should be aligned to the left
|
||||
kTextAlignCenter, //!< Text should be centered
|
||||
kTextAlignRight //!< Text should be aligned to the right
|
||||
kTextAlignLeft, ///< Text should be aligned to the left
|
||||
kTextAlignCenter, ///< Text should be centered
|
||||
kTextAlignRight ///< Text should be aligned to the right
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -140,17 +140,18 @@ public:
|
|||
static NewFont *loadFromCache(Common::SeekableReadStream &stream);
|
||||
};
|
||||
|
||||
#if (defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
# define DEFINE_FONT(n) \
|
||||
const NewFont *n; \
|
||||
#define DEFINE_FONT(n) \
|
||||
const NewFont *n = 0; \
|
||||
void create_##n() { \
|
||||
n = new NewFont(desc); \
|
||||
}
|
||||
|
||||
# define INIT_FONT(n) \
|
||||
extern void create_##n(); \
|
||||
#define FORWARD_DECLARE_FONT(n) \
|
||||
extern const NewFont *n; \
|
||||
extern void create_##n();
|
||||
|
||||
#define INIT_FONT(n) \
|
||||
create_##n();
|
||||
#endif
|
||||
|
||||
} // End of namespace Graphics
|
||||
|
||||
|
|
|
@ -29,38 +29,34 @@ DECLARE_SINGLETON(Graphics::FontManager);
|
|||
|
||||
namespace Graphics {
|
||||
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
const ScummFont g_scummfont;
|
||||
extern const NewFont g_sysfont;
|
||||
extern const NewFont g_sysfont_big;
|
||||
extern const NewFont g_consolefont;
|
||||
const ScummFont *g_scummfont = 0;
|
||||
FORWARD_DECLARE_FONT(g_sysfont)
|
||||
FORWARD_DECLARE_FONT(g_sysfont_big)
|
||||
FORWARD_DECLARE_FONT(g_consolefont)
|
||||
|
||||
FontManager::FontManager() {
|
||||
// This assert should *never* trigger, because
|
||||
// FontManager is a singleton, thus there is only
|
||||
// one instance of it per time. (g_scummfont gets
|
||||
// reset to 0 in the desctructor of this class).
|
||||
assert(g_scummfont == 0);
|
||||
g_scummfont = new ScummFont;
|
||||
INIT_FONT(g_sysfont)
|
||||
INIT_FONT(g_sysfont_big)
|
||||
INIT_FONT(g_consolefont)
|
||||
}
|
||||
|
||||
#else
|
||||
const ScummFont *g_scummfont;
|
||||
extern const NewFont *g_sysfont;
|
||||
extern const NewFont *g_sysfont_big;
|
||||
extern const NewFont *g_consolefont;
|
||||
|
||||
static bool g_initialized = false;
|
||||
void initfonts() {
|
||||
if (!g_initialized) {
|
||||
// FIXME : this need to be freed
|
||||
g_initialized = true;
|
||||
g_scummfont = new ScummFont;
|
||||
INIT_FONT(g_sysfont)
|
||||
INIT_FONT(g_sysfont_big)
|
||||
INIT_FONT(g_consolefont)
|
||||
}
|
||||
FontManager::~FontManager() {
|
||||
delete g_scummfont;
|
||||
g_scummfont = 0;
|
||||
delete g_sysfont;
|
||||
g_sysfont = 0;
|
||||
delete g_sysfont_big;
|
||||
g_sysfont_big = 0;
|
||||
delete g_consolefont;
|
||||
g_consolefont = 0;
|
||||
}
|
||||
|
||||
FontManager::FontManager() {
|
||||
initfonts();
|
||||
}
|
||||
#endif
|
||||
|
||||
const Font *FontManager::getFontByName(const Common::String &name) const {
|
||||
if (!_fontMap.contains(name))
|
||||
return 0;
|
||||
|
@ -69,16 +65,6 @@ const Font *FontManager::getFontByName(const Common::String &name) const {
|
|||
|
||||
const Font *FontManager::getFontByUsage(FontUsage usage) const {
|
||||
switch (usage) {
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
case kOSDFont:
|
||||
return &g_scummfont;
|
||||
case kConsoleFont:
|
||||
return &g_consolefont;
|
||||
case kGUIFont:
|
||||
return &g_sysfont;
|
||||
case kBigGUIFont:
|
||||
return &g_sysfont_big;
|
||||
#else
|
||||
case kOSDFont:
|
||||
return g_scummfont;
|
||||
case kConsoleFont:
|
||||
|
@ -87,7 +73,6 @@ const Font *FontManager::getFontByUsage(FontUsage usage) const {
|
|||
return g_sysfont;
|
||||
case kBigGUIFont:
|
||||
return g_sysfont_big;
|
||||
#endif
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -83,6 +83,7 @@ public:
|
|||
private:
|
||||
friend class Common::Singleton<SingletonBaseType>;
|
||||
FontManager();
|
||||
~FontManager();
|
||||
|
||||
Common::HashMap<Common::String, const Font *> _fontMap;
|
||||
};
|
||||
|
|
|
@ -5651,10 +5651,6 @@ static const FontDesc desc = {
|
|||
sizeof(_font_bits)/sizeof(bitmap_t)
|
||||
};
|
||||
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
extern const NewFont g_consolefont(desc);
|
||||
#else
|
||||
DEFINE_FONT(g_consolefont)
|
||||
#endif
|
||||
|
||||
} // End of namespace Graphics
|
||||
|
|
|
@ -7435,10 +7435,6 @@ static const FontDesc desc = {
|
|||
sizeof(_font_bits)/sizeof(bitmap_t)
|
||||
};
|
||||
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
extern const NewFont g_sysfont(desc);
|
||||
#else
|
||||
DEFINE_FONT(g_sysfont)
|
||||
#endif
|
||||
|
||||
} // End of namespace Graphics
|
||||
|
|
|
@ -5539,10 +5539,6 @@ static const FontDesc desc = {
|
|||
sizeof(_font_bits)/sizeof(bitmap_t)
|
||||
};
|
||||
|
||||
#if !(defined(PALMOS_ARM) || defined(PALMOS_DEBUG) || defined(__GP32__))
|
||||
extern const NewFont g_sysfont_big(desc);
|
||||
#else
|
||||
DEFINE_FONT(g_sysfont_big)
|
||||
#endif
|
||||
|
||||
} // End of namespace Graphics
|
||||
|
|
|
@ -175,4 +175,4 @@ Surface *ImageDecoder::loadFile(Common::SeekableReadStream &stream, const PixelF
|
|||
|
||||
return decoder->decodeImage(stream, format);
|
||||
}
|
||||
} // end of namespace Graphics
|
||||
} // End of namespace Graphics
|
||||
|
|
|
@ -61,7 +61,7 @@ public:
|
|||
*/
|
||||
virtual Surface *decodeImage(Common::SeekableReadStream &stream, const PixelFormat &format) = 0;
|
||||
};
|
||||
} // end of namespace Graphics
|
||||
} // End of namespace Graphics
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
#define GRAPHICS_PIXELFORMAT_H
|
||||
|
||||
#include "common/sys.h"
|
||||
#include "common/list.h"
|
||||
|
||||
namespace Graphics {
|
||||
|
||||
|
@ -148,26 +147,6 @@ struct PixelFormat {
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Determines the first matching format between two lists.
|
||||
*
|
||||
* @param backend The higher priority list, meant to be a list of formats supported by the backend
|
||||
* @param frontend The lower priority list, meant to be a list of formats supported by the engine
|
||||
* @return The first item on the backend list that also occurs on the frontend list
|
||||
* or PixelFormat::createFormatCLUT8() if no matching formats were found.
|
||||
*/
|
||||
inline PixelFormat findCompatibleFormat(Common::List<PixelFormat> backend, Common::List<PixelFormat> frontend) {
|
||||
#ifdef USE_RGB_COLOR
|
||||
for (Common::List<PixelFormat>::iterator i = backend.begin(); i != backend.end(); ++i) {
|
||||
for (Common::List<PixelFormat>::iterator j = frontend.begin(); j != frontend.end(); ++j) {
|
||||
if (*i == *j)
|
||||
return *i;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return PixelFormat::createFormatCLUT8();
|
||||
}
|
||||
|
||||
} // end of namespace Graphics
|
||||
} // End of namespace Graphics
|
||||
|
||||
#endif
|
||||
|
|
|
@ -166,5 +166,5 @@ bool saveThumbnail(Common::WriteStream &out, const Graphics::Surface &thumb) {
|
|||
return true;
|
||||
}
|
||||
|
||||
} // end of namespace Graphics
|
||||
} // End of namespace Graphics
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue