[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