[Scummvm-cvs-logs] CVS: scummvm/scumm gfx.cpp,2.141,2.142 gfx.h,1.40,1.41 saveload.cpp,1.86,1.87 scumm.h,1.242,1.243 scummvm.cpp,2.214,2.215

Pawel Kolodziejski aquadran at users.sourceforge.net
Thu Jun 5 11:09:06 CEST 2003


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

Modified Files:
	gfx.cpp gfx.h saveload.cpp scumm.h scummvm.cpp 
Log Message:
added v1 gfx codec, (not working)

Index: gfx.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.cpp,v
retrieving revision 2.141
retrieving revision 2.142
diff -u -d -r2.141 -r2.142
--- gfx.cpp	5 Jun 2003 07:05:37 -0000	2.141
+++ gfx.cpp	5 Jun 2003 17:22:13 -0000	2.142
@@ -66,7 +66,7 @@
 #ifdef __PALM_OS__
 static const TransitionEffect *transitionEffects;
 #else
-static const TransitionEffect transitionEffects[5] = {
+static const TransitionEffect transitionEffects[4] = {
 	// Iris effect (looks like an opening/closing camera iris)
 	{
 		13,		// Number of iterations
@@ -134,23 +134,6 @@
 		   38,  0, 38, 24,
 		  255,  0,  0,  0
 		}
-	},
-
-	// Inverse iris effect, specially tailored for V2 games
-	{
-		8,		// Number of iterations
-		{
-			-1, -1,  1, -1,
-			-1,  1,  1,  1,
-			-1, -1, -1,  1,
-			 1, -1,  1,  1
-		},
-		{
-			 7, 7, 32, 7,
-			 7, 8, 32, 8,
-			 7, 8,  7, 8,
-			32, 7, 32, 8
-		}
 	}
 };
 #endif
@@ -993,7 +976,7 @@
 	// dificult to draw only parts of a room/object. We handle the V2 graphics
 	// differently from all other (newer) graphic formats for this reason.
 	//
