[Scummvm-cvs-logs] SF.net SVN: scummvm: [32182] scummvm/trunk/engines/made

john_doe at users.sourceforge.net john_doe at users.sourceforge.net
Mon May 19 21:34:55 CEST 2008


Revision: 32182
          http://scummvm.svn.sourceforge.net/scummvm/?rev=32182&view=rev
Author:   john_doe
Date:     2008-05-19 12:34:55 -0700 (Mon, 19 May 2008)

Log Message:
-----------
RtZ: Fixed bug which caused PMV videos to look odd (noticeable in the intro movie) and optimized frame decompression code.

Modified Paths:
--------------
    scummvm/trunk/engines/made/graphics.cpp
    scummvm/trunk/engines/made/graphics.h
    scummvm/trunk/engines/made/pmvplayer.cpp

Modified: scummvm/trunk/engines/made/graphics.cpp
===================================================================
--- scummvm/trunk/engines/made/graphics.cpp	2008-05-19 17:34:29 UTC (rev 32181)
+++ scummvm/trunk/engines/made/graphics.cpp	2008-05-19 19:34:55 UTC (rev 32182)
@@ -47,7 +47,6 @@
 
 	byte *destPtr = (byte*)surface.getBasePtr(0, 0);
 
-	//byte lineBuf[320 * 4];
 	byte lineBuf[640 * 4];
 	byte bitBuf[40];
 
@@ -149,4 +148,114 @@
 
 }
 
+void decompressMovieImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, uint16 pixelOffs, uint16 maskOffs, uint16 lineSize) {
+
+	uint16 width = surface.w;
+	uint16 height = surface.h;
+	uint16 bx = 0, by = 0, bw = ((width + 3) / 4) * 4;
+
+	byte *cmdBuffer = source + cmdOffs;
+	byte *maskBuffer = source + maskOffs;
+	byte *pixelBuffer = source + pixelOffs;
+
+	byte *destPtr = (byte*)surface.getBasePtr(0, 0);
+
+	byte bitBuf[40];
+
+	int bitBufLastOfs = (((lineSize + 1) >> 1) << 1) - 2;
+	int bitBufLastCount = ((width + 3) >> 2) & 7;
+	if (bitBufLastCount == 0)
+		bitBufLastCount = 8;
+		
+	debug(1, "width = %d; bw = %d", width, bw);
+
+	while (height > 0) {
+
+		int drawDestOfs = 0;
+
+		memcpy(bitBuf, cmdBuffer, lineSize);
+		cmdBuffer += lineSize;
+
+		for (uint16 bitBufOfs = 0; bitBufOfs < lineSize; bitBufOfs += 2) {
+
+			uint16 bits = READ_LE_UINT16(&bitBuf[bitBufOfs]);
+
+			int bitCount;
+			if (bitBufOfs == bitBufLastOfs)
+				bitCount = bitBufLastCount;
+			else
+				bitCount = 8;
+
+			for (int curCmd = 0; curCmd < bitCount; curCmd++) {
+				uint cmd = bits & 3;
+				bits >>= 2;
+
+				byte pixels[4], block[16];
+				uint32 mask;
+
+				switch (cmd) {
+
+				case 0:
+					pixels[0] = *pixelBuffer++;
+					for (int i = 0; i < 16; i++)
+						block[i] = pixels[0];
+					break;
+
+				case 1:
+					pixels[0] = *pixelBuffer++;
+					pixels[1] = *pixelBuffer++;
+					mask = READ_LE_UINT16(maskBuffer);
+					maskBuffer += 2;
+					for (int i = 0; i < 16; i++) {
+						block[i] = pixels[mask & 1];
+						mask >>= 1;
+					}
+					break;
+
+				case 2:
+					pixels[0] = *pixelBuffer++;
+					pixels[1] = *pixelBuffer++;
+					pixels[2] = *pixelBuffer++;
+					pixels[3] = *pixelBuffer++;
+					mask = READ_LE_UINT32(maskBuffer);
+					maskBuffer += 4;
+					for (int i = 0; i < 16; i++) {
+						block[i] = pixels[mask & 3];
+						mask >>= 2;
+					}
+					break;
+
+				case 3:
+					break;
+
+				}
+
+				if (cmd != 3) {
+					uint16 blockPos = 0;
+					uint32 maxW = MIN(4, surface.w - bx);
+					uint32 maxH = (MIN(4, surface.h - by) + by) * width;
+					for (uint32 yc = by * width; yc < maxH; yc += width) {
+						for (uint32 xc = 0; xc < maxW; xc++) {
+							destPtr[(bx + xc) + yc] = block[xc + blockPos];
+						}
+						blockPos += 4;
+					}
+				}
+
+				bx += 4;
+				if (bx >= bw) {
+					bx = 0;
+					by += 4;
+				}
+
+			}
+
+		}
+
+		height -= 4;
+
+	}
+
+}
+
 } // End of namespace Made

