aboutsummaryrefslogtreecommitdiff
path: root/engines/cruise/dataLoader.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2009-05-07 09:49:13 +0000
committerPaul Gilbert2009-05-07 09:49:13 +0000
commit70472c79cd8b338cc25282a5a3c7ddd1ae372fd1 (patch)
tree28e2fb8073441cfd2a99f56e5b8ded2d65e7d0d7 /engines/cruise/dataLoader.cpp
parentcd90fdacebb7ec4b138385ac6c0b9e6fd7fe66c4 (diff)
downloadscummvm-rg350-70472c79cd8b338cc25282a5a3c7ddd1ae372fd1.tar.gz
scummvm-rg350-70472c79cd8b338cc25282a5a3c7ddd1ae372fd1.tar.bz2
scummvm-rg350-70472c79cd8b338cc25282a5a3c7ddd1ae372fd1.zip
Commit of patch submitted by Jaime Abraham Corrales Gonzalez, with minor formatting changes
svn-id: r40368
Diffstat (limited to 'engines/cruise/dataLoader.cpp')
-rw-r--r--engines/cruise/dataLoader.cpp153
1 files changed, 74 insertions, 79 deletions
diff --git a/engines/cruise/dataLoader.cpp b/engines/cruise/dataLoader.cpp
index 5602bdfec1..b458bee9d3 100644
--- a/engines/cruise/dataLoader.cpp
+++ b/engines/cruise/dataLoader.cpp
@@ -37,100 +37,95 @@ enum fileTypeEnum {
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;
-}
-
-void decodeGfxFormat4(dataFileEntry *pCurrentFileEntry) {
- uint8 *buffer;
- uint8 *dataPtr = pCurrentFileEntry->subData.ptr;
+ uint8 *buffer = (uint8 *)malloc(spriteSize);
- int spriteSize = pCurrentFileEntry->height * pCurrentFileEntry->width;
- int x = 0;
+ // 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;
+
+ p0 = (dataPtr[0] << 8) | dataPtr[1];
+
+ // Format 4
+ if (format == 4) {
+ p1 = (dataPtr[2] << 8) | dataPtr[3];
+ p2 = (dataPtr[4] << 8) | dataPtr[5];
+ p3 = (dataPtr[6] << 8) | dataPtr[7];
+ }
- buffer = (uint8 *) malloc(spriteSize);
+ /* 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);
+ }
- while (x < spriteSize) {
- uint8 c;
- uint16 p0;
- uint16 p1;
- uint16 p2;
- uint16 p3;
+ p0 <<= 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];
+ // Format 4
+ if (format == 4) {
+ p1 <<= 1;
+ p2 <<= 1;
+ p3 <<= 1;
+ }
+ }
- /* decode planes */
- for (c = 0; c < 16; c++) {
- buffer[x + c] = ((p0 >> 15) & 1) | ((p1 >> 14) & 2) | ((p2 >> 13) & 4) | ((p3 >> 12) & 8);
+ x += 16;
- p0 <<= 1;
- p1 <<= 1;
- p2 <<= 1;
- p3 <<= 1;
+ 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;
-
- 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;
+ 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 @@ int loadSetEntry(const char *name, uint8 *ptr, int currentEntryIdx, int currentD
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 @@ int loadSetEntry(const char *name, uint8 *ptr, int currentEntryIdx, int currentD
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;