[Scummvm-cvs-logs] scummvm master -> b04a0697820d3dfff1fa09831c1bb362a641c49c

bluegr md5 at scummvm.org
Fri Oct 14 13:16:08 CEST 2011


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

Summary:
d39cdd8e1c SCI: More work on the vertical plane offset for SCI32. Still WIP.
b04a069782 SCI: More work on kBitmap (still WIP)


Commit: d39cdd8e1cfdcf9992f03f6ef72138dbdc3f6bbb
    https://github.com/scummvm/scummvm/commit/d39cdd8e1cfdcf9992f03f6ef72138dbdc3f6bbb
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2011-10-14T04:07:00-07:00

Commit Message:
SCI: More work on the vertical plane offset for SCI32. Still WIP.

Vertical clipping is still not finished. This fixes the display in the
Torin demo (which uses a scene with loads of items with a vertical
offset).

Changed paths:
    engines/sci/graphics/frameout.cpp
    engines/sci/graphics/frameout.h
    engines/sci/graphics/picture.cpp
    engines/sci/graphics/picture.h



diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index 9d15c82..9a44f07 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -90,6 +90,7 @@ void GfxFrameout::kernelAddPlane(reg_t object) {
 	newPlane.priority = readSelectorValue(_segMan, object, SELECTOR(priority));
 	newPlane.lastPriority = 0xFFFF; // hidden
 	newPlane.planeOffsetX = 0;
+	newPlane.planeOffsetY = 0;
 	newPlane.pictureId = 0xFFFF;
 	newPlane.planePictureMirrored = false;
 	newPlane.planeBack = 0;
@@ -132,9 +133,14 @@ void GfxFrameout::kernelUpdatePlane(reg_t object) {
 			} else {
 				it->planeOffsetX = 0;
 			}
-
-			if (it->planeRect.top < 0)
+			
+			if (it->planeRect.top < 0) {
+				it->planeOffsetY = -it->planeRect.top;
 				it->planeRect.top = 0;
+			} else {
+				it->planeOffsetY = 0;
+			}
+
 			// We get bad plane-bottom in sq6
 			if (it->planeRect.right > _screen->getWidth())
 				it->planeRect.right = _screen->getWidth();
@@ -447,7 +453,14 @@ void GfxFrameout::kernelFrameout() {
 					continue;
 
 				// Out of view vertically (sanity checks)
-				// TODO
+				int16 pictureCelStartY = itemEntry->picStartY + itemEntry->y;
+				int16 pictureCelEndY = pictureCelStartY + itemEntry->picture->getSci32celHeight(itemEntry->celNo);
+				int16 planeStartY = it->planeOffsetY;
+				int16 planeEndY = planeStartY + it->planeRect.height();
+				if (pictureCelEndY < planeStartY)
+					continue;
+				if (pictureCelStartY > planeEndY)
+					continue;
 
 				int16 pictureOffsetX = it->planeOffsetX;
 				int16 pictureX = itemEntry->x;
@@ -460,8 +473,18 @@ void GfxFrameout::kernelFrameout() {
 					}
 				}
 
-				// TODO: pictureOffsetY
-				itemEntry->picture->drawSci32Vga(itemEntry->celNo, pictureX, itemEntry->y, pictureOffsetX, it->planePictureMirrored);
+				int16 pictureOffsetY = it->planeOffsetY;
+				int16 pictureY = itemEntry->y;
+				if ((it->planeOffsetY) || (itemEntry->picStartY)) {
+					if (it->planeOffsetY <= itemEntry->picStartY) {
+						pictureY += itemEntry->picStartY - it->planeOffsetY;
+						pictureOffsetY = 0;
+					} else {
+						pictureOffsetY = it->planeOffsetY - itemEntry->picStartY;
+					}
+				}
+
+				itemEntry->picture->drawSci32Vga(itemEntry->celNo, pictureX, itemEntry->y, pictureOffsetX, pictureOffsetY, it->planePictureMirrored);
 //				warning("picture cel %d %d", itemEntry->celNo, itemEntry->priority);
 
 			} else if (itemEntry->viewId != 0xFFFF) {
@@ -482,6 +505,7 @@ void GfxFrameout::kernelFrameout() {
 
 				// Adjust according to current scroll position
 				itemEntry->x -= it->planeOffsetX;
+				itemEntry->y -= it->planeOffsetY;
 
 				uint16 useInsetRect = readSelectorValue(_segMan, itemEntry->object, SELECTOR(useInsetRect));
 				if (useInsetRect) {
@@ -504,7 +528,7 @@ void GfxFrameout::kernelFrameout() {
 
 					Common::Rect nsRect = itemEntry->celRect;
 					// Translate back to actual coordinate within scrollable plane
-					nsRect.translate(it->planeOffsetX, 0);
+					nsRect.translate(it->planeOffsetX, it->planeOffsetY);
 
 					if (view->isSci2Hires()) {
 						view->adjustBackUpscaledCoordinates(nsRect.top, nsRect.left);
diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h
index 3176db2..160c343 100644
--- a/engines/sci/graphics/frameout.h
+++ b/engines/sci/graphics/frameout.h
@@ -32,6 +32,7 @@ struct PlaneEntry {
 	uint16 priority;
 	uint16 lastPriority;
 	int16 planeOffsetX;
+	int16 planeOffsetY;
 	GuiResourceId pictureId;
 	Common::Rect planeRect;
 	Common::Rect planeClipRect;
diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp
index dad2b77..1c85ecd 100644
--- a/engines/sci/graphics/picture.cpp
+++ b/engines/sci/graphics/picture.cpp
@@ -132,7 +132,7 @@ void GfxPicture::drawSci11Vga() {
 		_palette->createFromData(inbuffer + palette_data_ptr, size - palette_data_ptr, &palette);
 		_palette->set(&palette, true);
 
-		drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, 0, 0, 0);
+		drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, 0, 0, 0, 0);
 	}
 
 	// process vector data
@@ -148,18 +148,18 @@ int16 GfxPicture::getSci32celCount() {
 	return inbuffer[2];
 }
 
-int16 GfxPicture::getSci32celY(int16 celNo) {
+int16 GfxPicture::getSci32celX(int16 celNo) {
 	byte *inbuffer = _resource->data;
 	int header_size = READ_SCI11ENDIAN_UINT16(inbuffer);
 	int cel_headerPos = header_size + 42 * celNo;
-	return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 40);
+	return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 38);
 }
 
-int16 GfxPicture::getSci32celX(int16 celNo) {
+int16 GfxPicture::getSci32celY(int16 celNo) {
 	byte *inbuffer = _resource->data;
 	int header_size = READ_SCI11ENDIAN_UINT16(inbuffer);
 	int cel_headerPos = header_size + 42 * celNo;
-	return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 38);
+	return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 40);
 }
 
 int16 GfxPicture::getSci32celWidth(int16 celNo) {
@@ -169,6 +169,14 @@ int16 GfxPicture::getSci32celWidth(int16 celNo) {
 	return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 0);
 }
 
+int16 GfxPicture::getSci32celHeight(int16 celNo) {
+	byte *inbuffer = _resource->data;
+	int header_size = READ_SCI11ENDIAN_UINT16(inbuffer);
+	int cel_headerPos = header_size + 42 * celNo;
+	return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 2);
+}
+
+
 int16 GfxPicture::getSci32celPriority(int16 celNo) {
 	byte *inbuffer = _resource->data;
 	int header_size = READ_SCI11ENDIAN_UINT16(inbuffer);
@@ -176,7 +184,7 @@ int16 GfxPicture::getSci32celPriority(int16 celNo) {
 	return READ_SCI11ENDIAN_UINT16(inbuffer + cel_headerPos + 36);
 }
 
-void GfxPicture::drawSci32Vga(int16 celNo, int16 drawX, int16 drawY, int16 pictureX, bool mirrored) {
+void GfxPicture::drawSci32Vga(int16 celNo, int16 drawX, int16 drawY, int16 pictureX, int16 pictureY, bool mirrored) {
 	byte *inbuffer = _resource->data;
 	int size = _resource->size;
 	int header_size = READ_SCI11ENDIAN_UINT16(inbuffer);
@@ -216,14 +224,14 @@ void GfxPicture::drawSci32Vga(int16 celNo, int16 drawX, int16 drawY, int16 pictu
 	cel_RlePos = READ_SCI11ENDIAN_UINT32(inbuffer + cel_headerPos + 24);
 	cel_LiteralPos = READ_SCI11ENDIAN_UINT32(inbuffer + cel_headerPos + 28);
 
-	drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, drawX, drawY, pictureX);
+	drawCelData(inbuffer, size, cel_headerPos, cel_RlePos, cel_LiteralPos, drawX, drawY, pictureX, pictureY);
 	cel_headerPos += 42;
 }
 #endif
 
 extern void unpackCelData(byte *inBuffer, byte *celBitmap, byte clearColor, int pixelCount, int rlePos, int literalPos, ViewType viewType, uint16 width, bool isMacSci11ViewData);
 
-void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX) {
+void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX, int16 pictureY) {
 	byte *celBitmap = NULL;
 	byte *ptr = NULL;
 	byte *headerPtr = inbuffer + headerPos;
@@ -300,10 +308,11 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
 
 	Common::Rect displayArea = _coordAdjuster->pictureGetDisplayArea();
 
+	// Horizontal clipping
 	uint16 skipCelBitmapPixels = 0;
 	int16 displayWidth = width;
 	if (pictureX) {
-		// scroll position for picture active, we need to adjust drawX accordingly
+		// horizontal scroll position for picture active, we need to adjust drawX accordingly
 		drawX -= pictureX;
 		if (drawX < 0) {
 			skipCelBitmapPixels = -drawX;
@@ -312,7 +321,21 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
 		}
 	}
 
-	if (displayWidth > 0) {
+	// Vertical clipping
+	uint16 skipCelBitmapLines = 0;
+	int16 displayHeight = height;
+	if (pictureY) {
+		// vertical scroll position for picture active, we need to adjust drawY accordingly
+		// TODO: Finish this
+		/*drawY -= pictureY;
+		if (drawY < 0) {
+			skipCelBitmapLines = -drawY;
+			displayHeight -= skipCelBitmapLines;
+			drawY = 0;
+		}*/
+	}
+
+	if (displayWidth > 0 && displayHeight > 0) {
 		y = displayArea.top + drawY;
 		lastY = MIN<int16>(height + y, displayArea.bottom);
 		leftX = displayArea.left + drawX;
@@ -334,6 +357,7 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos
 
 		ptr = celBitmap;
 		ptr += skipCelBitmapPixels;
+		ptr += skipCelBitmapLines * width;
 		if (!_mirroredFlag) {
 			// Draw bitmap to screen
 			x = leftX;
@@ -714,7 +738,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) {
 					vectorGetAbsCoordsNoMirror(data, curPos, x, y);
 					size = READ_LE_UINT16(data + curPos); curPos += 2;
 					_priority = pic_priority; // set global priority so the cel gets drawn using current priority as well
-					drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0);
+					drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0, 0);
 					curPos += size;
 					break;
 				case PIC_OPX_EGA_SET_PRIORITY_TABLE:
@@ -757,7 +781,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) {
 					vectorGetAbsCoordsNoMirror(data, curPos, x, y);
 					size = READ_LE_UINT16(data + curPos); curPos += 2;
 					_priority = pic_priority; // set global priority so the cel gets drawn using current priority as well
-					drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0);
+					drawCelData(data, _resource->size, curPos, curPos + 8, 0, x, y, 0, 0);
 					curPos += size;
 					break;
 				case PIC_OPX_VGA_PRIORITY_TABLE_EQDIST:
diff --git a/engines/sci/graphics/picture.h b/engines/sci/graphics/picture.h
index 78623d5..4f075a6 100644
--- a/engines/sci/graphics/picture.h
+++ b/engines/sci/graphics/picture.h
@@ -56,15 +56,16 @@ public:
 	int16 getSci32celY(int16 celNo);
 	int16 getSci32celX(int16 celNo);
 	int16 getSci32celWidth(int16 celNo);
+	int16 getSci32celHeight(int16 celNo);
 	int16 getSci32celPriority(int16 celNo);
-	void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, int16 pictureX, bool mirrored);
+	void drawSci32Vga(int16 celNo, int16 callerX, int16 callerY, int16 pictureX, int16 pictureY, bool mirrored);
 #endif
 
 private:
 	void initData(GuiResourceId resourceId);
 	void reset();
 	void drawSci11Vga();
-	void drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX);
+	void drawCelData(byte *inbuffer, int size, int headerPos, int rlePos, int literalPos, int16 drawX, int16 drawY, int16 pictureX, int16 pictureY);
 	void drawVectorData(byte *data, int size);
 	bool vectorIsNonOpcode(byte pixel);
 	void vectorGetAbsCoords(byte *data, int &curPos, int16 &x, int16 &y);


Commit: b04a0697820d3dfff1fa09831c1bb362a641c49c
    https://github.com/scummvm/scummvm/commit/b04a0697820d3dfff1fa09831c1bb362a641c49c
Author: Filippos Karapetis (md5 at scummvm.org)
Date: 2011-10-14T04:07:01-07:00

Commit Message:
SCI: More work on kBitmap (still WIP)

Changed paths:
    engines/sci/engine/kgraphics.cpp
    engines/sci/graphics/text32.cpp



diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index 5ea5132..0d5b586 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -49,6 +49,7 @@
 #include "sci/graphics/text16.h"
 #include "sci/graphics/view.h"
 #ifdef ENABLE_SCI32
+#include "sci/graphics/font.h"	// TODO: remove once kBitmap is moved in a separate class
 #include "sci/graphics/text32.h"
 #include "sci/graphics/frameout.h"
 #endif
@@ -1637,6 +1638,11 @@ reg_t kFont(EngineState *s, int argc, reg_t *argv) {
 	return s->r_acc;
 }
 
+// TODO: Eventually, all of the kBitmap operations should be put
+// in a separate class
+
+#define BITMAP_HEADER_SIZE 46
+
 reg_t kBitmap(EngineState *s, int argc, reg_t *argv) {
 	// Used for bitmap operations in SCI2.1 and SCI3.
 	// This is the SCI2.1 version, the functionality seems to have changed in SCI3.
@@ -1648,17 +1654,23 @@ reg_t kBitmap(EngineState *s, int argc, reg_t *argv) {
 		// script 64890 and TransView::init() in script 64884
 		uint16 width = argv[1].toUint16();
 		uint16 height = argv[2].toUint16();
-		//uint16 skip = argv[3].toUint16();
-		uint16 back = argv[4].toUint16();
-		//uint16 width2 = (argc >= 6) ? argv[5].toUint16() : 0;
-		//uint16 height2 = (argc >= 7) ? argv[6].toUint16() : 0;
-		//uint16 transparentFlag = (argc >= 8) ? argv[7].toUint16() : 0;
+		uint16 skip = argv[3].toUint16();
+		uint16 back = argv[4].toUint16();	// usually equals skip
+		uint16 width2 = (argc >= 6) ? argv[5].toUint16() : 0;
+		uint16 height2 = (argc >= 7) ? argv[6].toUint16() : 0;
+		uint16 transparentFlag = (argc >= 8) ? argv[7].toUint16() : 0;
 
 		// TODO: skip, width2, height2, transparentFlag
-		int entrySize = width * height;
-		reg_t memoryId = s->_segMan->allocateHunkEntry("TextBitmap()", entrySize);
+		// (used for transparent bitmaps)
+		int entrySize = width * height + BITMAP_HEADER_SIZE;
+		reg_t memoryId = s->_segMan->allocateHunkEntry("Bitmap()", entrySize);
 		byte *memoryPtr = s->_segMan->getHunkPointer(memoryId);
-		memset(memoryPtr, back, entrySize);
+		memset(memoryPtr, 0, BITMAP_HEADER_SIZE);	// zero out the bitmap header
+		memset(memoryPtr + BITMAP_HEADER_SIZE, back, width * height);
+		// Save totalWidth, totalHeight
+		// TODO: Save the whole bitmap header, like SSCI does
+		WRITE_LE_UINT16((void *)memoryPtr, width);
+		WRITE_LE_UINT16((void *)(memoryPtr + 2), height);
 		return memoryId;
 		}
 		break;
@@ -1682,40 +1694,77 @@ reg_t kBitmap(EngineState *s, int argc, reg_t *argv) {
 		uint16 x = argv[5].toUint16();
 		uint16 y = argv[6].toUint16();
 
-		byte *bitmap = s->_segMan->getHunkPointer(hunkId);
+		byte *memoryPtr = s->_segMan->getHunkPointer(hunkId);
+		// Get totalWidth, totalHeight
+		uint16 totalWidth = READ_LE_UINT16((void *)memoryPtr);
+		uint16 totalHeight = READ_LE_UINT16((void *)(memoryPtr + 2));
+		byte *bitmap = memoryPtr + BITMAP_HEADER_SIZE;
 
 		GfxView *view = g_sci->_gfxCache->getView(viewNum);
-		uint16 width = view->getWidth(loop, cel);
-		uint16 height = view->getHeight(loop, cel);
-		const byte *viewBitmap = view->getBitmap(loop, cel);
-		uint32 curPixel = 0;
-
-		for (uint16 curY = y; curY < y + height; curY++) {
-			for (uint16 curX = x; curX < x + width; curX++) {
-				bitmap[curY + curX] = viewBitmap[curPixel++];
+		uint16 tileWidth = view->getWidth(loop, cel);
+		uint16 tileHeight = view->getHeight(loop, cel);
+		const byte *tileBitmap = view->getBitmap(loop, cel);
+		uint16 width = MIN<uint16>(totalWidth - x, tileWidth);
+		uint16 height = MIN<uint16>(totalHeight - y, tileHeight);
+
+		for (uint16 curY = 0; curY < height; curY++) {
+			for (uint16 curX = 0; curX < width; curX++) {
+				bitmap[(curY + y) * totalWidth + (curX + x)] = tileBitmap[curY * tileWidth + curX];
 			}
 		}
 
 		}
 		break;
-	case 4:	// process text
+	case 4:	// add text to bitmap
 		{
 		// 13 params, called e.g. from TextButton::createBitmap() in Torin's Passage,
 		// script 64894
-		reg_t bitmapPtr = argv[1];	// obtained from kBitmap(0)
+		reg_t hunkId = argv[1];	// obtained from kBitmap(0)
 		Common::String text = s->_segMan->getString(argv[2]);
-		// unk3
-		// unk4
-		// unk5
-		// unk6
-		// skip?
-		// back?
-		uint16 font = argv[9].toUint16();
-		uint16 mode = argv[10].toUint16();
-		// unk
+		uint16 textX = argv[3].toUint16();
+		uint16 textY = argv[4].toUint16();
+		//reg_t unk5 = argv[5];
+		//reg_t unk6 = argv[6];
+		//reg_t unk7 = argv[7];	// skip?
+		//reg_t unk8 = argv[8];	// back?
+		//reg_t unk9 = argv[9];
+		uint16 fontId = argv[10].toUint16();
+		//uint16 mode = argv[11].toUint16();
 		uint16 dimmed = argv[12].toUint16();
-		warning("kBitmap(4): bitmap ptr %04x:%04x, font %d, mode %d, dimmed %d - text: \"%s\"",
-				PRINT_REG(bitmapPtr), font, mode, dimmed, text.c_str());
+		//warning("kBitmap(4): bitmap ptr %04x:%04x, font %d, mode %d, dimmed %d - text: \"%s\"",
+		//		PRINT_REG(bitmapPtr), font, mode, dimmed, text.c_str());
+		uint16 foreColor = 255;	// TODO
+
+		byte *memoryPtr = s->_segMan->getHunkPointer(hunkId);
+		// Get totalWidth, totalHeight
+		uint16 totalWidth = READ_LE_UINT16((void *)memoryPtr);
+		uint16 totalHeight = READ_LE_UINT16((void *)(memoryPtr + 2));
+		byte *bitmap = memoryPtr + BITMAP_HEADER_SIZE;
+
+		GfxFont *font = g_sci->_gfxCache->getFont(fontId);
+
+		int16 charCount = 0;
+		uint16 curX = textX, curY = textY;
+		const char *txt = text.c_str();
+
+		while (*txt) {
+			charCount = g_sci->_gfxText32->GetLongest(txt, totalWidth, font);
+			if (charCount == 0)
+				break;
+
+			for (int i = 0; i < charCount; i++) {
+				unsigned char curChar = txt[i];
+				font->drawToBuffer(curChar, curY, curX, foreColor, dimmed, bitmap, totalWidth, totalHeight);
+				curX += font->getCharWidth(curChar);
+			}
+
+			curX = textX;
+			curY += font->getHeight();
+			txt += charCount;
+			while (*txt == ' ')
+				txt++; // skip over breaking spaces
+		}
+
 		}
 		break;
 	case 5:	// fill with color
@@ -1725,15 +1774,21 @@ reg_t kBitmap(EngineState *s, int argc, reg_t *argv) {
 		reg_t hunkId = argv[1];	// obtained from kBitmap(0)
 		uint16 x = argv[2].toUint16();
 		uint16 y = argv[3].toUint16();
-		uint16 width = argv[4].toUint16();	// width - 1
-		uint16 height = argv[5].toUint16();	// height - 1
+		uint16 fillWidth = argv[4].toUint16();	// width - 1
+		uint16 fillHeight = argv[5].toUint16();	// height - 1
 		uint16 back = argv[6].toUint16();
 
-		byte *bitmap = s->_segMan->getHunkPointer(hunkId);
-
-		for (uint16 curY = y; curY < y + height; curY++) {
-			for (uint16 curX = x; curX < x + width; curX++) {
-				bitmap[curY + curX] = back;
+		byte *memoryPtr = s->_segMan->getHunkPointer(hunkId);
+		// Get totalWidth, totalHeight
+		uint16 totalWidth = READ_LE_UINT16((void *)memoryPtr);
+		uint16 totalHeight = READ_LE_UINT16((void *)(memoryPtr + 2));
+		uint16 width = MIN<uint16>(totalWidth - x, fillWidth);
+		uint16 height = MIN<uint16>(totalHeight - y, fillHeight);
+		byte *bitmap = memoryPtr + BITMAP_HEADER_SIZE;
+
+		for (uint16 curY = 0; curY < height; curY++) {
+			for (uint16 curX = 0; curX < width; curX++) {
+				bitmap[(curY + y) * totalWidth + (curX + x)] = back;
 			}
 		}
 
diff --git a/engines/sci/graphics/text32.cpp b/engines/sci/graphics/text32.cpp
index 52124fd..0d4f8de 100644
--- a/engines/sci/graphics/text32.cpp
+++ b/engines/sci/graphics/text32.cpp
@@ -104,6 +104,8 @@ void GfxText32::disposeTextBitmap(reg_t hunkId) {
 	_segMan->freeHunkEntry(hunkId);
 }
 
+#define BITMAP_HEADER_SIZE 46
+
 void GfxText32::drawTextBitmap(reg_t textObject) {
 	reg_t hunkId = readSelector(_segMan, textObject, SELECTOR(bitmap));
 	byte *surface = _segMan->getHunkPointer(hunkId);
@@ -111,6 +113,10 @@ void GfxText32::drawTextBitmap(reg_t textObject) {
 	if (!surface)
 		error("Attempt to draw an invalid text bitmap");
 
+	// Skip the bitmap header in SCI21 - SCI3
+	if (getSciVersion() >= SCI_VERSION_2_1)
+		surface += BITMAP_HEADER_SIZE;
+
 	int curByte = 0;
 	Common::Rect nsRect = getNSRect(textObject);
 	Common::Rect planeRect = getPlaneRect(textObject);






More information about the Scummvm-git-logs mailing list