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

neuromancer noreply at scummvm.org
Sun Feb 23 14:27:52 UTC 2025


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:
ce5b705283 FREESCAPE: improve handling of c64 color palette


Commit: ce5b705283fdd34730255c5a784afe87df03cad2
    https://github.com/scummvm/scummvm/commit/ce5b705283fdd34730255c5a784afe87df03cad2
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2025-02-23T14:30:02+01:00

Commit Message:
FREESCAPE: improve handling of c64 color palette

Changed paths:
    engines/freescape/gfx.cpp


diff --git a/engines/freescape/gfx.cpp b/engines/freescape/gfx.cpp
index eefb6de66c5..9625dc15178 100644
--- a/engines/freescape/gfx.cpp
+++ b/engines/freescape/gfx.cpp
@@ -143,13 +143,13 @@ byte getCGAStipple(byte x, int back, int fore) {
 }
 
 byte getC64Stipple(byte x, int back, int fore) {
-	int c0 = getC64Pixel(x, 0);
+	int c0 = x & 1 ? fore : back; //getC64Pixel(x, 0);
 	assert(c0 == back || c0 == fore || back == fore);
-	int c1 = getC64Pixel(x, 1);
+	int c1 = (x >> 1) & 1 ? fore : back; //getC64Pixel(x, 1);
 	assert(c1 == back || c1 == fore || back == fore);
-	int c2 = getC64Pixel(x, 2);
+	int c2 = (x >> 2) & 1 ? fore : back; //getC64Pixel(x, 2);
 	assert(c2 == back || c2 == fore || back == fore);
-	int c3 = getC64Pixel(x, 3);
+	int c3 = (x >> 3) & 1 ? fore : back; //getC64Pixel(x, 3);
 	assert(c3 == back || c3 == fore || back == fore);
 
 	byte st = 0;
@@ -173,43 +173,107 @@ void Renderer::clearColorPairArray() {
 		_colorPair[i] = 0;
 }
 
+int getC64Color(uint8 index, bool isBackground) {
+	if (index < 4)
+		return index;
+
+	if (isBackground) {
+		switch(index) {
+		case 4:
+			return 1;
+		case 5: // OK
+			return 2;
+		case 6: // OK
+			return 0;
+		case 7: // OK
+			return 1;
+		case 8:
+			return 1; // ??
+		case 9:  // OK
+			return 3;
+		case 10: // ??
+			return 0;
+		case 11:
+			return 0;
+		case 12:
+			return 0;
+		case 13: // OK
+			return 3;
+		case 14:
+			return 0;
+		default:
+			error("invalid c64 color index %d", index);
+		}
+	}
+
+	switch(index) {
+		case 4:
+			return 0;
+		case 5: // OK
+			return 0;
+		case 6: // OK
+			return 3;
+		case 7: // OK
+			return 2;
+		case 8:
+			return 3; // ??
+		case 9: // OK
+			return 2;
+		case 10: // ??
+			return 0;
+		case 11:
+			return 0;
+		case 12:
+			return 0;
+		case 13:
+			return 2;
+		case 14:
+			return 0;
+		default:
+			error("invalid c64 color index %d", index);
+	}
+
+	error("unreachable");
+}
+
 void Renderer::fillColorPairArray() {
 	for (int i = 0; i < 15; i++) {
 		byte *entry = (*_colorMap)[i];
-		int c1;
+		int c1 = -1;
+		int c2 = -1;
 		if (_renderMode == Common::kRenderCGA)
 			c1 = getCGAPixel(entry[0], 0);
 		else if (_renderMode == Common::kRenderCPC)
 			c1 = getCPCPixel(entry[0], 0, true);
-		else if (_renderMode == Common::kRenderC64)
-			c1 = getC64Pixel(entry[0], 0);
-		else
+		else if (_renderMode == Common::kRenderC64) {
+			c1 = getC64Color(i, false);
+			c2 = getC64Color(i, true);
+		} else
 			error("Not implemented");
 
-		int c2 = -1;
-
-		for (int j = 0; j < 4; j++) {
-			int k, c;
-			for (k = 0; k < 4; k++) {
-				if (_renderMode == Common::kRenderCGA)
-					c = getCGAPixel(entry[j], k);
-				else if (_renderMode == Common::kRenderCPC)
-					c = getCPCPixel(entry[j], k, true);
-				else if (_renderMode == Common::kRenderC64)
-					c = getC64Pixel(entry[j], k);
-				else
-					error("Not implemented");
-				if (c1 != c) {
-					c2 = c;
-					break;
+		if (_renderMode != Common::kRenderC64) {
+			for (int j = 0; j < 4  && c2 == -1; j++) {
+				int k, c;
+				for (k = 0; k < 4; k++) {
+					if (_renderMode == Common::kRenderCGA)
+						c = getCGAPixel(entry[j], k);
+					else if (_renderMode == Common::kRenderCPC)
+						c = getCPCPixel(entry[j], k, true);
+					else
+						error("Not implemented");
+					if (c1 != c) {
+						c2 = c;
+						break;
+					}
 				}
+				if (k != 4)
+					break;
 			}
-			if (k != 4)
-				break;
+			// The Castle Master CPC release needs the following workaround
+			if (c2 < 0)
+				c2 = c1;
+
 		}
-		// The Castle Master CPC release needs the following workaround
-		if (c2 < 0)
-			c2 = c1;
 		assert((c1 < 16) & (c2 < 16));
 		_colorPair[i] = byte(c1) | (byte(c2) << 4);
 	}
@@ -342,46 +406,6 @@ bool Renderer::getRGBAtCGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &
 	return true;
 }
 
-void Renderer::extractC64Indexes(uint8 cm1, uint8 cm2, uint8 &i1, uint8 &i2) {
-	if (cm1 == 0x00 && cm2 == 0x00) {
-		i1 = 0;
-		i2 = 0;
-	} else if (cm1 == 0xf0 && cm2 == 0xf0) {
-		i1 = 1;
-		i2 = 1;
-	} else if (cm1 == 0x0f && cm2 == 0x0f) {
-		i1 = 2;
-		i2 = 2;
-	} else if (cm1 == 0xff && cm2 == 0xff) {
-		i1 = 3;
-		i2 = 3;
-	} else if (cm1 == 0xaa && cm2 == 0x55) {
-		i1 = 3;
-		i2 = 1;
-	} else if (cm1 == 0x05 && cm2 == 0x0a) { // Y?
-		i1 = 1;
-		i2 = 0;
-	} else if (cm1 == 0xf5 && cm2 == 0xfa) { // Y
-		i1 = 3;
-		i2 = 2;
-	} else if (cm1 == 0x50 && cm2 == 0xa0) {
-		i1 = 2;
-		i2 = 0;
-	} else if (cm1 == 0x5f && cm2 == 0xaf) { // Y ?
-		i1 = 1;
-		i2 = 3;
-	} else if (cm1 == 0x5a && cm2 == 0xa5) { // Y?
-		i1 = 1;
-		i2 = 2;
-	} else if (cm1 == 0x55 && cm2 == 0xaa) { // ??
-		i1 = 0;
-		i2 = 0;
-	} else {
-		i1 = 2;
-		i2 = 2;
-	}
-}
-
 bool Renderer::getRGBAtC64(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *&stipple) {
 	if (index == _keyColor)
 		return false;
@@ -406,17 +430,15 @@ bool Renderer::getRGBAtC64(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &
 	assert (_renderMode == Common::kRenderC64);
 	uint8 i1, i2;
 	stipple = (byte *)_stipples[index - 1];
-	byte *entry = (*_colorMap)[index - 1];
-	uint8 cm1 = *(entry);
-	entry++;
-	uint8 cm2 = *(entry);
-	extractC64Indexes(cm1, cm2, i1, i2);
+
+	byte pair = _colorPair[index - 1];
+	i1 = pair & 0xf;
+	i2 = (pair >> 4) & 0xf;
+
 	selectColorFromFourColorPalette(i1, r1, g1, b1);
 	selectColorFromFourColorPalette(i2, r2, g2, b2);
-	if (r1 == r2 && g1 == g2 && b1 == b2) {
+	if (r1 == r2 && g1 == g2 && b1 == b2)
 		stipple = nullptr;
-	} else
-		stipple = nullptr; // TODO: custom stipple support
 	return true;
 }
 




More information about the Scummvm-git-logs mailing list