diff options
-rw-r--r-- | backends/saves/compressed/compressed-saves.cpp | 35 | ||||
-rw-r--r-- | engines/kyra/saveload.cpp | 5 | ||||
-rw-r--r-- | engines/scumm/saveload.cpp | 14 | ||||
-rw-r--r-- | engines/scumm/saveload.h | 2 | ||||
-rw-r--r-- | engines/scumm/scumm.h | 4 | ||||
-rw-r--r-- | engines/scumm/thumbnail.cpp | 27 | ||||
-rw-r--r-- | graphics/thumbnail.cpp | 2 |
7 files changed, 38 insertions, 51 deletions
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 diff --git a/engines/kyra/saveload.cpp b/engines/kyra/saveload.cpp index c08967c85c..debf0623ac 100644 --- a/engines/kyra/saveload.cpp +++ b/engines/kyra/saveload.cpp @@ -113,7 +113,10 @@ KyraEngine_v1::kReadSaveHeaderError KyraEngine_v1::readSaveHeader(Common::Seekab if (loadThumbnail) { header.thumbnail = new Graphics::Surface(); assert(header.thumbnail); - Graphics::loadThumbnail(*in, *header.thumbnail); + if (!Graphics::loadThumbnail(*in, *header.thumbnail)) { + delete header.thumbnail; + header.thumbnail = 0; + } } else { Graphics::skipThumbnailHeader(*in); } diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index 54dfca9eea..c7193a55f3 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -184,18 +184,8 @@ bool ScummEngine::loadState(int slot, bool compat) { } // Since version 52 a thumbnail is saved directly after the header. - if (hdr.ver >= VER(52)) { - uint32 type = in->readUint32BE(); - // Check for the THMB header. Also, work around a bug which caused - // the chunk type (incorrectly) to be written in LE on LE machines. - if (! (type == MKID_BE('THMB') || (hdr.ver < VER(55) && type == MKID_BE('BMHT')))){ - warning("Can not load thumbnail"); - delete in; - return false; - } - uint32 size = in->readUint32BE(); - in->skip(size - 8); - } + if (hdr.ver >= VER(52)) + skipThumbnailHeader(in); // Since version 56 we save additional information about the creation of // the save game and the save time. diff --git a/engines/scumm/saveload.h b/engines/scumm/saveload.h index 2d7ee64680..4f9899f961 100644 --- a/engines/scumm/saveload.h +++ b/engines/scumm/saveload.h @@ -50,7 +50,7 @@ namespace Scumm { * only saves/loads those which are valid for the version of the savegame * which is being loaded/saved currently. */ -#define CURRENT_VER 74 +#define CURRENT_VER 75 /** * An auxillary macro, used to specify savegame versions. We use this instead diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 2763331420..9ac78e3b93 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -636,9 +636,11 @@ public: protected: Graphics::Surface *loadThumbnail(Common::SeekableReadStream *file); - bool loadInfos(Common::SeekableReadStream *file, InfoStuff *stuff); void saveThumbnail(Common::WriteStream *file); + void skipThumbnailHeader(Common::SeekableReadStream *file); + void saveInfos(Common::WriteStream* file); + bool loadInfos(Common::SeekableReadStream *file, InfoStuff *stuff); int32 _engineStartTime; int32 _pauseStartTime; diff --git a/engines/scumm/thumbnail.cpp b/engines/scumm/thumbnail.cpp index da5cad945e..1f494b25a5 100644 --- a/engines/scumm/thumbnail.cpp +++ b/engines/scumm/thumbnail.cpp @@ -33,11 +33,8 @@ namespace Scumm { Graphics::Surface *ScummEngine::loadThumbnail(Common::SeekableReadStream *file) { - // TODO: Until backwards seeking in compressed save files is not supported - // We can not use this. - - //if (!Graphics::checkThumbnailHeader(*file)) - // return 0; + if (!Graphics::checkThumbnailHeader(*file)) + return 0; Graphics::Surface *thumb = new Graphics::Surface(); assert(thumb); @@ -50,25 +47,13 @@ Graphics::Surface *ScummEngine::loadThumbnail(Common::SeekableReadStream *file) } void ScummEngine::saveThumbnail(Common::OutSaveFile *file) { - // Until we support no thumbnails in the SCUMM save formats for NDS - // we save a dummy thumbnail. - // - // TODO: Actually all what has to be done about it, is to update - // the code in engines/scumm/saveload.o which skips the saveheader. - // Currently impossible because of lacking backward seek support for - // compressed save files. - // When we change that code to use the new API from graphics/thumbnail.h - // it should be all fine to save no header at all for NDS. - - Graphics::Surface thumb; - #if !defined(__DS__) - if (!createThumbnailFromScreen(&thumb)) + Graphics::saveThumbnail(*file); #endif - thumb.create(kThumbnailWidth, kThumbnailHeight2, sizeof(uint16)); +} - Graphics::saveThumbnail(*file, thumb); - thumb.free(); +void ScummEngine::skipThumbnailHeader(Common::SeekableReadStream *file) { + Graphics::skipThumbnailHeader(*file); } } // end of namespace Scumm diff --git a/graphics/thumbnail.cpp b/graphics/thumbnail.cpp index eb7dd3c6c1..905fea3d93 100644 --- a/graphics/thumbnail.cpp +++ b/graphics/thumbnail.cpp @@ -91,7 +91,7 @@ bool skipThumbnailHeader(Common::SeekableReadStream &in) { uint32 position = in.pos(); ThumbnailHeader header; - if (!loadHeader(in, header, true)) { + if (!loadHeader(in, header, false)) { in.seek(position, SEEK_SET); return false; } |