[Scummvm-git-logs] scummvm master -> 0f73d606c38d8431812b4c613f0280770e7c92f0

mgerhardy martin.gerhardy at gmail.com
Thu Dec 24 14:00:47 UTC 2020


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

Summary:
42121a9083 TWINE: increased fps for text rendering to match the original
e1f827c323 TWINE: drawSprite for SpriteData
c1b89c9878 TWINE: use SpriteData for rendering
0ab84e47ba TWINE: removed unused method parameter
0f73d606c3 TWINE: optimized drawBrickSprite


Commit: 42121a908319eefb00500773907236c4acc09285
    https://github.com/scummvm/scummvm/commit/42121a908319eefb00500773907236c4acc09285
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-12-24T15:00:00+01:00

Commit Message:
TWINE: increased fps for text rendering to match the original

Changed paths:
    engines/twine/text.cpp


diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index c6fcd33d69..5ee4de4c75 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -616,7 +616,7 @@ bool Text::drawTextFullscreen(int32 index) {
 
 		ProgressiveTextState printedText;
 		for (;;) {
-			ScopedFPS scopedFps;
+			ScopedFPS scopedFps(66);
 			_engine->readKeys();
 			printedText = updateProgressiveText();
 			playVox(currDialTextEntry);
@@ -783,7 +783,7 @@ void Text::drawAskQuestion(int32 index) {
 
 	ProgressiveTextState textStatus = ProgressiveTextState::UNK1;
 	do {
-		ScopedFPS scopedFps;
+		ScopedFPS scopedFps(66);
 		_engine->readKeys();
 		textStatus = updateProgressiveText();
 


Commit: e1f827c3234161f22b603f02f1be305f56ec1222
    https://github.com/scummvm/scummvm/commit/e1f827c3234161f22b603f02f1be305f56ec1222
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-12-24T15:00:00+01:00

Commit Message:
TWINE: drawSprite for SpriteData

Changed paths:
    engines/twine/resources/resources.cpp
    engines/twine/resources/resources.h
    engines/twine/scene/grid.cpp
    engines/twine/scene/grid.h


diff --git a/engines/twine/resources/resources.cpp b/engines/twine/resources/resources.cpp
index cfec2524ab..89e7e9307e 100644
--- a/engines/twine/resources/resources.cpp
+++ b/engines/twine/resources/resources.cpp
@@ -77,6 +77,9 @@ void Resources::preloadSprites() {
 	debug("preload %i sprites", numEntries);
 	for (int32 i = 0; i < numEntries; i++) {
 		spriteSizeTable[i] = HQR::getAllocEntry(&spriteTable[i], Resources::HQR_SPRITES_FILE, i);
+		if (!spriteData[i].loadFromBuffer(spriteTable[i], spriteSizeTable[i])) {
+			error("Failed to load sprite %i", i);
+		}
 	}
 }
 
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index 7b61712ee4..3eb1441be1 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -155,6 +155,7 @@ public:
 	uint8 *spriteTable[NUM_SPRITES] {nullptr};
 	/** Table with all loaded sprite sizes */
 	uint32 spriteSizeTable[NUM_SPRITES] {0};
+	SpriteData spriteData[NUM_SPRITES];
 
 	/** Table with all loaded animations */
 	uint8 *animTable[NUM_ANIMS]{nullptr};
diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index 3b65c4404a..bbecf2a541 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -474,6 +474,27 @@ void Grid::drawSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr) {
 	drawBrickSprite(index, posX, posY, ptr, true);
 }
 
+void Grid::drawSprite(int32 /*index*/, int32 posX, int32 posY, const SpriteData &ptr) {
+	const int32 left = posX + ptr.offsetX();
+	if (left > _engine->_interface->textWindow.right) {
+		return;
+	}
+	const int32 right = ptr.surface().w + left;
+	if (right < _engine->_interface->textWindow.left) {
+		return;
+	}
+	const int32 top = posY + ptr.offsetY();
+	if (top > _engine->_interface->textWindow.bottom) {
+		return;
+	}
+	const int32 bottom = ptr.surface().h + top;
+	if (bottom < _engine->_interface->textWindow.top) {
+		return;
+	}
+
+	_engine->frontVideoBuffer.transBlitFrom(ptr.surface(), Common::Point(left, top));
+}
+
 // WARNING: Rewrite this function to have better performance
 void Grid::drawBrickSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr, bool isSprite) {
 	const int32 left = posX + *(ptr + 2);
diff --git a/engines/twine/scene/grid.h b/engines/twine/scene/grid.h
index ae7c34cbb7..eee85b7341 100644
--- a/engines/twine/scene/grid.h
+++ b/engines/twine/scene/grid.h
@@ -24,6 +24,7 @@
 #define TWINE_GRID_H
 
 #include "common/scummsys.h"
+#include "twine/parser/sprite.h"
 #include "twine/shared.h"
 #include "twine/twine.h"
 
@@ -243,6 +244,7 @@ public:
 	 * @param ptr sprite buffer pointer to draw
 	 */
 	void drawSprite(int32 index, int32 posX, int32 posY, const uint8 *spritePtr);
+	void drawSprite(int32 index, int32 posX, int32 posY, const SpriteData &ptr);
 
 	/**
 	 * Draw sprite or bricks in the screen according with the type


Commit: c1b89c9878f6afeff53225db745ee481b8146a64
    https://github.com/scummvm/scummvm/commit/c1b89c9878f6afeff53225db745ee481b8146a64
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-12-24T15:00:00+01:00

Commit Message:
TWINE: use SpriteData for rendering

Changed paths:
    engines/twine/menu/menu.cpp
    engines/twine/renderer/redraw.cpp
    engines/twine/resources/resources.h


diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index bd7df2f497..06498ba841 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -806,7 +806,7 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
 
 	int32 newBoxLeft2 = left + 9;
 
-	_engine->_grid->drawSprite(0, newBoxLeft2, top + 13, _engine->_resources->spriteTable[SPRITEHQR_LIFEPOINTS]);
+	_engine->_grid->drawSprite(0, newBoxLeft2, top + 13, _engine->_resources->spriteData[SPRITEHQR_LIFEPOINTS]);
 
 	int32 boxRight = left + 325;
 	int32 newBoxLeft = left + 25;
@@ -818,7 +818,7 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
 	drawBox(newBoxLeft, boxTop, left + 324, boxTop + 14);
 
 	if (!_engine->_gameState->inventoryDisabled() && _engine->_gameState->hasItem(InventoryItems::kiTunic)) {
-		_engine->_grid->drawSprite(0, newBoxLeft2, top + 36, _engine->_resources->spriteTable[SPRITEHQR_MAGICPOINTS]);
+		_engine->_grid->drawSprite(0, newBoxLeft2, top + 36, _engine->_resources->spriteData[SPRITEHQR_MAGICPOINTS]);
 		if (_engine->_gameState->magicLevelIdx > 0) {
 			_engine->_interface->drawSplittedBox(Common::Rect(newBoxLeft, top + 35, _engine->_screens->crossDot(newBoxLeft, boxRight, 80, _engine->_gameState->inventoryMagicPoints), top + 50), 75);
 		}
@@ -828,13 +828,13 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
 	boxLeft = left + 340;
 
 	/** draw coin sprite */
-	_engine->_grid->drawSprite(0, boxLeft, top + 15, _engine->_resources->spriteTable[SPRITEHQR_KASHES]);
+	_engine->_grid->drawSprite(0, boxLeft, top + 15, _engine->_resources->spriteData[SPRITEHQR_KASHES]);
 	_engine->_text->setFontColor(155);
 	Common::String inventoryNumKashes = Common::String::format("%d", _engine->_gameState->inventoryNumKashes);
 	_engine->_text->drawText(left + 370, top + 5, inventoryNumKashes.c_str());
 
 	/** draw key sprite */
-	_engine->_grid->drawSprite(0, boxLeft, top + 55, _engine->_resources->spriteTable[SPRITEHQR_KEY]);
+	_engine->_grid->drawSprite(0, boxLeft, top + 55, _engine->_resources->spriteData[SPRITEHQR_KEY]);
 	_engine->_text->setFontColor(155);
 	Common::String inventoryNumKeys = Common::String::format("%d", _engine->_gameState->inventoryNumKeys);
 	_engine->_text->drawText(left + 370, top + 40, inventoryNumKeys.c_str());
@@ -846,12 +846,12 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
 
 	// Clover leaf boxes
 	for (int32 i = 0; i < _engine->_gameState->inventoryNumLeafsBox; i++) {
-		_engine->_grid->drawSprite(0, _engine->_screens->crossDot(left + 25, left + 325, 10, i), top + 58, _engine->_resources->spriteTable[SPRITEHQR_CLOVERLEAFBOX]);
+		_engine->_grid->drawSprite(0, _engine->_screens->crossDot(left + 25, left + 325, 10, i), top + 58, _engine->_resources->spriteData[SPRITEHQR_CLOVERLEAFBOX]);
 	}
 
 	// Clover leafs
 	for (int32 i = 0; i < _engine->_gameState->inventoryNumLeafs; i++) {
-		_engine->_grid->drawSprite(0, _engine->_screens->crossDot(left + 25, left + 325, 10, i) + 2, top + 60, _engine->_resources->spriteTable[SPRITEHQR_CLOVERLEAF]);
+		_engine->_grid->drawSprite(0, _engine->_screens->crossDot(left + 25, left + 325, 10, i) + 2, top + 60, _engine->_resources->spriteData[SPRITEHQR_CLOVERLEAF]);
 	}
 
 	_engine->copyBlockPhys(left, top, left + width, top + 135);
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index 513d3e3b58..2ce6126f75 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -415,13 +415,13 @@ void Redraw::processDrawListActors(const DrawListStruct &drawCmd, bool bgRedraw)
 void Redraw::processDrawListActorSprites(const DrawListStruct &drawCmd, bool bgRedraw) {
 	int32 actorIdx = drawCmd.actorIdx;
 	ActorStruct *actor = _engine->_scene->getActor(actorIdx);
-	const uint8 *spritePtr = _engine->_resources->spriteTable[actor->entity];
+	const SpriteData &spritePtr = _engine->_resources->spriteData[actor->entity];
 
 	// get actor position on screen
 	_engine->_renderer->projectPositionOnScreen(actor->x - _engine->_grid->cameraX, actor->y - _engine->_grid->cameraY, actor->z - _engine->_grid->cameraZ);
 
-	int32 spriteWidth, spriteHeight;
-	_engine->_grid->getSpriteSize(0, &spriteWidth, &spriteHeight, spritePtr);
+	const int32 spriteWidth = spritePtr.surface().w;
+	const int32 spriteHeight = spritePtr.surface().h;
 
 	// calculate sprite position on screen
 	const SpriteDim* dim = _engine->_resources->spriteBoundingBox.dim(actor->entity);
@@ -478,8 +478,9 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
 	if (extra->info0 & 0x8000) {
 		_engine->_extra->drawExtraSpecial(actorIdx, _engine->_renderer->projPosX, _engine->_renderer->projPosY);
 	} else {
-		int32 spriteWidth, spriteHeight;
-		_engine->_grid->getSpriteSize(0, &spriteWidth, &spriteHeight, _engine->_resources->spriteTable[extra->info0]);
+		const SpriteData &spritePtr = _engine->_resources->spriteData[extra->info0];
+		const int32 spriteWidth = spritePtr.surface().w;
+		const int32 spriteHeight = spritePtr.surface().h;
 
 		// calculate sprite position on screen
 		const SpriteDim* dim = _engine->_resources->spriteBoundingBox.dim(extra->info0);
@@ -488,7 +489,7 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
 		renderRect.right = renderRect.left + spriteWidth;
 		renderRect.bottom = renderRect.top + spriteHeight;
 
-		_engine->_grid->drawSprite(0, renderRect.left, renderRect.top, _engine->_resources->spriteTable[extra->info0]);
+		_engine->_grid->drawSprite(0, renderRect.left, renderRect.top, spritePtr);
 	}
 
 	_engine->_interface->setClip(renderRect);
@@ -569,10 +570,9 @@ void Redraw::renderOverlays() {
 			// process overlay type
 			switch (overlay->type) {
 			case OverlayType::koSprite: {
-				const uint8 *spritePtr = _engine->_resources->spriteTable[overlay->info0];
-
-				int32 spriteWidth, spriteHeight;
-				_engine->_grid->getSpriteSize(0, &spriteWidth, &spriteHeight, spritePtr);
+				const SpriteData &spritePtr = _engine->_resources->spriteData[overlay->info0];
+				const int32 spriteWidth = spritePtr.surface().w;
+				const int32 spriteHeight = spritePtr.surface().h;
 
 				const SpriteDim* dim = _engine->_resources->spriteBoundingBox.dim(overlay->info0);
 				renderRect.left = dim->x + overlay->x;
@@ -777,9 +777,9 @@ void Redraw::drawBubble(int32 actorIdx) {
 		bubbleActor = actorIdx;
 	}
 
-	const uint8 *spritePtr = _engine->_resources->spriteTable[bubbleSpriteIndex];
-	int32 spriteWidth, spriteHeight;
-	_engine->_grid->getSpriteSize(0, &spriteWidth, &spriteHeight, spritePtr);
+	const SpriteData &spritePtr = _engine->_resources->spriteData[bubbleSpriteIndex];
+	const int32 spriteWidth = spritePtr.surface().w;
+	const int32 spriteHeight = spritePtr.surface().h;
 
 	// calculate sprite position on screen
 	if (bubbleSpriteIndex == SPRITEHQR_DIAG_BUBBLE_RIGHT) {
diff --git a/engines/twine/resources/resources.h b/engines/twine/resources/resources.h
index 3eb1441be1..dca46e0342 100644
--- a/engines/twine/resources/resources.h
+++ b/engines/twine/resources/resources.h
@@ -142,6 +142,11 @@ private:
 	void preloadAnimations();
 	void preloadSamples();
 
+	/** Table with all loaded sprites */
+	uint8 *spriteTable[NUM_SPRITES] {nullptr};
+	/** Table with all loaded sprite sizes */
+	uint32 spriteSizeTable[NUM_SPRITES] {0};
+
 public:
 	Resources(TwinEEngine *engine) : _engine(engine) {}
 	~Resources();
@@ -151,10 +156,6 @@ public:
 	/** Table with all loaded samples sizes */
 	uint32 inventorySizeTable[NUM_INVENTORY_ITEMS] {0};
 
-	/** Table with all loaded sprites */
-	uint8 *spriteTable[NUM_SPRITES] {nullptr};
-	/** Table with all loaded sprite sizes */
-	uint32 spriteSizeTable[NUM_SPRITES] {0};
 	SpriteData spriteData[NUM_SPRITES];
 
 	/** Table with all loaded animations */


Commit: 0ab84e47ba02749be099d61b81f9fcf461cf854c
    https://github.com/scummvm/scummvm/commit/0ab84e47ba02749be099d61b81f9fcf461cf854c
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-12-24T15:00:00+01:00

Commit Message:
TWINE: removed unused method parameter

Changed paths:
    engines/twine/menu/menu.cpp
    engines/twine/renderer/redraw.cpp
    engines/twine/scene/grid.cpp
    engines/twine/scene/grid.h


diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index 06498ba841..376d3efba1 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -806,7 +806,7 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
 
 	int32 newBoxLeft2 = left + 9;
 
-	_engine->_grid->drawSprite(0, newBoxLeft2, top + 13, _engine->_resources->spriteData[SPRITEHQR_LIFEPOINTS]);
+	_engine->_grid->drawSprite(newBoxLeft2, top + 13, _engine->_resources->spriteData[SPRITEHQR_LIFEPOINTS]);
 
 	int32 boxRight = left + 325;
 	int32 newBoxLeft = left + 25;
@@ -818,7 +818,7 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
 	drawBox(newBoxLeft, boxTop, left + 324, boxTop + 14);
 
 	if (!_engine->_gameState->inventoryDisabled() && _engine->_gameState->hasItem(InventoryItems::kiTunic)) {
-		_engine->_grid->drawSprite(0, newBoxLeft2, top + 36, _engine->_resources->spriteData[SPRITEHQR_MAGICPOINTS]);
+		_engine->_grid->drawSprite(newBoxLeft2, top + 36, _engine->_resources->spriteData[SPRITEHQR_MAGICPOINTS]);
 		if (_engine->_gameState->magicLevelIdx > 0) {
 			_engine->_interface->drawSplittedBox(Common::Rect(newBoxLeft, top + 35, _engine->_screens->crossDot(newBoxLeft, boxRight, 80, _engine->_gameState->inventoryMagicPoints), top + 50), 75);
 		}
@@ -828,13 +828,13 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
 	boxLeft = left + 340;
 
 	/** draw coin sprite */
-	_engine->_grid->drawSprite(0, boxLeft, top + 15, _engine->_resources->spriteData[SPRITEHQR_KASHES]);
+	_engine->_grid->drawSprite(boxLeft, top + 15, _engine->_resources->spriteData[SPRITEHQR_KASHES]);
 	_engine->_text->setFontColor(155);
 	Common::String inventoryNumKashes = Common::String::format("%d", _engine->_gameState->inventoryNumKashes);
 	_engine->_text->drawText(left + 370, top + 5, inventoryNumKashes.c_str());
 
 	/** draw key sprite */
-	_engine->_grid->drawSprite(0, boxLeft, top + 55, _engine->_resources->spriteData[SPRITEHQR_KEY]);
+	_engine->_grid->drawSprite(boxLeft, top + 55, _engine->_resources->spriteData[SPRITEHQR_KEY]);
 	_engine->_text->setFontColor(155);
 	Common::String inventoryNumKeys = Common::String::format("%d", _engine->_gameState->inventoryNumKeys);
 	_engine->_text->drawText(left + 370, top + 40, inventoryNumKeys.c_str());
@@ -846,12 +846,12 @@ void Menu::drawInfoMenu(int16 left, int16 top) {
 
 	// Clover leaf boxes
 	for (int32 i = 0; i < _engine->_gameState->inventoryNumLeafsBox; i++) {
-		_engine->_grid->drawSprite(0, _engine->_screens->crossDot(left + 25, left + 325, 10, i), top + 58, _engine->_resources->spriteData[SPRITEHQR_CLOVERLEAFBOX]);
+		_engine->_grid->drawSprite(_engine->_screens->crossDot(left + 25, left + 325, 10, i), top + 58, _engine->_resources->spriteData[SPRITEHQR_CLOVERLEAFBOX]);
 	}
 
 	// Clover leafs
 	for (int32 i = 0; i < _engine->_gameState->inventoryNumLeafs; i++) {
-		_engine->_grid->drawSprite(0, _engine->_screens->crossDot(left + 25, left + 325, 10, i) + 2, top + 60, _engine->_resources->spriteData[SPRITEHQR_CLOVERLEAF]);
+		_engine->_grid->drawSprite(_engine->_screens->crossDot(left + 25, left + 325, 10, i) + 2, top + 60, _engine->_resources->spriteData[SPRITEHQR_CLOVERLEAF]);
 	}
 
 	_engine->copyBlockPhys(left, top, left + width, top + 135);
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index 2ce6126f75..89906d02f4 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -438,7 +438,7 @@ void Redraw::processDrawListActorSprites(const DrawListStruct &drawCmd, bool bgR
 	}
 
 	if (_engine->_interface->textWindow.left <= _engine->_interface->textWindow.right && _engine->_interface->textWindow.top <= _engine->_interface->textWindow.bottom) {
-		_engine->_grid->drawSprite(0, renderRect.left, renderRect.top, spritePtr);
+		_engine->_grid->drawSprite(renderRect.left, renderRect.top, spritePtr);
 
 		actor->dynamicFlags.bIsVisible = 1;
 
@@ -489,7 +489,7 @@ void Redraw::processDrawListExtras(const DrawListStruct &drawCmd) {
 		renderRect.right = renderRect.left + spriteWidth;
 		renderRect.bottom = renderRect.top + spriteHeight;
 
-		_engine->_grid->drawSprite(0, renderRect.left, renderRect.top, spritePtr);
+		_engine->_grid->drawSprite(renderRect.left, renderRect.top, spritePtr);
 	}
 
 	_engine->_interface->setClip(renderRect);
@@ -580,7 +580,7 @@ void Redraw::renderOverlays() {
 				renderRect.right = renderRect.left + spriteWidth;
 				renderRect.bottom = renderRect.top + spriteHeight;
 
-				_engine->_grid->drawSprite(0, renderRect.left, renderRect.top, spritePtr);
+				_engine->_grid->drawSprite(renderRect.left, renderRect.top, spritePtr);
 
 				if (_engine->_interface->textWindow.left <= _engine->_interface->textWindow.right && _engine->_interface->textWindow.top <= _engine->_interface->textWindow.bottom) {
 					addRedrawArea(_engine->_interface->textWindow.left, _engine->_interface->textWindow.top, renderRect.right, renderRect.bottom);
@@ -793,7 +793,7 @@ void Redraw::drawBubble(int32 actorIdx) {
 
 	_engine->_interface->setClip(renderRect);
 
-	_engine->_grid->drawSprite(0, renderRect.left, renderRect.top, spritePtr);
+	_engine->_grid->drawSprite(renderRect.left, renderRect.top, spritePtr);
 	if (_engine->_interface->textWindow.left <= _engine->_interface->textWindow.right && _engine->_interface->textWindow.top <= _engine->_interface->textWindow.bottom) {
 		_engine->copyBlockPhys(renderRect);
 	}
diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index bbecf2a541..5c045662fe 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -474,7 +474,7 @@ void Grid::drawSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr) {
 	drawBrickSprite(index, posX, posY, ptr, true);
 }
 
-void Grid::drawSprite(int32 /*index*/, int32 posX, int32 posY, const SpriteData &ptr) {
+void Grid::drawSprite(int32 posX, int32 posY, const SpriteData &ptr) {
 	const int32 left = posX + ptr.offsetX();
 	if (left > _engine->_interface->textWindow.right) {
 		return;
diff --git a/engines/twine/scene/grid.h b/engines/twine/scene/grid.h
index eee85b7341..3619c80d5e 100644
--- a/engines/twine/scene/grid.h
+++ b/engines/twine/scene/grid.h
@@ -244,7 +244,7 @@ public:
 	 * @param ptr sprite buffer pointer to draw
 	 */
 	void drawSprite(int32 index, int32 posX, int32 posY, const uint8 *spritePtr);
-	void drawSprite(int32 index, int32 posX, int32 posY, const SpriteData &ptr);
+	void drawSprite(int32 posX, int32 posY, const SpriteData &ptr);
 
 	/**
 	 * Draw sprite or bricks in the screen according with the type


Commit: 0f73d606c38d8431812b4c613f0280770e7c92f0
    https://github.com/scummvm/scummvm/commit/0f73d606c38d8431812b4c613f0280770e7c92f0
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2020-12-24T15:00:08+01:00

Commit Message:
TWINE: optimized drawBrickSprite

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


diff --git a/engines/twine/scene/grid.cpp b/engines/twine/scene/grid.cpp
index 5c045662fe..c2c92c2016 100644
--- a/engines/twine/scene/grid.cpp
+++ b/engines/twine/scene/grid.cpp
@@ -531,23 +531,36 @@ void Grid::drawBrickSprite(int32 index, int32 posX, int32 posY, const uint8 *ptr
 					x += iterations;
 					continue;
 				}
+				if (y < _engine->_interface->textWindow.top || x >= _engine->_interface->textWindow.right || x + iterations < _engine->_interface->textWindow.left) {
+					if (type == 1) {
+						ptr += iterations;
+					} else {
+						++ptr;
+					}
+					x += iterations;
+					continue;
+				}
 				if (type == 1) {
+					uint8 *out = (uint8 *)_engine->frontVideoBuffer.getBasePtr(x, y);
 					for (uint8 i = 0; i < iterations; i++) {
-						if (x >= _engine->_interface->textWindow.left && x < _engine->_interface->textWindow.right && y >= _engine->_interface->textWindow.top) {
-							*(uint8 *)_engine->frontVideoBuffer.getBasePtr(x, y) = *ptr;
+						if (x >= _engine->_interface->textWindow.left && x < _engine->_interface->textWindow.right) {
+							*out = *ptr;
 						}
 
-						x++;
-						ptr++;
+						++out;
+						++x;
+						++ptr;
 					}
 				} else {
 					const uint8 pixel = *ptr++;
+					uint8 *out = (uint8 *)_engine->frontVideoBuffer.getBasePtr(x, y);
 					for (uint8 i = 0; i < iterations; i++) {
-						if (x >= _engine->_interface->textWindow.left && x < _engine->_interface->textWindow.right && y >= _engine->_interface->textWindow.top) {
-							*(uint8 *)_engine->frontVideoBuffer.getBasePtr(x, y) = pixel;
+						if (x >= _engine->_interface->textWindow.left && x < _engine->_interface->textWindow.right) {
+							*out = pixel;
 						}
 
-						x++;
+						++out;
+						++x;
 					}
 				}
 			}




More information about the Scummvm-git-logs mailing list