[Scummvm-git-logs] scummvm master -> 0417389653273e0eef55ac0f57882439cd06f1ad

neuromancer noreply at scummvm.org
Sun Mar 12 18:18:13 UTC 2023


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:
0417389653 FREESCAPE: pregenerate and show stipple patterns for driller in zx, cpc and cga


Commit: 0417389653273e0eef55ac0f57882439cd06f1ad
    https://github.com/scummvm/scummvm/commit/0417389653273e0eef55ac0f57882439cd06f1ad
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-03-12T19:08:44+01:00

Commit Message:
FREESCAPE: pregenerate and show stipple patterns for driller in zx, cpc and cga

Changed paths:
    engines/freescape/games/palettes.cpp
    engines/freescape/gfx.cpp
    engines/freescape/gfx.h
    engines/freescape/gfx_opengl.cpp


diff --git a/engines/freescape/games/palettes.cpp b/engines/freescape/games/palettes.cpp
index 6baef6c443f..00e626fb653 100644
--- a/engines/freescape/games/palettes.cpp
+++ b/engines/freescape/games/palettes.cpp
@@ -124,7 +124,7 @@ void FreescapeEngine::loadColorPalette() {
 	} else
 		error("Invalid render mode, no palette selected");
 
-	_gfx->_colorMap = &_colorMap;
+	_gfx->setColorMap(&_colorMap);
 }
 
 void FreescapeEngine::loadPalettes(Common::SeekableReadStream *file, int offset) {
diff --git a/engines/freescape/gfx.cpp b/engines/freescape/gfx.cpp
index d9765893090..dde88da0dee 100644
--- a/engines/freescape/gfx.cpp
+++ b/engines/freescape/gfx.cpp
@@ -48,10 +48,117 @@ Renderer::Renderer(int screenW, int screenH, Common::RenderMode renderMode) {
 	_colorRemaps = nullptr;
 	_renderMode = renderMode;
 	_isAccelerated = false;
+
+	for (int i = 0; i < 16; i++) {
+		_stipples[0][i] = 0;
+		_stipples[1][i] = 0;
+		_stipples[2][i] = 0;
+		_stipples[3][i] = 0;
+	}
 }
 
 Renderer::~Renderer() {}
 
+extern byte getCPCPixel(byte cpc_byte, int index);
+
+byte getCPCStipple(byte cpc_byte, int back, int fore) {
+	int c0 = getCPCPixel(cpc_byte, 0);
+	assert(c0 == back || c0 == fore);
+	int c1 = getCPCPixel(cpc_byte, 1);
+	assert(c1 == back || c1 == fore);
+	int c2 = getCPCPixel(cpc_byte, 2);
+	assert(c2 == back || c2 == fore);
+	int c3 = getCPCPixel(cpc_byte, 3);
+	assert(c3 == back || c3 == fore);
+
+	byte st = 0;
+	if (c0 == fore)
+		st = st | 0x3;
+
+	if (c1 == fore)
+		st = st | (2 << 0x3);
+
+	if (c2 == fore)
+		st = st | (4 << 0x3);
+
+	if (c3 == fore)
+		st = st |  (6 << 0x3);
+
+	return st;
+}
+
+byte getCGAPixel(byte x, int index) {
+	if (index == 0)
+		return (x >> 0) & 0x3;
+	else if (index == 1)
+		return (x >> 2) & 0x3;
+	else if (index == 2)
+		return (x >> 4) & 0x3;
+	else if (index == 3)
+		return (x >> 6) & 0x3;
+	else
+		error("Invalid index %d requested", index);
+}
+
+byte getCGAStipple(byte x, int back, int fore) {
+	int c0 = getCGAPixel(x, 0);
+	assert(c0 == back || c0 == fore || back == fore);
+	int c1 = getCGAPixel(x, 1);
+	assert(c1 == back || c1 == fore || back == fore);
+	int c2 = getCGAPixel(x, 2);
+	assert(c2 == back || c2 == fore || back == fore);
+	int c3 = getCGAPixel(x, 3);
+	assert(c3 == back || c3 == fore || back == fore);
+
+	byte st = 0;
+	if (c0 == fore)
+		st = st | 0x3;
+
+	if (c1 == fore)
+		st = st | (2 << 0x3);
+
+	if (c2 == fore)
+		st = st | (4 << 0x3);
+
+	if (c3 == fore)
+		st = st |  (6 << 0x3);
+
+	return st;
+}
+
+void Renderer::setColorMap(ColorMap *colorMap_) {
+	_colorMap = colorMap_;
+	if (_renderMode == Common::kRenderZX) {
+		for (int i = 0; i < 15; i++) {
+			byte *entry = (*_colorMap)[i];
+			_stipples[0][i] = entry[0];
+			_stipples[1][i] = entry[1];
+			_stipples[2][i] = entry[2];
+			_stipples[3][i] = entry[3];
+		}
+	} else if (_renderMode == Common::kRenderCPC) {
+		for (int i = 0; i < 15; i++) {
+			byte *entry = (*_colorMap)[i];
+			int i1 = getCPCPixel(entry[0], 0);
+			int i2 = getCPCPixel(entry[0], 1);
+			_stipples[0][i] = getCPCStipple(entry[0], i1, i2);
+			_stipples[1][i] = getCPCStipple(entry[1], i1, i2);
+			_stipples[2][i] = getCPCStipple(entry[2], i1, i2);
+			_stipples[3][i] = getCPCStipple(entry[3], i1, i2);
+		}
+	} else if (_renderMode == Common::kRenderCGA) {
+		for (int i = 0; i < 15; i++) {
+			byte *entry = (*_colorMap)[i];
+			int i1 = getCGAPixel(entry[0], 0);
+			int i2 = getCGAPixel(entry[0], 1);
+			_stipples[0][i] = getCGAStipple(entry[0], i1, i2);
+			_stipples[1][i] = getCGAStipple(entry[1], i1, i2);
+			_stipples[2][i] = getCGAStipple(entry[2], i1, i2);
+			_stipples[3][i] = getCGAStipple(entry[3], i1, i2);
+		}
+	}
+}
+
 void Renderer::readFromPalette(uint8 index, uint8 &r, uint8 &g, uint8 &b) {
 	r = _palette[3 * index + 0];
 	g = _palette[3 * index + 1];
@@ -71,7 +178,7 @@ void Renderer::setColorRemaps(ColorReMap *colorRemaps) {
 	_colorRemaps = colorRemaps;
 }
 
-bool Renderer::getRGBAtCGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2) {
+bool Renderer::getRGBAtCGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *stipple) {
 	if (index == _keyColor)
 		return false;
 
@@ -84,12 +191,18 @@ bool Renderer::getRGBAtCGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &
 		return true;
 	}
 
+	if (stipple) {
+		stipple[0] = _stipples[0][index - 1];
+		stipple[1] = _stipples[1][index - 1];
+		stipple[2] = _stipples[2][index - 1];
+		stipple[3] = _stipples[3][index - 1];
+	}
+
 	byte *entry = (*_colorMap)[index - 1];
-	byte be = *(entry);
-	readFromPalette((be >> 4) % 4, r1, g1, b1);
-	entry++;
-	be = *(entry);
-	readFromPalette((be >> 4) % 4, r2, g2, b2);
+	uint8 c1 = getCGAPixel(entry[0], 0);
+	uint8 c2 = getCGAPixel(entry[0], 1);
+	readFromPalette(c1, r1, g1, b1);
+	readFromPalette(c2, r2, g2, b2);
 	return true;
 }
 
