[Scummvm-cvs-logs] scummvm master -> 732fb69b1cc3a5022d7ed96eb83b84d2043c4240

bluegr bluegr at gmail.com
Sat Nov 2 18:20:08 CET 2013


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
732fb69b1c COMMON: Reenable SEEK_END seeking in GZipReadStream()


Commit: 732fb69b1cc3a5022d7ed96eb83b84d2043c4240
    https://github.com/scummvm/scummvm/commit/732fb69b1cc3a5022d7ed96eb83b84d2043c4240
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2013-11-02T10:19:26-07:00

Commit Message:
COMMON: Reenable SEEK_END seeking in GZipReadStream()

This is needed by the "Mirage" Wintermute game.
Vorbis can do backward seeking, thus we need to enable this for ZIP
streams. Since this can be a potentially slow operation, we throw a
warning (once per stream) when it occurs. Originally, SEEK_END seeks
in GZipReadStream were disabled by commit 9138128f. Refer to patch
#2050337 for more information.

Changed paths:
    common/zlib.cpp



diff --git a/common/zlib.cpp b/common/zlib.cpp
index 920338e..1c7e843 100644
--- a/common/zlib.cpp
+++ b/common/zlib.cpp
@@ -27,6 +27,7 @@
 #include "common/ptr.h"
 #include "common/util.h"
 #include "common/stream.h"
+#include "common/textconsole.h"
 
 #if defined(USE_ZLIB)
   #ifdef __SYMBIAN32__
@@ -158,10 +159,11 @@ protected:
 	uint32 _pos;
 	uint32 _origSize;
 	bool _eos;
+	bool _shownBackwardSeekingWarning;
 
 public:
 
-	GZipReadStream(SeekableReadStream *w, uint32 knownSize = 0) : _wrapped(w), _stream() {
+	GZipReadStream(SeekableReadStream *w, uint32 knownSize = 0) : _wrapped(w), _stream(), _shownBackwardSeekingWarning(false) {
 		assert(w != 0);
 
 		// Verify file header is correct
@@ -241,13 +243,17 @@ public:
 	}
 	bool seek(int32 offset, int whence = SEEK_SET) {
 		int32 newPos = 0;
-		assert(whence != SEEK_END);	// SEEK_END not supported
 		switch (whence) {
 		case SEEK_SET:
 			newPos = offset;
 			break;
 		case SEEK_CUR:
 			newPos = _pos + offset;
+			break;
+		case SEEK_END:
+			// NOTE: This can be an expensive operation (see below).
+			newPos = size() - offset;
+			break;
 		}
 
 		assert(newPos >= 0);
@@ -256,9 +262,15 @@ public:
 			// 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 GZipReadStream detected");
-#endif
+
+			if (!_shownBackwardSeekingWarning) {
+				// We only throw this warning once per stream, to avoid
+				// getting the console swarmed with warnings when consecutive
+				// seeks are made.
+				warning("Backward seeking in GZipReadStream detected");
+				_shownBackwardSeekingWarning = true;
+			}
+
 			_pos = 0;
 			_wrapped->seek(0, SEEK_SET);
 			_zlibErr = inflateReset(&_stream);






More information about the Scummvm-git-logs mailing list