mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-24 05:01:43 +00:00
Fix for bug #1042802 (DIG: Graphics glitch when scrolling) -- the fix is to properly distinguish pitch and width of the target surface
svn-id: r15480
This commit is contained in:
parent
ca41dba220
commit
b3c72a792b
@ -537,7 +537,7 @@ void AkosRenderer::codec1_genericDecode() {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
masked = (y < 0 || y >= _outheight) || (*mask & maskbit);
|
||||
masked = (y < 0 || y >= _out.h) || (*mask & maskbit);
|
||||
|
||||
if (color && !masked && !skip_column) {
|
||||
pcolor = palette[color];
|
||||
@ -555,7 +555,7 @@ void AkosRenderer::codec1_genericDecode() {
|
||||
*dst = pcolor;
|
||||
}
|
||||
}
|
||||
dst += _outwidth;
|
||||
dst += _out.pitch;
|
||||
mask += _numStrips;
|
||||
y++;
|
||||
}
|
||||
@ -569,7 +569,7 @@ void AkosRenderer::codec1_genericDecode() {
|
||||
|
||||
if (_scaleX == 255 || v1.scaletable[v1.scaleXindex] < _scaleX) {
|
||||
v1.x += v1.scaleXstep;
|
||||
if (v1.x < 0 || v1.x >= _outwidth)
|
||||
if (v1.x < 0 || v1.x >= _out.w)
|
||||
return;
|
||||
maskbit = revBitMask[(v1.x + _vm->virtscr[0].xstart) & 7];
|
||||
v1.destptr += v1.scaleXstep;
|
||||
@ -802,7 +802,7 @@ byte AkosRenderer::codec1(int xmoveCur, int ymoveCur) {
|
||||
|
||||
j = startScaleIndexX;
|
||||
for (i = 0; i < _width; i++) {
|
||||
if (rect.left >= _outwidth) {
|
||||
if (rect.left >= _out.w) {
|
||||
startScaleIndexX = j;
|
||||
skip++;
|
||||
}
|
||||
@ -871,10 +871,10 @@ byte AkosRenderer::codec1(int xmoveCur, int ymoveCur) {
|
||||
} else
|
||||
_vm->markRectAsDirty(kMainVirtScreen, rect, _actorID);
|
||||
|
||||
if (rect.top >= _outheight || rect.bottom <= 0)
|
||||
if (rect.top >= _out.h || rect.bottom <= 0)
|
||||
return 0;
|
||||
|
||||
if (rect.left >= _outwidth || rect.right <= 0)
|
||||
if (rect.left >= _out.w || rect.right <= 0)
|
||||
return 0;
|
||||
|
||||
v1.replen = 0;
|
||||
@ -887,7 +887,7 @@ byte AkosRenderer::codec1(int xmoveCur, int ymoveCur) {
|
||||
codec1_ignorePakCols(skip);
|
||||
v1.x = 0;
|
||||
} else {
|
||||
skip = rect.right - _outwidth;
|
||||
skip = rect.right - _out.w;
|
||||
if (skip <= 0) {
|
||||
drawFlag = 2;
|
||||
} else {
|
||||
@ -896,11 +896,11 @@ byte AkosRenderer::codec1(int xmoveCur, int ymoveCur) {
|
||||
}
|
||||
} else {
|
||||
if (!use_scaling)
|
||||
skip = rect.right - _outwidth + 1;
|
||||
skip = rect.right - _out.w + 1;
|
||||
if (skip > 0) {
|
||||
v1.skip_width -= skip;
|
||||
codec1_ignorePakCols(skip);
|
||||
v1.x = _outwidth - 1;
|
||||
v1.x = _out.w - 1;
|
||||
} else {
|
||||
skip = -1 - rect.left;
|
||||
if (skip <= 0)
|
||||
@ -919,18 +919,18 @@ byte AkosRenderer::codec1(int xmoveCur, int ymoveCur) {
|
||||
if (rect.top < 0)
|
||||
rect.top = 0;
|
||||
|
||||
if (rect.top > _outheight)
|
||||
rect.top = _outheight;
|
||||
if (rect.top > _out.h)
|
||||
rect.top = _out.h;
|
||||
|
||||
if (rect.bottom > _outheight)
|
||||
rect.bottom = _outheight;
|
||||
if (rect.bottom > _out.h)
|
||||
rect.bottom = _out.h;
|
||||
|
||||
if (_draw_top > rect.top)
|
||||
_draw_top = rect.top;
|
||||
if (_draw_bottom < rect.bottom)
|
||||
_draw_bottom = rect.bottom;
|
||||
|
||||
v1.destptr = _outptr + v1.y * _outwidth + v1.x;
|
||||
v1.destptr = (byte *)_out.pixels + v1.y * _out.pitch + v1.x;
|
||||
|
||||
codec1_genericDecode();
|
||||
|
||||
@ -956,8 +956,8 @@ byte AkosRenderer::codec5(int xmoveCur, int ymoveCur) {
|
||||
clip.top = _actorY + ymoveCur;
|
||||
clip.right = clip.left + _width;
|
||||
clip.bottom = clip.top + _height;
|
||||
maxw = _outwidth;
|
||||
maxh = _outheight;
|
||||
maxw = _out.w;
|
||||
maxh = _out.h;
|
||||
|
||||
_vm->markRectAsDirty(kMainVirtScreen, clip, _actorID);
|
||||
|
||||
@ -976,7 +976,7 @@ byte AkosRenderer::codec5(int xmoveCur, int ymoveCur) {
|
||||
bdd.srcwidth = _width;
|
||||
bdd.srcheight = _height;
|
||||
bdd.dst = _vm->virtscr[kMainVirtScreen];
|
||||
bdd.dst.pixels = _outptr;
|
||||
bdd.dst.pixels = _out.pixels;
|
||||
bdd.dataptr = _srcptr;
|
||||
bdd.scale_x = 255;
|
||||
bdd.scale_y = 255;
|
||||
@ -1124,8 +1124,8 @@ byte AkosRenderer::codec16(int xmoveCur, int ymoveCur) {
|
||||
clip.top = _actorY + ymoveCur;
|
||||
clip.right = clip.left + _width;
|
||||
clip.bottom = clip.top + _height;
|
||||
maxw = _outwidth;
|
||||
maxh = _outheight;
|
||||
maxw = _out.w;
|
||||
maxh = _out.h;
|
||||
|
||||
if (_vm->_heversion >= 71) {
|
||||
clip.clip(_clipOverride);
|
||||
@ -1169,8 +1169,6 @@ byte AkosRenderer::codec16(int xmoveCur, int ymoveCur) {
|
||||
int32 width_unk, height_unk;
|
||||
|
||||
height_unk = clip.top;
|
||||
int32 pitch = _outwidth;
|
||||
|
||||
int32 dir;
|
||||
|
||||
if (!_mirror) {
|
||||
@ -1202,9 +1200,9 @@ byte AkosRenderer::codec16(int xmoveCur, int ymoveCur) {
|
||||
int32 numskip_before = skip_x + (skip_y * _width);
|
||||
int32 numskip_after = _width - cur_x;
|
||||
|
||||
byte *dst = _outptr + width_unk + height_unk * _outwidth;
|
||||
byte *dst = (byte *)_out.pixels + width_unk + height_unk * _out.pitch;
|
||||
|
||||
akos16Decompress(dst, pitch, _srcptr, cur_x, out_height, dir, numskip_before, numskip_after, transparency, clip.left, clip.top, _zbuf);
|
||||
akos16Decompress(dst, _out.pitch, _srcptr, cur_x, out_height, dir, numskip_before, numskip_after, transparency, clip.left, clip.top, _zbuf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1232,11 +1230,11 @@ byte AkosRenderer::codec32(int xmoveCur, int ymoveCur) {
|
||||
if (_draw_bottom < dst.bottom)
|
||||
_draw_bottom = dst.bottom;
|
||||
|
||||
byte *dstPtr = _outptr + dst.left + dst.top * _outwidth;
|
||||
byte *dstPtr = (byte *)_out.pixels + dst.left + dst.top * _out.pitch;
|
||||
|
||||
for (int i = 0; i < 256; i++)
|
||||
_vm->gdi._wizImagePalette[i] = i;
|
||||
_vm->gdi.decompressWizImage(dstPtr, _outwidth, dst, _srcptr, src);
|
||||
_vm->gdi.decompressWizImage(dstPtr, _out.pitch, dst, _srcptr, src);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -29,13 +29,12 @@ byte BaseCostumeRenderer::drawCostume(const VirtScreen &vs, int numStrips, const
|
||||
int i;
|
||||
byte result = 0;
|
||||
|
||||
_out = vs;
|
||||
if (drawToBackBuf)
|
||||
_outptr = vs.getBackPixels(0, 0);
|
||||
_out.pixels = vs.getBackPixels(0, 0);
|
||||
else
|
||||
_outptr = vs.getPixels(0, 0);
|
||||
_out.pixels = vs.getPixels(0, 0);
|
||||
|
||||
_outwidth = vs.pitch;
|
||||
_outheight = vs.h;
|
||||
_numStrips = numStrips;
|
||||
|
||||
if (_vm->_version == 1) {
|
||||
|
@ -71,8 +71,7 @@ protected:
|
||||
ScummEngine *_vm;
|
||||
|
||||
// Destination
|
||||
byte *_outptr;
|
||||
int _outwidth, _outheight;
|
||||
Graphics::Surface _out;
|
||||
int32 _numStrips;
|
||||
|
||||
// Source pointer
|
||||
@ -119,14 +118,6 @@ public:
|
||||
_width = _height = 0;
|
||||
_skipLimb = 0;
|
||||
_transparency = 0;
|
||||
|
||||
_clipOverride.right = 0;
|
||||
_clipOverride.left = 0;
|
||||
_clipOverride.top = 0;
|
||||
_clipOverride.bottom = 0;
|
||||
|
||||
_outptr = 0;
|
||||
_outwidth = _outheight = 0;
|
||||
}
|
||||
|
||||
virtual void setPalette(byte *palette) = 0;
|
||||
|
@ -157,7 +157,7 @@ byte CostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {
|
||||
|
||||
_scaleIndexX = startScaleIndexX;
|
||||
for (i = 0; i < _width; i++) {
|
||||
if (rect.left >= _outwidth) {
|
||||
if (rect.left >= _out.w) {
|
||||
startScaleIndexX = _scaleIndexX;
|
||||
skip++;
|
||||
}
|
||||
@ -219,10 +219,10 @@ byte CostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {
|
||||
else
|
||||
_vm->markRectAsDirty(kMainVirtScreen, rect.left, rect.right + 1, rect.top, rect.bottom, _actorID);
|
||||
|
||||
if (rect.top >= _outheight || rect.bottom <= 0)
|
||||
if (rect.top >= _out.h || rect.bottom <= 0)
|
||||
return 0;
|
||||
|
||||
if (rect.left >= _outwidth || rect.right <= 0)
|
||||
if (rect.left >= _out.w || rect.right <= 0)
|
||||
return 0;
|
||||
|
||||
v1.replen = 0;
|
||||
@ -237,7 +237,7 @@ byte CostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {
|
||||
v1.x = 0;
|
||||
}
|
||||
} else {
|
||||
skip = rect.right - _outwidth;
|
||||
skip = rect.right - _out.w;
|
||||
if (skip <= 0) {
|
||||
drawFlag = 2;
|
||||
} else {
|
||||
@ -246,12 +246,12 @@ byte CostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {
|
||||
}
|
||||
} else {
|
||||
if (!use_scaling)
|
||||
skip = rect.right - _outwidth;
|
||||
skip = rect.right - _out.w;
|
||||
if (skip > 0) {
|
||||
if (!newAmiCost && _loaded._format != 0x57) {
|
||||
v1.skip_width -= skip;
|
||||
codec1_ignorePakCols(skip);
|
||||
v1.x = _outwidth - 1;
|
||||
v1.x = _out.w - 1;
|
||||
}
|
||||
} else {
|
||||
// V1 games uses 8 x 8 pixels for actors
|
||||
@ -275,11 +275,11 @@ byte CostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {
|
||||
if (rect.top < 0)
|
||||
rect.top = 0;
|
||||
|
||||
if (rect.top > _outheight)
|
||||
rect.top = _outheight;
|
||||
if (rect.top > _out.h)
|
||||
rect.top = _out.h;
|
||||
|
||||
if (rect.bottom > _outheight)
|
||||
rect.bottom = _outheight;
|
||||
if (rect.bottom > _out.h)
|
||||
rect.bottom = _out.h;
|
||||
|
||||
if (_draw_top > rect.top)
|
||||
_draw_top = rect.top;
|
||||
@ -291,7 +291,7 @@ byte CostumeRenderer::mainRoutine(int xmoveCur, int ymoveCur) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
v1.destptr = _outptr + v1.y * _outwidth + v1.x;
|
||||
v1.destptr = (byte *)_out.pixels + v1.y * _out.pitch + v1.x;
|
||||
|
||||
v1.mask_ptr = _vm->getMaskBuffer(0, v1.y, _zbuf);
|
||||
|
||||
@ -374,14 +374,14 @@ void CostumeRenderer::procC64(int actor) {
|
||||
if (!rep)
|
||||
color = *src++;
|
||||
|
||||
if (0 <= y && y < _outheight && 0 <= v1.x && v1.x < _outwidth) {
|
||||
if (0 <= y && y < _out.h && 0 <= v1.x && v1.x < _out.w) {
|
||||
if (!_mirror) {
|
||||
LINE(0, 0); LINE(2, 2); LINE(4, 4); LINE(6, 6);
|
||||
} else {
|
||||
LINE(6, 0); LINE(4, 2); LINE(2, 4); LINE(0, 6);
|
||||
}
|
||||
}
|
||||
dst += _outwidth;
|
||||
dst += _out.pitch;
|
||||
y++;
|
||||
mask += _numStrips;
|
||||
if (!--height) {
|
||||
@ -390,7 +390,7 @@ void CostumeRenderer::procC64(int actor) {
|
||||
height = _height;
|
||||
y = v1.y;
|
||||
v1.x += 8 * v1.scaleXstep;
|
||||
if (v1.x < 0 || v1.x >= _outwidth)
|
||||
if (v1.x < 0 || v1.x >= _out.w)
|
||||
return;
|
||||
mask = v1.mask_ptr;
|
||||
v1.destptr += 8 * v1.scaleXstep;
|
||||
@ -455,7 +455,7 @@ void CostumeRenderer::proc3() {
|
||||
|
||||
do {
|
||||
if (_scaleY == 255 || *scaleytab++ < _scaleY) {
|
||||
masked = (y < 0 || y >= _outheight) || (v1.mask_ptr && (mask[0] & maskbit));
|
||||
masked = (y < 0 || y >= _out.h) || (v1.mask_ptr && (mask[0] & maskbit));
|
||||
|
||||
if (color && !masked) {
|
||||
// FIXME: Fully implement _shadow_mode.in Sam & Max
|
||||
@ -469,7 +469,7 @@ void CostumeRenderer::proc3() {
|
||||
}
|
||||
*dst = pcolor;
|
||||
}
|
||||
dst += _outwidth;
|
||||
dst += _out.pitch;
|
||||
mask += _numStrips;
|
||||
y++;
|
||||
}
|
||||
@ -483,7 +483,7 @@ void CostumeRenderer::proc3() {
|
||||
|
||||
if (_scaleX == 255 || v1.scaletable[_scaleIndexX] < _scaleX) {
|
||||
v1.x += v1.scaleXstep;
|
||||
if (v1.x < 0 || v1.x >= _outwidth)
|
||||
if (v1.x < 0 || v1.x >= _out.w)
|
||||
return;
|
||||
maskbit = revBitMask[v1.x & 7];
|
||||
v1.destptr += v1.scaleXstep;
|
||||
@ -524,9 +524,9 @@ void CostumeRenderer::proc3_ami() {
|
||||
len = *src++;
|
||||
do {
|
||||
if (_scaleY == 255 || v1.scaletable[_scaleIndexY] < _scaleY) {
|
||||
masked = (y < 0 || y >= _outheight) || (v1.mask_ptr && (mask[0] & maskbit));
|
||||
masked = (y < 0 || y >= _out.h) || (v1.mask_ptr && (mask[0] & maskbit));
|
||||
|
||||
if (color && v1.x >= 0 && v1.x < _outwidth && !masked) {
|
||||
if (color && v1.x >= 0 && v1.x < _out.w && !masked) {
|
||||
*dst = _palette[color];
|
||||
}
|
||||
|
||||
@ -542,11 +542,11 @@ void CostumeRenderer::proc3_ami() {
|
||||
if (!--height)
|
||||
return;
|
||||
|
||||
if (y >= _outheight)
|
||||
if (y >= _out.h)
|
||||
return;
|
||||
|
||||
if (v1.x != oldXpos) {
|
||||
dst += _outwidth - (v1.x - oldXpos);
|
||||
dst += _out.pitch - (v1.x - oldXpos);
|
||||
v1.mask_ptr += _numStrips;
|
||||
mask = v1.mask_ptr;
|
||||
y++;
|
||||
|
Loading…
x
Reference in New Issue
Block a user