[Scummvm-cvs-logs] scummvm master -> eb6c60cec034a7758b8d25e29f501b10fc06c1a4

Littleboy littleboy22 at gmail.com
Wed Aug 1 08:46:32 CEST 2012


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:
eb6c60cec0 LASTEXPRESS: Implement savegame read compression


Commit: eb6c60cec034a7758b8d25e29f501b10fc06c1a4
    https://github.com/scummvm/scummvm/commit/eb6c60cec034a7758b8d25e29f501b10fc06c1a4
Author: Littleboy (littleboy at scummvm.org)
Date: 2012-07-31T23:39:51-07:00

Commit Message:
LASTEXPRESS: Implement savegame read compression

Changed paths:
    engines/lastexpress/game/savegame.cpp
    engines/lastexpress/game/savegame.h



diff --git a/engines/lastexpress/game/savegame.cpp b/engines/lastexpress/game/savegame.cpp
index 54ba45e..360e991 100644
--- a/engines/lastexpress/game/savegame.cpp
+++ b/engines/lastexpress/game/savegame.cpp
@@ -119,6 +119,18 @@ void SavegameStream::writeBuffer(uint8 value, bool onlyValue) {
 	}
 }
 
+uint8 SavegameStream::readBuffer() {
+	if (_bufferOffset == -1 || _bufferOffset >= 256) {
+		readUncompressed(_buffer, 256);
+		_bufferOffset = 0;
+	}
+
+	byte val = _buffer[_bufferOffset];
+	_bufferOffset++;
+
+	return val;
+}
+
 uint32 SavegameStream::process() {
 	_enableCompression = !_enableCompression;
 
@@ -148,24 +160,24 @@ uint32 SavegameStream::process() {
 
 		case 2:
 			if (_previousValue) {
-				writeBuffer(0xFF, true);
-				writeBuffer(_repeatCount, true);
-				writeBuffer(_previousValue, true);
+				writeBuffer(0xFF);
+				writeBuffer(_repeatCount);
+				writeBuffer(_previousValue);
 				break;
 			}
 
 			if (_repeatCount == 3) {
-				writeBuffer(0xFB, true);
+				writeBuffer(0xFB);
 				break;
 			}
 
-			if (_repeatCount == -1) {
-				writeBuffer(0xFC, true);
+			if (_repeatCount == 255) {
+				writeBuffer(0xFC);
 				break;
 			}
 
-			writeBuffer(0xFD, true);
-			writeBuffer(_repeatCount, true);
+			writeBuffer(0xFD);
+			writeBuffer(_repeatCount);
 			break;
 		}
 
@@ -190,7 +202,7 @@ uint32 SavegameStream::writeCompressed(const void *dataPtr, uint32 dataSize) {
 		error("[SavegameStream::writeCompressed] Error: Compression buffer is in read mode.");
 
 	_status = kStatusWriting;
-	byte *data = (byte *)dataPtr;
+	const byte *data = (const byte *)dataPtr;
 
 	while (dataSize) {
 		switch (_valueCount) {
@@ -264,7 +276,72 @@ uint32 SavegameStream::readCompressed(void *dataPtr, uint32 dataSize) {
 	if (_status == kStatusWriting)
 		error("[SavegameStream::writeCompressed] Error: Compression buffer is in write mode.");
 
-	error("[SavegameStream::readCompressed] Compression not implemented!");
+	_status = kStatusReady;
+	byte *data = (byte *)dataPtr;
+
+	while (dataSize) {
+		switch (_valueCount) {
+		default:
+			error("[SavegameStream::readCompressed] Invalid value count (%d)", _valueCount);
+
+		case 0:
+		case 1: {
+			// Read control code
+			byte control = readBuffer();
+
+			switch (control) {
+			default:
+				// Data value
+				*data++ = control;
+				break;
+
+			case 0xFB:
+				_repeatCount = 2;
+				_previousValue = 0;
+				*data++ = 0;
+				_valueCount = 2;
+				break;
+
+			case 0xFC:
+				_repeatCount = 254;
+				_previousValue = 0;
+				*data++ = 0;
+				_valueCount = 2;
+				break;
+
+			case 0xFD:
+				_repeatCount = readBuffer() - 1;
+				_previousValue = 0;
+				*data++ = 0;
+				_valueCount = 2;
+				break;
+
+			case 0xFE:
+				*data++ = readBuffer();
+				break;
+
+			case 0xFF:
+				_repeatCount = readBuffer() - 1;
+				_previousValue = readBuffer();
+				*data++ = _previousValue;
+				_valueCount = 2;
+				break;
+			}
+			}
+			break;
+
+		case 2:
+			*data++ = _previousValue;
+			_repeatCount--;
+			if (!_repeatCount)
+				_valueCount = 1;
+			break;
+		}
+
+		--dataSize;
+	}
+
+	return _offset;
 }
 
 //////////////////////////////////////////////////////////////////////////
diff --git a/engines/lastexpress/game/savegame.h b/engines/lastexpress/game/savegame.h
index 8866fd3..8656b2e 100644
--- a/engines/lastexpress/game/savegame.h
+++ b/engines/lastexpress/game/savegame.h
@@ -124,7 +124,8 @@ private:
 	uint32 writeCompressed(const void *dataPtr, uint32 dataSize);
 	uint32 readCompressed(void *dataPtr, uint32 dataSize);
 
-	void writeBuffer(uint8 value, bool onlyValue);
+	void writeBuffer(uint8 value, bool onlyValue = true);
+	uint8 readBuffer();
 
 private:
 	bool _eos;






More information about the Scummvm-git-logs mailing list