aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2016-03-16 21:01:01 -0400
committerPaul Gilbert2016-03-16 21:01:01 -0400
commit6be64df2f0c0bf50e551187c2ba989d756f2dd36 (patch)
tree0d5286ac9a8e50b34fa25a3f4bb6eb9fcf53af9f /engines
parent8ec499c177d88e11930b8550c47c352d65dc603a (diff)
downloadscummvm-rg350-6be64df2f0c0bf50e551187c2ba989d756f2dd36.tar.gz
scummvm-rg350-6be64df2f0c0bf50e551187c2ba989d756f2dd36.tar.bz2
scummvm-rg350-6be64df2f0c0bf50e551187c2ba989d756f2dd36.zip
TITANIC: Implemented overall surface loading method
Diffstat (limited to 'engines')
-rw-r--r--engines/titanic/core/resource_key.cpp13
-rw-r--r--engines/titanic/core/resource_key.h15
-rw-r--r--engines/titanic/files_manager.cpp44
-rw-r--r--engines/titanic/files_manager.h7
-rw-r--r--engines/titanic/string.cpp38
-rw-r--r--engines/titanic/string.h19
-rw-r--r--engines/titanic/video_surface.cpp64
-rw-r--r--engines/titanic/video_surface.h112
8 files changed, 278 insertions, 34 deletions
diff --git a/engines/titanic/core/resource_key.cpp b/engines/titanic/core/resource_key.cpp
index 4788f7a493..4b52082b77 100644
--- a/engines/titanic/core/resource_key.cpp
+++ b/engines/titanic/core/resource_key.cpp
@@ -21,6 +21,7 @@
*/
#include "common/file.h"
+#include "titanic/titanic.h"
#include "titanic/simple_file.h"
#include "titanic/core/resource_key.h"
@@ -73,4 +74,16 @@ CString CResourceKey::exists() {
return f.exists(name) ? name : CString();
}
+bool CResourceKey::scanForFile() const {
+ return g_vm->_filesManager.scanForFile(_value);
+}
+
+FileType CResourceKey::fileTypeSuffix() const {
+ return _value.fileTypeSuffix();
+}
+
+ImageType CResourceKey::imageTypeSuffix() const {
+ return _value.imageTypeSuffix();
+}
+
} // End of namespace Titanic
diff --git a/engines/titanic/core/resource_key.h b/engines/titanic/core/resource_key.h
index a165a11e1a..111cec5c7c 100644
--- a/engines/titanic/core/resource_key.h
+++ b/engines/titanic/core/resource_key.h
@@ -57,6 +57,21 @@ public:
* and returns it's filename if it does
*/
CString exists();
+
+ /**
+ * Scans for a file with a matching name
+ */
+ bool scanForFile() const;
+
+ /**
+ * Returns the type of the resource based on it's extension
+ */
+ FileType fileTypeSuffix() const;
+
+ /**
+ * Returns the type of the resource based on it's extension
+ */
+ ImageType imageTypeSuffix() const;
};
} // End of namespace Titanic
diff --git a/engines/titanic/files_manager.cpp b/engines/titanic/files_manager.cpp
index b7562b638a..662a882e3e 100644
--- a/engines/titanic/files_manager.cpp
+++ b/engines/titanic/files_manager.cpp
@@ -31,35 +31,35 @@ CFilesManager::CFilesManager() : _gameManager(nullptr),
_field18(0), _field1C(0), _field3C(0) {
}
-bool CFilesManager::fn1(const CString &name) {
+bool CFilesManager::fileExists(const CString &name) {
+ Common::File f;
+ return f.exists(name);
+}
+
+bool CFilesManager::scanForFile(const CString &name) {
if (name.empty())
- return 0;
+ return false;
- CString str = name;
- str.toLowercase();
+ CString filename = name;
+ filename.toLowercase();
- if (str[0] == 'z' || str[0] == 'y') {
- return 1;
- } else if (str[0] < 'a' || str[0] > 'c') {
- return 0;
- }
+ if (filename[0] == 'y' || filename[0] == 'z')
+ return true;
+ else if (filename[0] < 'a' || filename[0] > 'c')
+ return false;
- CString tempStr = str;
- int idx = tempStr.indexOf('#');
+ CString fname = filename;
+ int idx = fname.indexOf('#');
if (idx >= 0) {
- tempStr = tempStr.left(idx);
- str = str.c_str() + idx + 1;
- str += ".st";
+ fname = fname.left(idx);
+ fname += ".st";
}
-
-
- return true;
-}
-
-bool CFilesManager::fileExists(const CString &name) {
- Common::File f;
- return f.exists(name);
+ // The original had a bunch of code here handling determining
+ // which asset path, if any, the filename was present for,
+ // and storing the "active asset path" it was found on.
+ // This is redundant for ScummVM, which takes care of the paths
+ return fileExists(fname);
}
} // End of namespace Titanic
diff --git a/engines/titanic/files_manager.h b/engines/titanic/files_manager.h
index 63eda5ec1e..93505230f8 100644
--- a/engines/titanic/files_manager.h
+++ b/engines/titanic/files_manager.h
@@ -54,12 +54,15 @@ public:
_gameManager = gameManager;
}
- bool fn1(const CString &name);
-
/**
* Returns true if a file of the given name exists
*/
static bool fileExists(const CString &name);
+
+ /**
+ * Scans for a file with a matching name
+ */
+ bool scanForFile(const CString &name);
};
} // End of namespace Titanic
diff --git a/engines/titanic/string.cpp b/engines/titanic/string.cpp
index c1afb4ff52..dbe0617f06 100644
--- a/engines/titanic/string.cpp
+++ b/engines/titanic/string.cpp
@@ -56,4 +56,42 @@ int CString::lastIndexOf(char c) {
return charP ? charP - c_str() : -1;
}
+FileType CString::fileTypeSuffix() const {
+ CString ext = right(1);
+ if (ext == "0" || ext == "4")
+ return FILETYPE_IMAGE;
+ else if (ext == "1")
+ return FILETYPE_WAV;
+ else if (ext == "2" || ext == "3")
+ return FILETYPE_MOVIE;
+
+ ext = right(3);
+ if (ext == "tga" || ext == "jpg")
+ return FILETYPE_IMAGE;
+ else if (ext == "wav")
+ return FILETYPE_WAV;
+ else if (ext == "avi" || ext == "mov")
+ return FILETYPE_MOVIE;
+ else if (ext == "dlg")
+ return FILETYPE_DLG;
+ else
+ return FILETYPE_UNKNOWN;
+}
+
+ImageType CString::imageTypeSuffix() const {
+ CString ext = right(1);
+ if (ext == "0")
+ return IMAGETYPE_TARGA;
+ else if (ext == "4")
+ return IMAGETYPE_JPEG;
+
+ ext = right(3);
+ if (ext == "tga")
+ return IMAGETYPE_TARGA;
+ else if (ext == "jpg")
+ return IMAGETYPE_JPEG;
+ else
+ return IMAGETYPE_UNKNOWN;
+}
+
} // End of namespace Titanic
diff --git a/engines/titanic/string.h b/engines/titanic/string.h
index d70e23d023..6b8e4b784e 100644
--- a/engines/titanic/string.h
+++ b/engines/titanic/string.h
@@ -28,6 +28,15 @@
namespace Titanic {
+enum FileType {
+ FILETYPE_UNKNOWN = 0, FILETYPE_IMAGE = 1, FILETYPE_MOVIE = 2,
+ FILETYPE_WAV = 3, FILETYPE_DLG = 4
+};
+
+enum ImageType {
+ IMAGETYPE_UNKNOWN = 0, IMAGETYPE_TARGA = 1, IMAGETYPE_JPEG = 2
+};
+
class CString : public Common::String {
public:
CString() : Common::String() {}
@@ -66,6 +75,16 @@ public:
* Returns the index of the last occurance of a given character
*/
int lastIndexOf(char c);
+
+ /**
+ * Returns the type of a filename based on it's extension
+ */
+ FileType fileTypeSuffix() const;
+
+ /**
+ * Returns the type of an image filename based on it's extension
+ */
+ ImageType imageTypeSuffix() const;
};
} // End of namespace Titanic
diff --git a/engines/titanic/video_surface.cpp b/engines/titanic/video_surface.cpp
index 1db23830b4..e649532b81 100644
--- a/engines/titanic/video_surface.cpp
+++ b/engines/titanic/video_surface.cpp
@@ -21,6 +21,7 @@
*/
#include "titanic/video_surface.h"
+#include "titanic/screen_manager.h"
namespace Titanic {
@@ -51,27 +52,78 @@ OSVideoSurface::OSVideoSurface(CScreenManager *screenManager, const CResourceKey
_field38 = flag;
if (_field38) {
- proc8(key);
+ loadResource(key);
} else {
_resourceKey = key;
- proc43();
+ load();
}
}
-void OSVideoSurface::proc8(const CResourceKey &key) {
+void OSVideoSurface::loadResource(const CResourceKey &key) {
_resourceKey = key;
_field38 = 1;
if (hasSurface())
- proc43();
+ load();
+}
+
+void OSVideoSurface::loadTarga() {
+ warning("TODO");
+}
+
+void OSVideoSurface::loadJPEG() {
+ warning("TODO");
+}
+
+void OSVideoSurface::loadMovie() {
+ warning("TODO");
}
bool OSVideoSurface::hasSurface() {
return _ddSurface != nullptr;
}
-void OSVideoSurface::proc43() {
- warning("TODO");
+int OSVideoSurface::getWidth() const {
+ assert(_ddSurface);
+ return _ddSurface->w;
+}
+
+int OSVideoSurface::getHeight() const {
+ assert(_ddSurface);
+ return _ddSurface->h;
+}
+
+int OSVideoSurface::getPitch() const {
+ assert(_ddSurface);
+ return _ddSurface->pitch;
+}
+
+void OSVideoSurface::load() {
+ if (!_resourceKey.scanForFile())
+ return;
+
+ bool result = true;
+ switch (_resourceKey.fileTypeSuffix()) {
+ case FILETYPE_IMAGE:
+ switch (_resourceKey.imageTypeSuffix()) {
+ case IMAGETYPE_TARGA:
+ loadTarga();
+ break;
+ case IMAGETYPE_JPEG:
+ loadJPEG();
+ break;
+ default:
+ break;
+ }
+ return true;
+
+ case FILETYPE_MOVIE:
+ loadMovie();
+ return true;
+
+ default:
+ return false;
+ }
}
} // End of namespace Titanic
diff --git a/engines/titanic/video_surface.h b/engines/titanic/video_surface.h
index d0fa54bf85..1c4bf322ab 100644
--- a/engines/titanic/video_surface.h
+++ b/engines/titanic/video_surface.h
@@ -54,11 +54,64 @@ protected:
public:
CVideoSurface(CScreenManager *screenManager);
+ /**
+ * Set the underlying surface for this video surface
+ */
void setSurface(CScreenManager *screenManager, DirectDrawSurface *surface);
- virtual void proc8(const CResourceKey &key) = 0;
+ /**
+ * Load the surface with the passed resource
+ */
+ virtual void loadResource(const CResourceKey &key) = 0;
+
+ /**
+ * Loads a Targa image file specified by the resource key
+ */
+ virtual void loadTarga() = 0;
+
+ /**
+ * Loads a JPEG image file specified by the resource key
+ */
+ virtual void loadJPEG() = 0;
+
+ /**
+ * Loads a movie file specified by the resource key
+ */
+ virtual void loadMovie() = 0;
+
+ /**
+ * Lock the surface for direct access to the pixels
+ */
+ virtual void lock() = 0;
+
+ /**
+ * Unlocks the surface after prior calls to lock()
+ */
+ virtual void unlock() = 0;
+
+ /**
+ * Returns true if an underlying raw surface has been set
+ */
virtual bool hasSurface() = 0;
- virtual void proc43() = 0;
+
+ /**
+ * Returns the width of the surface
+ */
+ virtual int getWidth() = 0;
+
+ /**
+ * Returns the height of the surface
+ */
+ virtual int getHeight() const = 0;
+
+ /**
+ * Returns the pitch of the surface in bytes
+ */
+ virtual int getPitch() const = 0;
+ /**
+ * Loads the surface data based on the currently set resource key
+ */
+ virtual void load() const = 0;
};
class OSVideoSurface : public CVideoSurface {
@@ -66,9 +119,60 @@ public:
OSVideoSurface(CScreenManager *screenManager, DirectDrawSurface *surface);
OSVideoSurface(CScreenManager *screenManager, const CResourceKey &key, bool flag = false);
- virtual void proc8(const CResourceKey &key);
+ /**
+ * Load the surface with the passed resource
+ */
+ virtual void loadResource(const CResourceKey &key);
+
+ /**
+ * Loads a Targa image file specified by the resource key
+ */
+ virtual void loadTarga();
+
+ /**
+ * Loads a JPEG image file specified by the resource key
+ */
+ virtual void loadJPEG();
+
+ /**
+ * Loads a movie file specified by the resource key
+ */
+ virtual void loadMovie();
+
+ /**
+ * Lock the surface for direct access to the pixels
+ */
+ virtual void lock();
+
+ /**
+ * Unlocks the surface after prior calls to lock()
+ */
+ virtual void unlock();
+
+ /**
+ * Returns true if an underlying raw surface has been set
+ */
virtual bool hasSurface();
- virtual void proc43();
+
+ /**
+ * Returns the width of the surface
+ */
+ virtual int getWidth() const;
+
+ /**
+ * Returns the height of the surface
+ */
+ virtual int getHeight() const;
+
+ /**
+ * Returns the pitch of the surface in bytes
+ */
+ virtual int getPitch() const;
+
+ /**
+ * Loads the surface data based on the currently set resource key
+ */
+ virtual void load();
};
} // End of namespace Titanic