more costume/akos changes

svn-id: r8074
This commit is contained in:
Max Horn 2003-05-29 02:46:06 +00:00
parent 59acd18cee
commit 0a6daf767f
5 changed files with 79 additions and 77 deletions

View File

@ -333,7 +333,7 @@ void AkosRenderer::codec1_genericDecode() {
color = v1.repcolor;
height = _height;
scaleytab = &v1.scaletable[v1.tmp_y];
scaleytab = &v1.scaletable[v1.scaleYindex];
maskbit = revBitMask[v1.x & 7];
mask = v1.mask_ptr + (v1.x >> 3);
@ -363,9 +363,9 @@ void AkosRenderer::codec1_genericDecode() {
height = _height;
y = v1.y;
scaleytab = &v1.scaletable[v1.tmp_y];
scaleytab = &v1.scaletable[v1.scaleYindex];
if (v1.scaletable[v1.tmp_x] < _scaleX) {
if (v1.scaletable[v1.scaleXindex] < _scaleX) {
v1.x += v1.scaleXstep;
if (v1.x < 0 || v1.x >= _vm->_screenWidth)
return;
@ -373,7 +373,7 @@ void AkosRenderer::codec1_genericDecode() {
v1.destptr += v1.scaleXstep;
}
mask = v1.mask_ptr + (v1.x >> 3);
v1.tmp_x += v1.scaleXstep;
v1.scaleXindex += v1.scaleXstep;
dst = v1.destptr;
}
StartPos:;
@ -396,7 +396,7 @@ void AkosRenderer::codec1_spec1() {
color = v1.repcolor;
height = _height;
scaleytab = &v1.scaletable[v1.tmp_y];
scaleytab = &v1.scaletable[v1.scaleYindex];
maskbit = revBitMask[v1.x & 7];
mask = v1.mask_ptr + (v1.x >> 3);
@ -429,9 +429,9 @@ void AkosRenderer::codec1_spec1() {
height = _height;
y = v1.y;
scaleytab = &v1.scaletable[v1.tmp_y];
scaleytab = &v1.scaletable[v1.scaleYindex];
if (v1.scaletable[v1.tmp_x] < _scaleX) {
if (v1.scaletable[v1.scaleXindex] < _scaleX) {
v1.x += v1.scaleXstep;
if (v1.x < 0 || v1.x >= _vm->_screenWidth)
return;
@ -439,7 +439,7 @@ void AkosRenderer::codec1_spec1() {
v1.destptr += v1.scaleXstep;
}
mask = v1.mask_ptr + (v1.x >> 3);
v1.tmp_x += v1.scaleXstep;
v1.scaleXindex += v1.scaleXstep;
dst = v1.destptr;
}
StartPos:;
@ -466,7 +466,7 @@ void AkosRenderer::codec1_spec3() {
color = v1.repcolor;
height = _height;
scaleytab = &v1.scaletable[v1.tmp_y];
scaleytab = &v1.scaletable[v1.scaleYindex];
maskbit = revBitMask[v1.x & 7];
mask = v1.mask_ptr + (v1.x >> 3);
@ -502,9 +502,9 @@ void AkosRenderer::codec1_spec3() {
height = _height;
y = v1.y;
scaleytab = &v1.scaletable[v1.tmp_y];
scaleytab = &v1.scaletable[v1.scaleYindex];
if (v1.scaletable[v1.tmp_x] < _scaleX) {
if (v1.scaletable[v1.scaleXindex] < _scaleX) {
v1.x += v1.scaleXstep;
if (v1.x < 0 || v1.x >= _vm->_screenWidth)
return;
@ -512,7 +512,7 @@ void AkosRenderer::codec1_spec3() {
v1.destptr += v1.scaleXstep;
}
mask = v1.mask_ptr + (v1.x >> 3);
v1.tmp_x += v1.scaleXstep;
v1.scaleXindex += v1.scaleXstep;
dst = v1.destptr;
}
StartPos:;
@ -761,8 +761,8 @@ byte AkosRenderer::codec1() {
tmp_y = 0x180;
}
v1.tmp_x = startScaleIndexX;
v1.tmp_y = tmp_y;
v1.scaleXindex = startScaleIndexX;
v1.scaleYindex = tmp_y;
v1.skip_width = _width;
v1.scaleXstep = -1;

View File

@ -32,7 +32,6 @@ struct AkosOffset;
class AkosRenderer : public BaseCostumeRenderer {
protected:
uint16 codec;
const byte *_srcptr;
// movement of cel to decode
int _xmoveCur, _ymoveCur;
@ -62,7 +61,6 @@ protected:
public:
AkosRenderer(Scumm *scumm) : BaseCostumeRenderer(scumm) {
_srcptr = 0;
akos = 0;
akhd = 0;
akpl = 0;

View File

@ -57,7 +57,7 @@ public:
int _draw_top, _draw_bottom;
// Destination params
// Destination
byte *_outptr;
uint _outwidth, _outheight;
@ -65,6 +65,9 @@ protected:
Scumm *_vm;
int32 _numStrips;
// Source pointer
const byte *_srcptr;
// current move offset
int _xmove, _ymove;
@ -75,14 +78,14 @@ protected:
int _width, _height;
struct {
/* codec stuff */
// Parameters for the original ("V1") costume codec.
const byte *scaletable;
byte mask, shr;
byte repcolor;
byte replen;
int scaleXstep;
int x, y;
int tmp_x, tmp_y;
int scaleXindex, scaleYindex;
int skip_width;
byte *destptr;
const byte *mask_ptr;
@ -101,6 +104,7 @@ public:
_vm = scumm;
_numStrips = _vm->gdi._numStrips;
_srcptr = 0;
_xmove = _ymove = 0;
_mirror = false;
_width = _height = 0;

View File

@ -78,7 +78,7 @@ const byte cost_scaleTable[256] = {
};
byte CostumeRenderer::mainRoutine() {
int xmove, ymove, i, s;
int xmove, ymove, i, skip;
byte drawFlag = 1;
uint scal;
bool use_scaling;
@ -86,6 +86,7 @@ byte CostumeRenderer::mainRoutine() {
int ex1, ex2;
int y_top, y_bottom;
int x_left, x_right;
int step;
const CostumeInfo *costumeInfo;
CHECK_HEAP
@ -126,26 +127,26 @@ byte CostumeRenderer::mainRoutine() {
use_scaling = (_scaleX != 0xFF) || (_scaleY != 0xFF);
s = 0;
skip = 0;
if (use_scaling) {
_scaleIndexXStep = -1;
v1.scaleXstep = -1;
if (xmove < 0) {
xmove = -xmove;
_scaleIndexXStep = 1;
v1.scaleXstep = 1;
}
if (_mirror) {
startScaleIndexX = _scaleIndexX = 128 - xmove;
for (i = 0; i < xmove; i++) {
if (cost_scaleTable[_scaleIndexX++] < _scaleX)
v1.x -= _scaleIndexXStep;
v1.x -= v1.scaleXstep;
}
x_right = x_left = v1.x;
_scaleIndexX = startScaleIndexX;
for (i = 0; i < _width; i++) {
if (x_right < 0) {
s++;
skip++;
startScaleIndexX = _scaleIndexX;
}
scal = cost_scaleTable[_scaleIndexX++];
@ -157,13 +158,13 @@ byte CostumeRenderer::mainRoutine() {
for (i = 0; i < xmove; i++) {
scal = cost_scaleTable[_scaleIndexX--];
if (scal < _scaleX)
v1.x += _scaleIndexXStep;
v1.x += v1.scaleXstep;
}
x_right = x_left = v1.x;
_scaleIndexX = startScaleIndexX;
for (i = 0; i < _width; i++) {
if (x_left > (_vm->_screenWidth - 1)) {
s++;
skip++;
startScaleIndexX = _scaleIndexX;
}
scal = cost_scaleTable[_scaleIndexX--];
@ -172,18 +173,19 @@ byte CostumeRenderer::mainRoutine() {
}
}
_scaleIndexX = startScaleIndexX;
if (s)
s--;
_scaleIndexYStep = -1;
if (skip)
skip--;
step = -1;
if (ymove < 0) {
ymove = -ymove;
_scaleIndexYStep = 1;
step = 1;
}
_scaleIndexY = 128 - ymove;
for (i = 0; i < ymove; i++) {
scal = cost_scaleTable[_scaleIndexY++];
if (scal < _scaleY)
v1.y -= _scaleIndexYStep;
v1.y -= step;
}
y_top = y_bottom = v1.y;
_scaleIndexY = 128 - ymove;
@ -209,10 +211,9 @@ byte CostumeRenderer::mainRoutine() {
y_bottom = y_top + _height;
}
_scaleIndexXStep = -1;
v1.scaleXstep = -1;
if (_mirror)
_scaleIndexXStep = 1;
_ypostop = v1.y;
v1.scaleXstep = 1;
_vm->updateDirtyRect(0, x_left, x_right + 1, y_top, y_bottom, _dirty_id);
@ -225,34 +226,34 @@ byte CostumeRenderer::mainRoutine() {
if (_mirror) {
if (!use_scaling)
s = -v1.x;
if (s > 0) {
_width2 -= s;
ignorePakCols(s);
skip = -v1.x;
if (skip > 0) {
_width2 -= skip;
ignorePakCols(skip);
v1.x = 0;
_docontinue = 1;
} else {
s = x_right - _vm->_screenWidth;
if (s <= 0) {
skip = x_right - _vm->_screenWidth;
if (skip <= 0) {
drawFlag = 2;
} else {
_width2 -= s;
_width2 -= skip;
}
}
} else {
if (!use_scaling)
s = x_right - _vm->_screenWidth;
if (s > 0) {
_width2 -= s;
ignorePakCols(s);
skip = x_right - _vm->_screenWidth;
if (skip > 0) {
_width2 -= skip;
ignorePakCols(skip);
v1.x = _vm->_screenWidth - 1;
_docontinue = 1;
} else {
s = -1 - x_left;
if (s <= 0)
skip = -1 - x_left;
if (skip <= 0)
drawFlag = 2;
else
_width2 -= s;
_width2 -= skip;
}
}
@ -310,7 +311,7 @@ void CostumeRenderer::proc3() {
const byte *mask, *src;
byte *dst;
byte maskbit, len, height, pcolor, width;
int color, t;
int color;
uint y;
bool masked;
@ -359,17 +360,17 @@ void CostumeRenderer::proc3() {
if (!--width)
return;
height = _height;
y = _ypostop;
y = v1.y;
_scaleIndexY = _scaleIndexYTop;
t = _scaleIndexX;
_scaleIndexX += _scaleIndexXStep;
if (_scaleX == 255 || cost_scaleTable[t] < _scaleX) {
v1.x += _scaleIndexXStep;
if (_scaleX == 255 || cost_scaleTable[_scaleIndexX] < _scaleX) {
v1.x += v1.scaleXstep;
if (v1.x < 0 || v1.x >= _vm->_screenWidth)
return;
maskbit = revBitMask[v1.x & 7];
v1.destptr += _scaleIndexXStep;
v1.destptr += v1.scaleXstep;
}
_scaleIndexX += v1.scaleXstep;
dst = v1.destptr;
mask = v1.mask_ptr + (v1.x >> 3);
}
@ -382,7 +383,7 @@ void CostumeRenderer::proc3_ami() {
const byte *mask, *src;
byte *dst;
byte maskbit, len, height, width;
int color, t;
int color;
uint y;
bool masked;
int oldXpos, oldScaleIndexX;
@ -411,13 +412,12 @@ void CostumeRenderer::proc3_ami() {
*dst = _palette[color];
}
t = _scaleIndexX;
_scaleIndexX = t + _scaleIndexXStep;
if (_scaleX == 255 || cost_scaleTable[t] < _scaleX) {
v1.x += _scaleIndexXStep;
dst += _scaleIndexXStep;
if (_scaleX == 255 || cost_scaleTable[_scaleIndexX] < _scaleX) {
v1.x += v1.scaleXstep;
dst += v1.scaleXstep;
maskbit = revBitMask[v1.x & 7];
}
_scaleIndexX += v1.scaleXstep;
mask = v1.mask_ptr + (v1.x >> 3);
}
if (!--width) {
@ -487,19 +487,24 @@ void LoadedCostume::loadCostume(int id) {
byte CostumeRenderer::drawLimb(const CostumeData &cost, int limb) {
int i;
int code;
const byte *frameptr;
// If the specified limb is stopped or not existing, do nothing.
if (cost.curpos[limb] == 0xFFFF || cost.stopped & (1 << limb))
return 0;
// Determine the position the limb is at
i = cost.curpos[limb] & 0x7FFF;
_frameptr = _loaded._baseptr + READ_LE_UINT16(_loaded._ptr + _loaded._numColors + limb * 2 + 10);
code = _loaded._dataptr[i] & 0x7F;
_srcptr = _loaded._baseptr + READ_LE_UINT16(_frameptr + code * 2);
// Get the base pointer for that limb
frameptr = _loaded._baseptr + READ_LE_UINT16(_loaded._ptr + _loaded._numColors + limb * 2 + 10);
// Determine the offset to the costume data for the limb at position i
code = _loaded._dataptr[i] & 0x7F;
// Code 0x7B indicates a limb for which there is nothing to draw
if (code != 0x7B) {
_srcptr = _loaded._baseptr + READ_LE_UINT16(frameptr + code * 2);
if (!(_vm->_features & GF_OLD256) || code < 0x79)
return mainRoutine();
}
@ -513,11 +518,11 @@ int Scumm::cost_frameToAnim(Actor *a, int frame) {
}
void Scumm::cost_decodeData(Actor *a, int frame, uint usemask) {
byte *r;
const byte *r;
uint mask, j;
int i;
byte extra, cmd;
byte *dataptr;
const byte *dataptr;
int anim;
LoadedCostume lc(this);

View File

@ -28,9 +28,9 @@ protected:
Scumm *_vm;
public:
byte *_ptr;
byte *_baseptr;
byte *_dataptr;
const byte *_ptr;
const byte *_baseptr;
const byte *_dataptr;
byte _numColors;
LoadedCostume(Scumm *vm) : _vm(vm), _ptr(0), _dataptr(0), _numColors(0) {}
@ -47,16 +47,11 @@ class CostumeRenderer : public BaseCostumeRenderer {
protected:
LoadedCostume _loaded;
byte *_frameptr;
const byte *_srcptr;
bool _use_mask, _use_charset_mask;
byte _width2;
int _scaleIndexXStep;
int _scaleIndexYStep;
byte _scaleIndexX; /* must wrap at 256 */
byte _scaleIndexY, _scaleIndexYTop;
int _ypostop;
byte _docontinue;
byte _palette[32];