Modified: scummvm/trunk/engines/made/graphics.h
===================================================================
--- scummvm/trunk/engines/made/graphics.h	2008-05-19 17:34:29 UTC (rev 32181)
+++ scummvm/trunk/engines/made/graphics.h	2008-05-19 19:34:55 UTC (rev 32182)
@@ -34,6 +34,7 @@
 namespace Made {
 
 void decompressImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, uint16 pixelOffs, uint16 maskOffs, uint16 lineSize, bool deltaFrame = false);
+void decompressMovieImage(byte *source, Graphics::Surface &surface, uint16 cmdOffs, uint16 pixelOffs, uint16 maskOffs, uint16 lineSize);
 
 } // End of namespace Made
 

Modified: scummvm/trunk/engines/made/pmvplayer.cpp
===================================================================
--- scummvm/trunk/engines/made/pmvplayer.cpp	2008-05-19 17:34:29 UTC (rev 32181)
+++ scummvm/trunk/engines/made/pmvplayer.cpp	2008-05-19 19:34:55 UTC (rev 32182)
@@ -74,7 +74,7 @@
 	uint32 frameCount = 0;
 	uint16 chunkCount = 0;
 	uint32 soundSize = 0;
-	uint32 palChunkOfs = 0;
+	uint32 soundChunkOfs = 0, palChunkOfs = 0;
 	uint32 palSize = 0;
 	byte *frameData, *audioData, *soundData, *palData, *imageData;
 	bool firstTime = true;
@@ -100,23 +100,29 @@
 
 		frameData = new byte[chunkSize];
 		_fd->read(frameData, chunkSize);
+		
+		soundChunkOfs = READ_LE_UINT32(frameData + 8);
+		palChunkOfs = READ_LE_UINT32(frameData + 16);
 
 		// Handle audio
-		audioData = frameData + READ_LE_UINT32(frameData + 8) - 8;
-		chunkSize = READ_LE_UINT16(audioData + 4);
-		chunkCount = READ_LE_UINT16(audioData + 6);
+		if (soundChunkOfs) {
 
-		if (chunkCount > 50) break;	// FIXME: this is a hack
+			audioData = frameData + soundChunkOfs - 8;
+			chunkSize = READ_LE_UINT16(audioData + 4);
+			chunkCount = READ_LE_UINT16(audioData + 6);
 
-		debug(1, "chunkCount = %d; chunkSize = %d; total = %d\n", chunkCount, chunkSize, chunkCount * chunkSize);
+			debug(1, "chunkCount = %d; chunkSize = %d; total = %d\n", chunkCount, chunkSize, chunkCount * chunkSize);
 
-		soundSize = chunkCount * chunkSize;
-		soundData = new byte[soundSize];
-		decompressSound(audioData + 8, soundData, chunkSize, chunkCount);
-		_audioStream->queueBuffer(soundData, soundSize);
+			if (chunkCount > 50) break;	// FIXME: this is a hack
 
+			soundSize = chunkCount * chunkSize;
+			soundData = new byte[soundSize];
+			decompressSound(audioData + 8, soundData, chunkSize, chunkCount);
+			_audioStream->queueBuffer(soundData, soundSize);
+
+		}
+
 		// Handle palette
-		palChunkOfs = READ_LE_UINT32(frameData + 16);
 		if (palChunkOfs) {
 			palData = frameData + palChunkOfs - 8;
 			palSize = READ_LE_UINT32(palData + 4);
@@ -143,7 +149,7 @@
 			_surface->create(width, height, 1);
 		}
 
-		decompressImage(imageData, *_surface, cmdOffs, pixelOffs, maskOffs, lineSize, frameNum > 0);
+		decompressMovieImage(imageData, *_surface, cmdOffs, pixelOffs, maskOffs, lineSize);
 	
 		if (firstTime) {
 			_mixer->playInputStream(Audio::Mixer::kPlainSoundType, &_audioStreamHandle, _audioStream);


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