new V2 drawBitmap implementation which handles object drawing, too; no masking implemented yet. Once it fully works, will remove all the _egaStrip* stuff
svn-id: r7413
This commit is contained in:
parent
114af3159e
commit
c4741d89a3
1 changed files with 167 additions and 2 deletions
169
scumm/gfx.cpp
169
scumm/gfx.cpp
|
@ -937,11 +937,176 @@ void Gdi::drawBitmap(byte *ptr, VirtScreen *vs, int x, int y, const int width, c
|
||||||
if (vs->scrollable)
|
if (vs->scrollable)
|
||||||
sx -= vs->xstart >> 3;
|
sx -= vs->xstart >> 3;
|
||||||
|
|
||||||
|
//////
|
||||||
|
//////
|
||||||
|
////// START OF BIG HACK!
|
||||||
|
//////
|
||||||
|
//////
|
||||||
if (_vm->_features & GF_AFTER_V2) {
|
if (_vm->_features & GF_AFTER_V2) {
|
||||||
// TODO: implement new V2 strip / zplane drawing in here
|
|
||||||
|
|
||||||
//return;
|
backbuff_ptr = vs->screenPtr + (y * _numStrips + x) * 8;
|
||||||
|
if (vs->alloctwobuffers)
|
||||||
|
bgbak_ptr = _vm->getResourceAddress(rtBuffer, vs->number + 5) + (y * _numStrips + x) * 8;
|
||||||
|
else
|
||||||
|
bgbak_ptr = backbuff_ptr;
|
||||||
|
|
||||||
|
_mask_ptr = _vm->getResourceAddress(rtBuffer, 9) + (y * _numStrips + x);
|
||||||
|
|
||||||
|
//if (numstrip > 5) return;
|
||||||
|
//if (width != 320 || height != 128) return;
|
||||||
|
//if (width != 40 || height != 48) return;
|
||||||
|
//if (height == 128) return;
|
||||||
|
|
||||||
|
|
||||||
|
//printf("x %d, y %d, width %d, height %d, stripnr %d, numstrip %d, vs->alloctwobuffers %d\n",
|
||||||
|
// x, y, width, height, stripnr, numstrip, vs->alloctwobuffers);
|
||||||
|
|
||||||
|
const int left = stripnr << 3;
|
||||||
|
const int right = left + numstrip << 3;
|
||||||
|
byte *dst = bgbak_ptr;
|
||||||
|
byte *src = smap_ptr;
|
||||||
|
byte color = 0, data = 0;
|
||||||
|
int run = 1;
|
||||||
|
bool dither = false;
|
||||||
|
byte dither_table[128];
|
||||||
|
byte *ptr_dither_table;
|
||||||
|
memset(dither_table, 0, sizeof(dither_table));
|
||||||
|
int theX, theY;
|
||||||
|
|
||||||
|
// Draw image data. To do this, we decode the full RLE graphics data,
|
||||||
|
// but only draw those parts we actually want to display.
|
||||||
|
assert(height <= 128);
|
||||||
|
for (theX = 0; theX < width; theX++) {
|
||||||
|
ptr_dither_table = dither_table;
|
||||||
|
for (theY = 0; theY < height; theY++) {
|
||||||
|
if (--run == 0) {
|
||||||
|
data = *src++;
|
||||||
|
if (data & 0x80) {
|
||||||
|
run = data & 0x7f;
|
||||||
|
dither = true;
|
||||||
|
} else {
|
||||||
|
run = data >> 4;
|
||||||
|
dither = false;
|
||||||
}
|
}
|
||||||
|
if (run == 0) {
|
||||||
|
run = *src++;
|
||||||
|
}
|
||||||
|
color = data & 0x0f;
|
||||||
|
}
|
||||||
|
if (!dither) {
|
||||||
|
*ptr_dither_table = color;
|
||||||
|
}
|
||||||
|
if (left <= theX && theX < right) {
|
||||||
|
*dst = *ptr_dither_table++;
|
||||||
|
dst += _vm->_realWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (left <= theX && theX < right) {
|
||||||
|
dst -= _vm->_realWidth * height;
|
||||||
|
dst++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Draw mask (zplane) data
|
||||||
|
// TODO - this code is right now completely bogus, will implement it correctly later
|
||||||
|
theY = 0;
|
||||||
|
theX = 0;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
run = *src++;
|
||||||
|
if (run & 0x80) {
|
||||||
|
run &= 0x7f;
|
||||||
|
data = *src++;
|
||||||
|
do {
|
||||||
|
if (left <= theX && theX < right) {
|
||||||
|
*_mask_ptr = data;
|
||||||
|
_mask_ptr += _numStrips;
|
||||||
|
}
|
||||||
|
theY++;
|
||||||
|
if (theY >= height) {
|
||||||
|
theX++;
|
||||||
|
if (theX >= (width >> 3))
|
||||||
|
goto finish_v2;
|
||||||
|
theY = 0;
|
||||||
|
if (left <= theX && theX < right)
|
||||||
|
_mask_ptr -= _numStrips * height - 1;
|
||||||
|
}
|
||||||
|
} while (--run);
|
||||||
|
} else {
|
||||||
|
do {
|
||||||
|
data = *src++;
|
||||||
|
|
||||||
|
if (left <= theX && theX < right) {
|
||||||
|
*_mask_ptr = data;
|
||||||
|
_mask_ptr += _numStrips;
|
||||||
|
}
|
||||||
|
theY++;
|
||||||
|
if (theY >= height) {
|
||||||
|
theX++;
|
||||||
|
if (theX >= width)
|
||||||
|
goto finish_v2;
|
||||||
|
theY = 0;
|
||||||
|
if (left <= theX && theX < right)
|
||||||
|
_mask_ptr -= _numStrips * height - 1;
|
||||||
|
}
|
||||||
|
} while (--run);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
finish_v2:
|
||||||
|
*/
|
||||||
|
// Update tdirty / bdirty
|
||||||
|
while (numstrip--) {
|
||||||
|
if (sx < 0)
|
||||||
|
goto next_iter_v2;
|
||||||
|
|
||||||
|
if (sx >= _numStrips) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y < vs->tdirty[sx])
|
||||||
|
vs->tdirty[sx] = y;
|
||||||
|
|
||||||
|
if (bottom > vs->bdirty[sx])
|
||||||
|
vs->bdirty[sx] = bottom;
|
||||||
|
|
||||||
|
CHECK_HEAP;
|
||||||
|
if (vs->alloctwobuffers) {
|
||||||
|
backbuff_ptr = vs->screenPtr + (y * _numStrips + x) * 8;
|
||||||
|
bgbak_ptr = _vm->getResourceAddress(rtBuffer, vs->number + 5) + (y * _numStrips + x) * 8;
|
||||||
|
_mask_ptr = _vm->getResourceAddress(rtBuffer, 9) + (y * _numStrips + x);
|
||||||
|
|
||||||
|
if (_vm->hasCharsetMask(sx << 3, y, (sx + 1) << 3, bottom)) {
|
||||||
|
if (flag & dbClear || !lightsOn)
|
||||||
|
clear8ColWithMasking(backbuff_ptr, height, _mask_ptr);
|
||||||
|
else
|
||||||
|
draw8ColWithMasking(backbuff_ptr, bgbak_ptr, height, _mask_ptr);
|
||||||
|
} else {
|
||||||
|
if (flag & dbClear || !lightsOn)
|
||||||
|
clear8Col(backbuff_ptr, height);
|
||||||
|
else
|
||||||
|
draw8Col(backbuff_ptr, bgbak_ptr, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
next_iter_v2:
|
||||||
|
CHECK_HEAP;
|
||||||
|
x++;
|
||||||
|
sx++;
|
||||||
|
stripnr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Get outa here
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////
|
||||||
|
//////
|
||||||
|
////// END OF BIG HACK!
|
||||||
|
//////
|
||||||
|
//////
|
||||||
|
|
||||||
while (numstrip--) {
|
while (numstrip--) {
|
||||||
CHECK_HEAP;
|
CHECK_HEAP;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue