[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