[Scummvm-cvs-logs] SF.net SVN: scummvm: [31044] scummvm/trunk/engines/gob

drmccoy at users.sourceforge.net drmccoy at users.sourceforge.net
Fri Mar 7 01:16:37 CET 2008


Revision: 31044
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31044&view=rev
Author:   drmccoy
Date:     2008-03-06 16:16:37 -0800 (Thu, 06 Mar 2008)

Log Message:
-----------
Added support for RLE compressed frame data in VMDs

Modified Paths:
--------------
    scummvm/trunk/engines/gob/coktelvideo.cpp
    scummvm/trunk/engines/gob/coktelvideo.h

Modified: scummvm/trunk/engines/gob/coktelvideo.cpp
===================================================================
--- scummvm/trunk/engines/gob/coktelvideo.cpp	2008-03-05 17:38:12 UTC (rev 31043)
+++ scummvm/trunk/engines/gob/coktelvideo.cpp	2008-03-07 00:16:37 UTC (rev 31044)
@@ -682,14 +682,14 @@
 			pixWritten = 0;
 			while (pixWritten < width) {
 				pixCount = *srcPtr++;
-				if (pixCount & 0x80) { // data
+				if (pixCount & 0x80) { // Data
 					pixCount = MIN((pixCount & 0x7F) + 1, width - pixWritten);
 					memcpy(imdVidMem, srcPtr, pixCount);
 
 					pixWritten += pixCount;
 					imdVidMem += pixCount;
 					srcPtr += pixCount;
-				} else { // "hole"
+				} else { // "Hole"
 					pixCount = (pixCount + 1) % 256;
 					pixWritten += pixCount;
 					imdVidMem += pixCount;
@@ -721,7 +721,7 @@
 			pixWritten = 0;
 			while (pixWritten < width) {
 				pixCount = *srcPtr++;
-				if (pixCount & 0x80) { // data
+				if (pixCount & 0x80) { // Data
 					pixCount = MIN((pixCount & 0x7F) + 1, width - pixWritten);
 					memcpy(imdVidMem, srcPtr, pixCount);
 					memcpy(imdVidMem + sW, srcPtr, pixCount);
@@ -729,7 +729,7 @@
 					pixWritten += pixCount;
 					imdVidMem += pixCount;
 					srcPtr += pixCount;
-				} else { // "hole"
+				} else { // "Hole"
 					pixCount = (pixCount + 1) % 256;
 					pixWritten += pixCount;
 					imdVidMem += pixCount;
@@ -747,7 +747,7 @@
 	int i;
 	byte buf[4370];
 	uint16 chunkLength;
-	uint16 frameLength;
+	uint32 frameLength;
 	uint16 bufPos1;
 	uint16 bufPos2;
 	uint16 tmp;
@@ -1164,6 +1164,33 @@
 	return state;
 }
 
+void Vmd::deRLE(byte *&srcPtr, byte *&destPtr, int16 len) {
+	srcPtr++;
+
+	if (len & 1)
+		*destPtr += *srcPtr++;
+
+	len >>= 1;
+
+	while (len > 0) {
+		uint8 tmp = *srcPtr++;
+		if (tmp & 0x80) { // Verbatim copy
+			tmp &= 0x7F;
+
+			memcpy(destPtr, srcPtr, tmp * 2);
+			destPtr += tmp * 2;
+			srcPtr += tmp * 2;
+		} else { // 2 bytes tmp times
+			for (int i = 0; i < tmp; i++) {
+				*destPtr++ = srcPtr[0];
+				*destPtr++ = srcPtr[1];
+			}
+			srcPtr += 2;
+		}
+		len -= tmp;
+	}
+}
+
 uint32 Vmd::renderFrame(int16 left, int16 top, int16 right, int16 bottom) {
 	if (!_frameData || !_vidMem || (_width <= 0) || (_height <= 0))
 		return 0;
@@ -1197,14 +1224,14 @@
 			pixWritten = 0;
 			while (pixWritten < width) {
 				pixCount = *srcPtr++;
-				if (pixCount & 0x80) { // data
+				if (pixCount & 0x80) { // Data
 					pixCount = MIN((pixCount & 0x7F) + 1, width - pixWritten);
 					memcpy(imdVidMem, srcPtr, pixCount);
 
 					pixWritten += pixCount;
 					imdVidMem += pixCount;
 					srcPtr += pixCount;
-				} else { // "hole"
+				} else { // "Hole"
 					pixCount = (pixCount + 1) % 256;
 					pixWritten += pixCount;
 					imdVidMem += pixCount;
@@ -1220,8 +1247,32 @@
 			imdVidMem += sW;
 		}
 	} else if (type == 3) { // RLE block
-		warning("Frame render method 3: RLE block");
-		return 0;
+		for (int i = 0; i < height; i++) {
+			imdVidMemBak = imdVidMem;
+
+			pixWritten = 0;
+			while (pixWritten < width) {
+				pixCount = *srcPtr++;
+				if (pixCount & 0x80) {
+					pixCount = (pixCount & 0x7F) + 1;
+
+					if (*srcPtr != 0xFF) { // Normal copy
+						memcpy(imdVidMem, srcPtr, pixCount);
+						imdVidMem += pixCount;
+						srcPtr += pixCount;
+					} else
+						deRLE(srcPtr, imdVidMem, pixCount);
+
+					pixWritten += pixCount;
+				} else { // "Hole"
+					imdVidMem += pixCount + 1;
+					pixWritten += pixCount + 1;
+				}
+
+			}
+			imdVidMemBak += sW;
+			imdVidMem = imdVidMemBak;
+		}
 	} else {
 		warning("Unkown frame rendering method %d (0x%X)", type, type);
 		return 0;

Modified: scummvm/trunk/engines/gob/coktelvideo.h
===================================================================
--- scummvm/trunk/engines/gob/coktelvideo.h	2008-03-05 17:38:12 UTC (rev 31043)
+++ scummvm/trunk/engines/gob/coktelvideo.h	2008-03-07 00:16:37 UTC (rev 31044)
@@ -306,6 +306,8 @@
 	State processFrame(uint16 frame);
 	uint32 renderFrame(int16 left, int16 top, int16 right, int16 bottom);
 
+	void deRLE(byte *&srcPtr, byte *&destPtr, int16 len);
+
 	void emptySoundSlice(uint32 size);
 	void soundSlice8bit(uint32 size);
 	void soundSlice16bit(uint32 size, int16 &init);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list