@@ -177,10 +290,10 @@ bool Renderer::getRGBAtZX(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r
 	}
 
 	if (stipple) {
-		stipple[0] = entry[0];
-		stipple[1] = entry[1];
-		stipple[2] = entry[2];
-		stipple[3] = entry[3];
+		stipple[0] = _stipples[0][index - 1];
+		stipple[1] = _stipples[1][index - 1];
+		stipple[2] = _stipples[2][index - 1];
+		stipple[3] = _stipples[3][index - 1];
 	}
 
 	readFromPalette(_paperColor, r1, g1, b1);
@@ -203,9 +316,7 @@ void Renderer::selectColorFromFourColorPalette(uint8 index, uint8 &r1, uint8 &g1
 		error("Invalid color");
 }
 
-extern byte getCPCPixel(byte cpc_byte, int index);
-
-bool Renderer::getRGBAtCPC(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2) {
+bool Renderer::getRGBAtCPC(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *stipple) {
 	if (index == _keyColor)
 		return false;
 
@@ -218,14 +329,16 @@ bool Renderer::getRGBAtCPC(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &
 		return true;
 	}
 
-	uint8 i1, i2;
-	byte *entry = (*_colorMap)[index - 1];
-	uint8 cm1 = *(entry);
-	entry++;
-	//uint8 cm2 = *(entry);
+	if (stipple) {
+		stipple[0] = _stipples[0][index - 1];
+		stipple[1] = _stipples[1][index - 1];
+		stipple[2] = _stipples[2][index - 1];
+		stipple[3] = _stipples[3][index - 1];
+	}
 
-	i1 = getCPCPixel(cm1, 0);
-	i2 = getCPCPixel(cm1, 1);
+	byte *entry = (*_colorMap)[index - 1];
+	uint8 i1 = getCPCPixel(entry[0], 0);
+	uint8 i2 = getCPCPixel(entry[0], 1);
 	selectColorFromFourColorPalette(i1, r1, g1, b1);
 	selectColorFromFourColorPalette(i2, r2, g2, b2);
 	return true;
@@ -286,9 +399,9 @@ bool Renderer::getRGBAt(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2,
 	else if (_renderMode == Common::kRenderC64)
 		return getRGBAtC64(index, r1, g1, b1, r2, g2, b2);
 	else if (_renderMode == Common::kRenderCGA)
-		return getRGBAtCGA(index, r1, g1, b1, r2, g2, b2);
+		return getRGBAtCGA(index, r1, g1, b1, r2, g2, b2, stipple);
 	else if (_renderMode == Common::kRenderCPC)
-		return getRGBAtCPC(index, r1, g1, b1, r2, g2, b2);
+		return getRGBAtCPC(index, r1, g1, b1, r2, g2, b2, stipple);
 	else if (_renderMode == Common::kRenderZX)
 		return getRGBAtZX(index, r1, g1, b1, r2, g2, b2, stipple);
 
diff --git a/engines/freescape/gfx.h b/engines/freescape/gfx.h
index 867da87b0f0..ff6612ee011 100644
--- a/engines/freescape/gfx.h
+++ b/engines/freescape/gfx.h
@@ -101,8 +101,8 @@ public:
 	uint8 indexFromColor(uint8 r, uint8 g, uint8 b);
 	bool getRGBAt(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *stipple);
 	bool getRGBAtC64(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2);
-	bool getRGBAtCGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2);
-	bool getRGBAtCPC(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2);
+	bool getRGBAtCGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *stipple);
+	bool getRGBAtCPC(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *stipple);
 	bool getRGBAtEGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2);
 	bool getRGBAtZX(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *stipple);
 	void extractCPCIndexes(uint8 cm1, uint8 cm2, uint8 &i1, uint8 &i2);
