[Scummvm-git-logs] scummvm master -> c658a2e5d01511d2c505b27e497bd145670f1614

joostp noreply at scummvm.org
Fri Aug 5 15:32:39 UTC 2022


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
c658a2e5d0 ICB: ELDORADO: support newer texture format


Commit: c658a2e5d01511d2c505b27e497bd145670f1614
    https://github.com/scummvm/scummvm/commit/c658a2e5d01511d2c505b27e497bd145670f1614
Author: Joost Peters (joostp at 7fc1.org)
Date: 2022-08-05T17:31:40+02:00

Commit Message:
ICB: ELDORADO: support newer texture format

Changed paths:
    engines/icb/common/revtex_api.h
    engines/icb/stagedraw_pc_poly.cpp


diff --git a/engines/icb/common/revtex_api.h b/engines/icb/common/revtex_api.h
index dc96595014b..d5ca16e01bc 100644
--- a/engines/icb/common/revtex_api.h
+++ b/engines/icb/common/revtex_api.h
@@ -30,16 +30,35 @@
 namespace ICB {
 
 #define REVTEX_API_ID "RTX"
-#define REVTEX_API_SCHEMA 1
+#define REVTEX_API_SCHEMA_ICB 1
+#define REVTEX_API_SCHEMA_ELDORADO 2
 
 #define MAX_PAL_ENTRIES (256)
 
+typedef struct revtex_API_header {
+	char id[4];
+	uint32 schema;
+} revtex_API_header;
+
 // The level pointers within the RevTexture structure in this structure
 // are relative addresses which get converted to absolute pointer by
 // calling the Map function
-typedef struct revtex_API {
+typedef struct revtex_API_v1 {
+	char id[4];
+	uint32 schema;
+
+	// RevTexture revtex;
+	uint32 palette[256];   // windows 32-bit RGB with 1 byte of padding
+	uint32 width;          // must be power of 2
+	uint32 height;         // must be power of 2
+	uint32 levelOffset[9]; // width/1 * height/1 -> width/256 * height/256
+
+} revtex_API_v1;
+
+typedef struct revtex_API_v2 {
 	char id[4];
 	uint32 schema;
+	uint32 transparent;
 
 	// RevTexture revtex;
 	uint32 palette[256];   // windows 32-bit RGB with 1 byte of padding
@@ -47,7 +66,7 @@ typedef struct revtex_API {
 	uint32 height;         // must be power of 2
 	uint32 levelOffset[9]; // width/1 * height/1 -> width/256 * height/256
 
-} revtex_API;
+} revtex_API_v2;
 
 } // End of namespace ICB
 
diff --git a/engines/icb/stagedraw_pc_poly.cpp b/engines/icb/stagedraw_pc_poly.cpp
index cc1a1f58696..2b1dd13ff86 100644
--- a/engines/icb/stagedraw_pc_poly.cpp
+++ b/engines/icb/stagedraw_pc_poly.cpp
@@ -144,6 +144,7 @@ void DestoryRevRenderDevice() {
 #define TEX 0
 #define PAL 1
 TextureHandle *texHans[MAX_NUM_TEX_HANS];
+uint32 texTransparent[MAX_NUM_TEX_HANS];
 uint32 texHanHashs[MAX_NUM_TEX_HANS][2];
 uint32 texHanBaseHashs[MAX_NUM_TEX_HANS];
 int32 numTexHans = 0;
@@ -156,6 +157,7 @@ void ClearTextures() {
 		texHanHashs[i][TEX] = 0; // no hash so don't think we have this texture
 		texHanHashs[i][PAL] = 0; // no hash so don't think we have this texture
 		texHanBaseHashs[i] = 0;  // ditto
+		texTransparent[i] = 0;
 
 		UnregisterTexture(texHans[i]);
 	}
@@ -168,42 +170,71 @@ void ClearTextures() {
 // open a new texture, add it to position numTexHans of texHans list...
 void OpenTexture(const char *tex_name, uint32 tex_hash, const char *pal_name, uint32 pal_hash, const char *base, uint32 base_hash) {
 	// Load the texture
-	revtex_API *rTexAPI = (revtex_API *)rs_anims->Res_open(tex_name, tex_hash, base, base_hash);
+	revtex_API_header *rTexAPIHeader = (revtex_API_header *)rs_anims->Res_open(tex_name, tex_hash, base, base_hash);
 
 	// Check the texture file is correct ID & schema
-	if (READ_LE_UINT32((uint32 *)rTexAPI->id) != (*(uint32 *)const_cast<char *>(REVTEX_API_ID)))
-		Fatal_error("Invalid revtex_API id file %s API %s in file %s", rTexAPI->id, REVTEX_API_ID, tex_name);
+	if (READ_LE_UINT32((uint32 *)rTexAPIHeader->id) != (*(uint32 *)const_cast<char *>(REVTEX_API_ID)))
+		Fatal_error("Invalid revtex_API id file %s API %s in file %s", rTexAPIHeader->id, REVTEX_API_ID, tex_name);
 
-	if (FROM_LE_32(rTexAPI->schema) != REVTEX_API_SCHEMA)
-		Fatal_error("Invalid revtex_API file schema file %d API %d in file %s", FROM_LE_32(rTexAPI->schema), REVTEX_API_SCHEMA, tex_name);
+	if (FROM_LE_32(rTexAPIHeader->schema) != REVTEX_API_SCHEMA_ICB && FROM_LE_32(rTexAPIHeader->schema) != REVTEX_API_SCHEMA_ELDORADO)
+		Fatal_error("Invalid revtex_API file schema file %d in file %s", FROM_LE_32(rTexAPIHeader->schema), tex_name);
 
 	// Load the palette (it might be the same file !)
-	revtex_API *rPalAPI = (revtex_API *)rs_anims->Res_open(pal_name, pal_hash, base, base_hash);
+	revtex_API_header *rPalAPIHeader = (revtex_API_header *)rs_anims->Res_open(pal_name, pal_hash, base, base_hash);
 
 	// Is the palette different ?
-	if (rPalAPI != rTexAPI) {
+	if (rPalAPIHeader != rTexAPIHeader) {
 		// It's different !
-		if ((READ_LE_UINT32((uint32 *)rPalAPI->id)) != (*(uint32 *)const_cast<char *>(REVTEX_API_ID)))
-			Fatal_error("Invalid revtex_API id file %s API %s in file %s", rTexAPI->id, REVTEX_API_ID, pal_name);
+		if ((READ_LE_UINT32((uint32 *)rPalAPIHeader->id)) != (*(uint32 *)const_cast<char *>(REVTEX_API_ID)))
+			Fatal_error("Invalid revtex_API id file %s API %s in file %s", rPalAPIHeader->id, REVTEX_API_ID, pal_name);
 
-		if (FROM_LE_32(rPalAPI->schema) != REVTEX_API_SCHEMA)
-			Fatal_error("Invalid revtex_API file schema file %d API %d in file %s", FROM_LE_32(rTexAPI->schema), REVTEX_API_SCHEMA, pal_name);
+		if (FROM_LE_32(rPalAPIHeader->schema) != REVTEX_API_SCHEMA_ICB && FROM_LE_32(rPalAPIHeader->schema) != REVTEX_API_SCHEMA_ELDORADO)
+			Fatal_error("Invalid revtex_API file schema file %d in file %s", FROM_LE_32(rPalAPIHeader->schema), pal_name);
 
-		// Copy the palette into the texture
-		memcpy(rTexAPI->palette, rPalAPI->palette, 256 * sizeof(uint32));
+		if (FROM_LE_32(rTexAPIHeader->schema) != FROM_LE_32(rPalAPIHeader->schema))
+			Fatal_error("revtex_API file schema mismatch %d != %d", FROM_LE_32(rTexAPIHeader->schema), FROM_LE_32(rPalAPIHeader->schema));
+
+		if (FROM_LE_32(rTexAPIHeader->schema) == REVTEX_API_SCHEMA_ICB) {
+			revtex_API_v1 *rTexAPI = (revtex_API_v1 *)rTexAPIHeader;
+			revtex_API_v1 *rPalAPI = (revtex_API_v1 *)rPalAPIHeader;
+
+			// Copy the palette into the texture
+			memcpy(rTexAPI->palette, rPalAPI->palette, 256 * sizeof(uint32));
+		} else if (FROM_LE_32(rTexAPIHeader->schema) == REVTEX_API_SCHEMA_ELDORADO) {
+			revtex_API_v2 *rTexAPI = (revtex_API_v2 *)rTexAPIHeader;
+			revtex_API_v2 *rPalAPI = (revtex_API_v2 *)rPalAPIHeader;
+
+			// Copy the palette into the texture
+			memcpy(rTexAPI->palette, rPalAPI->palette, 256 * sizeof(uint32));
+		}
 	}
 
 	// Set up RevTexture structure
 	RevTexture revTex;
-	revTex.palette = rTexAPI->palette;
-	revTex.width = FROM_LE_32(rTexAPI->width);
-	revTex.height = FROM_LE_32(rTexAPI->height);
-	for (int32 i = 0; i < 9; i++) {
-		revTex.level[i] = (uint8 *)rTexAPI + FROM_LE_32(rTexAPI->levelOffset[i]);
+	uint32 transparent = 0;
+
+	if (FROM_LE_32(rTexAPIHeader->schema) == REVTEX_API_SCHEMA_ICB) {
+		revtex_API_v1 *rTexAPI = (revtex_API_v1 *)rTexAPIHeader;
+		revTex.palette = rTexAPI->palette;
+		revTex.width = FROM_LE_32(rTexAPI->width);
+		revTex.height = FROM_LE_32(rTexAPI->height);
+		for (int32 i = 0; i < 9; i++) {
+			revTex.level[i] = (uint8 *)rTexAPI + FROM_LE_32(rTexAPI->levelOffset[i]);
+		}
+	} else if (FROM_LE_32(rTexAPIHeader->schema) == REVTEX_API_SCHEMA_ELDORADO) {
+		revtex_API_v2 *rTexAPI = (revtex_API_v2 *)rTexAPIHeader;
+		revTex.palette = rTexAPI->palette;
+		revTex.width = FROM_LE_32(rTexAPI->width);
+		revTex.height = FROM_LE_32(rTexAPI->height);
+		for (int32 i = 0; i < 9; i++) {
+			revTex.level[i] = (uint8 *)rTexAPI + FROM_LE_32(rTexAPI->levelOffset[i]);
+		}
+		transparent = rTexAPI->transparent;
 	}
 
 	// Register the texture
 	texHans[numTexHans] = RegisterTexture(&revTex);
+	texTransparent[numTexHans] = transparent;
 	texHanHashs[numTexHans][TEX] = tex_hash;
 	texHanHashs[numTexHans][PAL] = pal_hash;
 	texHanBaseHashs[numTexHans] = base_hash;




More information about the Scummvm-git-logs mailing list