aboutsummaryrefslogtreecommitdiff
path: root/engines/prince
diff options
context:
space:
mode:
authorEugene Sandulenko2018-05-05 14:16:49 +0200
committerEugene Sandulenko2018-05-05 23:17:35 +0200
commit6e58c5aaa521d450878786eaf00c8a71191962ae (patch)
treee4f5d2fea9bfdc4b31e5ce699b547862328dbd40 /engines/prince
parente3b9be66799cfa907930b96fd67475dbcb36f308 (diff)
downloadscummvm-rg350-6e58c5aaa521d450878786eaf00c8a71191962ae.tar.gz
scummvm-rg350-6e58c5aaa521d450878786eaf00c8a71191962ae.tar.bz2
scummvm-rg350-6e58c5aaa521d450878786eaf00c8a71191962ae.zip
PRINCE: Added support for unbundled compressed files
Diffstat (limited to 'engines/prince')
-rw-r--r--engines/prince/resource.h45
1 files changed, 39 insertions, 6 deletions
diff --git a/engines/prince/resource.h b/engines/prince/resource.h
index a2cd8a6262..8fb2b94bd9 100644
--- a/engines/prince/resource.h
+++ b/engines/prince/resource.h
@@ -24,14 +24,19 @@
#define PRINCE_RESOURCE_H
#include "common/stream.h"
+#include "common/memstream.h"
#include "common/archive.h"
#include "common/debug-channels.h"
#include "common/ptr.h"
+#include "prince/decompress.h"
+
namespace Prince {
namespace Resource {
+static Common::SeekableReadStream *getDecompressedStream(Common::SeekableReadStream *stream);
+
template <typename T>
bool loadFromStream(T &resource, Common::SeekableReadStream &stream) {
return resource.loadStream(stream);
@@ -39,13 +44,15 @@ bool loadFromStream(T &resource, Common::SeekableReadStream &stream) {
template<typename T>
bool loadResource(T *resource, const char *resourceName, bool required) {
- Common::ScopedPtr<Common::SeekableReadStream> stream(SearchMan.createReadStreamForMember(resourceName));
- if (!stream) {
+ Common::SeekableReadStream *stream_(SearchMan.createReadStreamForMember(resourceName));
+ if (!stream_) {
if (required)
error("Can't load %s", resourceName);
return false;
}
+ Common::ScopedPtr<Common::SeekableReadStream> stream(getDecompressedStream(stream_));
+
return loadFromStream(*resource, *stream);
}
@@ -61,26 +68,30 @@ bool loadResource(Common::Array<T> &array, Common::SeekableReadStream &stream, b
template <typename T>
bool loadResource(Common::Array<T> &array, const char *resourceName, bool required = true) {
- Common::ScopedPtr<Common::SeekableReadStream> stream(SearchMan.createReadStreamForMember(resourceName));
- if (!stream) {
+ Common::SeekableReadStream *stream_(SearchMan.createReadStreamForMember(resourceName));
+ if (!stream_) {
if (required)
error("Can't load %s", resourceName);
return false;
}
+ Common::ScopedPtr<Common::SeekableReadStream> stream(getDecompressedStream(stream_));
+
return loadResource(array, *stream, required);
}
template <typename T>
bool loadResource(Common::Array<T *> &array, const char *resourceName, bool required = true) {
- Common::ScopedPtr<Common::SeekableReadStream> stream(SearchMan.createReadStreamForMember(resourceName));
- if (!stream) {
+ Common::SeekableReadStream *stream_(SearchMan.createReadStreamForMember(resourceName));
+ if (!stream_) {
if (required)
error("Can't load %s", resourceName);
return false;
}
+ Common::ScopedPtr<Common::SeekableReadStream> stream(getDecompressedStream(stream_));
+
// FIXME: This is stupid. Maybe loadFromStream should be helper method that returns initialized object
while (true) {
T* t = new T();
@@ -93,6 +104,28 @@ bool loadResource(Common::Array<T *> &array, const char *resourceName, bool requ
return true;
}
+static Common::SeekableReadStream *getDecompressedStream(Common::SeekableReadStream *stream) {
+ byte header[4];
+
+ stream->read(header, 4);
+ stream->seek(0);
+
+ if (READ_BE_UINT32(header) == MKTAG('M', 'A', 'S', 'M')) {
+ byte *buffer = (byte *)malloc(stream->size());
+ stream->read(buffer, stream->size());
+
+ Decompressor dec;
+ uint32 decompLen = READ_BE_UINT32(buffer + 14);
+ byte *decompData = (byte *)malloc(decompLen);
+ dec.decompress(buffer + 18, decompData, decompLen);
+ free(buffer);
+
+ return new Common::MemoryReadStream(decompData, decompLen, DisposeAfterUse::YES);
+ } else {
+ return stream;
+ }
+}
+
}
} // End of namespace Prince