diff options
Diffstat (limited to 'backends')
47 files changed, 602 insertions, 690 deletions
diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp index b070fb89ef..65b375605b 100644 --- a/backends/events/default/default-events.cpp +++ b/backends/events/default/default-events.cpp @@ -392,11 +392,23 @@ bool DefaultEventManager::pollEvent(Common::Event &event) {  			_keyRepeatTime = time + kKeyRepeatInitialDelay;  #endif  			// Global Main Menu -			if (event.kbd.keycode == Common::KEYCODE_MAINMENU) +			// FIXME: F6 is not the best trigger, it conflicts with some games!!! +			if (event.kbd.keycode == Common::KEYCODE_F6)  				if (g_engine && !g_engine->isPaused()) {  					Common::Event menuEvent;  					menuEvent.type = Common::EVENT_MAINMENU; -					pushEvent(menuEvent); +					 +					// FIXME: GSoC RTL branch passes the F6 key event to the +					// engine, and also enqueues a EVENT_MAINMENU. For now, +					// we just drop the key event and return an EVENT_MAINMENU +					// instead. This way, we don't have to add special cases +					// to engines (like it was the case for LURE in the RTL branch). +					// +					// However, this has other consequences, possibly negative ones. +					// Like, what happens with key repeat for the trigger key? +					 +					//pushEvent(menuEvent); +					event = menuEvent;  				}  			break; diff --git a/backends/fs/abstract-fs.cpp b/backends/fs/abstract-fs.cpp new file mode 100644 index 0000000000..f6dc8f1891 --- /dev/null +++ b/backends/fs/abstract-fs.cpp @@ -0,0 +1,39 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#include "backends/fs/abstract-fs.h" + +const char *AbstractFilesystemNode::lastPathComponent(const Common::String &str, const char sep) { +	if(str.empty()) +		return ""; + +	const char *start = str.c_str(); +	const char *cur = start + str.size() - 2; + +	while (cur >= start && *cur != sep) { +		--cur; +	} + +	return cur + 1; +} diff --git a/backends/fs/abstract-fs.h b/backends/fs/abstract-fs.h index 97de40a2fc..d81e7f36b0 100644 --- a/backends/fs/abstract-fs.h +++ b/backends/fs/abstract-fs.h @@ -72,6 +72,19 @@ protected:  	 */  	virtual AbstractFilesystemNode *getParent() const = 0; +	/** +	 * Returns the last component of a given path. +	 * +	 * Examples: +	 *			/foo/bar.txt would return /bar.txt +	 *			/foo/bar/    would return /bar/ +	 * +	 * @param str String containing the path. +	 * @param sep character used to separate path components +	 * @return Pointer to the first char of the last component inside str. +	 */ +	static const char *lastPathComponent(const Common::String &str, const char sep); +  public:  	/**  	 * Destructor. @@ -154,4 +167,6 @@ public:  	*/  }; + +  #endif //BACKENDS_ABSTRACT_FS_H diff --git a/backends/fs/amigaos4/amigaos4-fs-factory.cpp b/backends/fs/amigaos4/amigaos4-fs-factory.cpp index af843b7c78..2b0b2f1908 100644 --- a/backends/fs/amigaos4/amigaos4-fs-factory.cpp +++ b/backends/fs/amigaos4/amigaos4-fs-factory.cpp @@ -26,8 +26,6 @@  #include "backends/fs/amigaos4/amigaos4-fs-factory.h"  #include "backends/fs/amigaos4/amigaos4-fs.cpp" -DECLARE_SINGLETON(AmigaOSFilesystemFactory); -  AbstractFilesystemNode *AmigaOSFilesystemFactory::makeRootFileNode() const {  	return new AmigaOSFilesystemNode();  } @@ -36,7 +34,7 @@ AbstractFilesystemNode *AmigaOSFilesystemFactory::makeCurrentDirectoryFileNode()  	return new AmigaOSFilesystemNode();  } -AbstractFilesystemNode *AmigaOSFilesystemFactory::makeFileNodePath(const String &path) const { +AbstractFilesystemNode *AmigaOSFilesystemFactory::makeFileNodePath(const Common::String &path) const {  	return new AmigaOSFilesystemNode(path);  }  #endif diff --git a/backends/fs/amigaos4/amigaos4-fs-factory.h b/backends/fs/amigaos4/amigaos4-fs-factory.h index 58a7dcd372..03af6e95b9 100644 --- a/backends/fs/amigaos4/amigaos4-fs-factory.h +++ b/backends/fs/amigaos4/amigaos4-fs-factory.h @@ -25,7 +25,6 @@  #ifndef AMIGAOS_FILESYSTEM_FACTORY_H  #define AMIGAOS_FILESYSTEM_FACTORY_H -#include "common/singleton.h"  #include "backends/fs/fs-factory.h"  /** @@ -33,19 +32,11 @@   *   * Parts of this class are documented in the base interface class, FilesystemFactory.   */ -class AmigaOSFilesystemFactory : public FilesystemFactory, public Common::Singleton<AmigaOSFilesystemFactory> { +class AmigaOSFilesystemFactory : public FilesystemFactory {  public: -	typedef Common::String String; -  	virtual AbstractFilesystemNode *makeRootFileNode() const;  	virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; -	virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; - -protected: -	AmigaOSFilesystemFactory() {}; - -private: -	friend class Common::Singleton<SingletonBaseType>; +	virtual AbstractFilesystemNode *makeFileNodePath(const Common::String &path) const;  };  #endif /*AMIGAOS_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index cffe4c118d..d206941ab9 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -798,25 +798,3 @@ int std_ferror(FILE* handle) {  }  } // namespace DS - -/** - * Returns the last component of a given path. - * - * Examples: - *			/foo/bar.txt would return /bar.txt - *			/foo/bar/    would return /bar/ - * - * @param str String containing the path. - * @return Pointer to the first char of the last component inside str. - */ -const char *lastPathComponent(const Common::String &str) { -	const char *start = str.c_str(); -	const char *cur = start + str.size() - 2; - -	while (cur >= start && *cur != '/' && *cur != '\\') { -		--cur; -	} - -	return cur + 1; -} - diff --git a/backends/fs/palmos/palmos-fs.cpp b/backends/fs/palmos/palmos-fs.cpp index 5edb6c2d26..69d9f350f5 100644 --- a/backends/fs/palmos/palmos-fs.cpp +++ b/backends/fs/palmos/palmos-fs.cpp @@ -80,30 +80,6 @@ private:  	static void addFile(AbstractFSList &list, ListMode mode, const Char *base, FileInfoType* find_data);  }; -/** - * Returns the last component of a given path. - * - * Examples: - *			/foo/bar.txt would return /bar.txt - *			/foo/bar/    would return /bar/ - * - * @param str String containing the path. - * @return Pointer to the first char of the last component inside str. - */ -const char *lastPathComponent(const Common::String &str) { -	if(str.empty()) -		return ""; - -	const char *start = str.c_str(); -	const char *cur = start + str.size() - 2; - -	while (cur >= start && *cur != '/') { -		--cur; -	} - -	return cur + 1; -} -  void PalmOSFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const char *base, FileInfoType* find_data) {  	PalmOSFilesystemNode entry;  	bool isDir; @@ -138,7 +114,7 @@ PalmOSFilesystemNode::PalmOSFilesystemNode() {  PalmOSFilesystemNode::PalmOSFilesystemNode(const String &p) {  	_path = p; -	_displayName = lastPathComponent(_path); +	_displayName = lastPathComponent(_path, '/');  	UInt32 attr;  	FileRef handle; @@ -215,13 +191,13 @@ AbstractFilesystemNode *PalmOSFilesystemNode::getParent() const {  	if (!_isPseudoRoot) {  		const char *start = _path.c_str(); -		const char *end = lastPathComponent(_path); +		const char *end = lastPathComponent(_path, '/');  		p = new PalmOSFilesystemNode();  		p->_path = String(start, end - start);  		p->_isValid = true;  		p->_isDirectory = true; -		p->_displayName = lastPathComponent(p->_path); +		p->_displayName = lastPathComponent(p->_path, '/');  		p->_isPseudoRoot =(p->_path == "/");  	} diff --git a/backends/fs/posix/posix-fs-factory.cpp b/backends/fs/posix/posix-fs-factory.cpp index 0a1160ff8f..da73738287 100644 --- a/backends/fs/posix/posix-fs-factory.cpp +++ b/backends/fs/posix/posix-fs-factory.cpp @@ -26,8 +26,6 @@  #include "backends/fs/posix/posix-fs-factory.h"  #include "backends/fs/posix/posix-fs.cpp" -DECLARE_SINGLETON(POSIXFilesystemFactory); -  AbstractFilesystemNode *POSIXFilesystemFactory::makeRootFileNode() const {  	return new POSIXFilesystemNode();  } @@ -38,7 +36,7 @@ AbstractFilesystemNode *POSIXFilesystemFactory::makeCurrentDirectoryFileNode() c  	return new POSIXFilesystemNode(buf, true);  } -AbstractFilesystemNode *POSIXFilesystemFactory::makeFileNodePath(const String &path) const { +AbstractFilesystemNode *POSIXFilesystemFactory::makeFileNodePath(const Common::String &path) const {  	return new POSIXFilesystemNode(path, true);  }  #endif diff --git a/backends/fs/posix/posix-fs-factory.h b/backends/fs/posix/posix-fs-factory.h index d8eecda6ef..c697679814 100644 --- a/backends/fs/posix/posix-fs-factory.h +++ b/backends/fs/posix/posix-fs-factory.h @@ -25,7 +25,6 @@  #ifndef POSIX_FILESYSTEM_FACTORY_H  #define POSIX_FILESYSTEM_FACTORY_H -#include "common/singleton.h"  #include "backends/fs/fs-factory.h"  /** @@ -33,19 +32,10 @@   *   * Parts of this class are documented in the base interface class, FilesystemFactory.   */ -class POSIXFilesystemFactory : public FilesystemFactory, public Common::Singleton<POSIXFilesystemFactory> { -public: -	typedef Common::String String; - +class POSIXFilesystemFactory : public FilesystemFactory {  	virtual AbstractFilesystemNode *makeRootFileNode() const;  	virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; -	virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; - -protected: -	POSIXFilesystemFactory() {}; - -private: -	friend class Common::Singleton<SingletonBaseType>; +	virtual AbstractFilesystemNode *makeFileNodePath(const Common::String &path) const;  };  #endif /*POSIX_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp index 10782a9057..5cd6a909d6 100644 --- a/backends/fs/posix/posix-fs.cpp +++ b/backends/fs/posix/posix-fs.cpp @@ -24,85 +24,18 @@  #if defined(UNIX) -#include "backends/fs/abstract-fs.h" +#include "backends/fs/posix/posix-fs.h" -#ifdef MACOSX -#include <sys/types.h> -#endif  #include <sys/param.h>  #include <sys/stat.h>  #include <dirent.h>  #include <stdio.h> -#include <unistd.h> -/** - * Implementation of the ScummVM file system API based on POSIX. - * - * Parts of this class are documented in the base interface class, AbstractFilesystemNode. - */ -class POSIXFilesystemNode : public AbstractFilesystemNode { -protected: -	Common::String _displayName; -	Common::String _path; -	bool _isDirectory; -	bool _isValid; - -public: -	/** -	 * Creates a POSIXFilesystemNode with the root node as path. -	 */ -	POSIXFilesystemNode(); - -	/** -	 * Creates a POSIXFilesystemNode for a given path. -	 * -	 * @param path String with the path the new node should point to. -	 * @param verify true if the isValid and isDirectory flags should be verified during the construction. -	 */ -	POSIXFilesystemNode(const Common::String &path, bool verify); - -	virtual bool exists() const { return access(_path.c_str(), F_OK) == 0; } -	virtual Common::String getDisplayName() const { return _displayName; } -	virtual Common::String getName() const { return _displayName; } -	virtual Common::String getPath() const { return _path; } -	virtual bool isDirectory() const { return _isDirectory; } -	virtual bool isReadable() const { return access(_path.c_str(), R_OK) == 0; } -	virtual bool isWritable() const { return access(_path.c_str(), W_OK) == 0; } - -	virtual AbstractFilesystemNode *getChild(const Common::String &n) const; -	virtual bool getChildren(AbstractFSList &list, ListMode mode, bool hidden) const; -	virtual AbstractFilesystemNode *getParent() const; - -private: -	/** -	 * Tests and sets the _isValid and _isDirectory flags, using the stat() function. -	 */ -	virtual void setFlags(); -}; - -/** - * Returns the last component of a given path. - * - * Examples: - *			/foo/bar.txt would return /bar.txt - *			/foo/bar/    would return /bar/ - * - * @param str String containing the path. - * @return Pointer to the first char of the last component inside str. - */ -const char *lastPathComponent(const Common::String &str) { -	if(str.empty()) -		return ""; - -	const char *start = str.c_str(); -	const char *cur = start + str.size() - 2; - -	while (cur >= start && *cur != '/') { -		--cur; -	} +#ifdef __OS2__ +#define INCL_DOS +#include <os2.h> +#endif -	return cur + 1; -}  void POSIXFilesystemNode::setFlags() {  	struct stat st; @@ -135,7 +68,7 @@ POSIXFilesystemNode::POSIXFilesystemNode(const Common::String &p, bool verify) {  		_path = p;  	} -	_displayName = lastPathComponent(_path); +	_displayName = lastPathComponent(_path, '/');  	if (verify) {  		setFlags(); @@ -158,6 +91,38 @@ AbstractFilesystemNode *POSIXFilesystemNode::getChild(const Common::String &n) c  bool POSIXFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, bool hidden) const {  	assert(_isDirectory); +#ifdef __OS2__ +    if (_path == "/") { +        ULONG ulDrvNum; +        ULONG ulDrvMap; + +        DosQueryCurrentDisk(&ulDrvNum, &ulDrvMap); + +        for (int i = 0; i < 26; i++) { +            if (ulDrvMap & 1) { +                char drive_root[4]; + +                drive_root[0] = i + 'A'; +                drive_root[1] = ':'; +                drive_root[2] = '/'; +                drive_root[3] = 0; + +                POSIXFilesystemNode entry; + +                entry._isDirectory = true; +                entry._isValid = true; +                entry._path = drive_root; +                entry._displayName = "[" + Common::String(drive_root, 2) + "]"; +                myList.push_back(new POSIXFilesystemNode(entry)); +            } + +            ulDrvMap >>= 1; +        } +         +        return true; +    } +#endif +  	DIR *dirp = opendir(_path.c_str());  	struct dirent *dp; @@ -234,9 +199,14 @@ AbstractFilesystemNode *POSIXFilesystemNode::getParent() const {  		return 0;  	const char *start = _path.c_str(); -	const char *end = lastPathComponent(_path); +	const char *end = lastPathComponent(_path, '/'); + +#ifdef __OS2__ +    if (end == start) +        return new POSIXFilesystemNode(); +#endif -	return new POSIXFilesystemNode(Common::String(start, end - start), true); +	return new POSIXFilesystemNode(Common::String(start, end), true);  }  #endif //#if defined(UNIX) diff --git a/backends/fs/posix/posix-fs.h b/backends/fs/posix/posix-fs.h new file mode 100644 index 0000000000..df50fc16af --- /dev/null +++ b/backends/fs/posix/posix-fs.h @@ -0,0 +1,80 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifndef POSIX_FILESYSTEM_H +#define POSIX_FILESYSTEM_H + +#include "backends/fs/abstract-fs.h" + +#ifdef MACOSX +#include <sys/types.h> +#endif +#include <unistd.h> + +/** + * Implementation of the ScummVM file system API based on POSIX. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. + */ +class POSIXFilesystemNode : public AbstractFilesystemNode { +protected: +	Common::String _displayName; +	Common::String _path; +	bool _isDirectory; +	bool _isValid; + +public: +	/** +	 * Creates a POSIXFilesystemNode with the root node as path. +	 */ +	POSIXFilesystemNode(); + +	/** +	 * Creates a POSIXFilesystemNode for a given path. +	 * +	 * @param path String with the path the new node should point to. +	 * @param verify true if the isValid and isDirectory flags should be verified during the construction. +	 */ +	POSIXFilesystemNode(const Common::String &path, bool verify); + +	virtual bool exists() const { return access(_path.c_str(), F_OK) == 0; } +	virtual Common::String getDisplayName() const { return _displayName; } +	virtual Common::String getName() const { return _displayName; } +	virtual Common::String getPath() const { return _path; } +	virtual bool isDirectory() const { return _isDirectory; } +	virtual bool isReadable() const { return access(_path.c_str(), R_OK) == 0; } +	virtual bool isWritable() const { return access(_path.c_str(), W_OK) == 0; } + +	virtual AbstractFilesystemNode *getChild(const Common::String &n) const; +	virtual bool getChildren(AbstractFSList &list, ListMode mode, bool hidden) const; +	virtual AbstractFilesystemNode *getParent() const; + +private: +	/** +	 * Tests and sets the _isValid and _isDirectory flags, using the stat() function. +	 */ +	virtual void setFlags(); +}; + +#endif /*POSIX_FILESYSTEM_H*/ diff --git a/backends/fs/ps2/ps2-fs.cpp b/backends/fs/ps2/ps2-fs.cpp index 782e97b959..b0f1ddbafb 100644 --- a/backends/fs/ps2/ps2-fs.cpp +++ b/backends/fs/ps2/ps2-fs.cpp @@ -100,28 +100,6 @@ public:  	virtual AbstractFilesystemNode *getParent() const;  }; -/** - * Returns the last component of a given path. - *  - * @param str String containing the path. - * @return Pointer to the first char of the last component inside str. - */ -const char *lastPathComponent(const Common::String &str) { -	if (str.empty()) -		return ""; - -	const char *start = str.c_str(); -	const char *cur = start + str.size() - 2; - -	while (cur >= start && *cur != '/' && *cur != ':') { -		--cur; -	} - -	printf("romeo : lastPathComponent = %s\n", cur + 1); - -	return cur + 1; -} -  Ps2FilesystemNode::Ps2FilesystemNode() {  	_isDirectory = true;  	_isRoot = true; diff --git a/backends/fs/psp/psp-fs.cpp b/backends/fs/psp/psp-fs.cpp index 3fe6060928..aa3e253782 100644 --- a/backends/fs/psp/psp-fs.cpp +++ b/backends/fs/psp/psp-fs.cpp @@ -71,30 +71,6 @@ public:  	virtual AbstractFilesystemNode *getParent() const;  }; -/** - * Returns the last component of a given path. - * - * Examples: - *			/foo/bar.txt would return /bar.txt - *			/foo/bar/    would return /bar/ - * - * @param str String containing the path. - * @return Pointer to the first char of the last component inside str. - */ -const char *lastPathComponent(const Common::String &str) { -	if(str.empty()) -		return ""; - -	const char *start = str.c_str(); -	const char *cur = start + str.size() - 2; - -	while (cur >= start && *cur != '/') { -		--cur; -	} - -	return cur + 1; -} -  PSPFilesystemNode::PSPFilesystemNode() {  	_isDirectory = true;  	_displayName = "Root"; @@ -106,7 +82,7 @@ PSPFilesystemNode::PSPFilesystemNode(const Common::String &p, bool verify) {  	assert(p.size() > 0);  	_path = p; -	_displayName = lastPathComponent(_path); +	_displayName = lastPathComponent(_path, '/');  	_isValid = true;  	_isDirectory = true; @@ -176,7 +152,7 @@ AbstractFilesystemNode *PSPFilesystemNode::getParent() const {  		return 0;  	const char *start = _path.c_str(); -	const char *end = lastPathComponent(_path); +	const char *end = lastPathComponent(_path, '/');  	return new PSPFilesystemNode(String(start, end - start), false);  } diff --git a/backends/fs/symbian/symbian-fs-factory.cpp b/backends/fs/symbian/symbian-fs-factory.cpp index 0a1bd62134..c31dfb594a 100644 --- a/backends/fs/symbian/symbian-fs-factory.cpp +++ b/backends/fs/symbian/symbian-fs-factory.cpp @@ -26,8 +26,6 @@  #include "backends/fs/symbian/symbian-fs-factory.h"  #include "backends/fs/symbian/symbian-fs.cpp" -DECLARE_SINGLETON(SymbianFilesystemFactory); -  AbstractFilesystemNode *SymbianFilesystemFactory::makeRootFileNode() const {  	return new SymbianFilesystemNode(true);  } @@ -38,7 +36,7 @@ AbstractFilesystemNode *SymbianFilesystemFactory::makeCurrentDirectoryFileNode()  	return new SymbianFilesystemNode(path);  } -AbstractFilesystemNode *SymbianFilesystemFactory::makeFileNodePath(const String &path) const { +AbstractFilesystemNode *SymbianFilesystemFactory::makeFileNodePath(const Common::String &path) const {  	return new SymbianFilesystemNode(path);  }  #endif diff --git a/backends/fs/symbian/symbian-fs-factory.h b/backends/fs/symbian/symbian-fs-factory.h index 502fba2930..ef5a231e72 100644 --- a/backends/fs/symbian/symbian-fs-factory.h +++ b/backends/fs/symbian/symbian-fs-factory.h @@ -25,7 +25,6 @@  #ifndef SYMBIAN_FILESYSTEM_FACTORY_H  #define SYMBIAN_FILESYSTEM_FACTORY_H -#include "common/singleton.h"  #include "backends/fs/fs-factory.h"  /** @@ -33,19 +32,11 @@   *   * Parts of this class are documented in the base interface class, FilesystemFactory.   */ -class SymbianFilesystemFactory : public FilesystemFactory, public Common::Singleton<SymbianFilesystemFactory> { +class SymbianFilesystemFactory : public FilesystemFactory {  public: -	typedef Common::String String; -  	virtual AbstractFilesystemNode *makeRootFileNode() const;  	virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; -	virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; - -protected: -	SymbianFilesystemFactory() {}; - -private: -	friend class Common::Singleton<SingletonBaseType>; +	virtual AbstractFilesystemNode *makeFileNodePath(const Common::String &path) const;  };  #endif /*SYMBIAN_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/symbian/symbian-fs.cpp b/backends/fs/symbian/symbian-fs.cpp index 85fc58179a..af963dda0c 100644 --- a/backends/fs/symbian/symbian-fs.cpp +++ b/backends/fs/symbian/symbian-fs.cpp @@ -24,6 +24,7 @@  #if defined (__SYMBIAN32__)  #include "backends/fs/abstract-fs.h" +#include "backends/platform/symbian/src/SymbianOS.h"  #include <dirent.h>  #include <eikenv.h> @@ -62,7 +63,7 @@ public:  		TFileName fname;  		TPtrC8 ptr((const unsigned char*)_path.c_str(),_path.size());  		fname.Copy(ptr); -		TBool fileExists = BaflUtils::FileExists(CEikonEnv::Static()->FsSession(), fname); +		TBool fileExists = BaflUtils::FileExists(static_cast<OSystem_SDL_Symbian*>(g_system)->FsSession(), fname);  		return fileExists;  	}  	virtual String getDisplayName() const { return _displayName; } @@ -78,30 +79,6 @@ public:  };  /** - * Returns the last component of a given path. - * - * Examples: - *			c:\foo\bar.txt would return "\bar.txt" - *			c:\foo\bar\    would return "\bar\" - * - * @param str Path to obtain the last component from. - * @return Pointer to the first char of the last component inside str. - */ -const char *lastPathComponent(const Common::String &str) { -	if(str.empty()) -		return ""; - -	const char *start = str.c_str(); -	const char *cur = start + str.size() - 2; - -	while (cur >= start && *cur != '\\') { -		--cur; -	} - -	return cur + 1; -} - -/**   * Fixes the path by changing all slashes to backslashes.   *   * @param path String with the path to be fixed. @@ -135,14 +112,14 @@ SymbianFilesystemNode::SymbianFilesystemNode(const String &path) {  	fixFilePath(_path); -	_displayName = lastPathComponent(_path); +	_displayName = lastPathComponent(_path, '\\');  	TEntry fileAttribs;  	TFileName fname;  	TPtrC8 ptr((const unsigned char*)_path.c_str(),_path.size());  	fname.Copy(ptr); -	if (CEikonEnv::Static()->FsSession().Entry(fname, fileAttribs) == KErrNone) { +	if (static_cast<OSystem_SDL_Symbian*>(g_system)->FsSession().Entry(fname, fileAttribs) == KErrNone) {  		_isValid = true;  		_isDirectory = fileAttribs.IsDir();  	} else { @@ -163,7 +140,7 @@ AbstractFilesystemNode *SymbianFilesystemNode::getChild(const String &n) const {  	TFileName fname;  	fname.Copy(ptr);  	TBool isFolder = EFalse; -	BaflUtils::IsFolder(CEikonEnv::Static()->FsSession(), fname, isFolder); +	BaflUtils::IsFolder(static_cast<OSystem_SDL_Symbian*>(g_system)->FsSession(), fname, isFolder);  	if (!isFolder)  		return 0; @@ -177,7 +154,7 @@ bool SymbianFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, b  	if (_isPseudoRoot) {  		// Drives enumeration -		RFs fs = CEikonEnv::Static()->FsSession(); +		RFs& fs = static_cast<OSystem_SDL_Symbian*>(g_system)->FsSession();  		TInt driveNumber;  		TChar driveLetter;  		TUint driveLetterValue; @@ -218,7 +195,7 @@ bool SymbianFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, b  		fname.Copy(ptr);  		TBuf8<256>nameBuf;  		CDir* dirPtr; -		if (CEikonEnv::Static()->FsSession().GetDir(fname,KEntryAttNormal|KEntryAttDir,0,dirPtr)==KErrNone) { +		if (static_cast<OSystem_SDL_Symbian*>(g_system)->FsSession().GetDir(fname,KEntryAttNormal|KEntryAttDir,0,dirPtr)==KErrNone) {  			CleanupStack::PushL(dirPtr);  			TInt cnt=dirPtr->Count();  			for (TInt loop=0;loop<cnt;loop++) { @@ -256,12 +233,12 @@ AbstractFilesystemNode *SymbianFilesystemNode::getParent() const {  	if (!_isPseudoRoot && _path.size() > 3) {  		p = new SymbianFilesystemNode(false);  		const char *start = _path.c_str(); -		const char *end = lastPathComponent(_path); +		const char *end = lastPathComponent(_path, '\\');  		p->_path = String(start, end - start);  		p->_isValid = true;  		p->_isDirectory = true; -		p->_displayName = lastPathComponent(p->_path); +		p->_displayName = lastPathComponent(p->_path, '\\');  	}  	else  	{ diff --git a/backends/fs/wii/wii-fs.cpp b/backends/fs/wii/wii-fs.cpp index e6d0cf4c7e..4272ffb380 100644 --- a/backends/fs/wii/wii-fs.cpp +++ b/backends/fs/wii/wii-fs.cpp @@ -71,30 +71,6 @@ private:  	virtual void setFlags();  }; -/** - * Returns the last component of a given path. - * - * Examples: - *						/foo/bar.txt would return /bar.txt - *						/foo/bar/	 would return /bar/ - * - * @param str String containing the path. - * @return Pointer to the first char of the last component inside str. - */ -const char *lastPathComponent(const Common::String &str) { -	if(str.empty()) -		return ""; - -	const char *start = str.c_str(); -	const char *cur = start + str.size() - 2; - -	while (cur >= start && *cur != '/') { -		--cur; -	} - -	return cur + 1; -} -  void WiiFilesystemNode::setFlags() {  	struct stat st; @@ -123,7 +99,7 @@ WiiFilesystemNode::WiiFilesystemNode(const String &p, bool verify) {  	_path = p; -	_displayName = lastPathComponent(_path); +	_displayName = lastPathComponent(_path, '/');  	if (verify)  		setFlags(); @@ -187,7 +163,7 @@ AbstractFilesystemNode *WiiFilesystemNode::getParent() const {  		return 0;  	const char *start = _path.c_str(); -	const char *end = lastPathComponent(_path); +	const char *end = lastPathComponent(_path, '/');  	return new WiiFilesystemNode(String(start, end - start), true);  } diff --git a/backends/fs/windows/windows-fs-factory.cpp b/backends/fs/windows/windows-fs-factory.cpp index 7fbf4f7fff..ed273bb746 100644 --- a/backends/fs/windows/windows-fs-factory.cpp +++ b/backends/fs/windows/windows-fs-factory.cpp @@ -26,8 +26,6 @@  #include "backends/fs/windows/windows-fs-factory.h"  #include "backends/fs/windows/windows-fs.cpp" -DECLARE_SINGLETON(WindowsFilesystemFactory); -  AbstractFilesystemNode *WindowsFilesystemFactory::makeRootFileNode() const {  	return new WindowsFilesystemNode();  } @@ -36,7 +34,7 @@ AbstractFilesystemNode *WindowsFilesystemFactory::makeCurrentDirectoryFileNode()  	return new WindowsFilesystemNode("", true);  } -AbstractFilesystemNode *WindowsFilesystemFactory::makeFileNodePath(const String &path) const { +AbstractFilesystemNode *WindowsFilesystemFactory::makeFileNodePath(const Common::String &path) const {  	return new WindowsFilesystemNode(path, false);  }  #endif diff --git a/backends/fs/windows/windows-fs-factory.h b/backends/fs/windows/windows-fs-factory.h index 0745b286a8..3c7b80942d 100644 --- a/backends/fs/windows/windows-fs-factory.h +++ b/backends/fs/windows/windows-fs-factory.h @@ -25,7 +25,6 @@  #ifndef WINDOWS_FILESYSTEM_FACTORY_H  #define WINDOWS_FILESYSTEM_FACTORY_H -#include "common/singleton.h"  #include "backends/fs/fs-factory.h"  /** @@ -33,19 +32,11 @@   *   * Parts of this class are documented in the base interface class, FilesystemFactory.   */ -class WindowsFilesystemFactory : public FilesystemFactory, public Common::Singleton<WindowsFilesystemFactory> { +class WindowsFilesystemFactory : public FilesystemFactory {  public: -	typedef Common::String String; -  	virtual AbstractFilesystemNode *makeRootFileNode() const;  	virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; -	virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; - -protected: -	WindowsFilesystemFactory() {}; - -private: -	friend class Common::Singleton<SingletonBaseType>; +	virtual AbstractFilesystemNode *makeFileNodePath(const Common::String &path) const;  };  #endif /*WINDOWS_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/windows/windows-fs.cpp b/backends/fs/windows/windows-fs.cpp index 2105317a96..b06581047c 100644 --- a/backends/fs/windows/windows-fs.cpp +++ b/backends/fs/windows/windows-fs.cpp @@ -135,30 +135,6 @@ private:  	static const TCHAR* toUnicode(const char *str);  }; -/** - * Returns the last component of a given path. - * - * Examples: - *			c:\foo\bar.txt would return "\bar.txt" - *			c:\foo\bar\    would return "\bar\" - * - * @param str Path to obtain the last component from. - * @return Pointer to the first char of the last component inside str. - */ -const char *lastPathComponent(const Common::String &str) { -	if(str.empty()) -		return ""; - -	const char *start = str.c_str(); -	const char *cur = start + str.size() - 2; - -	while (cur >= start && *cur != '\\') { -		--cur; -	} - -	return cur + 1; -} -  void WindowsFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const char *base, WIN32_FIND_DATA* find_data) {  	WindowsFilesystemNode entry;  	char *asciiName = toAscii(find_data->cFileName); @@ -232,7 +208,7 @@ WindowsFilesystemNode::WindowsFilesystemNode(const String &p, const bool current  		_path = p;  	} -	_displayName = lastPathComponent(_path); +	_displayName = lastPathComponent(_path, '\\');  	// Check whether it is a directory, and whether the file actually exists  	DWORD fileAttribs = GetFileAttributes(toUnicode(_path.c_str())); @@ -322,13 +298,13 @@ AbstractFilesystemNode *WindowsFilesystemNode::getParent() const {  	WindowsFilesystemNode *p = new WindowsFilesystemNode();  	if (_path.size() > 3) {  		const char *start = _path.c_str(); -		const char *end = lastPathComponent(_path); +		const char *end = lastPathComponent(_path, '\\');  		p = new WindowsFilesystemNode();  		p->_path = String(start, end - start);  		p->_isValid = true;  		p->_isDirectory = true; -		p->_displayName = lastPathComponent(p->_path); +		p->_displayName = lastPathComponent(p->_path, '\\');  		p->_isPseudoRoot = false;  	} diff --git a/backends/midi/seq.cpp b/backends/midi/seq.cpp index 57a5a1ea32..9e86181674 100644 --- a/backends/midi/seq.cpp +++ b/backends/midi/seq.cpp @@ -28,7 +28,7 @@   *    both the QuickTime support and (vkeybd http://www.alsa-project.org/~iwai/alsa.html)   */ -#if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) +#if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__)  #include "common/util.h"  #include "sound/musicplugin.h" diff --git a/backends/midi/stmidi.cpp b/backends/midi/stmidi.cpp new file mode 100644 index 0000000000..addb23c6bd --- /dev/null +++ b/backends/midi/stmidi.cpp @@ -0,0 +1,155 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001  Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * + * 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. + */ + +/*   + * Raw MIDI output for the Atari ST line of computers. + * Based on the ScummVM SEQ & CoreMIDI drivers.   + * Atari code by Keith Scroggins + * We, unfortunately, could not use the SEQ driver because the /dev/midi under + * FreeMiNT (and hence in libc) is considered to be a serial port for machine + * access.  So, we just use OS calls then to send the data to the MIDI ports + * directly.  The current implementation is sending 1 byte at a time because + * in most cases we are only sending up to 3 bytes, I believe this saves a few + * cycles.  I might change so sysex messages are sent the other way later. + */ + +#if defined __MINT__ + +#include <osbind.h> +#include "sound/mpu401.h" +#include "common/util.h" +#include "sound/musicplugin.h" + +class MidiDriver_STMIDI : public MidiDriver_MPU401 { +public: +        MidiDriver_STMIDI() : _isOpen (false) { } +	int open(); +	void close(); +	void send(uint32 b); +	void sysEx(const byte *msg, uint16 length); + +private: +	bool _isOpen; +}; + +int MidiDriver_STMIDI::open() { +	if ((_isOpen) && (!Bcostat(4))) +		return MERR_ALREADY_OPEN; +	warning("ST Midi Port Open"); +	_isOpen = true; +	return 0; +} + +void MidiDriver_STMIDI::close() { +	MidiDriver_MPU401::close(); +	_isOpen = false; +} + +void MidiDriver_STMIDI::send(uint32 b) { + +	byte status_byte = (b & 0x000000FF); +	byte first_byte = (b & 0x0000FF00) >> 8; +	byte second_byte = (b & 0x00FF0000) >> 16; + +//	warning("ST MIDI Packet sent"); + +	switch (b & 0xF0) { +	case 0x80:	// Note Off +	case 0x90:	// Note On +	case 0xA0:	// Polyphonic Key Pressure +	case 0xB0:	// Controller +	case 0xE0:	// Pitch Bend +		Bconout(3, status_byte); +		Bconout(3, first_byte); +		Bconout(3, second_byte); +		break; +	case 0xC0:	// Program Change +	case 0xD0:	// Aftertouch +		Bconout(3, status_byte); +		Bconout(3, first_byte); +		break; +	default: +		fprintf(stderr, "Unknown : %08x\n", (int)b); +		break; +	} +} + +void MidiDriver_STMIDI::sysEx (const byte *msg, uint16 length) { +	if (length > 254) { +		warning ("Cannot send SysEx block - data too large"); +		return; +	} + +	const byte *chr = msg; +	warning("Sending SysEx Message"); + +	Bconout(3, '0xF0'); +	for (; length; --length, ++chr) { +		Bconout(3,((unsigned char) *chr & 0x7F)); +	} +	Bconout(3, '0xF7'); +} + +// Plugin interface + +class StMidiMusicPlugin : public MusicPluginObject { +public: +        const char *getName() const { +                return "STMIDI"; +        } + +        const char *getId() const { +                return "stmidi"; +        } + +        MusicDevices getDevices() const; +        PluginError createInstance(Audio::Mixer *mixer, MidiDriver **mididriver) + const; +}; + +MusicDevices StMidiMusicPlugin::getDevices() const { +        MusicDevices devices; +        // TODO: Return a different music type depending on the configuration +        // TODO: List the available devices +        devices.push_back(MusicDevice(this, "", MT_GM)); +        return devices; +} + +PluginError StMidiMusicPlugin::createInstance(Audio::Mixer *mixer, MidiDriver **mididriver) const { +        *mididriver = new MidiDriver_STMIDI(); + +        return kNoError; +} + +MidiDriver *MidiDriver_STMIDI_create(Audio::Mixer *mixer) { +        MidiDriver *mididriver; + +        StMidiMusicPlugin p; +        p.createInstance(mixer, &mididriver); + +        return mididriver; +} + +//#if PLUGIN_ENABLED_DYNAMIC(STMIDI) +        //REGISTER_PLUGIN_DYNAMIC(STMIDI, PLUGIN_TYPE_MUSIC, StMidiMusicPlugin); +//#else +        REGISTER_PLUGIN_STATIC(STMIDI, PLUGIN_TYPE_MUSIC, StMidiMusicPlugin); +//#endif + +#endif diff --git a/backends/module.mk b/backends/module.mk index 6642a3a281..9e66fba4af 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -1,6 +1,7 @@  MODULE := backends  MODULE_OBJS := \ +	fs/abstract-fs.o \  	fs/amigaos4/amigaos4-fs-factory.o \  	fs/ds/ds-fs-factory.o \  	fs/palmos/palmos-fs-factory.o \ @@ -17,6 +18,7 @@ MODULE_OBJS := \  	midi/coremidi.o \  	midi/quicktime.o \  	midi/seq.o \ +	midi/stmidi.o \  	midi/timidity.o \  	midi/dmedia.o \  	midi/windows.o \ diff --git a/backends/platform/dc/Makefile b/backends/platform/dc/Makefile index 56848504e1..db5861903b 100644 --- a/backends/platform/dc/Makefile +++ b/backends/platform/dc/Makefile @@ -75,7 +75,7 @@ SCUMMVM.BIN : scummvm.bin  plugin_dist :  	for p in plugins/*.plg; do \ -	  sh-elf-strip -g -o "`basename \"$$p\" | tr '[:lower:]' '[:upper:]'`" "$$p"; \ +	  sh-elf-strip -g -o "`basename \"$$p\" | LC_CTYPE=C tr '[:lower:]' '[:upper:]'`" "$$p"; \  	done  dist : SCUMMVM.BIN plugins plugin_dist diff --git a/backends/platform/dc/dc-fs.cpp b/backends/platform/dc/dc-fs.cpp index f4dc4037df..0da77e317e 100644 --- a/backends/platform/dc/dc-fs.cpp +++ b/backends/platform/dc/dc-fs.cpp @@ -34,18 +34,15 @@   *   * Parts of this class are documented in the base interface class, AbstractFilesystemNode.   */ - -/* A file */  class RoninCDFileNode : public AbstractFilesystemNode {  protected:  	String _path; -	static const char *lastPathComponent(const Common::String &str);  public:  	RoninCDFileNode(const String &path) : _path(path) {};  	virtual bool exists() const { return true; } -	virtual String getName() const { return lastPathComponent(_path); } +	virtual String getName() const { return lastPathComponent(_path, '/'); }  	virtual String getPath() const { return _path; }  	virtual bool isDirectory() const { return false; }  	virtual bool isReadable() const { return true; } @@ -61,7 +58,7 @@ public:  /* A directory */  class RoninCDDirectoryNode : public RoninCDFileNode {  public: -        RoninCDDirectoryNode(const String &path) : RoninCDFileNode(path) {}; +	RoninCDDirectoryNode(const String &path) : RoninCDFileNode(path) {};  	virtual bool isDirectory() const { return true; }  	virtual AbstractFilesystemNode *getChild(const String &n) const; @@ -77,32 +74,7 @@ public:  	virtual bool isReadable() const { return false; }  }; -/** - * Returns the last component of a given path. - * - * Examples: - *			/foo/bar.txt would return /bar.txt - *			/foo/bar/    would return /bar/ - * - * @param str String containing the path. - * @return Pointer to the first char of the last component inside str. - */ -const char *RoninCDFileNode::lastPathComponent(const Common::String &str) { -	if(str.empty()) -		return ""; - -	const char *start = str.c_str(); -	const char *cur = start + str.size() - 2; - -	while (cur >= start && *cur != '/') { -		--cur; -	} - -	return cur + 1; -} - -AbstractFilesystemNode *RoninCDFileNode::makeFileNodePath(const Common::String &path) -{ +AbstractFilesystemNode *RoninCDFileNode::makeFileNodePath(const Common::String &path) {  	assert(path.size() > 0);  	int fd; @@ -110,12 +82,10 @@ AbstractFilesystemNode *RoninCDFileNode::makeFileNodePath(const Common::String &  	if ((fd = open(path.c_str(), O_RDONLY)) >= 0) {  		close(fd);  		return new RoninCDFileNode(path); -	} -	else if ((fd = open(path.c_str(), O_DIR|O_RDONLY)) >= 0) { +	} else if ((fd = open(path.c_str(), O_DIR|O_RDONLY)) >= 0) {  		close(fd);  		return new RoninCDDirectoryNode(path);		 -	} -	else { +	} else {  		return NULL;  	}  } @@ -168,7 +138,7 @@ AbstractFilesystemNode *RoninCDFileNode::getParent() const {  		return 0;  	const char *start = _path.c_str(); -	const char *end = lastPathComponent(_path); +	const char *end = lastPathComponent(_path, '/');  	return new RoninCDDirectoryNode(String(start, end - start));  } diff --git a/backends/platform/ds/arm9/source/blitters_arm.s b/backends/platform/ds/arm9/source/blitters_arm.s index 5f7df298b4..48ec316675 100644 --- a/backends/platform/ds/arm9/source/blitters_arm.s +++ b/backends/platform/ds/arm9/source/blitters_arm.s @@ -20,149 +20,12 @@  @  @ @author Robin Watts (robin@wss.co.uk) -	.global	asmDrawStripToScreen -	.global	asmCopy8Col  	.global	Rescale_320x256xPAL8_To_256x256x1555  	.global	Rescale_320x256x1555_To_256x256x1555  	.section .itcm,"ax", %progbits  	.align 2  	.code 32 -	@ ARM implementation of asmDrawStripToScreen. -	@ -	@ C prototype would be: -	@ -	@ extern "C" void asmDrawStripToScreen(int         height, -	@                                      int         width, -	@                                      byte const *text, -	@                                      byte const *src, -	@                                      byte       *dst, -	@                                      int         vsPitch, -	@                                      int         vsScreenWidth, -	@                                      int         textSurfacePitch); -	@ -	@ In addition, we assume that text, src and dst are all word (4 byte) -	@ aligned. This is the same assumption that the old 'inline' version -	@ made. -asmDrawStripToScreen: -	@ r0 = height -	@ r1 = width -	@ r2 = text -	@ r3 = src -	MOV	r12,r13 -	STMFD	r13!,{r4-r7,r9-r11,R14} -	LDMIA	r12,{r4,r5,r6,r7} -	@ r4 = dst -	@ r5 = vsPitch -	@ r6 = vmScreenWidth -	@ r7 = textSurfacePitch - -	CMP	r0,#0			@ If height<=0 -	MOVLE	r0,#1			@    height=1 -	CMP	r1,#4			@ If width<4 -	BLT	end			@    return - -	@ Width &= ~4 ? What's that about then? Width &= ~3 I could have -	@ understood... -	BIC	r1,r1,#4 - -	SUB	r5,r5,r1		@ vsPitch          -= width -	SUB	r6,r6,r1		@ vmScreenWidth    -= width -	SUB	r7,r7,r1		@ textSurfacePitch -= width -	MOV	r10,#253 -	ORR	r10,r10,r10,LSL #8 -	ORR	r10,r10,r10,LSL #16	@ r10 = mask -yLoop: -	MOV	r14,r1			@ r14 = width -xLoop: -	LDR	r12,[r2],#4		@ r12 = [text] -	LDR	r11,[r3],#4		@ r11 = [src] -	CMP	r12,r10 -	BNE	singleByteCompare -	SUBS	r14,r14,#4 -	STR	r11,[r4], #4		@ r4 = [dst] -	BGT	xLoop - -	ADD	r2,r2,r7		@ text += textSurfacePitch -	ADD	r3,r3,r5		@ src  += vsPitch -	ADD	r4,r4,r6		@ dst  += vmScreenWidth -	SUBS	r0,r0,#1 -	BGT	yLoop -	LDMFD	r13!,{r4-r7,r9-r11,PC} - -singleByteCompare: -	MOV	r9,r12,LSR #24		@ r9 = 1st byte of [text] -	CMP	r9,r10,LSR #24		@ if (r9 == mask) -	MOVEQ	r9,r11,LSR #24		@     r9 = 1st byte of [src] -	ORR	r12,r9,r12,LSL #8	@ r12 = combine r9 and r12 - -	MOV	r9,r12,LSR #24		@ r9 = 1st byte of [text] -	CMP	r9,r10,LSR #24		@ if (r9 == mask) -	MOVEQ	r9,r11,LSR #24		@     r9 = 1st byte of [src] -	ORR	r12,r9,r12,LSL #8	@ r12 = combine r9 and r12 - -	MOV	r9,r12,LSR #24		@ r9 = 1st byte of [text] -	CMP	r9,r10,LSR #24		@ if (r9 == mask) -	MOVEQ	r9,r11,LSR #24		@     r9 = 1st byte of [src] -	ORR	r12,r9,r12,LSL #8	@ r12 = combine r9 and r12 - -	MOV	r9,r12,LSR #24		@ r9 = 1st byte of [text] -	CMP	r9,r10,LSR #24		@ if (r9 == mask) -	MOVEQ	r9,r11,LSR #24		@     r9 = 1st byte of [src] -	ORR	r12,r9,r12,LSL #8	@ r12 = combine r9 and r12 - -	STR	r12,[r4],#4 -	SUBS	r14,r14,#4 -	BGT	xLoop - -	ADD	r2,r2,r7		@ text += textSurfacePitch -	ADD	r3,r3,r5		@ src  += vsPitch -	ADD	r4,r4,r6		@ dst  += vmScreenWidth -	SUBS	r0,r0,#1 -	BGT	yLoop -end: -	LDMFD	r13!,{r4-r7,r9-r11,PC} - - -	@ ARM implementation of asmCopy8Col -	@ -	@ C prototype would be: -	@ -	@ extern "C" void asmCopy8Col(byte       *dst, -	@                             int         dstPitch, -	@                             const byte *src, -	@                             int         height); -	@ -	@ In addition, we assume that src and dst are both word (4 byte) -	@ aligned. This is the same assumption that the old 'inline' version -	@ made. -asmCopy8Col: -	@ r0 = dst -	@ r1 = dstPitch -	@ r2 = src -	@ r3 = height -	STMFD	r13!,{r14} -	SUB	r1,r1,#4 - -	TST	r3,#1 -	ADDNE   r3,r3,#1 -	BNE	roll2 -yLoop2: -	LDR	r12,[r2],#4 -	LDR	r14,[r2],r1 -	STR	r12,[r0],#4 -	STR	r14,[r0],r1 -roll2: -	LDR	r12,[r2],#4 -	LDR	r14,[r2],r1 -	SUBS	r3,r3,#2 -	STR	r12,[r0],#4 -	STR	r14,[r0],r1 -	BNE	yLoop2 - -	LDMFD	r13!,{PC} - -  	@ ARM implementation of Rescale_320x256x1555_To_256x256x1555  	@  	@ C prototype would be: diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp index 5c3b87309d..9abaa3c6fb 100644 --- a/backends/platform/sdl/sdl.cpp +++ b/backends/platform/sdl/sdl.cpp @@ -196,6 +196,7 @@ OSystem_SDL::OSystem_SDL()  	_soundMutex(0), _soundCond(0), _soundThread(0),  	_soundThreadIsRunning(false), _soundThreadShouldQuit(false),  #endif +	_fsFactory(0),  	_savefile(0),  	_mixer(0),  	_timer(0), @@ -213,6 +214,19 @@ OSystem_SDL::OSystem_SDL()  	memset(&_mouseCurState, 0, sizeof(_mouseCurState));  	_inited = false; + + +	#if defined(__amigaos4__) +		_fsFactory = new AmigaOSFilesystemFactory(); +	#elif defined(UNIX) +		_fsFactory = new POSIXFilesystemFactory(); +	#elif defined(WIN32) +		_fsFactory = new WindowsFilesystemFactory(); +	#elif defined(__SYMBIAN32__) +		// Do nothing since its handled by the Symbian SDL inheritance +	#else +		#error Unknown and unsupported FS backend +	#endif  }  OSystem_SDL::~OSystem_SDL() { @@ -254,17 +268,8 @@ Common::SaveFileManager *OSystem_SDL::getSavefileManager() {  }  FilesystemFactory *OSystem_SDL::getFilesystemFactory() { -	#if defined(__amigaos4__) -		return &AmigaOSFilesystemFactory::instance();	 -	#elif defined(UNIX) -		return &POSIXFilesystemFactory::instance(); -	#elif defined(WIN32) -		return &WindowsFilesystemFactory::instance(); -	#elif defined(__SYMBIAN32__) -		// Do nothing since its handled by the Symbian SDL inheritance -	#else -		#error Unknown and unsupported backend in OSystem_SDL::getFilesystemFactory -	#endif +	assert(_fsFactory); +	return _fsFactory;  }  static Common::String getDefaultConfigFileName() { @@ -292,20 +297,19 @@ static Common::String getDefaultConfigFileName() {  		CreateDirectory(configFile, NULL);  		strcat(configFile, "\\" DEFAULT_CONFIG_FILE); -		if (fopen(configFile, "r") == NULL) { +		FILE *tmp = NULL; +		if ((tmp = fopen(configFile, "r")) == NULL) {  			// Check windows directory  			char oldConfigFile[MAXPATHLEN];  			GetWindowsDirectory(oldConfigFile, MAXPATHLEN);  			strcat(oldConfigFile, "\\" DEFAULT_CONFIG_FILE); -			if (fopen(oldConfigFile, "r")) { -				printf("The default location of the config file (scummvm.ini) in ScummVM has changed,\n"); -				printf("under Windows NT4/2000/XP/Vista. You may want to consider moving your config\n"); -				printf("file from the old default location:\n"); -				printf("%s\n", oldConfigFile); -				printf("to the new default location:\n"); -				printf("%s\n\n", configFile); +			if ((tmp = fopen(oldConfigFile, "r"))) {  				strcpy(configFile, oldConfigFile); + +				fclose(tmp);  			} +		} else { +			fclose(tmp);  		}  	} else {  		// Check windows directory @@ -334,23 +338,13 @@ static Common::String getDefaultConfigFileName() {  }  Common::SeekableReadStream *OSystem_SDL::openConfigFileForReading() { -	Common::File *confFile = new Common::File(); -	assert(confFile); -	if (!confFile->open(getDefaultConfigFileName())) { -		delete confFile; -		confFile = 0; -	} -	return confFile; +	FilesystemNode file(getDefaultConfigFileName()); +	return file.openForReading();  }  Common::WriteStream *OSystem_SDL::openConfigFileForWriting() { -	Common::DumpFile *confFile = new Common::DumpFile(); -	assert(confFile); -	if (!confFile->open(getDefaultConfigFileName())) { -		delete confFile; -		confFile = 0; -	} -	return confFile; +	FilesystemNode file(getDefaultConfigFileName()); +	return file.openForWriting();  }  void OSystem_SDL::setWindowCaption(const char *caption) { @@ -435,15 +429,21 @@ void OSystem_SDL::quit() {  }  void OSystem_SDL::setupIcon() { -	int w, h, ncols, nbytes, i; -	unsigned int rgba[256], icon[32 * 32]; -	unsigned char mask[32][4]; +	int x, y, w, h, ncols, nbytes, i; +	unsigned int rgba[256]; +        unsigned int *icon;  	sscanf(scummvm_icon[0], "%d %d %d %d", &w, &h, &ncols, &nbytes); -	if ((w != 32) || (h != 32) || (ncols > 255) || (nbytes > 1)) { -		warning("Could not load the icon (%d %d %d %d)", w, h, ncols, nbytes); +	if ((w > 512) || (h > 512) || (ncols > 255) || (nbytes > 1)) { +		warning("Could not load the built-in icon (%d %d %d %d)", w, h, ncols, nbytes); +		return; +	} +	icon = (unsigned int*)malloc(w*h*sizeof(unsigned int)); +	if (!icon) { +		warning("Could not allocate temp storage for the built-in icon");  		return;  	} +  	for (i = 0; i < ncols; i++) {  		unsigned char code;  		char color[32]; @@ -457,26 +457,27 @@ void OSystem_SDL::setupIcon() {  			sscanf(color + 1, "%06x", &col);  			col |= 0xFF000000;  		} else { -			warning("Could not load the icon (%d %s - %s) ", code, color, scummvm_icon[1 + i]); +			warning("Could not load the built-in icon (%d %s - %s) ", code, color, scummvm_icon[1 + i]); +			free(icon);  			return;  		}  		rgba[code] = col;  	} -	memset(mask, 0, sizeof(mask)); -	for (h = 0; h < 32; h++) { -		const char *line = scummvm_icon[1 + ncols + h]; -		for (w = 0; w < 32; w++) { -			icon[w + 32 * h] = rgba[(int)line[w]]; -			if (rgba[(int)line[w]] & 0xFF000000) { -				mask[h][w >> 3] |= 1 << (7 - (w & 0x07)); -			} +	for (y = 0; y < h; y++) { +		const char *line = scummvm_icon[1 + ncols + y]; +		for (x = 0; x < w; x++) { +			icon[x + w * y] = rgba[(int)line[x]];  		}  	} -	SDL_Surface *sdl_surf = SDL_CreateRGBSurfaceFrom(icon, 32, 32, 32, 32 * 4, 0xFF0000, 0x00FF00, 0x0000FF, 0xFF000000); -	SDL_WM_SetIcon(sdl_surf, (unsigned char *) mask); +	SDL_Surface *sdl_surf = SDL_CreateRGBSurfaceFrom(icon, w, h, 32, w * 4, 0xFF0000, 0x00FF00, 0x0000FF, 0xFF000000); +	if (!sdl_surf) { +		warning("SDL_CreateRGBSurfaceFrom(icon) failed"); +	} +	SDL_WM_SetIcon(sdl_surf, NULL);  	SDL_FreeSurface(sdl_surf); +	free(icon);  }  OSystem::MutexRef OSystem_SDL::createMutex(void) { diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 1c1381ec5c..d07dcee679 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -400,14 +400,13 @@ protected:  	void deinitThreadedMixer();  #endif - +	FilesystemFactory *_fsFactory;  	Common::SaveFileManager *_savefile;  	Audio::MixerImpl *_mixer;  	SDL_TimerID _timerID;  	Common::TimerManager *_timer; -  protected:  	void addDirtyRgnAuto(const byte *buf);  	void makeChecksums(const byte *buf); diff --git a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl index 12e5f8f0c4..d575a1de38 100644 --- a/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl +++ b/backends/platform/symbian/BuildPackageUpload_LocalSettings.pl @@ -3,10 +3,10 @@  	@WorkingEngines = qw(  		scumm agos sky queen gob saga drascula  -		kyra lure agi touche parallaction  +		kyra lure agi touche parallaction cine  	);  	@TestingEngines = qw( -		cruise igor made m4 cine 		 +		cruise igor made m4  	);  	@BrokenEngines = qw(  		sword1 diff --git a/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v1.pkg b/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v1.pkg index 67d9d83160..bf3c69ae08 100644 --- a/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v1.pkg +++ b/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v1.pkg @@ -16,7 +16,7 @@  ; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  ;  ; $URL:$ -; $Id$ +; $Id:$  ;  ; diff --git a/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v2.pkg b/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v2.pkg index 3afb7a094c..3f88ec918c 100644 --- a/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v2.pkg +++ b/backends/platform/symbian/S60/scummvm-CVS-SymbianS60v2.pkg @@ -52,6 +52,7 @@  "..\..\..\..\dists\engine-data\sky.cpt"-"!:\system\apps\scummvm\sky.cpt"  "..\..\..\..\dists\engine-data\igor.tbl"-"!:\system\apps\scummvm\igor.tbl"  "..\..\..\..\dists\engine-data\lure.dat"-"!:\system\apps\scummvm\lure.dat" +"..\..\..\..\dists\engine-data\drascula.dat"-"!:\system\apps\scummvm\drascula.dat"  ; Config/log files: 'empty' will automagically be removed on uninstall  ""-"!:\system\apps\ScummVM\scummvm.ini",FILENULL diff --git a/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg index 32df2aee8b..6bd1fbd047 100644 --- a/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg +++ b/backends/platform/symbian/S60v3/scummvm-CVS-SymbianS60v3.pkg @@ -63,6 +63,7 @@  "..\..\..\..\dists\engine-data\sky.cpt"-"c:\data\scummvm\sky.cpt"  "..\..\..\..\dists\engine-data\igor.tbl"-"c:\data\scummvm\igor.tbl"  "..\..\..\..\dists\engine-data\lure.dat"-"c:\data\scummvm\lure.dat" +"..\..\..\..\dists\engine-data\drascula.dat"-"c:\data\drascula.dat"  ; Config/log files: 'empty' will automagically be removed on uninstall  ""-"c:\data\scummvm\scummvm.ini",FILENULL diff --git a/backends/platform/symbian/S80/scummvm-CVS-SymbianS80.pkg b/backends/platform/symbian/S80/scummvm-CVS-SymbianS80.pkg index 94d457b93a..29e318a479 100644 --- a/backends/platform/symbian/S80/scummvm-CVS-SymbianS80.pkg +++ b/backends/platform/symbian/S80/scummvm-CVS-SymbianS80.pkg @@ -53,6 +53,7 @@  "..\..\..\..\dists\engine-data\sky.cpt"-"!:\system\apps\scummvm\sky.cpt"  "..\..\..\..\dists\engine-data\igor.tbl"-"!:\system\apps\scummvm\igor.tbl"  "..\..\..\..\dists\engine-data\lure.dat"-"!:\system\apps\scummvm\lure.dat" +"..\..\..\..\dists\engine-data\drascula.dat"-"!:\system\apps\scummvm\drascula.dat"  ; Config/log files: 'empty' will automagically be removed on uninstall  ""-"!:\system\apps\ScummVM\scummvm.ini",FILENULL diff --git a/backends/platform/symbian/S90/scummvm-CVS-SymbianS90.pkg b/backends/platform/symbian/S90/scummvm-CVS-SymbianS90.pkg index ca7f08d85f..0173da7699 100644 --- a/backends/platform/symbian/S90/scummvm-CVS-SymbianS90.pkg +++ b/backends/platform/symbian/S90/scummvm-CVS-SymbianS90.pkg @@ -53,6 +53,7 @@  "..\..\..\..\dists\engine-data\sky.cpt"-"!:\system\apps\scummvm\sky.cpt"  "..\..\..\..\dists\engine-data\igor.tbl"-"!:\system\apps\scummvm\igor.tbl"  "..\..\..\..\dists\engine-data\lure.dat"-"!:\system\apps\scummvm\lure.dat" +"..\..\..\..\dists\engine-data\drascula.dat"-"!:\system\apps\scummvm\drascula.dat"  ; Config/log files: 'empty' will automagically be removed on uninstall  ""-"!:\system\apps\ScummVM\scummvm.ini",FILENULL diff --git a/backends/platform/symbian/UIQ2/scummvm-CVS-SymbianUIQ2.pkg b/backends/platform/symbian/UIQ2/scummvm-CVS-SymbianUIQ2.pkg index 8a121227bc..aca927eadd 100644 --- a/backends/platform/symbian/UIQ2/scummvm-CVS-SymbianUIQ2.pkg +++ b/backends/platform/symbian/UIQ2/scummvm-CVS-SymbianUIQ2.pkg @@ -16,7 +16,7 @@  ; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  ;  ; $URL:$ -; $Id$ +; $Id:$  ;  ; diff --git a/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg b/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg index 5aad403074..0883c88a21 100644 --- a/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg +++ b/backends/platform/symbian/UIQ3/scummvm-CVS-SymbianUIQ3.pkg @@ -61,6 +61,7 @@  "..\..\..\..\dists\engine-data\sky.cpt"-"c:\shared\scummvm\sky.cpt"  "..\..\..\..\dists\engine-data\igor.tbl"-"c:\shared\scummvm\igor.tbl"  "..\..\..\..\dists\engine-data\lure.dat"-"c:\shared\scummvm\lure.dat" +"..\..\..\..\dists\engine-data\drascula.dat"-"c:\shared\scummvm\drascula.dat"  ; Config/log files: 'empty' will automagically be removed on uninstall  ""-"c:\shared\scummvm\scummvm.ini",FILENULL diff --git a/backends/platform/symbian/src/SymbianActions.cpp b/backends/platform/symbian/src/SymbianActions.cpp index 60e402632f..e71b242329 100644 --- a/backends/platform/symbian/src/SymbianActions.cpp +++ b/backends/platform/symbian/src/SymbianActions.cpp @@ -153,7 +153,7 @@ void SymbianActions::initInstanceGame() {  	// Save -	if (is_simon || is_sword2 || is_gob || is_kyra || is_touche || is_feeble) +	if (is_simon || is_sword2 || is_gob || is_kyra || is_feeble)  		_action_enabled[ACTION_SAVE] = false;  	else {  		_action_enabled[ACTION_SAVE] = true; diff --git a/backends/platform/symbian/src/SymbianOS.cpp b/backends/platform/symbian/src/SymbianOS.cpp index 0ce44d1704..90bd99fa7d 100644 --- a/backends/platform/symbian/src/SymbianOS.cpp +++ b/backends/platform/symbian/src/SymbianOS.cpp @@ -123,10 +123,6 @@ void OSystem_SDL_Symbian::setFeatureState(Feature f, bool enable) {  	}  } -FilesystemFactory *OSystem_SDL_Symbian::getFilesystemFactory() { -	return &SymbianFilesystemFactory::instance(); -} -  static Common::String getDefaultConfigFileName() {  	char configFile[MAXPATHLEN];  	strcpy(configFile, Symbian::GetExecutablePath()); @@ -134,33 +130,13 @@ static Common::String getDefaultConfigFileName() {  	return configFile;  } -Common::SeekableReadStream *OSystem_SDL_Symbian::openConfigFileForReading() { -	Common::File *confFile = new Common::File(); -	assert(confFile); -	if (!confFile->open(getDefaultConfigFileName())) { -		delete confFile; -		confFile = 0; -	} -	return confFile; -} - -Common::WriteStream *OSystem_SDL_Symbian::openConfigFileForWriting() { -	Common::DumpFile *confFile = new Common::DumpFile(); -	assert(confFile); -	if (!confFile->open(getDefaultConfigFileName())) { -		delete confFile; -		confFile = 0; -	} -	return confFile; -} - -  OSystem_SDL_Symbian::zoneDesc OSystem_SDL_Symbian::_zones[TOTAL_ZONES] = {          { 0, 0, 320, 145 },          { 0, 145, 150, 55 },          { 150, 145, 170, 55 }  };  OSystem_SDL_Symbian::OSystem_SDL_Symbian() :_channels(0),_stereo_mix_buffer(0) { +	_RFs = &CEikonEnv::Static()->FsSession();  }  void OSystem_SDL_Symbian::initBackend() { @@ -184,6 +160,8 @@ void OSystem_SDL_Symbian::initBackend() {  	actions->initInstanceMain(this);  	actions->loadMapping();  	initZones(); +	 +	_fsFactory = new SymbianFilesystemFactory();  }  OSystem_SDL_Symbian::~OSystem_SDL_Symbian() { @@ -488,6 +466,10 @@ void OSystem_SDL_Symbian::initZones() {  	}  } +RFs& OSystem_SDL_Symbian::FsSession() { +	return *_RFs; +} +  FILE*	symbian_fopen(const char* name, const char* mode) {  	TSymbianFileEntry* fileEntry = new TSymbianFileEntry;  	fileEntry->iInputPos = KErrNotFound; @@ -516,22 +498,22 @@ FILE*	symbian_fopen(const char* name, const char* mode) {  		switch(mode[0]) {  		case 'a': -			if (fileEntry->iFileHandle.Open(CEikonEnv::Static()->FsSession(), tempFileName, fileMode) != KErrNone) { -				if (fileEntry->iFileHandle.Create(CEikonEnv::Static()->FsSession(), tempFileName, fileMode) != KErrNone) { +			if (fileEntry->iFileHandle.Open(static_cast<OSystem_SDL_Symbian*>(g_system)->FsSession(), tempFileName, fileMode) != KErrNone) { +				if (fileEntry->iFileHandle.Create(static_cast<OSystem_SDL_Symbian*>(g_system)->FsSession(), tempFileName, fileMode) != KErrNone) {  					delete fileEntry;  					fileEntry = NULL;  				}  			}  			break;  		case 'r': -			if (fileEntry->iFileHandle.Open(CEikonEnv::Static()->FsSession(), tempFileName, fileMode) != KErrNone) { +			if (fileEntry->iFileHandle.Open(static_cast<OSystem_SDL_Symbian*>(g_system)->FsSession(), tempFileName, fileMode) != KErrNone) {  				delete fileEntry;  				fileEntry = NULL;  			}  			break;  		case 'w': -			if (fileEntry->iFileHandle.Replace(CEikonEnv::Static()->FsSession(), tempFileName, fileMode) != KErrNone) { +			if (fileEntry->iFileHandle.Replace(static_cast<OSystem_SDL_Symbian*>(g_system)->FsSession(), tempFileName, fileMode) != KErrNone) {  				delete fileEntry;  				fileEntry = NULL;  			} diff --git a/backends/platform/symbian/src/SymbianOS.h b/backends/platform/symbian/src/SymbianOS.h index 68a6fb492f..80329d984e 100644 --- a/backends/platform/symbian/src/SymbianOS.h +++ b/backends/platform/symbian/src/SymbianOS.h @@ -33,6 +33,7 @@  #endif  #define TOTAL_ZONES 3 +class RFs;  class OSystem_SDL_Symbian : public OSystem_SDL {  public: @@ -70,10 +71,6 @@ protected:  	//  	static void symbianMixCallback(void *s, byte *samples, int len); -	virtual FilesystemFactory *getFilesystemFactory(); - -	virtual Common::SeekableReadStream *openConfigFileForReading(); -	virtual Common::WriteStream *openConfigFileForWriting();  public:  	// vibration support  #ifdef USE_VIBRA_SE_PXXX @@ -134,6 +131,7 @@ protected:  	} zoneDesc;  	static zoneDesc _zones[TOTAL_ZONES]; +	RFs* _RFs;  };  #endif diff --git a/backends/platform/symbian/src/portdefs.h b/backends/platform/symbian/src/portdefs.h index 4577824b33..02436d7c35 100644 --- a/backends/platform/symbian/src/portdefs.h +++ b/backends/platform/symbian/src/portdefs.h @@ -134,7 +134,6 @@  #ifndef __WINS__  #define USE_ARM_GFX_ASM -#define ARM_USE_GFX_ASM  #define USE_ARM_SMUSH_ASM  #define USE_ARM_COSTUME_ASM  #define USE_ARM_SOUND_ASM diff --git a/backends/platform/wince/CEActionsPocket.cpp b/backends/platform/wince/CEActionsPocket.cpp index 3626c4c10b..7f78517762 100644 --- a/backends/platform/wince/CEActionsPocket.cpp +++ b/backends/platform/wince/CEActionsPocket.cpp @@ -147,7 +147,7 @@ void CEActionsPocket::initInstanceGame() {  	_key_action[POCKET_ACTION_PAUSE].setKey(VK_SPACE);  	_action_enabled[POCKET_ACTION_PAUSE] = true;  	// Save -	if (is_simon || is_sword2 || is_gob || is_kyra || is_touche || is_feeble) +	if (is_simon || is_sword2 || is_gob || is_kyra || is_feeble)  		_action_enabled[POCKET_ACTION_SAVE] = false;  	else if (is_queen) {  		_action_enabled[POCKET_ACTION_SAVE] = true; diff --git a/backends/platform/wince/CEActionsSmartphone.cpp b/backends/platform/wince/CEActionsSmartphone.cpp index 87f73f5a66..0c4113cc0c 100644 --- a/backends/platform/wince/CEActionsSmartphone.cpp +++ b/backends/platform/wince/CEActionsSmartphone.cpp @@ -130,7 +130,7 @@ void CEActionsSmartphone::initInstanceGame() {  	// Initialize keys for different actions  	// Save -	if (is_simon || is_sword2 || is_gob || is_kyra || is_touche || is_feeble) +	if (is_simon || is_sword2 || is_gob || is_kyra || is_feeble)  		_action_enabled[SMARTPHONE_ACTION_SAVE] = false;  	else if (is_queen) {  		_action_enabled[SMARTPHONE_ACTION_SAVE] = true; diff --git a/backends/platform/wince/Makefile b/backends/platform/wince/Makefile index 4400d50e3a..9f040bbed1 100644 --- a/backends/platform/wince/Makefile +++ b/backends/platform/wince/Makefile @@ -45,8 +45,8 @@ ENABLE_DRASCULA = STATIC_PLUGIN  USE_MAD           = 1  USE_MPEG2         = 1 -USE_TREMOR        = 1 -#USE_TREMOLO       = 1 +#USE_TREMOR        = 1 +USE_TREMOLO       = 1  USE_FLAC          = 1  USE_ZLIB          = 1 @@ -139,7 +139,7 @@ LIBS += -ltremorce  endif  ifdef USE_TREMOLO -DEFINES += -DUSE_TREMOR -DUSE_VORBIS +DEFINES += -DUSE_TREMOR -DUSE_VORBIS -DUSE_TREMOLO  INCLUDES += -Ilibs/include/tremolo  LIBS += -llibTremolo  endif diff --git a/backends/platform/wince/README-WinCE.txt b/backends/platform/wince/README-WinCE.txt index f4cb00dcfa..86c627d764 100644 --- a/backends/platform/wince/README-WinCE.txt +++ b/backends/platform/wince/README-WinCE.txt @@ -1,29 +1,28 @@  ScummVM Windows CE FAQ  Last updated: $Date$ -Release version: 0.11.0 +Release version: 0.12.0  ------------------------------------------------------------------------  New in this version  ------------------- -0.11.0 -- Redesigned 'Free Look' action (Pocket PCs) -In order to accommodate for the requirements of the lure engine, the -usage characteristics of the 'Free Look' action have been improved. The -new behavior is available for use in all engines, but is is *strongly* -recommended for at least when playing 'Lure of the Temptress'. By using -the new scheme, when in 'Free Look' mode, it is now possible to enter -left clicks by clicking a second time near the current location of the -mouse pointer. Left and Right clicks at the current point location -are also available by using the respective actions' bound key. +0.12.0: +- Improved SMUSH support (deprecated 'Smush_force_redraw' option) +No skipped frames in Full Throttle action sequences. The 'Smush_force_redraw' +option is not needed/honored anymore. -- Reduced optimization build -The ScummVM executable has grown quite large, prohibiting some devices -from running memory demanding games (or any games at all). Code -optimization level has been reduced to offset the growth of the executable. -Games run slightly slower. This will be addressed before next release. +- Fixed MultiFuntion key in Full Throttle -- Several bugfixes +- Improved sound output +Fixed a long standing bug which led to distorted sound output in all games. + +- Switched to faster ogg vorbis library +Robin Watts' libTremolo is used for ogg vorbis (tremor) replay. Info patch +by Lostech. + +- New right click through double tap inhibiting option +Check out the 'no_doubletap_rightclick' option if double-tapping as a right +click input method annoys you. Patch by spookypeanut.  ------------------------------------------------------------------------ @@ -109,10 +108,10 @@ and report your success ...  How do I install ScummVM for Windows CE ?  ----------------------------------------- -Simple! Unpack the release package on your desktop pc, then copy all its contents -to a folder on your device. Typically, you should at least have scummvm.exe, -modern.ini and modern.zip in the same directory. Finally, upload your beloved games -and fire it up :-) +Simple! Unpack the release package on your desktop pc, then copy all its +contents to a folder on your device. Typically, you should at least have +scummvm.exe, modern.ini and modern.zip in the same directory. Finally, upload +your beloved games and fire it up :-)  Some devices (like Pocket PC 2000) require GAPI to be present. @@ -184,18 +183,19 @@ The following actions are available :    * Right click    : acts as a right mouse button click    * Cursor         : hide or display the mouse cursor    * Free look      : go in or out of free-look mode. In this mode, you can tap -                     the screen to look for interesting locations without walking. -                     Cling a second time near the pointer's location equals to left click. +                     the screen to look for interesting locations without  +                     walking. Click a second time near the pointer's location  +                     equals to a left click.    * Zoom up        : magnify the upper part of the screen for 640x480 games                       rendered on a QVGA device.    * Zoom down      : magnify the lower part of the screen for 640x480 games                       rendered on a QVGA device. -  * Multi Function : this key performs a different function depending on the game -                   : Full Throttle    -> win an action sequence (cheat) -                   : Fate of Atlantis -> sucker punch (cheat) -                   : Bargon           -> F1 (start the game) -                   : All AGI games    -> bring up the predictive input dialog -  * Bind keys      : map a key action to a device button +  * Multi Function : performs a different function depending on the game : +                     Full Throttle    -> win an action sequence (cheat) +                     Fate of Atlantis -> sucker punch (cheat) +                     Bargon           -> F1 (start the game) +                     All AGI games    -> bring up the predictive input dialog +  * Bind keys        map a key action to a device button    * Up,Down,Left   :      Right,         : emulate mouse/stylus behavior      Left Click     : @@ -245,11 +245,11 @@ the list of available actions for Smartphones:    * Skip           : skip a non interactive sequence, the current dialog or                       behaves like the ESC key on a regular keyboard    * Zone           : switch between the 3 different mouse zones -  * Multi Function : this key performs a different function depending on the game -                   : Full Throttle    -> win an action sequence (cheat) -                   : Fate of Atlantis -> sucker punch (cheat) -                   : Bargon           -> F1 (start the game) -                   : All AGI games    -> bring up the predictive input dialog +  * Multi Function : performs a different function depending on the game +                     Full Throttle    -> win an action sequence (cheat) +                     Fate of Atlantis -> sucker punch (cheat) +                     Bargon           -> F1 (start the game) +                     All AGI games    -> bring up the predictive input dialog    * Bind keys      : map a key action to a device button    * Keyboard       : hide or display the virtual keyboard    * Rotate         : rotate the screen (also rotates dpad keys) @@ -287,32 +287,34 @@ Some parameters are specific to this port :  Game specific sections (f.e. [monkey2]) - performance options - *  high_sample_rate       bool     Desktop quality (22 kHz) sound output if set. -                                    11 kHz otherwise.  The default is 11 kHz. -                                    If you have a fast device, you can set this to -                                    true to enjoy better sound effects and music. + *  high_sample_rate       bool     Desktop quality (22 kHz) sound output if +                                    set.  The default is 11 kHz. +                                    If you have a fast device, you can set this +                                    to true to enjoy better sound effects and  +                                    music.   *  FM_high_quality        bool     Desktop quality FM synthesis if set. Lower -                                    quality otherwise. The default is low quality. -                                    You can change this if you have a fast device. - *  sound_thread_priority  int      Set the priority of the sound thread (0, 1, 2). -                                    Depending on the release, this is set to 1 -                                    internally (above normal). If you get sound -                                    stuttering try setting this to a higher value. +                                    quality otherwise. The default is low  +                                    quality. You can change this if you have a +                                    fast device. + *  sound_thread_priority  int      Set the priority of the sound thread (0, 1, +                                    2). Depending on the release, this is set +                                    to 1 internally (above normal). +                                    If you get sound stuttering try setting +                                    this to a higher value.                                      Set to 0 if your device is fast enough or if -                                    you prefer better audio/video synchronization. - *  Smush_force_redraw     int      Force a Smush frame redraw every X missed -                                    frames. Mainly used for Full Throttle action -                                    sequences. Setting it lower gives more -                                    priority to screen redraws. Setting it higher -                                    gives more priority to stylus/keyboard input. -                                    The default is 30. +                                    you prefer better audio/video sync.  Game specific sections (f.e. [monkey2]) - game options - *  landscape              int      0: Portrait, 1: Landscape, 2: Inverse Landscape -                                    You can also use this in the [scummvm] section -                                    in QVGA Pocket PCs to display the launcher in -                                    landscape, for example, at startup. + *  landscape                int    0: Portrait, 1: Landscape,  +                                    2: Inverse Landscape. +                                    You can also use this in the [scummvm] +                                    section to display the launcher in landscape +                                    for example, at startup. + *  no_doubletap_rightclick  int    1: Turn off the default behavior of  +                                    simulating a right-click when the screen is +                                    double-tapped.  +  [scummvm] section - keys definition @@ -335,18 +337,18 @@ You can tweak these parameters to customize how the cursor is handled.                                      consider being repeated.   *  repeatX               int       Number of key repeat events before changing                                      horizontal cursor behaviour. - *  stepX1                int       Horizontal cursor offset value when the key is -                                    not repeated. - *  stepX2                int       Horizontal cursor offset value when the key is -                                    repeated less than repeatX. - *  stepX3                int       Horizontal cursor offset value when the key is -                                    repeated more than repeatX. + *  stepX1                int       Horizontal cursor offset value when the key +                                    is not repeated. + *  stepX2                int       Horizontal cursor offset value when the key +                                    is repeated less than repeatX. + *  stepX3                int       Horizontal cursor offset value when the key +                                    is repeated more than repeatX.   *  repeatY               int       Number of key repeat events before changing -                                    vertical cursor behaviour. +                                    vertical cursor behavior.   *  stepY1                int       Vertical cursor offset value when the key is                                      not repeated. - *  stepY2                int       Horizontal cursor offset value when the key is -                                    repeated less than repeatY. + *  stepY2                int       Horizontal cursor offset value when the key +                                    is repeated less than repeatY.   *  stepY3                int       Vertical cursor offset value when the key is                                      repeated more than repeatY. @@ -361,8 +363,8 @@ Game specific questions  I need to press a special key  ----------------------------- -Bring up the virtual keyboard. On Smartphones take a look at the Keyboard action above. -On Pocket PCs it's easier to double-tap at the top of the screen. +Bring up the virtual keyboard. On Smartphones take a look at the Keyboard  +action above. On Pocket PCs it's easier to double-tap at the top of the screen.  The panel is obscuring the playfield area  ----------------------------------------- @@ -383,17 +385,18 @@ Bind and use the quit action to quit.  I cannot rotate the screen to landscape/inverse landscape  --------------------------------------------------------- -Depending on the video driver, ScummVM may opt to not provide such functionality. -In general, when ScummVM starts in normal "portrait" orientation, the device driver -reports better display characteristics and you should consider launching from portrait. +Depending on the video driver, ScummVM may opt to not provide such +functionality.  In general, when ScummVM starts in normal "portrait" +orientation, the device driver reports better display characteristics and you +should consider launching from portrait.  I'm having problems. Is there diagnostic output available ?  -----------------------------------------------------------  Insert a line in the [scummvm] section of scummvm.ini with the following:  debuglevel=1 -Run ScummVM. When it closes scummvm_stdout.txt and scummvm_stderr.txt files will be -available at the program directory (see section above). +Run ScummVM. When it closes scummvm_stdout.txt and scummvm_stderr.txt files +will be available at the program directory (see section above).  ScummVM crashes and returns to desktop  -------------------------------------- @@ -548,18 +551,19 @@ Use the Multi Function action.  -- AGI engine games --  ---------------------- -Do you expect me to play these games on keyboard less devices ? +Do you expect me to play these games on keyboard-less devices ?  ---------------------------------------------------------------  Sure we do :-) -If you want to get some mileage on your stylus you can use the virtual keyboard. -There is a very useful alternative though, the AGI engine's predictive input dialog. -It requires a dictionary to be present. Just tap on the command line or use the -Multi Function action to bring it up. On Smartphones, when the dialog is shown -all key mapping is disabled temporarily (including mouse emulation). Input is -performed either by pressing the phone's numeric keypad keys and dpad enter to -close the dialog, or by navigating the buttons using the dpad arrows and pressing -with dpad enter. Check the main Readme file for more information on this. +If you want to get some mileage on your stylus you can use the virtual +keyboard.  There is a very useful alternative though, the AGI engine's +predictive input dialog.  It requires a dictionary to be present. Just tap on +the command line or use the Multi Function action to bring it up. On +Smartphones, when the dialog is shown all key mapping is disabled temporarily +(including mouse emulation). Input is performed either by pressing the phone's +numeric keypad keys and dpad enter to close the dialog, or by navigating the +buttons using the dpad arrows and pressing with dpad enter. Check the main +Readme file for more information on this.  ---------------------------  -- Lure of the Temptress -- @@ -595,8 +599,9 @@ I think I found a bug, ScummVM crashes in ...  See the "Reporting Bugs" section in ScummVM readme. -If you have a Pocket PC or Handheld PC, be sure to include its resolution (obtained -on the second dialog displayed on the "About" menu) in your bug report. +If you have a Pocket PC or Handheld PC, be sure to include its resolution +(obtained on the second dialog displayed on the "About" menu) in your bug +report.  If you cannot reproduce this bug on another ScummVM version, you can cross  post your bug report on ScummVM forums. @@ -619,6 +624,26 @@ http://www.scummvm.org/  Old news follow ...  ------------------------------------------------------------------------ +0.11.0: +- Redesigned 'Free Look' action (Pocket PCs) +In order to accommodate for the requirements of the lure engine, the +usage characteristics of the 'Free Look' action have been improved. The +new behavior is available for use in all engines, but is is *strongly* +recommended for at least when playing 'Lure of the Temptress'. By using +the new scheme, when in 'Free Look' mode, it is now possible to enter +left clicks by clicking a second time near the current location of the +mouse pointer. Left and Right clicks at the current point location +are also available by using the respective actions' bound key. + +- Reduced optimization build +The ScummVM executable has grown quite large, prohibiting some devices +from running memory demanding games (or any games at all). Code +optimization level has been reduced to offset the growth of the executable. +Games run slightly slower. This will be addressed before next release. + +- Several bugfixes + +  0.10.0:  Major improvements have taken place in this version, mostly for behind-  the-scenes stuff. First, we have migrated to GCC for building the Windows diff --git a/backends/platform/wince/wince-sdl.cpp b/backends/platform/wince/wince-sdl.cpp index 48f157f6ff..f09a483086 100644 --- a/backends/platform/wince/wince-sdl.cpp +++ b/backends/platform/wince/wince-sdl.cpp @@ -461,7 +461,7 @@ OSystem_WINCE3::OSystem_WINCE3() : OSystem_SDL(),  	_orientationLandscape(0), _newOrientation(0), _panelInitialized(false),  	_panelVisible(true), _panelStateForced(false), _forceHideMouse(false), _unfilteredkeys(false),  	_freeLook(false), _forcePanelInvisible(false), _toolbarHighDrawn(false), _zoomUp(false), _zoomDown(false), -	_scalersChanged(false), _lastKeyPressed(0), _tapTime(0), _closeClick(false), +	_scalersChanged(false), _lastKeyPressed(0), _tapTime(0), _closeClick(false), _noDoubleTapRMB(false),  	_saveToolbarState(false), _saveActiveToolbar(NAME_MAIN_PANEL), _rbutton(false), _hasfocus(true),  	_usesEmulatedMouse(false), _mouseBackupOld(NULL), _mouseBackupToolbar(NULL), _mouseBackupDim(0)  { @@ -1059,14 +1059,11 @@ void OSystem_WINCE3::update_game_settings() {  			panel->setVisible(false);  		_saveToolbarState = true; - -		// Set Smush Force Redraw rate for Full Throttle -		if (!ConfMan.hasKey("Smush_force_redraw")) { -			ConfMan.setInt("Smush_force_redraw", 30); -			ConfMan.flushToDisk(); -		}  	} +	if (ConfMan.hasKey("no_doubletap_rightclick")) +		_noDoubleTapRMB = ConfMan.getBool("no_doubletap_rightclick"); +  	compute_sample_rate();  } @@ -2340,7 +2337,7 @@ bool OSystem_WINCE3::pollEvent(Common::Event &event) {  					if (_closeClick && (GetTickCount() - _tapTime < 1000)) {  						if (event.mouse.y <= 20 && _panelInitialized) {		// top of screen (show panel)  							swap_panel_visibility(); -						} else {		// right click +						} else if (!_noDoubleTapRMB) {		// right click  							event.type = Common::EVENT_RBUTTONDOWN;  							_rbutton = true;  						} diff --git a/backends/platform/wince/wince-sdl.h b/backends/platform/wince/wince-sdl.h index 8853c156d8..ece8c9b7b1 100644 --- a/backends/platform/wince/wince-sdl.h +++ b/backends/platform/wince/wince-sdl.h @@ -200,6 +200,7 @@ private:  	bool _zoomUp;			// zooming up mode  	bool _zoomDown;			// zooming down mode +	bool _noDoubleTapRMB;	// disable double tap -> rmb click   	bool _rbutton;			// double tap -> right button simulation  	bool _closeClick;		// flag when taps are spatially close together diff --git a/backends/saves/compressed/compressed-saves.cpp b/backends/saves/compressed/compressed-saves.cpp index 150cf5c47d..0c4fec0e24 100644 --- a/backends/saves/compressed/compressed-saves.cpp +++ b/backends/saves/compressed/compressed-saves.cpp @@ -62,7 +62,7 @@ public:  		_stream.zfree = Z_NULL;  		_stream.opaque = Z_NULL; -		// Verify file header is correct once more +		// Verify file header is correct  		w->seek(0, SEEK_SET);  		uint16 header = w->readUint16BE();  		assert(header == 0x1F8B || @@ -133,27 +133,34 @@ public:  	}  	void seek(int32 offset, int whence = SEEK_SET) {  		int32 newPos = 0; +		assert(whence != SEEK_END);	// SEEK_END not supported  		switch(whence) { -		case SEEK_END: -			newPos = size() - offset; -			break;  		case SEEK_SET:  			newPos = offset;  			break;  		case SEEK_CUR:  			newPos = _pos + offset;  		} -		offset = newPos - _pos; - -		if (offset < 0) -			error("Backward seeking not supported in compressed savefiles"); +		 +		assert(newPos >= 0); + +		if ((uint32)newPos < _pos) { +			// To search backward, we have to restart the whole decompression +			// from the start of the file. A rather wasteful operation, best +			// to avoid it. :/ +#if DEBUG +			warning("Backward seeking in CompressedInSaveFile detected"); +#endif +			_pos = 0; +			_wrapped->seek(0, SEEK_SET); +			_zlibErr = inflateReset(&_stream); +			if (_zlibErr != Z_OK) +				return; +			_stream.next_in = _buf; +			_stream.avail_in = 0; +		} -		// We could implement backward seeking, but it is tricky to do efficiently. -		// A simple solution would be to restart the whole decompression from the -		// start of the file. Or we could decompress the whole file in one go -		// in the constructor, and wrap it into a MemoryReadStream -- but that -		// would be rather wasteful. As long as we don't need it, I'd rather not -		// implement this at all. -- Fingolfin +		offset = newPos - _pos;  		// Skip the given amount of data (very inefficient if one tries to skip  		// huge amounts of data, but usually client code will only skip a few  | 
