[Scummvm-git-logs] scummvm master -> 295f7e38596383d11e8e56e3f756dda0209c7886

mgerhardy martin.gerhardy at gmail.com
Wed Feb 17 21:09:22 UTC 2021


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

Summary:
04ac02c1e1 TWINE: convert to int32
e6fcdc0dbb TWINE: casting cleanup
833b276e08 TWINE: minor cleanup
295f7e3859 TWINE: assert to check for buffer overflows


Commit: 04ac02c1e1b54b7a05648ed1f0e86dd7c6bd1573
    https://github.com/scummvm/scummvm/commit/04ac02c1e1b54b7a05648ed1f0e86dd7c6bd1573
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-17T21:45:44+01:00

Commit Message:
TWINE: convert to int32

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


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index c3e6943936..60c0631db7 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1538,14 +1538,14 @@ static const int hmPolyOffset4 = 180; /* 0x00b4 */
 static const int hmPolyOffset5 = 240; /* 0x00f0 */
 static const int hmPolyOffset6 = 300; /* 0x012c */
 
-void Renderer::fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2, const Vertex &vertex3, const Vertex &vertex4, uint32 &top, uint32 &bottom) {
-	const uint32 yBottom = (uint32)(uint16)vertex1.y;
-	const uint32 yTop = (uint32)(uint16)vertex2.y;
+void Renderer::fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2, const Vertex &vertex3, const Vertex &vertex4, int32 &top, int32 &bottom) {
+	const int32 yBottom = (int32)(uint16)vertex1.y;
+	const int32 yTop = (int32)(uint16)vertex2.y;
 	if (yBottom < yTop) {
-		if ((int32)yBottom <= (int32)top) {
+		if (yBottom <= top) {
 			top = yBottom;
 		}
-		if ((int32)bottom <= (int32)yTop) {
+		if (bottom <= yTop) {
 			bottom = yTop;
 		}
 		computeHolomapPolygon(yTop, (uint32)(uint16)vertex2.x, yBottom,
@@ -1555,10 +1555,10 @@ void Renderer::fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2,
 		computeHolomapPolygon(yTop, (uint32)vertex4.y,
 							  yBottom, (uint32)vertex3.y, _polyTab + hmPolyOffset4);
 	} else if (yTop < yBottom) {
-		if ((int32)yTop <= (int32)top) {
+		if (yTop <= top) {
 			top = yTop;
 		}
-		if ((int32)bottom <= (int32)yBottom) {
+		if (bottom <= yBottom) {
 			bottom = yBottom;
 		}
 		computeHolomapPolygon(yTop, (uint32)(uint16)vertex2.x, yBottom,
@@ -1571,17 +1571,17 @@ void Renderer::fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2,
 }
 
 void Renderer::renderHolomapVertices(const Vertex vertexCoordinates[3], const Vertex vertexCoordinates2[3]) {
-	uint32 top = 32000;
-	uint32 bottom = (uint32)-32000;
+	int32 top = 32000;
+	int32 bottom = -32000;
 	fillHolomapPolygons(vertexCoordinates[0], vertexCoordinates[1], vertexCoordinates2[0], vertexCoordinates2[1], top, bottom);
 	fillHolomapPolygons(vertexCoordinates[1], vertexCoordinates[2], vertexCoordinates2[1], vertexCoordinates2[2], top, bottom);
 	fillHolomapPolygons(vertexCoordinates[2], vertexCoordinates[0], vertexCoordinates2[2], vertexCoordinates2[0], top, bottom);
 	renderHolomapPolygons(top, bottom);
 }
 
-void Renderer::renderHolomapPolygons(int32 top, int16 bottom) {
+void Renderer::renderHolomapPolygons(int32 top, int32 bottom) {
 	uint8 *out = (uint8 *)_engine->frontVideoBuffer.getBasePtr(0, top);
-	int16 vsize = (int16)(bottom - (int16)top) + 1;
+	int32 vsize = bottom - top + 1;
 	const int16 *polyTabPtr = &_polyTab[top];
 	int32 currentLine = top;
 	const void* pixelBegin = _engine->frontVideoBuffer.getBasePtr(0, 0);
diff --git a/engines/twine/renderer/renderer.h b/engines/twine/renderer/renderer.h
index a4624f641e..477e2f0241 100644
--- a/engines/twine/renderer/renderer.h
+++ b/engines/twine/renderer/renderer.h
@@ -384,9 +384,9 @@ private:
 
 	void baseMatrixTranspose();
 
-	void renderHolomapPolygons(int32 top, int16 bottom);
+	void renderHolomapPolygons(int32 top, int32 bottom);
 	void computeHolomapPolygon(int32 y1, int32 x1, int32 y2, int32 x2, int16 *polygonTabPtr);
-	void fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2, const Vertex &vertex3, const Vertex &vertex4, uint32 &top, uint32 &bottom);
+	void fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2, const Vertex &vertex3, const Vertex &vertex4, int32 &top, int32 &bottom);
 
 public:
 	Renderer(TwinEEngine *engine);


Commit: e6fcdc0dbbbca1cc0626b97d0496ecb2fea48542
    https://github.com/scummvm/scummvm/commit/e6fcdc0dbbbca1cc0626b97d0496ecb2fea48542
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-17T21:49:12+01:00

Commit Message:
TWINE: casting cleanup

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


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 60c0631db7..407a5329e2 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1548,12 +1548,9 @@ void Renderer::fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2,
 		if (bottom <= yTop) {
 			bottom = yTop;
 		}
-		computeHolomapPolygon(yTop, (uint32)(uint16)vertex2.x, yBottom,
-							  (uint32)(uint16)vertex1.x, _polyTab + hmPolyOffset1);
-		computeHolomapPolygon(yTop, (uint32)vertex4.x,
-							  yBottom, (uint32)vertex3.x, _polyTab + hmPolyOffset3);
-		computeHolomapPolygon(yTop, (uint32)vertex4.y,
-							  yBottom, (uint32)vertex3.y, _polyTab + hmPolyOffset4);
+		computeHolomapPolygon(yTop, (uint16)vertex2.x, yBottom, (uint16)vertex1.x, _polyTab + hmPolyOffset1);
+		computeHolomapPolygon(yTop, (uint16)vertex4.x, yBottom, (uint16)vertex3.x, _polyTab + hmPolyOffset3);
+		computeHolomapPolygon(yTop, (uint16)vertex4.y, yBottom, (uint16)vertex3.y, _polyTab + hmPolyOffset4);
 	} else if (yTop < yBottom) {
 		if (yTop <= top) {
 			top = yTop;
@@ -1561,12 +1558,9 @@ void Renderer::fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2,
 		if (bottom <= yBottom) {
 			bottom = yBottom;
 		}
-		computeHolomapPolygon(yTop, (uint32)(uint16)vertex2.x, yBottom,
-							  (uint32)(uint16)vertex1.x, _polyTab + hmPolyOffset2);
-		computeHolomapPolygon(yTop, (uint32)vertex4.x,
-							  yBottom, (uint32)vertex3.x, _polyTab + hmPolyOffset5);
-		computeHolomapPolygon(yTop, (uint32)vertex4.y,
-							  yBottom, (uint32)vertex3.y, _polyTab + hmPolyOffset6);
+		computeHolomapPolygon(yTop, (uint16)vertex2.x, yBottom, (uint16)vertex1.x, _polyTab + hmPolyOffset2);
+		computeHolomapPolygon(yTop, (uint16)vertex4.x, yBottom, (uint16)vertex3.x, _polyTab + hmPolyOffset5);
+		computeHolomapPolygon(yTop, (uint16)vertex4.y, yBottom, (uint16)vertex3.y, _polyTab + hmPolyOffset6);
 	}
 }
 


Commit: 833b276e084434096d549ff887e501780e62dd29
    https://github.com/scummvm/scummvm/commit/833b276e084434096d549ff887e501780e62dd29
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-17T21:58:15+01:00

Commit Message:
TWINE: minor cleanup

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


diff --git a/engines/twine/renderer/renderer.cpp b/engines/twine/renderer/renderer.cpp
index 407a5329e2..95110429bc 100644
--- a/engines/twine/renderer/renderer.cpp
+++ b/engines/twine/renderer/renderer.cpp
@@ -1542,25 +1542,17 @@ void Renderer::fillHolomapPolygons(const Vertex &vertex1, const Vertex &vertex2,
 	const int32 yBottom = (int32)(uint16)vertex1.y;
 	const int32 yTop = (int32)(uint16)vertex2.y;
 	if (yBottom < yTop) {
-		if (yBottom <= top) {
-			top = yBottom;
-		}
-		if (bottom <= yTop) {
-			bottom = yTop;
-		}
-		computeHolomapPolygon(yTop, (uint16)vertex2.x, yBottom, (uint16)vertex1.x, _polyTab + hmPolyOffset1);
-		computeHolomapPolygon(yTop, (uint16)vertex4.x, yBottom, (uint16)vertex3.x, _polyTab + hmPolyOffset3);
-		computeHolomapPolygon(yTop, (uint16)vertex4.y, yBottom, (uint16)vertex3.y, _polyTab + hmPolyOffset4);
+		top = MIN<int32>(yBottom, top);
+		bottom = MAX<int32>(yTop, bottom);
+		computeHolomapPolygon(yTop, (uint16)vertex2.x, yBottom, (uint16)vertex1.x, &_polyTab[hmPolyOffset1]);
+		computeHolomapPolygon(yTop, (uint16)vertex4.x, yBottom, (uint16)vertex3.x, &_polyTab[hmPolyOffset3]);
+		computeHolomapPolygon(yTop, (uint16)vertex4.y, yBottom, (uint16)vertex3.y, &_polyTab[hmPolyOffset4]);
 	} else if (yTop < yBottom) {
-		if (yTop <= top) {
-			top = yTop;
-		}
-		if (bottom <= yBottom) {
-			bottom = yBottom;
-		}
-		computeHolomapPolygon(yTop, (uint16)vertex2.x, yBottom, (uint16)vertex1.x, _polyTab + hmPolyOffset2);
-		computeHolomapPolygon(yTop, (uint16)vertex4.x, yBottom, (uint16)vertex3.x, _polyTab + hmPolyOffset5);
-		computeHolomapPolygon(yTop, (uint16)vertex4.y, yBottom, (uint16)vertex3.y, _polyTab + hmPolyOffset6);
+		top = MIN<int32>(yTop, top);
+		bottom = MAX<int32>(yBottom, bottom);
+		computeHolomapPolygon(yTop, (uint16)vertex2.x, yBottom, (uint16)vertex1.x, &_polyTab[hmPolyOffset2]);
+		computeHolomapPolygon(yTop, (uint16)vertex4.x, yBottom, (uint16)vertex3.x, &_polyTab[hmPolyOffset5]);
+		computeHolomapPolygon(yTop, (uint16)vertex4.y, yBottom, (uint16)vertex3.y, &_polyTab[hmPolyOffset6]);
 	}
 }
 


Commit: 295f7e38596383d11e8e56e3f756dda0209c7886
    https://github.com/scummvm/scummvm/commit/295f7e38596383d11e8e56e3f756dda0209c7886
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2021-02-17T22:02:38+01:00

Commit Message:
TWINE: assert to check for buffer overflows

Changed paths:
    engines/twine/holomap.cpp
    engines/twine/holomap.h


diff --git a/engines/twine/holomap.cpp b/engines/twine/holomap.cpp
index d444a3b48a..dc2ff09bdb 100644
--- a/engines/twine/holomap.cpp
+++ b/engines/twine/holomap.cpp
@@ -169,7 +169,7 @@ void Holomap::prepareHolomapPolygons() {
 	Common::MemoryReadStream stream(_engine->_resources->holomapSurfacePtr, _engine->_resources->holomapSurfaceSize);
 	int holomapSortArrayIdx = 0;
 	int holomapSurfaceArrayIdx = 0;
-	uint16 projectedIndex = 0;
+	_projectedSurfaceIndex = 0;
 	_engine->_renderer->setBaseRotation(0, 0, 0);
 	for (int32 angle = -ANGLE_90; angle <= ANGLE_90; angle += ANGLE_11_25) {
 		int rotation = 0;
@@ -178,26 +178,26 @@ void Holomap::prepareHolomapPolygons() {
 			_engine->_renderer->getBaseRotationPosition(vec->x, vec->y, vec->z);
 			if (angle != ANGLE_90) {
 				_holomapSort[holomapSortArrayIdx].z = _engine->_renderer->destZ;
-				_holomapSort[holomapSortArrayIdx].projectedPosIdx = projectedIndex;
+				_holomapSort[holomapSortArrayIdx].projectedPosIdx = _projectedSurfaceIndex;
 				++holomapSortArrayIdx;
 			}
 			_engine->_renderer->projectPositionOnScreen(_engine->_renderer->destX, _engine->_renderer->destY, _engine->_renderer->destZ);
-			_projectedSurfacePositions[projectedIndex].x = _engine->_renderer->projPosX;
-			_projectedSurfacePositions[projectedIndex].y = _engine->_renderer->projPosY;
+			_projectedSurfacePositions[_projectedSurfaceIndex].x = _engine->_renderer->projPosX;
+			_projectedSurfacePositions[_projectedSurfaceIndex].y = _engine->_renderer->projPosY;
 			rotation += ANGLE_11_25;
-			++projectedIndex;
+			++_projectedSurfaceIndex;
 		}
 		HolomapSurface* vec = &_holomapSurface[holomapSurfaceArrayIdx++];
 		_engine->_renderer->getBaseRotationPosition(vec->x, vec->y, vec->z);
 		_engine->_renderer->projectPositionOnScreen(_engine->_renderer->destX, _engine->_renderer->destY, _engine->_renderer->destZ);
-		_projectedSurfacePositions[projectedIndex].x = _engine->_renderer->projPosX;
-		_projectedSurfacePositions[projectedIndex].y = _engine->_renderer->projPosY;
+		_projectedSurfacePositions[_projectedSurfaceIndex].x = _engine->_renderer->projPosX;
+		_projectedSurfacePositions[_projectedSurfaceIndex].y = _engine->_renderer->projPosY;
 		rotation += ANGLE_11_25;
-		++projectedIndex;
+		++_projectedSurfaceIndex;
 	}
 	assert(holomapSortArrayIdx <= ARRAYSIZE(_holomapSort));
 	assert(holomapSurfaceArrayIdx <= ARRAYSIZE(_holomapSurface));
-	assert(projectedIndex <= ARRAYSIZE(_projectedSurfacePositions));
+	assert(_projectedSurfaceIndex <= ARRAYSIZE(_projectedSurfacePositions));
 	qsort(_holomapSort, ARRAYSIZE(_holomapSort), sizeof(HolomapSort), sortHolomapSurfaceCoordsByDepth);
 }
 
@@ -219,6 +219,7 @@ bool Holomap::isTriangleVisible(const Vertex *vertices) const {
 void Holomap::renderHolomapSurfacePolygons() {
 	prepareHolomapPolygons();
 	for (int32 i = 0; i < ARRAYSIZE(_holomapSort); ++i) {
+		assert(_holomapSort[i].projectedPosIdx + 34 < _projectedSurfaceIndex);
 		const HolomapProjectedPos &pos1 = _projectedSurfacePositions[_holomapSort[i].projectedPosIdx + 0];
 		const HolomapProjectedPos &pos2 = _projectedSurfacePositions[_holomapSort[i].projectedPosIdx + 33];
 		const HolomapProjectedPos &pos3 = _projectedSurfacePositions[_holomapSort[i].projectedPosIdx + 1];
diff --git a/engines/twine/holomap.h b/engines/twine/holomap.h
index dd5cc67946..16db4ca05f 100644
--- a/engines/twine/holomap.h
+++ b/engines/twine/holomap.h
@@ -82,6 +82,7 @@ private:
 		uint16 unk2 = 0;
 	};
 	HolomapProjectedPos _projectedSurfacePositions[2048];
+	int _projectedSurfaceIndex = 0;
 
 	struct TrajectoryData {
 		int16 locationIdx;




More information about the Scummvm-git-logs mailing list