-	if (_vm->_features & GF_AFTER_V2) {
+	if ((_vm->_features & GF_AFTER_V2) && !(_vm->_features & GF_AFTER_V1)) {
 		
 		if (vs->alloctwobuffers)
 			bgbak_ptr = _vm->getResourceAddress(rtBuffer, vs->number + 5) + (y * _numStrips + x) * 8;
@@ -1138,7 +1121,9 @@
 		else
 			bgbak_ptr = backbuff_ptr;
 
-		if (!(_vm->_features & GF_AFTER_V2)) {
+		if (_vm->_features & GF_AFTER_V1) {
+			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);
 			} else if (_vm->_features & GF_SMALL_HEADER) {
@@ -1166,7 +1151,10 @@
 		}
 		CHECK_HEAP;
 
-		if (_vm->_features & GF_AFTER_V2) {
+		if (_vm->_features & GF_AFTER_V1) {
+			mask_ptr = _vm->getResourceAddress(rtBuffer, 9) + y * _numStrips + x + _imgBufOffs[1];
+//			drawStripC64Mask(mask_ptr, stripnr, height);
+		} else if (_vm->_features & GF_AFTER_V2) {
 			// Do nothing here for V2 games - zplane was handled already.
 		} else if (flag & dbDrawMaskOnAll) {
 			// Sam & Max uses dbDrawMaskOnAll for things like the inventory
@@ -1351,6 +1339,59 @@
 	return table;
 }
 
+void Gdi::drawStripC64Background(byte *dst, int stripnr, int height) {
+	for(int y = 0; y < (height >> 3); y++) {
+		_C64Colors[3] = (_C64ColorMap[y + stripnr * (height >> 3)] & 7);
+		for(int i = 0; i < 8; i++) {
+			for(int j = 7; j >= 0; j--) {
+				*(dst + (7 - j) + stripnr * 8 + (y * 8 + i) * _vm->_screenWidth) =
+					_C64Colors[((_C64CharMap[_C64PicMap[y + stripnr * (height >> 3)] * 8 + i] >> (j & 6)) & 3)];
+			}
+		}
+	}
+}
+
+void Gdi::drawStripC64Mask(byte *dst, int stripnr, int height) {
+	for(int y = 0; y < (height / 8); y++) {
+		for(int i = 0; i < 8; i++) {
+			for(int j = 7; j >= 0; j--) {
+				*(dst + (7 - j) + stripnr * 8 + (y * 8 + i) * _vm->_screenWidth) =
+					((_C64MaskChar[_C64MaskMap[y + stripnr * (height >> 3)] * 8 + i] >> (j & 6)) & 3);
+			}
+		}
+	}
+}
+
+void Gdi::decodeC64Gfx(byte *src, byte *dst, int size) {
+	int x, z;
+	byte color, run, common[4];
+
+	for(z = 0; z < 4; z++) {
+		common[z] = *src++;
+	}
+
+	x = 0;
+	while(x < size){
+		color = *src++;
+		if (color < 0x40) {
+			for (z = 0; z <= color; z++) {
+				dst[x++] = *src++;
+			}
+		} else if (color < 0x80) {
+			color &= 0x3F;
+			run = *src++;
+			for (z = 0; z <= color; z++) {
+				dst[x++] = run;
+			}
+		} else {
+			run = common[(color >> 5) & 3];
+			color &= 0x1F;
+			for (z = 0; z <= color; z++) {
+				dst[x++] = run;
+			}
+		}
+	}
+}
 
 void Gdi::decodeStripEGA(byte *dst, const byte *src, int height) {
 	byte color = 0;
@@ -2088,14 +2129,6 @@
 	case 2:
 	case 3:
 	case 4:
-	case 5:
-		// Some of the transition effects won't work properly unless
-		// the screen is marked as clean first. At first I thought I
-		// could safely do this every time fadeIn() was called, but
-		// that broke the FOA intro. Probably other things as well.
-		//
-		// Hopefully it's safe to do it at this point, at least.
-		virtscr[0].setDirtyRange(0, 0);
 		transitionEffect(effect - 1);
 		break;
 	case 128:
@@ -2140,7 +2173,6 @@
 		case 2:
 		case 3:
 		case 4:
-		case 5:
 			transitionEffect(effect - 1);
 			break;
 		case 128:
@@ -2214,8 +2246,6 @@
 					continue;
 				if (b > bottom)
 					b = bottom;
-				if (t < 0)
-					t = 0;
 				virtscr[0].tdirty[l] = t << 3;
 				virtscr[0].bdirty[l] = (b + 1) << 3;
 			}
@@ -2469,6 +2499,25 @@
 	setPalColor(13, 252,   0, 252);
 	setPalColor(14, 252, 252,   0);
 	setPalColor(15, 252, 252, 252);
+}
+
+void Scumm::setupC64Palette() {
+	setPalColor( 0,   0,   0,   0);
+	setPalColor( 1, 252, 252, 252);
+	setPalColor( 2, 204,   0,   0);
+	setPalColor( 3,   0, 252, 204);
+	setPalColor( 4, 252,   0, 252);
+	setPalColor( 5,   0, 204,   0);
+	setPalColor( 6,   0,   0, 204);
+	setPalColor( 7, 252, 252, 252);
+	setPalColor( 8, 252, 136,   0);
+	setPalColor( 9, 136,  68,   0);
+	setPalColor(10, 252, 136, 136);
+	setPalColor(11,  68,  68,  68);
+	setPalColor(12, 136, 136, 136);
+	setPalColor(13, 136, 252, 136);
+	setPalColor(14, 136, 136, 252);
+	setPalColor(15, 204, 204, 204);
 }
 
 void Scumm::setPaletteFromPtr(const byte *ptr) {

Index: gfx.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/gfx.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- gfx.h	5 Jun 2003 00:18:15 -0000	1.40
+++ gfx.h	5 Jun 2003 17:22:14 -0000	1.41
@@ -122,9 +122,15 @@
 
 	bool _zbufferDisabled;
 
+	byte _C64Colors[4], _C64CharMap[256 * 8], _C64PicMap[4096], _C64ColorMap[4096];
+	byte _C64MaskMap[4096], _C64MaskChar[4096];
+
 	/* 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 drawStripC64Background(byte *dst, int stripnr, int height);
+	void drawStripC64Mask(byte *dst, int stripnr, int height);
 	void unkDecodeA(byte *dst, const byte *src, int height);
 	void unkDecodeA_trans(byte *dst, const byte *src, int height);
 	void unkDecodeB(byte *dst, const byte *src, int height);

Index: saveload.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/saveload.cpp,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -d -r1.86 -r1.87
--- saveload.cpp	5 Jun 2003 10:33:12 -0000	1.86
+++ saveload.cpp	5 Jun 2003 17:22:14 -0000	1.87
@@ -162,7 +162,10 @@
 
 	_completeScreenRedraw = true;
 
-	if (_features & GF_16COLOR) {
+	if (_features & GF_AFTER_V1) {
+		setupC64Palette();
+		setDirtyColors(0, 15);
+	} else if (_features & GF_16COLOR) {
 		// HACK: There was a time when ScummVM didn't store the
 		// palette in _currentPalette for 16-color games. To avoid
 		// breaking savegame compatibility, always set up the default

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scumm.h,v
retrieving revision 1.242
retrieving revision 1.243
diff -u -d -r1.242 -r1.243
--- scumm.h	5 Jun 2003 02:44:18 -0000	1.242
+++ scumm.h	5 Jun 2003 17:22:14 -0000	1.243
@@ -841,6 +841,7 @@
 
 	const byte *getPalettePtr();
 	void setupEGAPalette();
+	void setupC64Palette();
 	void setPalette(int pal);
 	void setPaletteFromPtr(const byte *ptr);
 	void setPaletteFromRes();

Index: scummvm.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/scummvm.cpp,v
retrieving revision 2.214
retrieving revision 2.215
diff -u -d -r2.214 -r2.215
--- scummvm.cpp	5 Jun 2003 10:33:13 -0000	2.214
+++ scummvm.cpp	5 Jun 2003 17:22:15 -0000	2.215
@@ -766,7 +766,11 @@
 		initScreens(0, 16, _screenWidth, 144);
 	}
 
-	if (_features & GF_16COLOR) {
+	if (_features & GF_AFTER_V1) {
+		for (i = 0; i < 16; i++)
+			_shadowPalette[i] = i;
+		setupC64Palette();
+	} else if (_features & GF_16COLOR) {
 		for (i = 0; i < 16; i++)
 			_shadowPalette[i] = i;
 		setupEGAPalette();
@@ -1397,7 +1401,10 @@
 	else
 		rmhd = (const RoomHeader *)findResourceData(MKID('RMHD'), roomptr);
 	
-	if (_features & GF_AFTER_V8) {
+	if (_features & GF_AFTER_V1) {
+		_roomWidth = roomptr[4] * 8;
+		_roomHeight = roomptr[5] * 8;
+	} else if (_features & GF_AFTER_V8) {
 		_roomWidth = READ_LE_UINT32(&(rmhd->v8.width));
 		_roomHeight = READ_LE_UINT32(&(rmhd->v8.height));
 	} else if (_features & GF_AFTER_V7) {
@@ -1411,7 +1418,17 @@
 	//
 	// Find the room image data
 	//
-	if (_features & GF_OLD_BUNDLE) {
+	if (_features & GF_AFTER_V1) {
+		_IM00_offs = 0;
+    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 + 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));
+	} else if (_features & GF_OLD_BUNDLE) {
 		_IM00_offs = READ_LE_UINT16(roomptr + 0x0A);
 		if (_features & GF_AFTER_V2)
 			_roomStrips = gdi.generateStripTable(roomptr + _IM00_offs, _roomWidth, _roomHeight, _roomStrips);





More information about the Scummvm-git-logs mailing list