[Scummvm-cvs-logs] SF.net SVN: scummvm:[40368] scummvm/trunk/engines/cruise/dataLoader.cpp

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Thu May 7 11:49:13 CEST 2009


Revision: 40368
          http://scummvm.svn.sourceforge.net/scummvm/?rev=40368&view=rev
Author:   dreammaster
Date:     2009-05-07 09:49:13 +0000 (Thu, 07 May 2009)

Log Message:
-----------
Commit of patch submitted by Jaime Abraham Corrales Gonzalez, with minor formatting changes

Modified Paths:
--------------
    scummvm/trunk/engines/cruise/dataLoader.cpp

Modified: scummvm/trunk/engines/cruise/dataLoader.cpp
===================================================================
--- scummvm/trunk/engines/cruise/dataLoader.cpp	2009-05-07 08:23:47 UTC (rev 40367)
+++ scummvm/trunk/engines/cruise/dataLoader.cpp	2009-05-07 09:49:13 UTC (rev 40368)
@@ -37,101 +37,96 @@
 
 int loadSingleFile;
 
-// TODO: Unify decodeGfxFormat1, decodeGfxFormat4 and decodeGfxFormat5
-
-void decodeGfxFormat1(dataFileEntry *pCurrentFileEntry) {
-	uint8 *buffer;
+/**
+ * Takes care of decoding a compressed graphic
+ */
+void decodeGfxUnified(dataFileEntry *pCurrentFileEntry, int16 format) {
 	uint8 *dataPtr = pCurrentFileEntry->subData.ptr;
+	int spriteSize;
 
-	int spriteSize = pCurrentFileEntry->height * pCurrentFileEntry->width;
-	int x = 0;
-
-	buffer = (uint8 *) malloc(spriteSize);
-
-	while (x < spriteSize) {
-		uint8 c;
-		uint16 p0;
-
-		p0 = (dataPtr[0] << 8) | dataPtr[1];
-
-		/* decode planes */
-		for (c = 0; c < 16; c++) {
-			buffer[x + c] = ((p0 >> 15) & 1);
-
-			p0 <<= 1;
-		}
-
-		x += 16;
-
-		dataPtr += 2;
+	// Unified how to get spriteSize
+	switch (format) {
+	case 1:
+	case 4:
+		spriteSize = pCurrentFileEntry->height * pCurrentFileEntry->width;
+		break;
+	case 5:
+		spriteSize = pCurrentFileEntry->height * pCurrentFileEntry->widthInColumn;
+		break;
 	}
 
-	pCurrentFileEntry->subData.ptr = buffer;
-}
+	uint8 *buffer = (uint8 *)malloc(spriteSize);
 
-void decodeGfxFormat4(dataFileEntry *pCurrentFileEntry) {
-	uint8 *buffer;
-	uint8 *dataPtr = pCurrentFileEntry->subData.ptr;
+	// Perform format specific decoding
+	switch (format) {
+	case 1:
+	case 4: {
+		int x = 0;
+		while (x < spriteSize) {
+			uint8 c;
+			uint16 p0;
+			// Format 4
+			uint16 p1, p2, p3;
 
-	int spriteSize = pCurrentFileEntry->height * pCurrentFileEntry->width;
-	int x = 0;
+			p0 = (dataPtr[0] << 8) | dataPtr[1];
 
-	buffer = (uint8 *) malloc(spriteSize);
+			// Format 4
+			if (format == 4) {
+				p1 = (dataPtr[2] << 8) | dataPtr[3];
+				p2 = (dataPtr[4] << 8) | dataPtr[5];
+				p3 = (dataPtr[6] << 8) | dataPtr[7];
+			}
 
-	while (x < spriteSize) {
-		uint8 c;
-		uint16 p0;
-		uint16 p1;
-		uint16 p2;
-		uint16 p3;
+			/* decode planes */
+			for (c = 0; c < 16; c++) {
+				// Format 4
+				if (format == 4) {
+					buffer[x + c] = ((p0 >> 15) & 1) | ((p1 >> 14) & 2) | ((p2 >> 13) & 4) | ((p3 >> 12) & 8);
+				} else {
+					buffer[x + c] = ((p0 >> 15) & 1);
+				}
 
-		p0 = (dataPtr[0] << 8) | dataPtr[1];
-		p1 = (dataPtr[2] << 8) | dataPtr[3];
-		p2 = (dataPtr[4] << 8) | dataPtr[5];
-		p3 = (dataPtr[6] << 8) | dataPtr[7];
+				p0 <<= 1;
 
-		/* decode planes */
-		for (c = 0; c < 16; c++) {
-			buffer[x + c] = ((p0 >> 15) & 1) | ((p1 >> 14) & 2) | ((p2 >> 13) & 4) | ((p3 >> 12) & 8);
+				// Format 4
+				if (format == 4) {
+					p1 <<= 1;
+					p2 <<= 1;
+					p3 <<= 1;
+				}
+			}
 
-			p0 <<= 1;
-			p1 <<= 1;
-			p2 <<= 1;
-			p3 <<= 1;
+			x += 16;
+
+			dataPtr += (2 * format);
 		}
 
-		x += 16;
-
-		dataPtr += 8;
+		break;
 	}
+	case 5: {
+		uint8 *destP = buffer;
+		int range = pCurrentFileEntry->height * pCurrentFileEntry->width;
 
-	pCurrentFileEntry->subData.ptr = buffer;
-}
+		for (int line = 0; line < pCurrentFileEntry->height; line++) {
+			uint8 p0, p1, p2, p3, p4;
 
-void decodeGfxFormat5(dataFileEntry *pCurrentFileEntry) {
-	uint8 *dataPtr = pCurrentFileEntry->subData.ptr;
-	int spriteSize = pCurrentFileEntry->height * pCurrentFileEntry->widthInColumn;
-	int range = pCurrentFileEntry->height * pCurrentFileEntry->width;
+			for (int x = 0; x < pCurrentFileEntry->widthInColumn; x++) {
+				int bit = 7 - (x % 8);
+				int col = x / 8;
 
-	uint8 *buffer = (uint8 *)malloc(spriteSize);
-	uint8 *destP = buffer;
+				p0 = (dataPtr[line*pCurrentFileEntry->width + col + range * 0] >> bit) & 1;
+				p1 = (dataPtr[line*pCurrentFileEntry->width + col + range * 1] >> bit) & 1;
+				p2 = (dataPtr[line*pCurrentFileEntry->width + col + range * 2] >> bit) & 1;
+				p3 = (dataPtr[line*pCurrentFileEntry->width + col + range * 3] >> bit) & 1;
+				p4 = (dataPtr[line*pCurrentFileEntry->width + col + range * 4] >> bit) & 1;
 
-	for (int line = 0; line < pCurrentFileEntry->height; line++) {
-		uint8 p0, p1, p2, p3, p4;
-
-		for (int x = 0; x < pCurrentFileEntry->widthInColumn; x++) {
-			int bit = 7 - (x % 8);
-			int col = x / 8;
-
-			p0 = (dataPtr[line*pCurrentFileEntry->width + col + range * 0] >> bit) & 1;
-			p1 = (dataPtr[line*pCurrentFileEntry->width + col + range * 1] >> bit) & 1;
-			p2 = (dataPtr[line*pCurrentFileEntry->width + col + range * 2] >> bit) & 1;
-			p3 = (dataPtr[line*pCurrentFileEntry->width + col + range * 3] >> bit) & 1;
-			p4 = (dataPtr[line*pCurrentFileEntry->width + col + range * 4] >> bit) & 1;
-
-			*destP++ = p0 | (p1 << 1) | (p2 << 2) | (p3 << 3) | (p4 << 4);
+				*destP++ = p0 | (p1 << 1) | (p2 << 2) | (p3 << 3) | (p4 << 4);
+			}
 		}
+
+		break;
 	}
+	}
 
 	pCurrentFileEntry->subData.ptr = buffer;
 }
@@ -470,7 +465,7 @@
 		case 1: {
 			filesDatabase[fileIndex].width = filesDatabase[fileIndex].widthInColumn * 8;
 			filesDatabase[fileIndex].subData.resourceType = OBJ_TYPE_BGMASK;
-			decodeGfxFormat1(&filesDatabase[fileIndex]);
+			decodeGfxUnified(&filesDatabase[fileIndex], localBuffer.type);
 			filesDatabase[fileIndex].subData.index = currentEntryIdx;
 			filesDatabase[fileIndex].subData.transparency = 0;
 			break;
@@ -478,14 +473,14 @@
 		case 4: {
 			filesDatabase[fileIndex].width = filesDatabase[fileIndex].widthInColumn * 2;
 			filesDatabase[fileIndex].subData.resourceType = OBJ_TYPE_SPRITE;
-			decodeGfxFormat4(&filesDatabase[fileIndex]);
+			decodeGfxUnified(&filesDatabase[fileIndex], localBuffer.type);
 			filesDatabase[fileIndex].subData.index = currentEntryIdx;
 			filesDatabase[fileIndex].subData.transparency = localBuffer.transparency % 0x10;
 			break;
 		}
 		case 5: {
 			filesDatabase[fileIndex].subData.resourceType = OBJ_TYPE_SPRITE;
-			decodeGfxFormat5(&filesDatabase[fileIndex]);
+			decodeGfxUnified(&filesDatabase[fileIndex], localBuffer.type);
 			filesDatabase[fileIndex].width = filesDatabase[fileIndex].widthInColumn;
 			filesDatabase[fileIndex].subData.index = currentEntryIdx;
 			filesDatabase[fileIndex].subData.transparency = localBuffer.transparency;


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