[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