[Scummvm-cvs-logs] SF.net SVN: scummvm: [27949] scummvm/trunk/engines/parallaction

peres001 at users.sourceforge.net peres001 at users.sourceforge.net
Sat Jul 7 16:56:30 CEST 2007


Revision: 27949
          http://scummvm.svn.sourceforge.net/scummvm/?rev=27949&view=rev
Author:   peres001
Date:     2007-07-07 07:56:30 -0700 (Sat, 07 Jul 2007)

Log Message:
-----------
DLTA tags in multi-frame images are now supported.

Modified Paths:
--------------
    scummvm/trunk/engines/parallaction/disk.cpp
    scummvm/trunk/engines/parallaction/disk.h

Modified: scummvm/trunk/engines/parallaction/disk.cpp
===================================================================
--- scummvm/trunk/engines/parallaction/disk.cpp	2007-07-07 01:11:43 UTC (rev 27948)
+++ scummvm/trunk/engines/parallaction/disk.cpp	2007-07-07 14:56:30 UTC (rev 27949)
@@ -693,39 +693,106 @@
 
 #define NUM_PLANES		5
 
-// FIXME: no mask is loaded
-void AmigaDisk::unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 planeSize) {
+/*
+	unpackFrame transforms images from 5-bitplanes format to
+	8-bit color-index mode
+*/
+void AmigaDisk::unpackFrame(byte *dst, byte *src, uint16 planeSize) {
 
 	byte s0, s1, s2, s3, s4, mask, t0, t1, t2, t3, t4;
 
+	for (uint32 j = 0; j < planeSize; j++) {
+		s0 = src[j];
+		s1 = src[j+planeSize];
+		s2 = src[j+planeSize*2];
+		s3 = src[j+planeSize*3];
+		s4 = src[j+planeSize*4];
+
+		for (uint32 k = 0; k < 8; k++) {
+			mask = 1 << (7 - k);
+			t0 = (s0 & mask ? 1 << 0 : 0);
+			t1 = (s1 & mask ? 1 << 1 : 0);
+			t2 = (s2 & mask ? 1 << 2 : 0);
+			t3 = (s3 & mask ? 1 << 3 : 0);
+			t4 = (s4 & mask ? 1 << 4 : 0);
+			*dst++ = t0 | t1 | t2 | t3 | t4;
+		}
+
+	}
+
+}
+
+/*
+	patchFrame applies DLTA data (dlta) to specified buffer (dst)
+*/
+void AmigaDisk::patchFrame(byte *dst, byte *dlta, uint16 bytesPerPlane, uint16 height) {
+
+	uint32 *dataIndex = (uint32*)dlta;
+	uint32 *ofslenIndex = (uint32*)dlta + 8;
+
+	uint16 *base = (uint16*)dlta;
+	uint16 wordsPerLine = bytesPerPlane >> 1;
+
+	for (uint j = 0; j < NUM_PLANES; j++) {
+		uint16 *dst16 = (uint16*)(dst + j * bytesPerPlane * height);
+
+		uint16 *data = base + READ_BE_UINT32(dataIndex);
+		dataIndex++;
+		uint16 *ofslen = base + READ_BE_UINT32(ofslenIndex);
+		ofslenIndex++;
+
+		while (*ofslen != 0xFFFF) {
+
+			uint16 ofs = READ_BE_UINT16(ofslen);
+			ofslen++;
+			uint16 size = READ_BE_UINT16(ofslen);
+			ofslen++;
+
+			while (size > 0) {
+				dst16[ofs] ^= *data++;
+				ofs += wordsPerLine;
+				size--;
+			}
+
+		}
+
+	}
+
+}
+
+// FIXME: no mask is loaded
+void AmigaDisk::unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 bytesPerPlane, uint16 height) {
+
+	byte *baseFrame = src;
+	byte *tempBuffer = 0;
+
+	uint16 planeSize = bytesPerPlane * height;
+
 	for (uint32 i = 0; i < numFrames; i++) {
 		if (READ_BE_UINT32(src) == MKID_BE('DLTA')) {
-			// TODO: Add support for delta encoding
-			uint32 size = READ_BE_UINT32(src + 4);
 
-			src += size + 8;
-		} else {
-			for (uint32 j = 0; j < planeSize; j++) {
-				s0 = src[j];
-				s1 = src[j+planeSize];
-				s2 = src[j+planeSize*2];
-				s3 = src[j+planeSize*3];
-				s4 = src[j+planeSize*4];
+			uint size = READ_BE_UINT32(src + 4);
 
-				for (uint32 k = 0; k < 8; k++) {
-					mask = 1 << (7 - k);
-					t0 = (s0 & mask ? 1 << 0 : 0);
-					t1 = (s1 & mask ? 1 << 1 : 0);
-					t2 = (s2 & mask ? 1 << 2 : 0);
-					t3 = (s3 & mask ? 1 << 3 : 0);
-					t4 = (s4 & mask ? 1 << 4 : 0);
-					*dst++ = t0 | t1 | t2 | t3 | t4;
-				}
+			if (tempBuffer == 0)
+				tempBuffer = (byte*)malloc(planeSize * NUM_PLANES);
 
-			}
+			memcpy(tempBuffer, baseFrame, planeSize * NUM_PLANES);
+
+			patchFrame(tempBuffer, src + 8, bytesPerPlane, height);
+			unpackFrame(dst, tempBuffer, planeSize);
+
+			src += (size + 8);
+			dst += planeSize * 8;
+		} else {
+			unpackFrame(dst, src, planeSize);
 			src += planeSize * NUM_PLANES;
+			dst += planeSize * 8;
 		}
 	}
+
+	if (tempBuffer)
+		free(tempBuffer);
+
 }
 
 StaticCnv* AmigaDisk::makeStaticCnv(Common::SeekableReadStream &stream) {
@@ -745,7 +812,7 @@
 	uint32 decsize = width * height;
 	byte *data = (byte*)calloc(decsize, 1);
 
-	unpackBitmap(data, buf, 1, height * bytesPerPlane);
+	unpackBitmap(data, buf, 1, bytesPerPlane, height);
 
 	free(buf);
 
@@ -775,7 +842,7 @@
 	uint32 decsize = numFrames * width * height;
 	byte *data = (byte*)calloc(decsize, 1);
 
-	unpackBitmap(data, buf, numFrames, height * bytesPerPlane);
+	unpackBitmap(data, buf, numFrames, bytesPerPlane, height);
 
 	free(buf);
 
@@ -1111,6 +1178,11 @@
 	Cnv *cnv = makeCnv(*s);
 	delete s;
 
+	FILE *f = fopen(name, "wb");
+	fwrite(cnv->_data, cnv->_height*cnv->_width, cnv->_count, f);
+	fclose(f);
+
+
 	return cnv;
 }
 

Modified: scummvm/trunk/engines/parallaction/disk.h
===================================================================
--- scummvm/trunk/engines/parallaction/disk.h	2007-07-07 01:11:43 UTC (rev 27948)
+++ scummvm/trunk/engines/parallaction/disk.h	2007-07-07 14:56:30 UTC (rev 27949)
@@ -166,7 +166,9 @@
 protected:
 	Cnv* makeCnv(Common::SeekableReadStream &stream);
 	StaticCnv* makeStaticCnv(Common::SeekableReadStream &stream);
-	void unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 planeSize);
+	void patchFrame(byte *dst, byte *dlta, uint16 bytesPerPlane, uint16 height);
+	void unpackFrame(byte *dst, byte *src, uint16 planeSize);
+	void unpackBitmap(byte *dst, byte *src, uint16 numFrames, uint16 bytesPerPlane, uint16 height);
 	Common::SeekableReadStream *openArchivedFile(const char* name, bool errorOnFileNotFound = false);
 	Font *createFont(const char *name, Common::SeekableReadStream &stream);
 	void loadMask(const char *name);


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