[Scummvm-cvs-logs] CVS: scummvm/scumm gfx.cpp,2.147,2.148 gfx.h,1.41,1.42 object.cpp,1.116,1.117 scummvm.cpp,2.217,2.218 verbs.cpp,1.50,1.51

Pawel Kolodziejski aquadran at users.sourceforge.net
Thu Jun 5 22:28:03 CEST 2003


Update of /cvsroot/scummvm/scummvm/scumm
In directory sc8-pr-cvs1:/tmp/cvs-serv5211

Modified Files:
	gfx.cpp gfx.h object.cpp scummvm.cpp verbs.cpp 
Log Message:
fixed almost object drawing for v1 games, (ugly hack for drawBitmap)

Index: gfx.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.cpp,v
retrieving revision 2.147
retrieving revision 2.148
diff -u -d -r2.147 -r2.148
--- gfx.cpp	6 Jun 2003 00:16:33 -0000	2.147
+++ gfx.cpp	6 Jun 2003 05:27:44 -0000	2.148
@@ -776,6 +776,9 @@
 	for (int i = 0; i < num; i++)
 		setGfxUsageBit(s + i, USAGE_BIT_DIRTY);
 
+	if (_features & GF_AFTER_V1) {
+		gdi._C64ObjectMode = false;
+	}
 	gdi.drawBitmap(getResourceAddress(rtRoom, _roomResource) + _IM00_offs,
 	               &virtscr[0], s, 0, _roomWidth, virtscr[0].height, s, num, 0, _roomStrips);
 }
@@ -1123,7 +1126,10 @@
 			bgbak_ptr = backbuff_ptr;
 
 		if (_vm->_features & GF_AFTER_V1) {
-			drawStripC64Background(bgbak_ptr, stripnr, height);
+			if (_C64ObjectMode)
+				drawStripC64Object(bgbak_ptr, stripnr, width, height);
+			else
+				drawStripC64Background(bgbak_ptr, stripnr, height);
 		} else if (!(_vm->_features & GF_AFTER_V2)) {
 			if (_vm->_features & GF_16COLOR) {
 				decodeStripEGA(bgbak_ptr, smap_ptr + READ_LE_UINT16(smap_ptr + stripnr * 2 + 2), height);
@@ -1343,6 +1349,22 @@
 	}
 }
 
+void Gdi::drawStripC64Object(byte *dst, int stripnr, int width, int height) {
+	int y, i, j;
+	height >>= 3;
+	width >>= 3;
+	for (y = 0; y < height; y++) {
+		_C64Colors[3] = (_C64ObjectMap[y * width + stripnr] & 7);
+		for (i = 0; i < 8; i++) {
+			for (j = 7; j >= 0; j--) {
+				byte c = _C64CharMap[_C64ObjectMap[y * width + stripnr] * 8 + i] >> (j & 6);
+				dst[7 - j] = _C64Colors[c & 3];
+			}
+			dst += _vm->_screenWidth;
+		}
+	}
+}
+
 void Gdi::drawStripC64Mask(byte *dst, int stripnr, int height) {
 	int y, i, j;
 	height >>= 3;
@@ -1357,7 +1379,7 @@
 	}
 }
 
