mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-17 07:07:10 +00:00
CGE: Implement snGhost by splitting _m field in two. Some cleanup.
This commit is contained in:
parent
9ba5e2b304
commit
dab96401ad
@ -46,7 +46,7 @@ void Bitmap::deinit() {
|
||||
}
|
||||
|
||||
#pragma argsused
|
||||
Bitmap::Bitmap(const char *fname, bool rem) : _m(NULL), _v(NULL) {
|
||||
Bitmap::Bitmap(const char *fname, bool rem) : _m(NULL), _v(NULL), _map(0) {
|
||||
char pat[MAXPATH];
|
||||
forceExt(pat, fname, ".VBM");
|
||||
|
||||
@ -78,7 +78,7 @@ Bitmap::Bitmap(const char *fname, bool rem) : _m(NULL), _v(NULL) {
|
||||
}
|
||||
|
||||
|
||||
Bitmap::Bitmap(uint16 w, uint16 h, uint8 *map) : _w(w), _h(h), _m(map), _v(NULL) {
|
||||
Bitmap::Bitmap(uint16 w, uint16 h, uint8 *map) : _w(w), _h(h), _m(map), _v(NULL), _map(0) {
|
||||
if (map)
|
||||
code();
|
||||
}
|
||||
@ -90,7 +90,8 @@ Bitmap::Bitmap(uint16 w, uint16 h, uint8 *map) : _w(w), _h(h), _m(map), _v(NULL)
|
||||
Bitmap::Bitmap(uint16 w, uint16 h, uint8 fill)
|
||||
: _w((w + 3) & ~3), // only full uint32 allowed!
|
||||
_h(h),
|
||||
_m(NULL) {
|
||||
_m(NULL),
|
||||
_map(0) {
|
||||
uint16 dsiz = _w >> 2; // data size (1 plane line size)
|
||||
uint16 lsiz = 2 + dsiz + 2; // uint16 for line header, uint16 for gap
|
||||
uint16 psiz = _h * lsiz; // - last gape, but + plane trailer
|
||||
@ -128,7 +129,7 @@ Bitmap::Bitmap(uint16 w, uint16 h, uint8 fill)
|
||||
}
|
||||
|
||||
|
||||
Bitmap::Bitmap(const Bitmap &bmp) : _w(bmp._w), _h(bmp._h), _m(NULL), _v(NULL) {
|
||||
Bitmap::Bitmap(const Bitmap &bmp) : _w(bmp._w), _h(bmp._h), _m(NULL), _v(NULL), _map(0) {
|
||||
uint8 *v0 = bmp._v;
|
||||
if (v0) {
|
||||
uint16 vsiz = (uint8 *)(bmp._b) - (uint8 *)(v0);
|
||||
@ -143,20 +144,9 @@ Bitmap::Bitmap(const Bitmap &bmp) : _w(bmp._w), _h(bmp._h), _m(NULL), _v(NULL) {
|
||||
|
||||
|
||||
Bitmap::~Bitmap() {
|
||||
if (memType(_m) == FAR_MEM)
|
||||
if (_m)
|
||||
free(_m);
|
||||
|
||||
switch (memType(_v)) {
|
||||
case NEAR_MEM :
|
||||
delete[](uint8 *) _v;
|
||||
break;
|
||||
case FAR_MEM :
|
||||
delete[] _v;
|
||||
default:
|
||||
warning("Unhandled MemType in Bitmap destructor");
|
||||
break;
|
||||
break;
|
||||
}
|
||||
delete[] _v;
|
||||
}
|
||||
|
||||
|
||||
@ -165,6 +155,7 @@ Bitmap &Bitmap::operator = (const Bitmap &bmp) {
|
||||
_w = bmp._w;
|
||||
_h = bmp._h;
|
||||
_m = NULL;
|
||||
_map = 0;
|
||||
if (memType(_v) == FAR_MEM)
|
||||
free(_v);
|
||||
if (v0 == NULL)
|
||||
@ -197,128 +188,120 @@ uint16 Bitmap::moveVmap(uint8 *buf) {
|
||||
|
||||
|
||||
BMP_PTR Bitmap::code() {
|
||||
if (_m) {
|
||||
uint16 i, cnt;
|
||||
if (!_m)
|
||||
return false;
|
||||
|
||||
if (_v) { // old X-map exists, so remove it
|
||||
switch (memType(_v)) {
|
||||
case NEAR_MEM :
|
||||
delete[](uint8 *) _v;
|
||||
break;
|
||||
case FAR_MEM :
|
||||
delete[] _v;
|
||||
break;
|
||||
default:
|
||||
warning("Unhandled MemType in Bitmap::Code()");
|
||||
break;
|
||||
uint16 i, cnt;
|
||||
|
||||
if (_v) { // old X-map exists, so remove it
|
||||
delete[] _v;
|
||||
_v = NULL;
|
||||
}
|
||||
|
||||
while (true) { // at most 2 times: for (V == NULL) & for allocated block;
|
||||
uint8 *im = _v + 2;
|
||||
uint16 *cp = (uint16 *) _v;
|
||||
int bpl;
|
||||
|
||||
if (_v) { // 2nd pass - fill the hide table
|
||||
for (i = 0; i < _h; i++) {
|
||||
_b[i].skip = 0xFFFF;
|
||||
_b[i].hide = 0x0000;
|
||||
}
|
||||
_v = NULL;
|
||||
}
|
||||
for (bpl = 0; bpl < 4; bpl++) { // once per each bitplane
|
||||
uint8 *bm = _m;
|
||||
bool skip = (bm[bpl] == TRANS);
|
||||
uint16 j;
|
||||
|
||||
while (true) { // at most 2 times: for (V == NULL) & for allocated block;
|
||||
uint8 *im = _v + 2;
|
||||
uint16 *cp = (uint16 *) _v;
|
||||
int bpl;
|
||||
cnt = 0;
|
||||
for (i = 0; i < _h; i++) { // once per each line
|
||||
uint8 pix;
|
||||
for (j = bpl; j < _w; j += 4) {
|
||||
pix = bm[j];
|
||||
if (_v && pix != TRANS) {
|
||||
if (j < _b[i].skip)
|
||||
_b[i].skip = j;
|
||||
|
||||
if (_v) { // 2nd pass - fill the hide table
|
||||
for (i = 0; i < _h; i++) {
|
||||
_b[i].skip = 0xFFFF;
|
||||
_b[i].hide = 0x0000;
|
||||
if (j >= _b[i].hide)
|
||||
_b[i].hide = j + 1;
|
||||
}
|
||||
if ((pix == TRANS) != skip || cnt >= 0x3FF0) { // end of block
|
||||
cnt |= (skip) ? SKP : CPY;
|
||||
if (_v)
|
||||
*cp = cnt; // store block description uint16
|
||||
|
||||
cp = (uint16 *) im;
|
||||
im += 2;
|
||||
skip = (pix == TRANS);
|
||||
cnt = 0;
|
||||
}
|
||||
if (! skip) {
|
||||
if (_v)
|
||||
*im = pix;
|
||||
++ im;
|
||||
}
|
||||
++ cnt;
|
||||
}
|
||||
|
||||
bm += _w;
|
||||
if (_w < SCR_WID) {
|
||||
if (skip) {
|
||||
cnt += (SCR_WID - j + 3) / 4;
|
||||
} else {
|
||||
cnt |= CPY;
|
||||
if (_v)
|
||||
*cp = cnt;
|
||||
|
||||
cp = (uint16 *) im;
|
||||
im += 2;
|
||||
skip = true;
|
||||
cnt = (SCR_WID - j + 3) / 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (bpl = 0; bpl < 4; bpl++) { // once per each bitplane
|
||||
uint8 *bm = _m;
|
||||
bool skip = (bm[bpl] == TRANS);
|
||||
uint16 j;
|
||||
|
||||
cnt = 0;
|
||||
for (i = 0; i < _h; i++) { // once per each line
|
||||
uint8 pix;
|
||||
for (j = bpl; j < _w; j += 4) {
|
||||
pix = bm[j];
|
||||
if (_v && pix != TRANS) {
|
||||
if (j < _b[i].skip)
|
||||
_b[i].skip = j;
|
||||
|
||||
if (j >= _b[i].hide)
|
||||
_b[i].hide = j + 1;
|
||||
}
|
||||
if ((pix == TRANS) != skip || cnt >= 0x3FF0) { // end of block
|
||||
cnt |= (skip) ? SKP : CPY;
|
||||
if (_v)
|
||||
*cp = cnt; // store block description uint16
|
||||
|
||||
cp = (uint16 *) im;
|
||||
im += 2;
|
||||
skip = (pix == TRANS);
|
||||
cnt = 0;
|
||||
}
|
||||
if (! skip) {
|
||||
if (_v)
|
||||
*im = pix;
|
||||
++ im;
|
||||
}
|
||||
++ cnt;
|
||||
}
|
||||
|
||||
bm += _w;
|
||||
if (_w < SCR_WID) {
|
||||
if (skip) {
|
||||
cnt += (SCR_WID - j + 3) / 4;
|
||||
} else {
|
||||
cnt |= CPY;
|
||||
if (_v)
|
||||
*cp = cnt;
|
||||
|
||||
cp = (uint16 *) im;
|
||||
im += 2;
|
||||
skip = true;
|
||||
cnt = (SCR_WID - j + 3) / 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cnt && ! skip) {
|
||||
cnt |= CPY;
|
||||
if (_v)
|
||||
*cp = cnt;
|
||||
|
||||
cp = (uint16 *) im;
|
||||
im += 2;
|
||||
}
|
||||
if (cnt && ! skip) {
|
||||
cnt |= CPY;
|
||||
if (_v)
|
||||
*cp = EOI;
|
||||
*cp = cnt;
|
||||
|
||||
cp = (uint16 *) im;
|
||||
im += 2;
|
||||
}
|
||||
if (_v)
|
||||
break;
|
||||
|
||||
uint16 sizV = (uint16)(im - 2 - _v);
|
||||
_v = new uint8[sizV + _h * sizeof(*_b)];
|
||||
if (!_v)
|
||||
error("No core");
|
||||
|
||||
_b = (HideDesc *)(_v + sizV);
|
||||
*cp = EOI;
|
||||
cp = (uint16 *) im;
|
||||
im += 2;
|
||||
}
|
||||
cnt = 0;
|
||||
for (i = 0; i < _h; i++) {
|
||||
if (_b[i].skip == 0xFFFF) { // whole line is skipped
|
||||
_b[i].skip = (cnt + SCR_WID) >> 2;
|
||||
cnt = 0;
|
||||
} else {
|
||||
uint16 s = _b[i].skip & ~3;
|
||||
uint16 h = (_b[i].hide + 3) & ~3;
|
||||
_b[i].skip = (cnt + s) >> 2;
|
||||
_b[i].hide = (h - s) >> 2;
|
||||
cnt = SCR_WID - h;
|
||||
}
|
||||
if (_v)
|
||||
break;
|
||||
|
||||
uint16 sizV = (uint16)(im - 2 - _v);
|
||||
_v = new uint8[sizV + _h * sizeof(*_b)];
|
||||
if (!_v)
|
||||
error("No core");
|
||||
|
||||
_b = (HideDesc *)(_v + sizV);
|
||||
}
|
||||
cnt = 0;
|
||||
for (i = 0; i < _h; i++) {
|
||||
if (_b[i].skip == 0xFFFF) { // whole line is skipped
|
||||
_b[i].skip = (cnt + SCR_WID) >> 2;
|
||||
cnt = 0;
|
||||
} else {
|
||||
uint16 s = _b[i].skip & ~3;
|
||||
uint16 h = (_b[i].hide + 3) & ~3;
|
||||
_b[i].skip = (cnt + s) >> 2;
|
||||
_b[i].hide = (h - s) >> 2;
|
||||
cnt = SCR_WID - h;
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
bool Bitmap::solidAt(int x, int y) {
|
||||
bool Bitmap::solidAt(int16 x, int16 y) {
|
||||
uint8 *m;
|
||||
uint16 r, n, n0;
|
||||
|
||||
@ -447,58 +430,58 @@ bool Bitmap::loadVBM(XFile *f) {
|
||||
}
|
||||
|
||||
bool Bitmap::loadBMP(XFile *f) {
|
||||
struct {
|
||||
char BM[2];
|
||||
union { int16 len; int32 len_; };
|
||||
union { int16 _06; int32 _06_; };
|
||||
union { int16 hdr; int32 hdr_; };
|
||||
union { int16 _0E; int32 _0E_; };
|
||||
union { int16 wid; int32 wid_; };
|
||||
union { int16 hig; int32 hig_; };
|
||||
union { int16 _1A; int32 _1A_; };
|
||||
union { int16 _1E; int32 _1E_; };
|
||||
union { int16 _22; int32 _22_; };
|
||||
union { int16 _26; int32 _26_; };
|
||||
union { int16 _2A; int32 _2A_; };
|
||||
union { int16 _2E; int32 _2E_; };
|
||||
union { int16 _32; int32 _32_; };
|
||||
} hea;
|
||||
struct {
|
||||
char BM[2];
|
||||
union { int16 len; int32 len_; };
|
||||
union { int16 _06; int32 _06_; };
|
||||
union { int16 hdr; int32 hdr_; };
|
||||
union { int16 _0E; int32 _0E_; };
|
||||
union { int16 wid; int32 wid_; };
|
||||
union { int16 hig; int32 hig_; };
|
||||
union { int16 _1A; int32 _1A_; };
|
||||
union { int16 _1E; int32 _1E_; };
|
||||
union { int16 _22; int32 _22_; };
|
||||
union { int16 _26; int32 _26_; };
|
||||
union { int16 _2A; int32 _2A_; };
|
||||
union { int16 _2E; int32 _2E_; };
|
||||
union { int16 _32; int32 _32_; };
|
||||
} hea;
|
||||
|
||||
Bgr4 bpal[256];
|
||||
Bgr4 bpal[256];
|
||||
|
||||
f->read((byte *)&hea, sizeof(hea));
|
||||
if (f->_error == 0) {
|
||||
if (hea.hdr == 0x436L) {
|
||||
int16 i = (hea.hdr - sizeof(hea)) / sizeof(Bgr4);
|
||||
f->read((byte *)&bpal, sizeof(bpal));
|
||||
if (f->_error == 0) {
|
||||
if (_pal) {
|
||||
for (i = 0; i < 256; i ++) {
|
||||
_pal[i]._r = bpal[i]._R;
|
||||
_pal[i]._g = bpal[i]._G;
|
||||
_pal[i]._b = bpal[i]._B;
|
||||
f->read((byte *)&hea, sizeof(hea));
|
||||
if (f->_error == 0) {
|
||||
if (hea.hdr == 0x436L) {
|
||||
int16 i = (hea.hdr - sizeof(hea)) / sizeof(Bgr4);
|
||||
f->read((byte *)&bpal, sizeof(bpal));
|
||||
if (f->_error == 0) {
|
||||
if (_pal) {
|
||||
for (i = 0; i < 256; i ++) {
|
||||
_pal[i]._r = bpal[i]._R;
|
||||
_pal[i]._g = bpal[i]._G;
|
||||
_pal[i]._b = bpal[i]._B;
|
||||
}
|
||||
_pal = NULL;
|
||||
}
|
||||
_h = hea.hig;
|
||||
_w = hea.wid;
|
||||
if ((_m = farnew(byte, _h * _w)) != NULL) {
|
||||
int16 r = (4 - (hea.wid & 3)) % 4;
|
||||
byte buf[3];
|
||||
for (i = _h - 1; i >= 0; i--) {
|
||||
f->read(_m + (_w * i), _w);
|
||||
if (r && f->_error == 0)
|
||||
f->read(buf, r);
|
||||
if (f->_error)
|
||||
break;
|
||||
}
|
||||
if (i < 0)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
_pal = NULL;
|
||||
}
|
||||
_h = hea.hig;
|
||||
_w = hea.wid;
|
||||
if ((_m = farnew(byte, _h * _w)) != NULL) {
|
||||
int16 r = (4 - (hea.wid & 3)) % 4;
|
||||
byte buf[3];
|
||||
for (i = _h - 1; i >= 0; i--) {
|
||||
f->read(_m + (_w * i), _w);
|
||||
if (r && f->_error == 0)
|
||||
f->read(buf, r);
|
||||
if (f->_error)
|
||||
break;
|
||||
}
|
||||
if (i < 0)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
} // End of namespace CGE
|
||||
|
@ -68,6 +68,7 @@ public:
|
||||
uint16 _h;
|
||||
uint8 *_m;
|
||||
uint8 *_v;
|
||||
int32 _map;
|
||||
HideDesc *_b;
|
||||
|
||||
Bitmap(const char *fname, bool rem);
|
||||
@ -81,10 +82,10 @@ public:
|
||||
Bitmap *flipH();
|
||||
Bitmap *code();
|
||||
Bitmap &operator = (const Bitmap &bmp);
|
||||
void hide(int x, int y);
|
||||
void show(int x, int y);
|
||||
void xShow(int x, int y);
|
||||
bool solidAt(int x, int y);
|
||||
void hide(int16 x, int16 y);
|
||||
void show(int16 x, int16 y);
|
||||
void xShow(int16 x, int16 y);
|
||||
bool solidAt(int16 x, int16 y);
|
||||
bool saveVBM(XFile *f);
|
||||
uint16 moveVmap(uint8 *buf);
|
||||
};
|
||||
|
@ -39,22 +39,13 @@ namespace CGE {
|
||||
|
||||
#define SEED 0xA5
|
||||
|
||||
#define SCR_WID_ 320
|
||||
#define SCR_HIG_ 200
|
||||
#define SCR_WID ((uint16)SCR_WID_)
|
||||
#define SCR_HIG ((uint16)SCR_HIG_)
|
||||
#define SCR_SEG 0xA000
|
||||
#define SCR_ADR ((uint8 *) MK_FP(SCR_SEG, 0))
|
||||
|
||||
|
||||
|
||||
//enum CPU { _8086, _80186, _80286, _80386, _80486 };
|
||||
enum MEM_TYPE { BAD_MEM, EMS_MEM, NEAR_MEM, FAR_MEM };
|
||||
enum ALLOC_MODE { FIRST_FIT, BEST_FIT, LAST_FIT };
|
||||
enum IOMODE { REA, WRI, UPD };
|
||||
|
||||
struct Dac {
|
||||
uint8 _r, _g, _b;
|
||||
uint8 _r;
|
||||
uint8 _g;
|
||||
uint8 _b;
|
||||
};
|
||||
|
||||
typedef uint16 CRYPT(void *buf, uint16 siz, uint16 seed);
|
||||
|
@ -309,11 +309,10 @@ void CGEEngine::hide1(Sprite *spr) {
|
||||
}
|
||||
|
||||
void CGEEngine::snGhost(Bitmap *bmp) {
|
||||
// TODO : Get x and y from M but not using segment / offset
|
||||
//bmp->Hide(FP_OFF(bmp->_m), FP_SEG(bmp->_m));
|
||||
bmp->hide(bmp->_map & 0xFFFF, bmp->_map >> 16);
|
||||
bmp->_m = NULL;
|
||||
bmp->_map = 0;
|
||||
delete bmp;
|
||||
warning("STUB: SNGhost");
|
||||
}
|
||||
|
||||
void CGEEngine::feedSnail(Sprite *spr, SNLIST snq) {
|
||||
|
@ -683,18 +683,9 @@ void Sprite::killXlat() {
|
||||
if (_flags._xlat && _ext) {
|
||||
BMP_PTR *b;
|
||||
uint8 *m = (*_ext->_shpList)->_m;
|
||||
|
||||
switch (memType(m)) {
|
||||
case NEAR_MEM :
|
||||
delete[](uint8 *) m;
|
||||
break;
|
||||
case FAR_MEM :
|
||||
if (m)
|
||||
free(m);
|
||||
break;
|
||||
default:
|
||||
warning("Unhandled MemType in Sprite::KillXlat()");
|
||||
break;
|
||||
}
|
||||
|
||||
for (b = _ext->_shpList; *b; b++)
|
||||
(*b)->_m = NULL;
|
||||
_flags._xlat = false;
|
||||
@ -777,9 +768,7 @@ BMP_PTR Sprite::ghost() {
|
||||
if ((bmp->_b = new HideDesc[bmp->_h]) == NULL)
|
||||
error("No Core");
|
||||
bmp->_v = (uint8 *) memcpy(bmp->_b, e->_b1->_b, sizeof(HideDesc) * bmp->_h);
|
||||
// TODO offset correctly in the surface using y1 pitch and x1 and not via offset segment
|
||||
//bmp->_m = (uint8 *) MK_FP(e->y1, e->x1);
|
||||
warning("FIXME: SPRITE::Ghost");
|
||||
bmp->_map = (e->_y1 << 16) + e->_x1;
|
||||
return bmp;
|
||||
}
|
||||
return NULL;
|
||||
@ -1209,7 +1198,7 @@ void Vga::copyPage(uint16 d, uint16 s) {
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
void Bitmap::xShow(int x, int y) {
|
||||
void Bitmap::xShow(int16 x, int16 y) {
|
||||
/*
|
||||
uint8 rmsk = x % 4,
|
||||
mask = 1 << rmsk,
|
||||
@ -1291,7 +1280,7 @@ void Bitmap::xShow(int x, int y) {
|
||||
}
|
||||
|
||||
|
||||
void Bitmap::show(int x, int y) {
|
||||
void Bitmap::show(int16 x, int16 y) {
|
||||
const byte *srcP = (const byte *)_v;
|
||||
byte *destEndP = (byte *)Vga::_page[1]->pixels + (SCR_WID * SCR_HIG);
|
||||
|
||||
@ -1353,8 +1342,8 @@ void Bitmap::show(int x, int y) {
|
||||
}
|
||||
|
||||
|
||||
void Bitmap::hide(int x, int y) {
|
||||
for (int yp = y; yp < y + _h; ++yp) {
|
||||
void Bitmap::hide(int16 x, int16 y) {
|
||||
for (int yp = y; yp < y + _h; yp++) {
|
||||
const byte *srcP = (const byte *)Vga::_page[2]->getBasePtr(x, yp);
|
||||
byte *destP = (byte *)Vga::_page[1]->getBasePtr(x, yp);
|
||||
|
||||
|
@ -57,19 +57,11 @@ namespace CGE {
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
#define LIGHT 0xFF
|
||||
#define DARK 0x00
|
||||
#define DGRAY 0xF6
|
||||
#define GRAY 0xFC
|
||||
#define LGRAY 0xFF
|
||||
#else
|
||||
#define LIGHT 0xFF
|
||||
#define DARK 207
|
||||
#define DGRAY 225 /*219*/
|
||||
#define GRAY 231
|
||||
#define LGRAY 237
|
||||
#endif
|
||||
|
||||
#define NO_SEQ (-1)
|
||||
#define NO_PTR ((uint8)-1)
|
||||
|
Loading…
Reference in New Issue
Block a user