diff options
author | Eugene Sandulenko | 2018-05-05 14:16:49 +0200 |
---|---|---|
committer | Eugene Sandulenko | 2018-05-05 23:17:35 +0200 |
commit | 6e58c5aaa521d450878786eaf00c8a71191962ae (patch) | |
tree | e4f5d2fea9bfdc4b31e5ce699b547862328dbd40 /engines/prince | |
parent | e3b9be66799cfa907930b96fd67475dbcb36f308 (diff) | |
download | scummvm-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.h | 45 |
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 |