-void Gdi::decodeC64Gfx(byte *src, byte *dst, int size) {
+void Gdi::decodeC64Gfx(const byte *src, byte *dst, int size) {
 	int x, z;
 	byte color, run, common[4];
 

Index: gfx.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.h,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -d -r1.41 -r1.42
--- gfx.h	5 Jun 2003 17:22:14 -0000	1.41
+++ gfx.h	6 Jun 2003 05:27:45 -0000	1.42
@@ -122,13 +122,15 @@
 
 	bool _zbufferDisabled;
 
-	byte _C64Colors[4], _C64CharMap[256 * 8], _C64PicMap[4096], _C64ColorMap[4096];
+	byte _C64Colors[4], _C64CharMap[2048], _C64ObjectMap[2048], _C64PicMap[4096], _C64ColorMap[4096];
 	byte _C64MaskMap[4096], _C64MaskChar[4096];
+	bool _C64ObjectMode;
 
 	/* Bitmap decompressors */
 	bool decompressBitmap(byte *bgbak_ptr, const byte *src, int numLinesToProcess);
 	void decodeStripEGA(byte *dst, const byte *src, int height);
-	void decodeC64Gfx(byte *src, byte *dst, int size);
+	void decodeC64Gfx(const byte *src, byte *dst, int size);
+	void drawStripC64Object(byte *dst, int stripnr, int width, int height);
 	void drawStripC64Background(byte *dst, int stripnr, int height);
 	void drawStripC64Mask(byte *dst, int stripnr, int height);
 	void unkDecodeA(byte *dst, const byte *src, int height);

Index: object.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/object.cpp,v
retrieving revision 1.116
retrieving revision 1.117
diff -u -d -r1.116 -r1.117
--- object.cpp	1 Jun 2003 16:40:15 -0000	1.116
+++ object.cpp	6 Jun 2003 05:27:45 -0000	1.117
@@ -444,6 +444,10 @@
 		byte flags = Gdi::dbAllowMaskOr;
 		// Sam & Max needs this to fix object-layering problems with
 		// the inventory and conversation icons.
+		if (_features & GF_AFTER_V1) {
+			gdi._C64ObjectMode = true;
+			gdi.decodeC64Gfx(ptr, gdi._C64ObjectMap, width * (height >> 3));
+		}
 		if ((_features & GF_AFTER_V7 || _gameId == GID_SAMNMAX) && getClass(od->obj_nr, kObjectClassIgnoreBoxes))
 			flags |= Gdi::dbDrawMaskOnAll;
 		gdi.drawBitmap(ptr, &virtscr[0], x, ypos, width << 3, height, x - xpos, numstrip, flags);

Index: scummvm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scummvm.cpp,v
retrieving revision 2.217
retrieving revision 2.218
diff -u -d -r2.217 -r2.218
--- scummvm.cpp	6 Jun 2003 04:20:41 -0000	2.217
+++ scummvm.cpp	6 Jun 2003 05:27:45 -0000	2.218
@@ -1426,11 +1426,12 @@
 		for(i = 0; i < 4; i++){
 			gdi._C64Colors[i] = roomptr[6 + i];
 		}
-		gdi.decodeC64Gfx(roomptr + READ_LE_UINT16(roomptr + 10), gdi._C64CharMap, 256 * 8);
+		gdi.decodeC64Gfx(roomptr + READ_LE_UINT16(roomptr + 10), gdi._C64CharMap, 2048);
 		gdi.decodeC64Gfx(roomptr + READ_LE_UINT16(roomptr + 12), gdi._C64PicMap, roomptr[4] * roomptr[5]);
 		gdi.decodeC64Gfx(roomptr + READ_LE_UINT16(roomptr + 14), gdi._C64ColorMap, roomptr[4] * roomptr[5]);
 		gdi.decodeC64Gfx(roomptr + READ_LE_UINT16(roomptr + 16), gdi._C64MaskMap, roomptr[4] * roomptr[5]);
 		gdi.decodeC64Gfx(roomptr + READ_LE_UINT16(roomptr + 18), gdi._C64MaskChar, READ_LE_UINT16(roomptr + 18));
+		gdi._C64ObjectMode = true;
 	} else if (_features & GF_OLD_BUNDLE) {
 		_IM00_offs = READ_LE_UINT16(roomptr + 0x0A);
 		if (_features & GF_AFTER_V2)

Index: verbs.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/verbs.cpp,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -d -r1.50 -r1.51
--- verbs.cpp	30 May 2003 14:29:07 -0000	1.50
+++ verbs.cpp	6 Jun 2003 05:27:45 -0000	1.51
@@ -453,6 +453,9 @@
 			error("No image for verb %d", verb);
 	}
 	assert(imptr);
+	if (_features & GF_AFTER_V1) {
+		gdi._C64ObjectMode = true;
+	}
 	for (i = 0; i < imgw; i++) {
 		tmp = xstrip + i;
 		if (tmp < gdi._numStrips)





More information about the Scummvm-git-logs mailing list