[Scummvm-cvs-logs] CVS: scummvm insane.cpp,1.52,1.53 script_v2.cpp,1.81,1.82 scumm.h,1.197,1.198 smush.h,1.11,1.12 sound.cpp,1.123,1.124 timer.cpp,1.3,1.4 timer.h,1.2,1.3

Pawe? Ko?odziejski aquadran at users.sourceforge.net
Thu Aug 8 14:55:04 CEST 2002


Update of /cvsroot/scummvm/scummvm
In directory usw-pr-cvs1:/tmp/cvs-serv5812

Modified Files:
	insane.cpp script_v2.cpp scumm.h smush.h sound.cpp timer.cpp 
	timer.h 
Log Message:
SMUSH: attached to timer, moved to class

Index: insane.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/insane.cpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- insane.cpp	8 Aug 2002 07:48:56 -0000	1.52
+++ insane.cpp	8 Aug 2002 21:54:49 -0000	1.53
@@ -31,59 +31,70 @@
 #include "scumm.h"
 #include "smush.h"
 
-//#define SWAP2(a) ((((a)>>24)&0xFF) | (((a)>>8)&0xFF00) | (((a)<<8)&0xFF0000) | (((a)<<24)&0xFF000000))
 #define MAX_STREAMER 10
 
-byte * SmushPlayer::loadTres()
-{
+static SmushPlayer * h_sp;
+
+SmushPlayer::SmushPlayer(Scumm * parent) {
+	_scumm = parent;
+	h_sp = this;
+}
+
+SmushPlayer::~SmushPlayer() {
+}
+
+static int smush_handler (int t) {
+	h_sp->update();
+	return t;
+}
+
+byte * SmushPlayer::loadTres() {
 	byte buf[100];
 	FILE * f_tres;
 	uint32 tmp, l;
 
-	sprintf((char *)buf, "%sVIDEO/%sTXT.TRS", (char *)sm->_gameDataPath, 
-			(char *)sm->_exe_name);
-	f_tres = fopen((char *)buf, "rb");
+	sprintf((char *)buf, "%sVIDEO/DIGTXT.TRS", (byte *)_scumm->_gameDataPath);
+	f_tres = (FILE*)_scumm->fileOpen((char *)&buf, 1);
 	
 	if (f_tres == NULL) {
-		sprintf((char *)buf, "%svideo/%stxt.trs", (char *)sm->_gameDataPath,
-				(char *)sm->_exe_name);
-		f_tres = fopen((char *)buf, "rb");
-		if (f_tres == NULL) 
+		sprintf((char *)buf, "%svideo/digtxt.trs", (byte *)_scumm->_gameDataPath);
+		f_tres = (FILE*)_scumm->fileOpen((char *)&buf, 1);
+		if (f_tres == NULL)
 			return NULL;
 	}
 
-	if (fread(&tmp, 4, 1, f_tres) != 1) // read tag
-		error("error while reading TRES");
+	_scumm->fileRead(f_tres, &tmp, 4); // read tag
+	if (_scumm->_fileReadFailed)
+		error("SP: error while reading TRES");
 	
 	tmp = READ_BE_UINT32(&tmp); 
 	if (tmp == 'ETRS')
 	{
-		fread(&tmp, 4, 1, f_tres); // read length
+		_scumm->fileRead(f_tres, &tmp, 4); // read length
 		tmp = READ_BE_UINT32(&tmp);
 		tmp -= 8;
-		_buffer_tres = (byte*)malloc (tmp + 1);
-		fread(_buffer_tres, 8, 1, f_tres); // skip 8 bytes
-		fread(_buffer_tres, tmp, 1, f_tres);
+		_bufferTres = (byte*)malloc (tmp + 1);
+		_scumm->fileRead(f_tres, _bufferTres, 8); // skip 8 bytes
+		_scumm->fileRead(f_tres, _bufferTres, tmp);
 		for (l = 0; l < tmp; l++) 
-			*(_buffer_tres + l) ^= 0xcc;
-		_buffer_tres[tmp] = 0;
+			*(_bufferTres + l) ^= 0xcc;
+		_bufferTres[tmp] = 0;
 	}
 	else
 	{
-		fseek(f_tres, 0, SEEK_END); // assume file is unencrypted
+		_scumm->fileSeek(f_tres, 0, SEEK_END); // assume file is unencrypted
 		tmp = ftell(f_tres);
-		fseek(f_tres, 0, SEEK_SET);
-		_buffer_tres = (byte*)malloc (tmp + 1);
-		fread(_buffer_tres, tmp, 1, f_tres);
-		_buffer_tres[tmp] = 0;
+		_scumm->fileSeek(f_tres, 0, SEEK_SET);
+		_bufferTres = (byte*)malloc (tmp + 1);
+		fread(_bufferTres, tmp, 1, f_tres);
+		_bufferTres[tmp] = 0;
 	}
-	fclose (f_tres);
+	_scumm->fileClose(f_tres);
 
-	return _buffer_tres;
+	return _bufferTres;
 }
 
-void SmushPlayer::loadFonts()
-{
+void SmushPlayer::loadFonts() {
 	byte buf[100];
 	FILE * f_tres;
 	uint32 tmp;
@@ -93,46 +104,45 @@
 	for (l = 0; l < SP_MAX_FONTS; l++)
 	{
 		_fonts [l] = NULL;
-		sprintf((char *)buf, "%sVIDEO/FONT%d.NUT", (char *)sm->_gameDataPath, l);
-		f_tres = fopen((char *)buf, "rb");
+		sprintf((char *)buf, "%sVIDEO/FONT%d.NUT", (char *)_scumm->_gameDataPath, l);
+		f_tres = (FILE*)_scumm->fileOpen((char *)buf, 1);
 
 		if (f_tres == NULL) {
-			sprintf((char *)buf, "%svideo/font%d.nut", (char *)sm->_gameDataPath, l);
-			f_tres = fopen((char *)buf, "rb");
+			sprintf((char *)buf, "%svideo/font%d.nut", (char *)_scumm->_gameDataPath, l);
+			f_tres = (FILE*)_scumm->fileOpen((char *)buf, 1);
 			if (f_tres == NULL) 
 				continue;
 		}
 
-		fread(&tmp, 4, 1, f_tres); // read tag
+		_scumm->fileRead(f_tres, &tmp, 4); // read tag
 		tmp = READ_BE_UINT32(&tmp);
 		if (tmp == 'ANIM') {
-			fread(&tmp, 4, 1, f_tres); // read length
+			_scumm->fileRead(f_tres, &tmp, 4); // read length
 			tmp = READ_BE_UINT32(&tmp);
 			buffer = (byte *)malloc(tmp);
-			fread(buffer, tmp, 1, f_tres);
+			_scumm->fileRead(f_tres, buffer, tmp);
 			_fonts[l] = buffer;
 		}
-		fclose (f_tres);
+		_scumm->fileClose(f_tres);
 	}
 }
 
-byte * SmushPlayer::getStringTRES(int32 number)
-{
+byte * SmushPlayer::getStringTRES(int32 number) {
 	byte * txt = NULL;
 	uint32 l, i, j;
 
 	for (l = 0;; l++) {
-		char t = *(_buffer_tres + l);
+		char t = *(_bufferTres + l);
 		if (t == 0)
 			break;
 		if (t == '#') {
 			byte buf[10];
-			strncpy ((char*)buf, (char*)_buffer_tres + l + 1, 9);
+			strncpy ((char*)buf, (char*)_bufferTres + l + 1, 9);
 			buf[9] = 0;
 			if (strcmp ((char*)buf, "define a ") == 0) {
 				l += 10;
 				for (i = 0; i < 5; i++) {
-					buf[i] = *(_buffer_tres + l + i);
+					buf[i] = *(_bufferTres + l + i);
 					if (buf[i] == 0x0d)
 					{
 						buf[i] = 0;
@@ -142,12 +152,12 @@
 				}
 				if (atol((char*)buf) == number) {
 					for (j = 0; j < 200; j++) {
-						t = *(_buffer_tres + l + j + i);
+						t = *(_bufferTres + l + j + i);
 						if ((t == 0) || (t == '#'))
 							break;
 					}
 					txt = (byte *)malloc(j + 1);
-					strncpy((char*)txt, (char*)_buffer_tres + l + i, j);
+					strncpy((char*)txt, (char*)_bufferTres + l + i, j);
 					txt[j] = 0;
 					return txt;
 				}
@@ -158,8 +168,7 @@
 	return txt;
 }
 
-uint32 SmushPlayer::getFontHeight(uint8 c_font)
-{
+uint32 SmushPlayer::getFontHeight(uint8 c_font) {
 	byte * font = _fonts[c_font];
 	uint32 offset = 0, t_offset = 0;
 	
@@ -181,8 +190,7 @@
 	return READ_LE_UINT16(font + t_offset + 8);
 }
 
-uint32 SmushPlayer::getCharWidth(uint8 c_font, byte txt)
-{
+uint32 SmushPlayer::getCharWidth(uint8 c_font, byte txt) {
 	byte * font = _fonts[c_font];
 	uint32 offset = 0, t_offset = 0, l;
 	
@@ -209,8 +217,7 @@
 	return READ_LE_UINT16(font + t_offset + 6);
 }
 
-void SmushPlayer::drawStringTRES(uint32 x, uint32 y, byte * txt)
-{
+void SmushPlayer::drawStringTRES(uint32 x, uint32 y, byte * txt) {
 	char buf[4];
 	uint32 c_line = 0, l = 0, i, tmp_x, x_pos, last_l, t_width, t_height;
 	uint8 c_font = 0, c_color = 0, last_j;
@@ -321,8 +328,7 @@
 
 }
 
-void codec44_depack(byte *dst, byte *src, uint32 len)
-{
+void SmushPlayer::codec44Depack(byte *dst, byte *src, uint32 len) {
 	byte val;
 	uint16 size_line;
 	uint16 num;
@@ -355,8 +361,7 @@
 	} while (len > 1);
 }
 
-void SmushPlayer::drawCharTRES(uint32 * x, uint32 y, uint32 c_line, uint8 c_font, uint8 color, uint8 txt)
-{
+void SmushPlayer::drawCharTRES(uint32 * x, uint32 y, uint32 c_line, uint8 c_font, uint8 color, uint8 txt) {
 	byte * font = _fonts[c_font];
 	uint32 offset = 0, t_offset = 0, l, width, height, length = 0;
 	
@@ -385,9 +390,7 @@
 	byte * dst = (byte*)malloc (1000);
 	byte * src = (byte*)(font + t_offset + 0x0e);
 
-	memset (dst, 0, 1000);
-	
-	codec44_depack (dst, src, length);
+	codec44Depack (dst, src, length);
 
 	width = READ_LE_UINT16(font + t_offset + 6);
 	height = READ_LE_UINT16(font + t_offset + 8);
@@ -415,61 +418,28 @@
 	free (dst);
 }
 
-void invalidblock(uint32 tag)
-{
-	error("Encountered invalid block %c%c%c%c", tag >> 24, tag >> 16, tag >> 8, tag);
-}
-
-int _frameChanged;
-int _mixer_num;
-
-uint32 SmushPlayer::nextBE32()
-{
+uint32 SmushPlayer::nextBE32() {
 	uint32 a = READ_BE_UINT32(_cur);
 	_cur += sizeof(uint32);
 
 	return a;
 }
 
-void SmushPlayer::fileRead(void *mem, int len)
-{
-	if (fread(mem, len, 1, _in) != 1)
-		error("EOF while reading");
-
-}
-
-uint32 SmushPlayer::fileReadBE32()
-{
-	byte b[4];
-	fread(b, sizeof(b), 1, _in);
-	return (b[0]<<24)|(b[1]<<16)|(b[2]<<8)|b[3];
-}
-
-uint32 SmushPlayer::fileReadLE32()
-{
-	byte b[4];
-	fread(b, sizeof(b), 1, _in);
-	return (b[3]<<24)|(b[2]<<16)|(b[1]<<8)|b[0];
-}
-
-void SmushPlayer::openFile(byte *fileName)
-{
+void SmushPlayer::openFile(byte *fileName) {
 	byte buf[100];
 
-	sprintf((char *)buf, "%sVIDEO/%s", (char *)sm->_gameDataPath, (char *)fileName);
-	_in = fopen((char *)buf, "rb");
+	sprintf((char *)buf, "%sVIDEO/%s", (char *)_scumm->_gameDataPath, (char *)fileName);
+	_in = (FILE*)_scumm->fileOpen((char *)buf, 1);
 
 	if (_in == NULL) {
-		sprintf((char *)buf, "%svideo/%s", (char *)sm->_gameDataPath, (char *)fileName);
-		_in = fopen((char *)buf, "rb");
-
+		sprintf((char *)buf, "%svideo/%s", (char *)_scumm->_gameDataPath, (char *)fileName);
+		_in = (FILE*)_scumm->fileOpen((char *)buf, 1);
 	}
 }
 
-void SmushPlayer::nextBlock()
-{
-	_blockTag = fileReadBE32();
-	_blockSize = fileReadBE32();
+void SmushPlayer::nextBlock() {
+	_blockTag = _scumm->fileReadDwordBE(_in);
+	_blockSize = _scumm->fileReadDwordBE(_in);
 
 	if (_block != NULL)
 		free(_block);
@@ -477,13 +447,12 @@
 	_block = (byte *)malloc(_blockSize);
 
 	if (_block == NULL)
-		error("cannot allocate memory");
+		error("SP: cannot allocate memory");
 
-	fileRead(_block, _blockSize);
+	_scumm->fileRead(_in, _block, _blockSize);
 }
 
-bool SmushPlayer::parseTag()
-{
+bool SmushPlayer::parseTag() {
 	switch (nextBlock(), _blockTag) {
 
 	case 'AHDR':
@@ -495,26 +464,20 @@
 		break;
 
 	default:
-		invalidblock(_blockTag);
+		error("SP: Encountered invalid block %c%c%c%c", _blockTag >> 24, _blockTag >> 16, _blockTag >> 8, _blockTag);
 	}
 
 	return true;
 }
 
-
-
-void SmushPlayer::parseAHDR()
-{
+void SmushPlayer::parseAHDR() {
 	memcpy(_fluPalette, _block + 6, 0x300);
 	_paletteChanged = true;
-
-//  printf("parse AHDR\n");
 }
 
-
-void SmushPlayer::parseIACT()
-{
-	unsigned int pos, bpos, tag, sublen, subpos, trk, idx, flags;
+void SmushPlayer::parseIACT() {
+	uint32 pos, bpos, tag, sublen, subpos, trk, idx;
+	byte flags;
 	bool new_mixer = false;
 	byte *buf;
 
@@ -547,7 +510,7 @@
 		return;
 	}
 
-	pos += 8;											/* FIXME: what are these ? */
+	pos += 8;	/* FIXME: what are these ? */
 
 	while (pos < _frmeSize) {
 
@@ -661,17 +624,12 @@
 	}
 }
 
-void SmushPlayer::parseNPAL()
-{
+void SmushPlayer::parseNPAL() {
 	memcpy(_fluPalette, _cur, 0x300);
-
 	_paletteChanged = true;
 }
 
-
-
-void codec1(CodecData * cd)
-{
+void SmushPlayer::codec1(CodecData * cd) {
 	uint y = cd->y;
 	byte *src = cd->src;
 	byte *dest = cd->out;
@@ -706,14 +664,14 @@
 
 			if (code & 1) {
 				color = *src++;
-//        if ((color = *src++)!=0) {
+//				if ((color = *src++)!=0) {
 				do {
 					if ((uint) x < (uint) cd->outwidth)
 						dest[x] = color;
 				} while (++x, --num);
-//        } else {
-//          x += num;
-//        }
+//			} else {
+//				x += num;
+//			}
 			} else {
 				do {
 					color = *src++;
@@ -725,13 +683,10 @@
 	} while (dest += cd->pitch, y++, --h);
 }
 
-
-
-void codec37_bompdepack(byte *dst, byte *src, int len)
-{
+void SmushPlayer::codec37BompDepack(byte *dst, byte *src, int32 len) {
 	byte code;
 	byte color;
-	int num;
+	int32 num;
 
 	do {
 		code = *src++;
@@ -749,14 +704,13 @@
 	} while (len -= num);
 }
 
-void codec37_proc4(byte *dst, byte *src, int next_offs, int bw, int bh, int pitch, int16 *table)
-{
+void SmushPlayer::codec37Proc4(byte *dst, byte *src, int32 next_offs, int32 bw, int32 bh, int32 pitch, int16 *table) {
 	byte code, *tmp;
-	int i;
+	int32 i;
 	uint32 t;
 
 	if (pitch != 320) {
-		warning("invalid pitch");
+		warning("SP: invalid pitch");
 		return;
 	}
 
@@ -877,15 +831,14 @@
 }
 
 
-void codec37_proc5(int game, byte *dst, byte *src, int next_offs, int bw, int bh,
-									 int pitch, int16 *table)
-{
+void SmushPlayer::codec37Proc5(int32 game, byte *dst, byte *src, int32 next_offs, int32 bw, int32 bh, 
+				  int32 pitch, int16 *table) {
 	byte code, *tmp;
-	int i;
+	int32 i;
 	uint32 t;
 
 	if (pitch != 320) {
-		warning("invalid pitch");
+		warning("SP: invalid pitch");
 		return;
 	}
 
@@ -976,7 +929,6 @@
 	} while (--bh);
 }
 
-
 // this table is the same in FT and Dig
 static const int8 maketable_bytes[] = {
 	0, 0, 1, 0, 2, 0, 3, 0, 5, 0, 8, 0, 13, 0, 21, 0,
@@ -1077,9 +1029,8 @@
 	-12, 19, 13, 19, -6, 22, 6, 22, 0, 23,
 };
 
-void codec37_maketable(PersistentCodecData37 * pcd, int pitch, byte idx)
-{
-	int i, j;
+void SmushPlayer::codec37Maketable(PersistentCodecData37 * pcd, int32 pitch, byte idx) {
+	int32 i, j;
 
 	if (pcd->table_last_pitch == pitch && pcd->table_last_flags == idx)
 		return;
@@ -1087,7 +1038,7 @@
 	pcd->table_last_pitch = pitch;
 	pcd->table_last_flags = idx;
 
-	assert(idx * 255 + 254 < (int)(sizeof(maketable_bytes) / 2));
+	assert(idx * 255 + 254 < (int32)(sizeof(maketable_bytes) / 2));
 
 	for (i = 0; i < 255; i++) {
 		j = i + idx * 255;
@@ -1095,14 +1046,11 @@
 	}
 }
 
-
-
-int codec37(int game, CodecData * cd, PersistentCodecData37 * pcd)
-{
-	int width_in_blocks, height_in_blocks;
-	int src_pitch;
+bool SmushPlayer::codec37(int32 game, CodecData * cd, PersistentCodecData37 * pcd) {
+	int32 width_in_blocks, height_in_blocks;
+	int32 src_pitch;
 	byte *curbuf;
-	uint size;
+	int32 size;
 	bool result = false;
 
 	_frameChanged = 1;
@@ -1111,7 +1059,7 @@
 	height_in_blocks = (cd->h + 3) >> 2;
 	src_pitch = width_in_blocks * 4;
 
-	codec37_maketable(pcd, src_pitch, cd->src[1]);
+	codec37Maketable(pcd, src_pitch, cd->src[1]);
 
 	switch (cd->src[0]) {
 	case 0:{
@@ -1127,7 +1075,7 @@
 			size = READ_LE_UINT32(cd->src + 4);
 			curbuf = pcd->deltaBufs[pcd->curtable];
 			if (size == 64000)
-				codec37_bompdepack(curbuf, cd->src + 16, size);
+				codec37BompDepack(curbuf, cd->src + 16, size);
 			else
 				return (1);
 
@@ -1152,7 +1100,7 @@
 				pcd->curtable ^= 1;
 			}
 
-			codec37_proc5(game, pcd->deltaBufs[pcd->curtable], cd->src + 16,
+			codec37Proc5(game, pcd->deltaBufs[pcd->curtable], cd->src + 16,
 										pcd->deltaBufs[pcd->curtable ^ 1] -
 										pcd->deltaBufs[pcd->curtable], width_in_blocks,
 										height_in_blocks, src_pitch, pcd->table1);
@@ -1175,7 +1123,7 @@
 				pcd->curtable ^= 1;
 			}
 
-			codec37_proc4(pcd->deltaBufs[pcd->curtable], cd->src + 16,
+			codec37Proc4(pcd->deltaBufs[pcd->curtable], cd->src + 16,
 										pcd->deltaBufs[pcd->curtable ^ 1] -
 										pcd->deltaBufs[pcd->curtable], width_in_blocks,
 										height_in_blocks, src_pitch, pcd->table1);
@@ -1183,11 +1131,11 @@
 		}
 
 	case 1:
-		warning("code %d", cd->src[0]);
+		warning("SP: code %d", cd->src[0]);
 		return (1);
 
 	default:
-		error("codec37 default case");
+		error("SP: codec37 default case");
 	}
 
 	pcd->flags = READ_LE_UINT16(cd->src + 2);
@@ -1201,8 +1149,7 @@
 	return (_frameChanged);
 }
 
-void codec37_init(PersistentCodecData37 * pcd, int width, int height)
-{
+void SmushPlayer::codec37Init(PersistentCodecData37 * pcd, int32 width, int32 height) {
 	pcd->width = width;
 	pcd->height = height;
 	pcd->deltaSize = width * height * 2 + 0x3E00 + 0xBA00;
@@ -1213,8 +1160,7 @@
 	pcd->table1 = (int16 *)calloc(255, sizeof(uint16));
 }
 
-void SmushPlayer::parseFOBJ()
-{
+void SmushPlayer::parseFOBJ() {
 	byte codec;
 	CodecData cd;
 
@@ -1235,16 +1181,15 @@
 		codec1(&cd);
 		break;
 	case 37:
-		_frameChanged = codec37(sm->_gameId, &cd, &pcd37);
+		_frameChanged = codec37(_scumm->_gameId, &cd, &pcd37);
 		break;
 	default:
-		error("invalid codec %d", codec);
+		error("SP: invalid codec %d", codec);
 	}
 }
 
-void SmushPlayer::parsePSAD()		// FIXME: Needs to append to
-{																//      a sound buffer
-	unsigned int pos, sublen, tag, idx, trk;
+void SmushPlayer::parsePSAD() {		// FIXME: Needs to append to a sound buffer
+	uint32 pos, sublen, tag, idx, trk;
 	bool new_mixer = false;
 	byte *buf;
 	pos = 0;
@@ -1332,26 +1277,21 @@
 	}
 }
 
-void SmushPlayer::parseTRES()
-{
-       // FIXME: Doesn't work for Full Throttle
-       if (sm->_gameId != GID_DIG) {  
-               printf("getStringTRES(%d)\n", READ_LE_UINT16(_cur + 16));
-               return;
-       }
-	if ((sm->_noSubtitles) && (READ_LE_UINT16(_cur + 4) != 0))
-		return;
+void SmushPlayer::parseTRES() {
+    if (_scumm->_gameId == GID_DIG) {  
+		if ((_scumm->_noSubtitles) && (READ_LE_UINT16(_cur + 4) != 0))
+			return;
 	
-	byte * txt = getStringTRES (READ_LE_UINT16(_cur + 16));
-	drawStringTRES (READ_LE_UINT16(_cur), READ_LE_UINT16(_cur + 2), txt);
-	if (txt != NULL)
-		free (txt);
+		byte * txt = getStringTRES (READ_LE_UINT16(_cur + 16));
+		drawStringTRES (READ_LE_UINT16(_cur), READ_LE_UINT16(_cur + 2), txt);
+		if (txt != NULL)
+			free (txt);
+	}
 }
 
-void SmushPlayer::parseXPAL()
-{
-	int num;
-	int i;
+void SmushPlayer::parseXPAL() {
+	int32 num;
+	int32 i;
 
 	num = READ_LE_UINT16(_cur + 2);
 	if (num == 0 || num == 0x200) {
@@ -1375,8 +1315,7 @@
 	_paletteChanged = true;
 }
 
-void SmushPlayer::parseFRME()
-{
+void SmushPlayer::parseFRME() {
 	_cur = _block;
 
 	do {
@@ -1407,17 +1346,16 @@
 			break;
 
 		default:
-			invalidblock(_frmeTag);
+			error("SP: Encountered invalid block %c%c%c%c", _frmeTag >> 24, _frmeTag >> 16, _frmeTag >> 8, _frmeTag);
 		}
 
 		_cur += (_frmeSize + 1) & ~1;
 	} while (_cur + 4 < _block + _blockSize);
 }
 
-void SmushPlayer::init()
-{
-	_renderBitmap = sm->_videoBuffer;
-	codec37_init(&pcd37, 320, 200);
+void SmushPlayer::init() {
+	_renderBitmap = _scumm->_videoBuffer;
+	codec37Init(&pcd37, 320, 200);
 
 	memset(_saudSize, 0, sizeof(_saudSize));
 	memset(_saudSubSize, 0, sizeof(_saudSubSize));
@@ -1430,23 +1368,23 @@
 	memset(_imusPos, 0, sizeof(_imusPos));
 	memset(_imusChan, 0, sizeof(_imusChan));
 	
-	if (sm->_gameId == GID_DIG)
+	if (_scumm->_gameId == GID_DIG)
 	{
 		for (uint8 l = 0; l < SP_MAX_FONTS; l++) {
 			_fonts[l] = NULL;
 		}
-		_buffer_tres = NULL;
+		_bufferTres = NULL;
 		loadTres();
 		loadFonts();
 	}
+	_scumm->_timer->installProcedure(&smush_handler, 83);
 }
 
-void SmushPlayer::deinit()
-{
-	if (sm->_gameId == GID_DIG)
+void SmushPlayer::deinit() {
+	if (_scumm->_gameId == GID_DIG)
 	{
-		if (_buffer_tres != NULL)
-			free (_buffer_tres);
+		if (_bufferTres != NULL)
+			free (_bufferTres);
 
 		for (int l = 0; l < SP_MAX_FONTS; l++) {
 			if (_fonts[l] != NULL) {
@@ -1455,17 +1393,16 @@
 			}
 		}
 	}
+	_scumm->_timer->releaseProcedure(&smush_handler);
 }
 
-void SmushPlayer::go()
-{
+void SmushPlayer::go() {
 	while (parseTag()) {
 	}
 }
 
-void SmushPlayer::setPalette()
-{
-	int i;
+void SmushPlayer::setPalette() {
+	int32 i;
 	byte palette_colors[1024];
 	byte *p = palette_colors;
 	byte *data = _fluPalette;
@@ -1477,15 +1414,18 @@
 		p[3] = 0;
 	}
 
-	sm->_system->set_palette(palette_colors, 0, 256);
+	_scumm->_system->set_palette(palette_colors, 0, 256);
 }
 
-void SmushPlayer::startVideo(short int arg, byte *videoFile)
-{
-	int frameIndex = 0;
+void SmushPlayer::update() {
+	_lock = false;
+}
+
+void SmushPlayer::startVideo(short int arg, byte *videoFile) {
+	int32 frameIndex = 0;
 
 	_in = NULL;
-	_paletteChanged = 0;
+	_paletteChanged = false;
 	_block = NULL;
 	_blockTag = 0;
 	_blockSize = 0;
@@ -1496,38 +1436,27 @@
 	_frmeSize = 0;
 	_deltaBuf = NULL;
 	_deltaBufSize = 0;
+	_lock = true;
 
-	pcd37.deltaBuf = NULL;
-	pcd37.deltaBufs[0] = NULL;
-	pcd37.deltaBufs[1] = NULL;
-	pcd37.deltaSize = 0;
-	pcd37.width = 0;
-	pcd37.height = 0;
-	pcd37.curtable = 0;
-	pcd37.unk2 = 0;
-	pcd37.unk3 = 0;
-	pcd37.flags = 0;
-	pcd37.table1 = NULL;
-	pcd37.table_last_pitch = 0;
-	pcd37.table_last_flags = 0;
+	memset (&pcd37, 0, sizeof (PersistentCodecData37));
 
-	sm->pauseBundleMusic(true);
+	_scumm->pauseBundleMusic(true);
 	init();
 	openFile(videoFile);
 
 	if (_in == NULL)
 		return;
 
-	if (fileReadBE32() != 'ANIM')
-		error("file is not an anim");
+	if (_scumm->fileReadDwordBE(_in) != 'ANIM')
+		error("SP: file is not an anim");
 
-	fileSize = fileReadBE32();
+	fileSize = _scumm->fileReadDwordBE(_in);
 
-	sm->videoFinished = 0;
-	sm->_insaneState = 1;
+	_scumm->videoFinished = 0;
+	_scumm->_insaneState = 1;
 
 	do {
-		_frameChanged = 1;
+		_frameChanged = true;
 
 		if (ftell(_in) >= fileSize)
 			break;
@@ -1541,26 +1470,26 @@
 		if (_paletteChanged) {
 			_paletteChanged = false;
 			setPalette();
-			sm->setDirtyColors(0, 255);
+			_scumm->setDirtyColors(0, 255);
 		}
 
 		if (_frameChanged) {
-			/* FIXME: not properly implemented after switch to new gfx code */
-
-			sm->_system->copy_rect(sm->_videoBuffer, 320, 0, 0, 320, 200);
-			sm->_system->update_screen();
-			sm->waitForTimer(60);
-
-			//sm->delta = sm->_system->waitTick(sm->delta);
+			_scumm->_system->copy_rect(_scumm->_videoBuffer, 320, 0, 0, 320, 200);
+			_scumm->_system->update_screen();
 		}
 
-		sm->processKbd();
+		do {
+			_scumm->waitForTimer(10);
+		} while (_lock);
+		_lock = true;
 
-	} while (!sm->videoFinished);
+		_scumm->processKbd();
+
+	} while (!_scumm->videoFinished);
 
 	deinit();
 
-	sm->_insaneState = 0;
-	sm->exitCutscene();
-	sm->pauseBundleMusic(false);
+	_scumm->_insaneState = 0;
+	_scumm->exitCutscene();
+	_scumm->pauseBundleMusic(false);
 }

Index: script_v2.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/script_v2.cpp,v
retrieving revision 1.81
retrieving revision 1.82
diff -u -d -r1.81 -r1.82
--- script_v2.cpp	4 Aug 2002 13:03:33 -0000	1.81
+++ script_v2.cpp	8 Aug 2002 21:54:49 -0000	1.82
@@ -2704,6 +2704,7 @@
 	Actor *a;
 
 	IMuse *se = _imuse;						//yazoo: not very nice
+	SmushPlayer * sp;
 
 	getStackList(args, sizeof(args) / sizeof(args[0]));
 
@@ -2713,9 +2714,9 @@
 			grabCursor(args[1], args[2], args[3], args[4]);
 			break;
 		case 6:
-			SmushPlayer localSp;
-			localSp.sm = this;
-			localSp.startVideo(args[1], getStringAddressVar(VAR_VIDEONAME));
+			sp = new SmushPlayer(this);
+			sp->startVideo(args[1], getStringAddressVar(VAR_VIDEONAME));
+			delete sp;
 			break;
 		case 7:
 			warning("o6_miscOps: stub7()");

Index: scumm.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm.h,v
retrieving revision 1.197
retrieving revision 1.198
diff -u -d -r1.197 -r1.198

Index: smush.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/smush.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- smush.h	15 Jul 2002 21:25:07 -0000	1.11
+++ smush.h	8 Aug 2002 21:54:49 -0000	1.12
@@ -22,105 +22,115 @@
 
 #define SP_MAX_FONTS 5
 
-struct PersistentCodecData37 {
-        byte *deltaBuf;
-        byte *deltaBufs[2];
-        uint32 deltaSize;
-        uint width, height;
-        int curtable;
-        int unk2,unk3;
+class SmushPlayer {
 
-        uint16 flags;
+private:
 
-        int16 *table1;
-        int table_last_pitch;
-        byte table_last_flags;
+struct PersistentCodecData37 {
+		byte *deltaBuf;
+		byte *deltaBufs[2];
+		uint32 deltaSize;
+		int32 width, height;
+		int32 curtable;
+		int32 unk2, unk3;
+		uint32 flags;
+		int16 *table1;
+		int32 table_last_pitch;
+		byte table_last_flags;
 };
 
 struct CodecData {
-        byte *out,*src;
-        int x,y;
-        int outwidth,outheight;
-        int w,h,pitch;
-
-        int flags;
+		byte * out, * src;
+		int32 x, y;
+		int32 outwidth, outheight;
+		int32 w, h, pitch;
+		uint32 flags;
 };
 
+		FILE * _in;
+		int32 fileSize;
+		byte * _block;
+		uint32 _blockTag;
+		uint32 _blockSize;
 
-struct SmushPlayer {
-        FILE *_in;
-        bool _paletteChanged;
-        byte * _block;
-        uint32 _blockTag;
-        uint32 _blockSize;
-        byte *_cur;
-        byte *_renderBitmap;
-        uint32 _frameSize;
-        uint32 _frmeTag, _frmeSize;
-
-        byte *_deltaBuf; 
-        int _deltaBufSize; 
+		byte * _cur;
+		byte * _renderBitmap;
+		uint32 _frameSize;
+		uint32 _frmeTag, _frmeSize;
+		bool _frameChanged;
 
-	byte * _fonts[SP_MAX_FONTS];
-	byte * _buffer_tres;
+		// Palette
+		uint16 _fluPalMul129[768];
+		uint16 _fluPalWords[768];
+		bool _paletteChanged;
+		byte _fluPalette[768];
 
-        PersistentCodecData37 pcd37;
-        
-        byte _fluPalette[768];
-        uint16 _fluPalMul129[768];
-        uint16 _fluPalWords[768];
+		// TRES
+		byte * _fonts[SP_MAX_FONTS];
+		byte * _bufferTres;
 
-	byte * loadTres();
-	void loadFonts();
-	uint32 getCharWidth(uint8 c_font, byte txt);
-	uint32 getFontHeight(uint8 c_font);
-	byte * getStringTRES(int32 number);
-	void drawStringTRES(uint32 x, uint32 y, byte * txt);
-	void drawCharTRES(uint32 * x, uint32 y, uint32 c_line, uint8 c_font, uint8 color, uint8 txt);
+		int32 _mixerNum;
 
-		/* PSAD: Full Throttle audio */
+		// PSAD: Full Throttle audio
 		uint32 _saudSize[8], _saudSubSize[8];
-		uint16 _psadTrk[8], _strkRate[8];
+		uint32 _psadTrk[8], _strkRate[8];
 		uint32 _saudSubTag[8];
 
-		/* IACT: The Dig audio */
+		// IACT: The Dig audio
 		uint32 _imusSize[8], _imusSubSize[8];
 		uint32 _imusTrk[8], _imusRate[8], _imusChan[8];
 		uint32 _imusSubTag[8];
 		byte _imusData[8][3];
 		uint32 _imusPos[8], _imusCodec[8];
 
-        void openFile(byte* fileName);
-        void nextBlock();
-
-        uint32 fileReadBE32();
-        uint32 fileReadLE32();
-        void go();
-
-        bool parseTag();		
-        void parseAHDR();
-        void parseFRME();
-
-        void parseNPAL();
-        void parseFOBJ();
-        void parsePSAD(); 
-        void parseTRES();
-        void parseXPAL();
-		void parseIACT();
-        void fileRead(void *mem, int len);
+		// Codec37
+		PersistentCodecData37 pcd37;
+		byte * _deltaBuf; 
+		int32 _deltaBufSize;
 
-        uint32 nextBE32();
-        void init();
-        void deinit();
+		bool _lock;
+		Scumm * _scumm;
 
-        void startVideo(short int arg, byte* videofile);
+		// TRES
+		byte * loadTres();
+		void loadFonts();
+		uint32 getCharWidth(uint8 c_font, byte txt);
+		uint32 getFontHeight(uint8 c_font);
+		byte * getStringTRES(int32 number);
+		void drawStringTRES(uint32 x, uint32 y, byte * txt);
+		void drawCharTRES(uint32 * x, uint32 y, uint32 c_line, uint8 c_font, uint8 color, uint8 txt);
 
-	void setPalette();
+		void openFile(byte* fileName);
 
-	long fileSize;
+		void setPalette();
+		void codec44Depack(byte *dst, byte *src, uint32 len);
+		void codec1(CodecData * cd);
+		void codec37Maketable(PersistentCodecData37 * pcd, int32 pitch, byte idx);
+		bool codec37(int32 game, CodecData * cd, PersistentCodecData37 * pcd);
+		void codec37Init(PersistentCodecData37 * pcd, int32 width, int32 height);
+		void codec37Proc5(int32 game, byte *dst, byte *src, int32 next_offs, int32 bw, int32 bh, int32 pitch, int16 *table);
+		void codec37BompDepack(byte *dst, byte *src, int32 len);
+		void codec37Proc4(byte *dst, byte *src, int32 next_offs, int32 bw, int32 bh, int32 pitch, int16 *table);
+		uint32 nextBE32();
+		void nextBlock();
 
-	Scumm *sm;
+		bool parseTag();		
+		void parseAHDR();
+		void parseFRME();
+		void parseNPAL();
+		void parseFOBJ();
+		void parsePSAD(); 
+		void parseTRES();
+		void parseXPAL();
+		void parseIACT();
 
-	int _frameChanged;
+		void init();
+		void deinit();
+		void go();
 
+public:
+		SmushPlayer(Scumm * parent);
+		~SmushPlayer();
+		void startVideo(short int arg, byte* videofile);
+		void update();
 };

Index: sound.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound.cpp,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -d -r1.123 -r1.124
--- sound.cpp	8 Aug 2002 07:48:57 -0000	1.123
+++ sound.cpp	8 Aug 2002 21:54:49 -0000	1.124
@@ -6,6 +6,7 @@
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * of the License, or (at your option) any later version.
+
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

Index: timer.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/timer.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- timer.cpp	8 Aug 2002 05:59:23 -0000	1.3
+++ timer.cpp	8 Aug 2002 21:54:49 -0000	1.4
@@ -43,13 +43,8 @@
 
 int Timer::handler(int * t) {
 	uint32 interval, l;
-	uint32 beginTime, endTime;
-
-	if (_timerRunning == false) 
-		return *t;
 
 	_osystem->lock_mutex(_mutex);
-	beginTime = _osystem->get_msecs();
 
 	if (_timerRunning) {
 		_lastTime = _thisTime;
@@ -67,14 +62,8 @@
 		}
 	}
 
-	endTime = _osystem->get_msecs();
-	interval = endTime - beginTime;
-	if (interval < 10) interval = 10;
-	if (interval > 10000) interval = 10000;
 	_osystem->unlock_mutex(_mutex);
 
-//	_osystem->set_timer (interval, &timer_handler);
-
 	return *t;
 }
 
@@ -98,7 +87,7 @@
 
 	_mutex = _osystem->create_mutex();
 	_thisTime = _osystem->get_msecs();
-	_osystem->set_timer (1000, &timer_handler);
+	_osystem->set_timer (10, &timer_handler);
 
 	_timerRunning = true;
 	_initialized = true;

Index: timer.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/timer.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- timer.h	4 Aug 2002 17:31:20 -0000	1.2
+++ timer.h	8 Aug 2002 21:54:49 -0000	1.3
@@ -23,7 +23,7 @@
 
 #include "scummsys.h"
 
-#define MAX_TIMERS 5
+#define MAX_TIMERS 3
 
 class OSystem;
 





More information about the Scummvm-git-logs mailing list