cleanup; fixed crashes that occured when an actor was drawn partly offscreen

svn-id: r8113
This commit is contained in:
Max Horn 2003-05-29 18:45:58 +00:00
parent f0c0b5f4f8
commit 746b0bdc5b
3 changed files with 11 additions and 29 deletions

View File

@ -351,7 +351,7 @@ void AkosRenderer::codec1_genericDecode() {
do {
if (*scaleytab++ < _scaleY) {
masked = v1.mask_ptr && ((mask[0] | mask[v1.imgbufoffs]) & maskbit);
masked = (y < _outheight) && v1.mask_ptr && ((mask[0] | mask[v1.imgbufoffs]) & maskbit);
if (color && y < _outheight && !masked) {
pcolor = palette[color];
@ -508,7 +508,6 @@ byte AkosRenderer::codec1(int xmoveCur, int ymoveCur) {
int skip = 0, startScaleIndexX, startScaleIndexY;
int cur_x, x_right, x_left;
int cur_y, y_top, y_bottom;
bool y_clipping;
bool charsetmask, masking;
int step;
byte drawFlag = 1;
@ -690,8 +689,6 @@ byte AkosRenderer::codec1(int xmoveCur, int ymoveCur) {
_vm->updateDirtyRect(0, x_left, x_right, y_top, y_bottom, _dirty_id);
y_clipping = ((uint) y_bottom > _outheight || y_top < 0);
if ((uint) y_top > (uint) _outheight)
y_top = 0;
@ -703,10 +700,7 @@ byte AkosRenderer::codec1(int xmoveCur, int ymoveCur) {
if (_draw_bottom < y_bottom)
_draw_bottom = y_bottom;
if (cur_x == -1)
cur_x = 0; /* ?? */
v1.destptr = _outptr + cur_x + cur_y * _outwidth;
v1.destptr = _outptr + v1.y * _outwidth + v1.x;
charsetmask =
_vm->hasCharsetMask(x_left, y_top + _vm->virtscr[0].topline, x_right,
@ -720,7 +714,7 @@ byte AkosRenderer::codec1(int xmoveCur, int ymoveCur) {
v1.mask_ptr = NULL;
if (masking || charsetmask || _shadow_mode) {
v1.mask_ptr = _vm->getResourceAddress(rtBuffer, 9) + cur_y * _numStrips + _vm->_screenStartStrip;
v1.mask_ptr = _vm->getResourceAddress(rtBuffer, 9) + v1.y * _numStrips + _vm->_screenStartStrip;
v1.imgbufoffs = _vm->gdi._imgBufOffs[_zbuf];
if (!charsetmask && masking) {
v1.mask_ptr += v1.imgbufoffs;

View File

@ -223,12 +223,12 @@ byte CostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {
if (_width2 == 0)
return 0;
if ((uint) y_top > (uint) _outheight)
y_top = 0;
if (x_left < 0)
x_left = 0;
if ((uint) y_top > (uint) _outheight)
y_top = 0;
if ((uint) y_bottom > _outheight)
y_bottom = _outheight;
@ -247,18 +247,6 @@ byte CostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {
v1.mask_ptr = _vm->getResourceAddress(rtBuffer, 9) + v1.y * _numStrips + _vm->_screenStartStrip;
v1.imgbufoffs = _vm->gdi._imgBufOffs[_zbuf];
// FIXME: Masking used to be conditional. Will it cause regressions
// to always do it? I don't think so, since the behaviour used to be
// to mask if there was a mask to apply, unless _zbuf is 0.
//
// However, when _zbuf is 0 masking and charset masking are the same
// thing. I believe the only thing that is ever written to the
// frontmost mask buffer is the charset mask, except in Sam & Max
// where it's also used for the inventory box and conversation icons.
_use_mask = true;
_use_charset_mask = true;
CHECK_HEAP
if (_vm->_features & GF_AMIGA)
@ -278,8 +266,6 @@ void CostumeRenderer::proc3() {
uint y;
bool masked;
mask = v1.mask_ptr + (v1.x >> 3);
maskbit = revBitMask[v1.x & 7];
y = v1.y;
src = _srcptr;
dst = v1.destptr;
@ -288,6 +274,9 @@ void CostumeRenderer::proc3() {
height = _height;
width = _width2;
maskbit = revBitMask[v1.x & 7];
mask = v1.mask_ptr + (v1.x >> 3);
if (len)
goto StartPos;
@ -300,7 +289,7 @@ void CostumeRenderer::proc3() {
do {
if (_scaleY == 255 || cost_scaleTable[_scaleIndexY++] < _scaleY) {
masked = (_use_mask && (mask[v1.imgbufoffs] & maskbit)) || (_use_charset_mask && (mask[0] & maskbit));
masked = (y < _outheight) && v1.mask_ptr && ((mask[0] | mask[v1.imgbufoffs]) & maskbit);
if (color && y < _outheight && !masked) {
// FIXME: Fully implement _shadow_mode.
@ -369,7 +358,7 @@ void CostumeRenderer::proc3_ami() {
len = *src++;
do {
if (_scaleY == 255 || cost_scaleTable[_scaleIndexY] < _scaleY) {
masked = (_use_mask && (mask[v1.imgbufoffs] & maskbit)) || (_use_charset_mask && (mask[0] & maskbit));
masked = (y < _outheight) && v1.mask_ptr && ((mask[0] | mask[v1.imgbufoffs]) & maskbit);
if (color && v1.x >= 0 && v1.x < _vm->_screenWidth && !masked) {
*dst = _palette[color];

View File

@ -47,7 +47,6 @@ class CostumeRenderer : public BaseCostumeRenderer {
protected:
LoadedCostume _loaded;
bool _use_mask, _use_charset_mask;
byte _width2;
byte _scaleIndexX; /* must wrap at 256 */