@@ -113,12 +113,14 @@ public:
 	virtual void setStippleData(byte *data) {};
 	virtual void useStipple(bool enabled) {};
 	byte *_palette;
+	void setColorMap(ColorMap *colorMap_);
 	ColorMap *_colorMap;
 	ColorReMap *_colorRemaps;
 	int _keyColor;
 	int _inkColor;
 	int _paperColor;
 	int _underFireBackgroundColor;
+	byte _stipples[4][16];
 
 	/**
 	 * Select the window where to render
diff --git a/engines/freescape/gfx_opengl.cpp b/engines/freescape/gfx_opengl.cpp
index e504625b1c4..13f08e5db49 100644
--- a/engines/freescape/gfx_opengl.cpp
+++ b/engines/freescape/gfx_opengl.cpp
@@ -285,7 +285,12 @@ void OpenGLRenderer::useStipple(bool enabled) {
 		glEnable(GL_POLYGON_OFFSET_FILL);
 		glPolygonOffset(0.0f, -1.0f);
 		glEnable(GL_POLYGON_STIPPLE);
-		glPolygonStipple(_renderMode == Common::kRenderZX ? _variableStippleArray : _defaultStippleArray);
+		if (_renderMode == Common::kRenderZX  ||
+			_renderMode == Common::kRenderCPC ||
+			_renderMode == Common::kRenderCGA)
+			glPolygonStipple(_variableStippleArray);
+		else
+			glPolygonStipple(_defaultStippleArray);
 	} else {
 		glPolygonOffset(0, 0);
 		glDisable(GL_POLYGON_OFFSET_FILL);




More information about the Scummvm-git-logs mailing list