[Scummvm-cvs-logs] CVS: scummvm/scumm/smush codec37.cpp,1.27,1.28 codec37.h,1.14,1.15
Gregory Montoir
cyx at users.sourceforge.net
Sun Jul 25 12:06:02 CEST 2004
Update of /cvsroot/scummvm/scummvm/scumm/smush
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31532/scumm/smush
Modified Files:
codec37.cpp codec37.h
Log Message:
smush codec37 sub1 (FT demo)
Index: codec37.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/smush/codec37.cpp,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- codec37.cpp 10 Apr 2004 09:17:34 -0000 1.27
+++ codec37.cpp 25 Jul 2004 19:05:16 -0000 1.28
@@ -338,6 +338,71 @@
dst += 4; \
} while (0)
+void Codec37Decoder::proc1(byte *dst, const byte *src, int32 next_offs, int bw, int bh, int pitch, int16 *offset_table) {
+ uint8 code;
+ bool filling, skipCode;
+ int32 len;
+ int i, p;
+ uint32 pitches[16];
+
+ i = bw;
+ for (p = 0; p < 16; ++p) {
+ pitches[p] = (p >> 2) * pitch + (p & 0x3);
+ }
+ code = 0;
+ filling = false;
+ len = -1;
+ while (1) {
+ if (len < 0) {
+ filling = (*src & 1) == 1;
+ len = *src++ >> 1;
+ skipCode = false;
+ } else {
+ skipCode = true;
+ }
+ if (!filling || !skipCode) {
+ code = *src++;
+ if (code == 0xFF) {
+ --len;
+ for (p = 0; p < 0x10; ++p) {
+ if (len < 0) {
+ filling = (*src & 1) == 1;
+ len = *src++ >> 1;
+ if (filling) {
+ code = *src++;
+ }
+ }
+ if (filling) {
+ *(dst + pitches[p]) = code;
+ } else {
+ *(dst + pitches[p]) = *src++;
+ }
+ --len;
+ }
+ dst += 4;
+ --i;
+ if (i == 0) {
+ dst += pitch * 3;
+ --bh;
+ if (bh == 0) return;
+ i = bw;
+ }
+ continue;
+ }
+ }
+ byte *dst2 = dst + offset_table[code] + next_offs;
+ COPY_4X4(dst2, dst, pitch);
+ --i;
+ if (i == 0) {
+ dst += pitch * 3;
+ --bh;
+ if (bh == 0) return;
+ i = bw;
+ }
+ --len;
+ }
+}
+
void Codec37Decoder::proc3WithFDFE(byte *dst, const byte *src, int32 next_offs, int bw, int bh, int pitch, int16 *offset_table) {
do {
int32 i = bw;
@@ -464,7 +529,11 @@
memcpy(_deltaBufs[_curtable], src + 16, decoded_size);
break;
case 1:
- warning("codec37: missing opcode 1");
+ if ((seq_nb & 1) || !(mask_flags & 1)) {
+ _curtable ^= 1;
+ }
+ proc1(_deltaBufs[_curtable], src + 16, _deltaBufs[_curtable ^ 1] - _deltaBufs[_curtable],
+ bw, bh, pitch, _offsetTable);
break;
case 2:
bompDecodeLine(_deltaBufs[_curtable], src + 16, decoded_size);
Index: codec37.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/smush/codec37.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- codec37.h 6 Jan 2004 12:45:31 -0000 1.14
+++ codec37.h 25 Jul 2004 19:05:16 -0000 1.15
@@ -47,6 +47,7 @@
void deinit();
protected:
void maketable(int, int);
+ void proc1(byte *dst, const byte *src, int32, int, int, int, int16 *);
void proc3WithFDFE(byte *dst, const byte *src, int32, int, int, int, int16 *);
void proc3WithoutFDFE(byte *dst, const byte *src, int32, int, int, int, int16 *);
void proc4WithFDFE(byte *dst, const byte *src, int32, int, int, int, int16 *);
More information about the Scummvm-git-logs
mailing list