[Scummvm-git-logs] scummvm branch-2-3 -> 807c655503c001f8a55b85e60a411edc9c42abec

mgerhardy martin.gerhardy at gmail.com
Wed Sep 8 18:11:37 UTC 2021


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

Summary:
eec73f6aa4 TWINE: no need to create a copy of the domain string
41f0bbe3c2 TWINE: set the debugger after all game components are set up already
b4fe7a230d TWINE: comments
a669f472d1 TWINE: added disassembled code to render methods
fe83878d86 TWINE: removed labels in renderPolygonsMarble
45eb1c7c2e TWINE: further fixes in renderPolygonsMarble
7fda05e2f5 TWINE: fixed alignment issues for polytab access
11c9df55d4 TWINE: renderPolygonsMarble renamed variables
12ff8a4dae TWINE: renderPolygonsMarble cleanup
324393a7ea TWINE: re-did the renderPolygonsBopper method
18abfb799f TWINE: cleanup renderPolygonsGouraud
807c655503 TWINE: fixed potential buffer underflow in renderPolygonsGouraud


Commit: eec73f6aa4934aed604c52a1fff9f661a0956b4a
    https://github.com/scummvm/scummvm/commit/eec73f6aa4934aed604c52a1fff9f661a0956b4a
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:06+02:00

Commit Message:
TWINE: no need to create a copy of the domain string

Changed paths:
    engines/twine/twine.cpp


diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index cc4cd9097b..f0960c6c51 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -238,7 +238,7 @@ Common::Error TwinEEngine::run() {
 	ConfMan.registerDefault("usehighres", false);
 	ConfMan.registerDefault("wallcollision", false);
 
-	Common::String gameTarget = ConfMan.getActiveDomainName();
+	const Common::String &gameTarget = ConfMan.getActiveDomainName();
 	AchMan.setActiveDomain(getMetaEngine()->getAchievementsInfo(gameTarget));
 
 	syncSoundSettings();


Commit: 41f0bbe3c24cf1b00134aef168f266df30ac7ba9
    https://github.com/scummvm/scummvm/commit/41f0bbe3c24cf1b00134aef168f266df30ac7ba9
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:10+02:00

Commit Message:
TWINE: set the debugger after all game components are set up already

Changed paths:
    engines/twine/scene/gamestate.cpp
    engines/twine/twine.cpp


diff --git a/engines/twine/scene/gamestate.cpp b/engines/twine/scene/gamestate.cpp
index fc2cecd4e7..18255cca4a 100644
--- a/engines/twine/scene/gamestate.cpp
+++ b/engines/twine/scene/gamestate.cpp
@@ -111,9 +111,9 @@ void GameState::initEngineVars() {
 	initGameStateVars();
 	initHeroVars();
 
-	_engine->_scene->_newHeroPos.x = 0x2000;
-	_engine->_scene->_newHeroPos.y = 0x1800;
-	_engine->_scene->_newHeroPos.z = 0x2000;
+	_engine->_scene->_newHeroPos.x = 16 * BRICK_SIZE;
+	_engine->_scene->_newHeroPos.y = 24 * BRICK_HEIGHT;
+	_engine->_scene->_newHeroPos.z = 16 * BRICK_SIZE;
 
 	_engine->_scene->_currentSceneIdx = SCENE_CEILING_GRID_FADE_1;
 	_engine->_scene->_needChangeScene = LBA1SceneId::Citadel_Island_Prison;
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index f0960c6c51..b6beeac15b 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -151,7 +151,6 @@ TwinEEngine::TwinEEngine(OSystem *system, Common::Language language, uint32 flag
 #endif
 	}
 
-	setDebugger(new TwinEConsole(this));
 	_actor = new Actor(this);
 	_animations = new Animations(this);
 	_collision = new Collision(this);
@@ -178,6 +177,7 @@ TwinEEngine::TwinEEngine(OSystem *system, Common::Language language, uint32 flag
 	_input = new Input(this);
 	_debug = new Debug(this);
 	_debugScene = new DebugScene(this);
+	setDebugger(new TwinEConsole(this));
 }
 
 TwinEEngine::~TwinEEngine() {


Commit: b4fe7a230dfda0d47ad69f17fa67401edb0e3186
    https://github.com/scummvm/scummvm/commit/b4fe7a230dfda0d47ad69f17fa67401edb0e3186
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:13+02:00

Commit Message:
TWINE: comments

Changed paths:
    engines/twine/renderer/renderer.cpp


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 6e4a0a556b..78aca10402 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -678,6 +678,7 @@ void Renderer::renderPolygonsTras(int vtop, int32 vsize, uint8 color) const {
 }
 
 // FIXME: buggy
+// Used e.g for the legs of the horse or the ears of most characters
 void Renderer::renderPolygonsTrame(int vtop, int32 vsize, uint8 color) const {
 	uint8 *out = (uint8 *)_engine->_frontVideoBuffer.getBasePtr(0, vtop);
 	const int16 *ptr1 = &_polyTab[vtop];
@@ -821,6 +822,7 @@ void Renderer::renderPolygonsGouraud(int vtop, int32 vsize) const {
 	}
 }
 
+// used for the most of the heads of the characters and the horse body
 void Renderer::renderPolygonsDither(int vtop, int32 vsize) const {
 	uint8 *out = (uint8 *)_engine->_frontVideoBuffer.getBasePtr(0, vtop);
 	const int16 *ptr1 = &_polyTab[vtop];


Commit: a669f472d109703c73654d111f67b830d7fba076
    https://github.com/scummvm/scummvm/commit/a669f472d109703c73654d111f67b830d7fba076
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:16+02:00

Commit Message:
TWINE: added disassembled code to render methods

Changed paths:
    engines/twine/renderer/renderer.cpp


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 78aca10402..7b00006fe4 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -502,6 +502,75 @@ void Renderer::renderPolygonsCopper(int vtop, int32 vsize, uint8 color) const {
 }
 
 void Renderer::renderPolygonsBopper(int vtop, int32 vsize, uint8 color) const {
+#if 0
+	LOBYTE(v14) = a2;
+	HIWORD(j) = 0;
+	do {
+		stop = *(uint16 *)(polytab + 960);
+		start = *(uint16 *)polytab;
+		polytab += 2;
+		v34 = stop < (unsigned __int16)start;
+		v17 = stop - start;
+		if (!v34) {
+			LOWORD(j) = j + 1;
+			v18 = (void *)(start + v2);
+			HIBYTE(v14) = v14;
+			LOWORD(start) = v14;
+			start <<= 16;
+			LOWORD(start) = v14;
+			if ((unsigned __int8)v18 & 1) {
+				*(uint8 *)v18 = v14;
+				v18 = (char *)v18 + 1;
+				--j;
+			}
+			v19 = j;
+			v20 = (unsigned int)j >> 2;
+			memset32(v18, start, v20);
+			v21 = (int)((char *)v18 + 4 * v20);
+			for (j = v19 & 2; j; --j)
+				*(uint8 *)v21++ = start;
+			LOBYTE(v14) = v14 + 1;
+			if (!(v14 & 0xF)) {
+				while (1) {
+					LOBYTE(v14) = v14 - 1;
+					if (!(v14 & 0xF))
+						break;
+					v2 += 640;
+					--v5;
+					if (!v5)
+						return start;
+					v22 = *(uint16 *)(polytab + 960);
+					start = *(uint16 *)polytab;
+					polytab += 2;
+					v34 = v22 < (unsigned __int16)start;
+					v23 = v22 - start;
+					if (!v34) {
+						LOWORD(j) = j + 1;
+						v24 = (void *)(start + v2);
+						HIBYTE(v14) = v14;
+						LOWORD(start) = v14;
+						start <<= 16;
+						LOWORD(start) = v14;
+						if ((unsigned __int8)v24 & 1) {
+							*(uint8 *)v24 = v14;
+							v24 = (char *)v24 + 1;
+							--j;
+						}
+						v25 = j;
+						v26 = (unsigned int)j >> 2;
+						memset32(v24, start, v26);
+						v27 = (int)((char *)v24 + 4 * v26);
+						for (j = v25 & 2; j; --j)
+							*(uint8 *)v27++ = start;
+					}
+				}
+			}
+		}
+		v2 += 640;
+		--v5;
+	} while (v5);
+	return start;
+#endif
 	uint8 *out = (uint8 *)_engine->_frontVideoBuffer.getBasePtr(0, vtop);
 	const int16 *ptr1 = &_polyTab[vtop];
 	const int screenWidth = _engine->width();
@@ -957,6 +1026,89 @@ void Renderer::renderPolygonsDither(int vtop, int32 vsize) const {
 }
 
 void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
+#if 0
+	const int screenWidth = _engine->width();
+	const int screenHeight = _engine->height();
+
+	uint8 *v2 = (uint8 *)_engine->_frontVideoBuffer.getBasePtr(0, vtop);
+	//v2 = screenLockupTable[(uint16)vtop] + frontVideoBuffer;
+	int8 *v3 = (int8 *)&_polyTab[(uint16)vtop];
+	int v5 = vsize; //(uint16)vbottom - (uint16)vtop + 1;
+
+	uint16 v28 = color;
+	uint16 v29 = 2;
+	while (2) {
+		uint16 v30 = *(uint16 *)(v3 + screenHeight * 2);
+		uint16 v7 = *(uint16 *)v3;
+		v3 += 2;
+		uint16 v34 = v30 < v7;
+		uint16 v31 = v30 - v7;
+		if (v34)
+			goto LABEL_40;
+		uint16 v32 = v31 + 1;
+		uint8 *v33 = v7 + v2;
+		LOBYTE(v7) = v28;
+		BYTE1(v7) = v28;
+		if (v33 & 1) {
+			*(uint8 *)v33++ = v28;
+			--v32;
+		}
+		v34 = v32 & 1;
+		for (k = v32 >> 1; k; --k) {
+			*(uint16 *)v33 = v7;
+			v33 += 2;
+		}
+		for (l = __RCL__(0, v34); l; --l)
+			*(uint8 *)v33++ = v28;
+		--v29;
+		if (v29 || (v29 = 2, ++v28, v28 & 0xF))
+			goto LABEL_40;
+	LABEL_52:
+		v29 = 2;
+		--v28;
+		if (!(v28 & 0xF)) {
+		LABEL_40:
+			v2 += screenWidth;
+			--v5;
+			if (!v5)
+				return v7;
+			continue;
+		}
+		break;
+	}
+	while (1) {
+		v2 += screenWidth;
+		--v5;
+		if (!v5)
+			return v7;
+		uint16 v37 = *(uint16 *)(v3 + screenHeight * 2);
+		uint16 v7 = *(uint16 *)v3;
+		v3 += 2;
+		uint16 v34 = v37 < v7;
+		uint16 v38 = v37 - v7;
+		if (!v34) {
+			uint16 v39 = v38 + 1;
+			uint16 v40 = v7 + v2;
+			LOBYTE(v7) = v28;
+			BYTE1(v7) = v28;
+			if (v40 & 1) {
+				*(uint8 *)v40++ = v28;
+				--v39;
+			}
+			v41 = v39 & 1;
+			for (m = v39 >> 1; m; --m) {
+				*(uint16 *)v40 = v7;
+				v40 += 2;
+			}
+			for (n = __RCL__(0, v41); n; --n)
+				*(uint8 *)v40++ = v28;
+			--v29;
+			if (v29)
+				continue;
+		}
+		goto LABEL_52;
+	}
+#endif
 }
 
 void Renderer::renderPolygons(const CmdRenderPolygon &polygon, Vertex *vertices, int vtop, int vbottom) {


Commit: fe83878d86d0f05a0bedd5a7ca8950c5b85e0380
    https://github.com/scummvm/scummvm/commit/fe83878d86d0f05a0bedd5a7ca8950c5b85e0380
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:21+02:00

Commit Message:
TWINE: removed labels in renderPolygonsMarble

Changed paths:
    engines/twine/renderer/renderer.cpp


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 7b00006fe4..d51e7ec886 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1043,8 +1043,13 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 		v3 += 2;
 		uint16 v34 = v30 < v7;
 		uint16 v31 = v30 - v7;
-		if (v34)
-			goto LABEL_40;
+		if (v34) {
+			v2 += screenWidth;
+			--v5;
+			if (!v5)
+				return v7;
+			continue;
+		}
 		uint16 v32 = v31 + 1;
 		uint8 *v33 = v7 + v2;
 		LOBYTE(v7) = v28;
@@ -1061,13 +1066,16 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 		for (l = __RCL__(0, v34); l; --l)
 			*(uint8 *)v33++ = v28;
 		--v29;
-		if (v29 || (v29 = 2, ++v28, v28 & 0xF))
-			goto LABEL_40;
-	LABEL_52:
+		if (v29 || (v29 = 2, ++v28, v28 & 0xF)) {
+			v2 += screenWidth;
+			--v5;
+			if (!v5)
+				return v7;
+			continue;
+		}
 		v29 = 2;
 		--v28;
 		if (!(v28 & 0xF)) {
-		LABEL_40:
 			v2 += screenWidth;
 			--v5;
 			if (!v5)
@@ -1106,7 +1114,16 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 			if (v29)
 				continue;
 		}
-		goto LABEL_52;
+		v29 = 2;
+		--v28;
+		if (!(v28 & 0xF)) {
+			v2 += screenWidth;
+			--v5;
+			if (!v5)
+				return v7;
+			continue;
+		}
+		break;
 	}
 #endif
 }


Commit: 45eb1c7c2efbdf4f7bad42d1b5129e742c66404b
    https://github.com/scummvm/scummvm/commit/45eb1c7c2efbdf4f7bad42d1b5129e742c66404b
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:25+02:00

Commit Message:
TWINE: further fixes in renderPolygonsMarble

Changed paths:
    engines/twine/renderer/renderer.cpp


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index d51e7ec886..5cda478f75 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1026,7 +1026,6 @@ void Renderer::renderPolygonsDither(int vtop, int32 vsize) const {
 }
 
 void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
-#if 0
 	const int screenWidth = _engine->width();
 	const int screenHeight = _engine->height();
 
@@ -1038,39 +1037,42 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 	uint16 v28 = color;
 	uint16 v29 = 2;
 	while (2) {
-		uint16 v30 = *(uint16 *)(v3 + screenHeight * 2);
-		uint16 v7 = *(uint16 *)v3;
+		uint16 v30 = *(const uint16 *)(v3 + screenHeight * 2);
+		uint16 v7 = *(const uint16 *)v3;
 		v3 += 2;
 		uint16 v34 = v30 < v7;
 		uint16 v31 = v30 - v7;
 		if (v34) {
 			v2 += screenWidth;
 			--v5;
-			if (!v5)
-				return v7;
+			if (!v5) {
+				return;
+			}
 			continue;
 		}
 		uint16 v32 = v31 + 1;
 		uint8 *v33 = v7 + v2;
-		LOBYTE(v7) = v28;
-		BYTE1(v7) = v28;
-		if (v33 & 1) {
+		(*((uint8 *)&(v7) + (0))) = v28;
+		(*((uint8 *)&(v7) + (1))) = v28;
+		if ((uintptr)v33 & 1) {
 			*(uint8 *)v33++ = v28;
 			--v32;
 		}
 		v34 = v32 & 1;
-		for (k = v32 >> 1; k; --k) {
+		for (uint16 k = v32 >> 1; k; --k) {
 			*(uint16 *)v33 = v7;
 			v33 += 2;
 		}
-		for (l = __RCL__(0, v34); l; --l)
+		for (uint16 l = v34; l; --l) {
 			*(uint8 *)v33++ = v28;
+		}
 		--v29;
 		if (v29 || (v29 = 2, ++v28, v28 & 0xF)) {
 			v2 += screenWidth;
 			--v5;
-			if (!v5)
-				return v7;
+			if (!v5) {
+				return;
+			}
 			continue;
 		}
 		v29 = 2;
@@ -1078,8 +1080,9 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 		if (!(v28 & 0xF)) {
 			v2 += screenWidth;
 			--v5;
-			if (!v5)
-				return v7;
+			if (!v5) {
+				return;
+			}
 			continue;
 		}
 		break;
@@ -1087,45 +1090,48 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 	while (1) {
 		v2 += screenWidth;
 		--v5;
-		if (!v5)
-			return v7;
-		uint16 v37 = *(uint16 *)(v3 + screenHeight * 2);
-		uint16 v7 = *(uint16 *)v3;
+		if (!v5) {
+			return;
+		}
+		uint16 v37 = *(const uint16 *)(v3 + screenHeight * 2);
+		uint16 v7 = *(const uint16 *)v3;
 		v3 += 2;
 		uint16 v34 = v37 < v7;
 		uint16 v38 = v37 - v7;
 		if (!v34) {
 			uint16 v39 = v38 + 1;
-			uint16 v40 = v7 + v2;
-			LOBYTE(v7) = v28;
-			BYTE1(v7) = v28;
-			if (v40 & 1) {
+			uint8 *v40 = v7 + v2;
+			(*((uint8 *)&(v7) + (0))) = v28;
+			(*((uint8 *)&(v7) + (1))) = v28;
+			if ((uintptr)v40 & 1) {
 				*(uint8 *)v40++ = v28;
 				--v39;
 			}
-			v41 = v39 & 1;
-			for (m = v39 >> 1; m; --m) {
+			uint16 v41 = v39 & 1;
+			for (uint16 m = v39 >> 1; m; --m) {
 				*(uint16 *)v40 = v7;
 				v40 += 2;
 			}
-			for (n = __RCL__(0, v41); n; --n)
+			for (uint16 n = v41; n; --n) {
 				*(uint8 *)v40++ = v28;
+			}
 			--v29;
-			if (v29)
+			if (v29) {
 				continue;
+			}
 		}
 		v29 = 2;
 		--v28;
 		if (!(v28 & 0xF)) {
 			v2 += screenWidth;
 			--v5;
-			if (!v5)
-				return v7;
+			if (!v5) {
+				return;
+			}
 			continue;
 		}
 		break;
 	}
-#endif
 }
 
 void Renderer::renderPolygons(const CmdRenderPolygon &polygon, Vertex *vertices, int vtop, int vbottom) {


Commit: 7fda05e2f551162d1716f0418519f1a1ad8555a5
    https://github.com/scummvm/scummvm/commit/7fda05e2f551162d1716f0418519f1a1ad8555a5
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:28+02:00

Commit Message:
TWINE: fixed alignment issues for polytab access

Changed paths:
    engines/twine/renderer/renderer.cpp


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 5cda478f75..e9aa092bfd 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1030,16 +1030,15 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 	const int screenHeight = _engine->height();
 
 	uint8 *v2 = (uint8 *)_engine->_frontVideoBuffer.getBasePtr(0, vtop);
-	//v2 = screenLockupTable[(uint16)vtop] + frontVideoBuffer;
-	int8 *v3 = (int8 *)&_polyTab[(uint16)vtop];
-	int v5 = vsize; //(uint16)vbottom - (uint16)vtop + 1;
+	const int16 *v3 = &_polyTab[vtop];
+	int v5 = vsize;
 
 	uint16 v28 = color;
 	uint16 v29 = 2;
 	while (2) {
-		uint16 v30 = *(const uint16 *)(v3 + screenHeight * 2);
+		uint16 v30 = *(const uint16 *)(v3 + screenHeight);
 		uint16 v7 = *(const uint16 *)v3;
-		v3 += 2;
+		++v3;
 		uint16 v34 = v30 < v7;
 		uint16 v31 = v30 - v7;
 		if (v34) {
@@ -1052,8 +1051,8 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 		}
 		uint16 v32 = v31 + 1;
 		uint8 *v33 = v7 + v2;
-		(*((uint8 *)&(v7) + (0))) = v28;
-		(*((uint8 *)&(v7) + (1))) = v28;
+		(*((uint8 *)&v7)) = v28;
+		(*((uint8 *)&(v7) + 1)) = v28;
 		if ((uintptr)v33 & 1) {
 			*(uint8 *)v33++ = v28;
 			--v32;
@@ -1093,16 +1092,16 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 		if (!v5) {
 			return;
 		}
-		uint16 v37 = *(const uint16 *)(v3 + screenHeight * 2);
+		uint16 v37 = *(const uint16 *)(v3 + screenHeight);
 		uint16 v7 = *(const uint16 *)v3;
-		v3 += 2;
+		++v3;
 		uint16 v34 = v37 < v7;
 		uint16 v38 = v37 - v7;
 		if (!v34) {
 			uint16 v39 = v38 + 1;
 			uint8 *v40 = v7 + v2;
-			(*((uint8 *)&(v7) + (0))) = v28;
-			(*((uint8 *)&(v7) + (1))) = v28;
+			(*((uint8 *)&v7)) = v28;
+			(*((uint8 *)&(v7) + 1)) = v28;
 			if ((uintptr)v40 & 1) {
 				*(uint8 *)v40++ = v28;
 				--v39;


Commit: 11c9df55d4e6204e53b915716a07a4d393d16f17
    https://github.com/scummvm/scummvm/commit/11c9df55d4e6204e53b915716a07a4d393d16f17
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:31+02:00

Commit Message:
TWINE: renderPolygonsMarble renamed variables

Changed paths:
    engines/twine/renderer/renderer.cpp


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index e9aa092bfd..355301b66d 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1029,57 +1029,56 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 	const int screenWidth = _engine->width();
 	const int screenHeight = _engine->height();
 
-	uint8 *v2 = (uint8 *)_engine->_frontVideoBuffer.getBasePtr(0, vtop);
-	const int16 *v3 = &_polyTab[vtop];
-	int v5 = vsize;
+	uint8 *out = (uint8 *)_engine->_frontVideoBuffer.getBasePtr(0, vtop);
+	const int16 *ptr1 = &_polyTab[vtop];
+	int height = vsize;
 
-	uint16 v28 = color;
+	uint16 color2 = color;
 	uint16 v29 = 2;
 	while (2) {
-		uint16 v30 = *(const uint16 *)(v3 + screenHeight);
-		uint16 v7 = *(const uint16 *)v3;
-		++v3;
-		uint16 v34 = v30 < v7;
-		uint16 v31 = v30 - v7;
-		if (v34) {
-			v2 += screenWidth;
-			--v5;
-			if (!v5) {
+		uint16 stop = *(const uint16 *)(ptr1 + screenHeight);
+		uint16 start = *(const uint16 *)ptr1;
+		++ptr1;
+		if (stop < start) {
+			out += screenWidth;
+			--height;
+			if (!height) {
 				return;
 			}
 			continue;
 		}
-		uint16 v32 = v31 + 1;
-		uint8 *v33 = v7 + v2;
-		(*((uint8 *)&v7)) = v28;
-		(*((uint8 *)&(v7) + 1)) = v28;
-		if ((uintptr)v33 & 1) {
-			*(uint8 *)v33++ = v28;
-			--v32;
+		uint16 hsize = stop - start;
+		uint16 width = hsize + 1;
+		uint8 *out2 = start + out;
+		(*((uint8 *)&start)) = color2;
+		(*((uint8 *)&(start) + 1)) = color2;
+		if ((uintptr)out2 & 1) {
+			*(uint8 *)out2++ = color2;
+			--width;
 		}
-		v34 = v32 & 1;
-		for (uint16 k = v32 >> 1; k; --k) {
-			*(uint16 *)v33 = v7;
-			v33 += 2;
+		uint16 v34 = width & 1;
+		for (uint16 k = width >> 1; k; --k) {
+			*(uint16 *)out2 = start;
+			out2 += 2;
 		}
 		for (uint16 l = v34; l; --l) {
-			*(uint8 *)v33++ = v28;
+			*(uint8 *)out2++ = color2;
 		}
 		--v29;
-		if (v29 || (v29 = 2, ++v28, v28 & 0xF)) {
-			v2 += screenWidth;
-			--v5;
-			if (!v5) {
+		if (v29 || (v29 = 2, ++color2, color2 & 0xF)) {
+			out += screenWidth;
+			--height;
+			if (!height) {
 				return;
 			}
 			continue;
 		}
 		v29 = 2;
-		--v28;
-		if (!(v28 & 0xF)) {
-			v2 += screenWidth;
-			--v5;
-			if (!v5) {
+		--color2;
+		if (!(color2 & 0xF)) {
+			out += screenWidth;
+			--height;
+			if (!height) {
 				return;
 			}
 			continue;
@@ -1087,32 +1086,31 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 		break;
 	}
 	while (1) {
-		v2 += screenWidth;
-		--v5;
-		if (!v5) {
+		out += screenWidth;
+		--height;
+		if (!height) {
 			return;
 		}
-		uint16 v37 = *(const uint16 *)(v3 + screenHeight);
-		uint16 v7 = *(const uint16 *)v3;
-		++v3;
-		uint16 v34 = v37 < v7;
-		uint16 v38 = v37 - v7;
-		if (!v34) {
-			uint16 v39 = v38 + 1;
-			uint8 *v40 = v7 + v2;
-			(*((uint8 *)&v7)) = v28;
-			(*((uint8 *)&(v7) + 1)) = v28;
-			if ((uintptr)v40 & 1) {
-				*(uint8 *)v40++ = v28;
-				--v39;
+		uint16 stop = *(const uint16 *)(ptr1 + screenHeight);
+		uint16 start = *(const uint16 *)ptr1;
+		++ptr1;
+		if (stop >= start) {
+			uint16 hsize = stop - start;
+			uint16 width = hsize + 1;
+			uint8 *out2 = start + out;
+			(*((uint8 *)&start)) = color2;
+			(*((uint8 *)&(start) + 1)) = color2;
+			if ((uintptr)out2 & 1) {
+				*(uint8 *)out2++ = color2;
+				--width;
 			}
-			uint16 v41 = v39 & 1;
-			for (uint16 m = v39 >> 1; m; --m) {
-				*(uint16 *)v40 = v7;
-				v40 += 2;
+			uint16 v41 = width & 1;
+			for (uint16 m = width >> 1; m; --m) {
+				*(uint16 *)out2 = start;
+				out2 += 2;
 			}
 			for (uint16 n = v41; n; --n) {
-				*(uint8 *)v40++ = v28;
+				*(uint8 *)out2++ = color2;
 			}
 			--v29;
 			if (v29) {
@@ -1120,11 +1118,11 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 			}
 		}
 		v29 = 2;
-		--v28;
-		if (!(v28 & 0xF)) {
-			v2 += screenWidth;
-			--v5;
-			if (!v5) {
+		--color2;
+		if (!(color2 & 0xF)) {
+			out += screenWidth;
+			--height;
+			if (!height) {
 				return;
 			}
 			continue;


Commit: 12ff8a4daede7df3b85147e133d0bfbf0119373a
    https://github.com/scummvm/scummvm/commit/12ff8a4daede7df3b85147e133d0bfbf0119373a
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:36+02:00

Commit Message:
TWINE: renderPolygonsMarble cleanup

Changed paths:
    engines/twine/renderer/renderer.cpp


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 355301b66d..dcee5dfbc4 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1036,8 +1036,8 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 	uint16 color2 = color;
 	uint16 v29 = 2;
 	while (2) {
-		uint16 stop = *(const uint16 *)(ptr1 + screenHeight);
-		uint16 start = *(const uint16 *)ptr1;
+		const uint16 stop = *(const uint16 *)(ptr1 + screenHeight);
+		const uint16 start = *(const uint16 *)ptr1;
 		++ptr1;
 		if (stop < start) {
 			out += screenWidth;
@@ -1047,22 +1047,20 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 			}
 			continue;
 		}
-		uint16 hsize = stop - start;
+		const uint16 hsize = stop - start;
 		uint16 width = hsize + 1;
 		uint8 *out2 = start + out;
-		(*((uint8 *)&start)) = color2;
-		(*((uint8 *)&(start) + 1)) = color2;
 		if ((uintptr)out2 & 1) {
-			*(uint8 *)out2++ = color2;
+			*out2++ = color2;
 			--width;
 		}
-		uint16 v34 = width & 1;
-		for (uint16 k = width >> 1; k; --k) {
-			*(uint16 *)out2 = start;
-			out2 += 2;
+		for (uint16 k = width / 2; k; --k) {
+			*out2++ = color2;
+			*out2++ = color2;
 		}
+		const uint16 v34 = width & 1;
 		for (uint16 l = v34; l; --l) {
-			*(uint8 *)out2++ = color2;
+			*out2++ = color2;
 		}
 		--v29;
 		if (v29 || (v29 = 2, ++color2, color2 & 0xF)) {
@@ -1091,26 +1089,24 @@ void Renderer::renderPolygonsMarble(int vtop, int32 vsize, uint8 color) const {
 		if (!height) {
 			return;
 		}
-		uint16 stop = *(const uint16 *)(ptr1 + screenHeight);
-		uint16 start = *(const uint16 *)ptr1;
+		const uint16 stop = *(const uint16 *)(ptr1 + screenHeight);
+		const uint16 start = *(const uint16 *)ptr1;
 		++ptr1;
 		if (stop >= start) {
-			uint16 hsize = stop - start;
+			const uint16 hsize = stop - start;
 			uint16 width = hsize + 1;
 			uint8 *out2 = start + out;
-			(*((uint8 *)&start)) = color2;
-			(*((uint8 *)&(start) + 1)) = color2;
 			if ((uintptr)out2 & 1) {
-				*(uint8 *)out2++ = color2;
+				*out2++ = color2;
 				--width;
 			}
-			uint16 v41 = width & 1;
-			for (uint16 m = width >> 1; m; --m) {
-				*(uint16 *)out2 = start;
-				out2 += 2;
+			for (uint16 m = width / 2; m; --m) {
+				*out2++ = color2;
+				*out2++ = color2;
 			}
+			const uint16 v41 = width & 1;
 			for (uint16 n = v41; n; --n) {
-				*(uint8 *)out2++ = color2;
+				*out2++ = color2;
 			}
 			--v29;
 			if (v29) {


Commit: 324393a7ea487a87757a2c38ca5de3f8fcd2743e
    https://github.com/scummvm/scummvm/commit/324393a7ea487a87757a2c38ca5de3f8fcd2743e
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:40+02:00

Commit Message:
TWINE: re-did the renderPolygonsBopper method

better - but still not yet there. Try it with:

  set_holomap_trajectory 15

and check the boat windows

Changed paths:
    engines/twine/renderer/renderer.cpp


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index dcee5dfbc4..6802b4d491 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -503,74 +503,49 @@ void Renderer::renderPolygonsCopper(int vtop, int32 vsize, uint8 color) const {
 
 void Renderer::renderPolygonsBopper(int vtop, int32 vsize, uint8 color) const {
 #if 0
-	LOBYTE(v14) = a2;
-	HIWORD(j) = 0;
+	uint8 *out = (uint8 *)_engine->_frontVideoBuffer.getBasePtr(0, vtop);
+	const int16 *ptr1 = &_polyTab[vtop];
+
+	const int screenWidth = _engine->width();
+	const int screenHeight = _engine->height();
+
+	int32 j = 0;
+
 	do {
-		stop = *(uint16 *)(polytab + 960);
-		start = *(uint16 *)polytab;
-		polytab += 2;
-		v34 = stop < (unsigned __int16)start;
-		v17 = stop - start;
-		if (!v34) {
-			LOWORD(j) = j + 1;
-			v18 = (void *)(start + v2);
-			HIBYTE(v14) = v14;
-			LOWORD(start) = v14;
-			start <<= 16;
-			LOWORD(start) = v14;
-			if ((unsigned __int8)v18 & 1) {
-				*(uint8 *)v18 = v14;
-				v18 = (char *)v18 + 1;
-				--j;
-			}
-			v19 = j;
-			v20 = (unsigned int)j >> 2;
-			memset32(v18, start, v20);
-			v21 = (int)((char *)v18 + 4 * v20);
-			for (j = v19 & 2; j; --j)
-				*(uint8 *)v21++ = start;
-			LOBYTE(v14) = v14 + 1;
-			if (!(v14 & 0xF)) {
+		uint16 stop = *(const uint16 *)(ptr1 + screenHeight);
+		uint16 start = *(const uint16 *)ptr1;
+		++ptr1;
+		if (stop >= start) {
+			++j;
+			uint8 *out2 = out + start;
+			memset(out2, color, j);
+			++color;
+			if (!(color & 0xF)) {
 				while (1) {
-					LOBYTE(v14) = v14 - 1;
-					if (!(v14 & 0xF))
+					--color;
+					if (!(color & 0xF)) {
 						break;
-					v2 += 640;
-					--v5;
-					if (!v5)
-						return start;
-					v22 = *(uint16 *)(polytab + 960);
-					start = *(uint16 *)polytab;
-					polytab += 2;
-					v34 = v22 < (unsigned __int16)start;
-					v23 = v22 - start;
-					if (!v34) {
-						LOWORD(j) = j + 1;
-						v24 = (void *)(start + v2);
-						HIBYTE(v14) = v14;
-						LOWORD(start) = v14;
-						start <<= 16;
-						LOWORD(start) = v14;
-						if ((unsigned __int8)v24 & 1) {
-							*(uint8 *)v24 = v14;
-							v24 = (char *)v24 + 1;
-							--j;
-						}
-						v25 = j;
-						v26 = (unsigned int)j >> 2;
-						memset32(v24, start, v26);
-						v27 = (int)((char *)v24 + 4 * v26);
-						for (j = v25 & 2; j; --j)
-							*(uint8 *)v27++ = start;
+					}
+					out += screenWidth;
+					--vsize;
+					if (!vsize) {
+						return;
+					}
+					stop = *(const uint16 *)(ptr1 + screenHeight);
+					start = *(const uint16 *)ptr1;
+					++ptr1;
+					if (stop >= start) {
+						++j;
+						out2 = out + start;
+						memset(out2, color, j);
 					}
 				}
 			}
 		}
-		v2 += 640;
-		--v5;
-	} while (v5);
-	return start;
-#endif
+		out += screenWidth;
+		--vsize;
+	} while (vsize);
+#else
 	uint8 *out = (uint8 *)_engine->_frontVideoBuffer.getBasePtr(0, vtop);
 	const int16 *ptr1 = &_polyTab[vtop];
 	const int screenWidth = _engine->width();
@@ -600,6 +575,7 @@ void Renderer::renderPolygonsBopper(int vtop, int32 vsize, uint8 color) const {
 		}
 		out += screenWidth;
 	}
+#endif
 }
 
 void Renderer::renderPolygonsFlat(int vtop, int32 vsize, uint8 color) const {


Commit: 18abfb799fbe79f2b7a2384c14e885588c58a0ca
    https://github.com/scummvm/scummvm/commit/18abfb799fbe79f2b7a2384c14e885588c58a0ca
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:46+02:00

Commit Message:
TWINE: cleanup renderPolygonsGouraud

Changed paths:
    engines/twine/renderer/renderer.cpp


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 6802b4d491..17074f8c6e 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -785,83 +785,68 @@ void Renderer::renderPolygonsGouraud(int vtop, int32 vsize) const {
 	}
 	for (int32 currentLine = 0; currentLine < renderLoop; ++currentLine) {
 		uint16 startColor = ptr2[0];
-		uint16 stopColor = ptr2[screenHeight];
+		const uint16 stopColor = ptr2[screenHeight];
 
-		int16 colorSize = stopColor - startColor;
+		int16 colorDiff = stopColor - startColor;
 
-		int16 stop = ptr1[screenHeight];
-		int16 start = ptr1[0];
+		const int16 stop = ptr1[screenHeight];
+		const int16 start = ptr1[0];
 
 		ptr1++;
 		uint8 *out2 = start + out;
 		int32 hsize = stop - start;
 
-		//varf2 = ptr2[screenHeight];
-		//varf3 = ptr2[0];
-
 		ptr2++;
 
-		//varf4 = (float)((int32)varf2 - (int32)varf3);
-
 		if (hsize == 0) {
 			if (start >= 0 && start < screenWidth) {
 				*out2 = ((startColor + stopColor) / 2) / 256; // average of the 2 colors
 			}
-		} else if (hsize > 0) {
-			if (hsize == 1) {
-				if (start >= -1 && start < screenWidth - 1) {
-					*(out2 + 1) = stopColor / 256;
-				}
+		} else if (hsize == 1) {
+			if (start >= -1 && start < screenWidth - 1) {
+				*(out2 + 1) = stopColor / 256;
+			}
 
-				if (start >= 0 && start < screenWidth) {
-					*out2 = startColor / 256;
-				}
-			} else if (hsize == 2) {
-				if (start >= -2 && start < screenWidth - 2) {
-					*(out2 + 2) = stopColor / 256;
-				}
+			if (start >= 0 && start < screenWidth) {
+				*out2 = startColor / 256;
+			}
+		} else if (hsize == 2) {
+			if (start >= -2 && start < screenWidth - 2) {
+				*(out2 + 2) = stopColor / 256;
+			}
 
-				if (start >= -1 && start < screenWidth - 1) {
-					*(out2 + 1) = ((startColor + stopColor) / 2) / 256;
-				}
+			if (start >= -1 && start < screenWidth - 1) {
+				*(out2 + 1) = ((startColor + stopColor) / 2) / 256; // average of the 2 colors
+			}
 
-				if (start >= 0 && start < screenWidth) {
+			if (start >= 0 && start < screenWidth) {
+				*out2 = startColor / 256;
+			}
+		} else if (hsize > 0) {
+			int32 currentXPos = start;
+			colorDiff /= hsize;
+			hsize++;
+
+			if (hsize % 2) {
+				if (currentXPos >= 0 && currentXPos < screenWidth) {
 					*out2 = startColor / 256;
 				}
-			} else {
-				int32 currentXPos = start;
-				colorSize /= hsize;
-				hsize++;
+				++out2;
+				++currentXPos;
+				startColor += colorDiff;
+			}
+			hsize /= 2;
 
-				if (hsize % 2) {
-					hsize /= 2;
+			do {
+				for (int i = 0; i < 2; ++i) {
 					if (currentXPos >= 0 && currentXPos < screenWidth) {
-						*out2 = startColor >> 8;
+						*out2 = startColor / 256;
 					}
-					out2++;
-					currentXPos++;
-					startColor += colorSize;
-				} else {
-					hsize /= 2;
+					++out2;
+					++currentXPos;
+					startColor += colorDiff;
 				}
-
-				do {
-					if (currentXPos >= 0 && currentXPos < screenWidth) {
-						*out2 = startColor >> 8;
-					}
-
-					currentXPos++;
-					startColor += colorSize;
-
-					if (currentXPos >= 0 && currentXPos < screenWidth) {
-						*(out2 + 1) = startColor >> 8;
-					}
-
-					currentXPos++;
-					out2 += 2;
-					startColor += colorSize;
-				} while (--hsize);
-			}
+			} while (--hsize);
 		}
 		out += screenWidth;
 	}


Commit: 807c655503c001f8a55b85e60a411edc9c42abec
    https://github.com/scummvm/scummvm/commit/807c655503c001f8a55b85e60a411edc9c42abec
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-09-08T20:10:57+02:00

Commit Message:
TWINE: fixed potential buffer underflow in renderPolygonsGouraud

Changed paths:
    engines/twine/renderer/renderer.cpp


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 17074f8c6e..3c0a8a3b9b 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -803,7 +803,7 @@ void Renderer::renderPolygonsGouraud(int vtop, int32 vsize) const {
 				*out2 = ((startColor + stopColor) / 2) / 256; // average of the 2 colors
 			}
 		} else if (hsize == 1) {
-			if (start >= -1 && start < screenWidth - 1) {
+			if (start >= 1 && start < screenWidth - 1) {
 				*(out2 + 1) = stopColor / 256;
 			}
 
@@ -811,11 +811,11 @@ void Renderer::renderPolygonsGouraud(int vtop, int32 vsize) const {
 				*out2 = startColor / 256;
 			}
 		} else if (hsize == 2) {
-			if (start >= -2 && start < screenWidth - 2) {
+			if (start >= 2 && start < screenWidth - 2) {
 				*(out2 + 2) = stopColor / 256;
 			}
 
-			if (start >= -1 && start < screenWidth - 1) {
+			if (start >= 1 && start < screenWidth - 1) {
 				*(out2 + 1) = ((startColor + stopColor) / 2) / 256; // average of the 2 colors
 			}
 




More information about the Scummvm-git-logs mailing list