126 lines
3 KiB
C++
126 lines
3 KiB
C++
#include "native.h"
|
|
#include "endianutils.h"
|
|
|
|
#define MAIN_TYPE CostumeProc3Type
|
|
#include "macros.h"
|
|
|
|
#define MSETPTR(type, member) v1.member = _GETPTR(v1comp, V1CodecType, member, type);
|
|
#define MSET32(type, member) v1.member = _GET32(v1comp, V1CodecType, member, type);
|
|
#define MSET8(type, member) v1.member = _GET8(v1comp, V1CodecType, member, type);
|
|
|
|
UInt32 CostumeRenderer_proc3(void *userData68KP) {
|
|
// import variables
|
|
V1Type v1;
|
|
|
|
SETPTRV (V1CodecType * , v1, v1comp )
|
|
|
|
SETPTR (const byte * ,_srcptr )
|
|
SET32 (int ,_height )
|
|
SET8 (byte ,_scaleIndexX )
|
|
SET8 (byte ,_scaleIndexY )
|
|
SET8 (byte ,_scaleX )
|
|
SET8 (byte ,_scaleY )
|
|
SET32 (int32 ,_numStrips )
|
|
SET32 (int ,_out_pitch )
|
|
SET32 (int ,_out_w )
|
|
SET32 (int ,_out_h )
|
|
SETPTR (byte * ,_shadow_table )
|
|
SETPTR (byte * ,_palette )
|
|
SET8 (byte ,_shadow_mode )
|
|
|
|
MSETPTR (const byte * ,scaletable )
|
|
MSET8 (byte ,mask )
|
|
MSET8 (byte ,shr )
|
|
MSET8 (byte ,repcolor )
|
|
MSET8 (byte ,replen )
|
|
MSET32 (int ,scaleXstep )
|
|
MSET32 (int ,x )
|
|
MSET32 (int ,y )
|
|
MSET32 (int ,scaleXindex )
|
|
MSET32 (int ,scaleYindex )
|
|
MSET32 (int ,skip_width )
|
|
MSETPTR (byte * ,destptr )
|
|
MSETPTR (byte * ,mask_ptr )
|
|
// end of import
|
|
|
|
const byte *mask, *src;
|
|
byte *dst;
|
|
byte len, maskbit;
|
|
int y;
|
|
uint color, height, pcolor;
|
|
const byte *scaleytab;
|
|
bool masked;
|
|
|
|
y = v1.y;
|
|
src = _srcptr;
|
|
dst = v1.destptr;
|
|
len = v1.replen;
|
|
color = v1.repcolor;
|
|
height = _height;
|
|
|
|
scaleytab = &v1.scaletable[_scaleIndexY];
|
|
maskbit = revBitMask(v1.x & 7);
|
|
mask = v1.mask_ptr + v1.x / 8;
|
|
|
|
if (len)
|
|
goto StartPos;
|
|
|
|
do {
|
|
len = *src++;
|
|
color = len >> v1.shr;
|
|
len &= v1.mask;
|
|
if (!len)
|
|
len = *src++;
|
|
|
|
do {
|
|
if (_scaleY == 255 || *scaleytab++ < _scaleY) {
|
|
masked = (y < 0 || y >= _out_h) || (v1.mask_ptr && (mask[0] & maskbit));
|
|
|
|
if (color && !masked) {
|
|
// FIXME: Fully implement _shadow_mode.in Sam & Max
|
|
// For now, it's enough for transparency.
|
|
if (_shadow_mode & 0x20) {
|
|
pcolor = _shadow_table[*dst];
|
|
} else {
|
|
pcolor = _palette[color];
|
|
if (pcolor == 13 && _shadow_table)
|
|
pcolor = _shadow_table[*dst];
|
|
}
|
|
*dst = pcolor;
|
|
}
|
|
dst += _out_w;
|
|
mask += _numStrips;
|
|
y++;
|
|
}
|
|
if (!--height) {
|
|
if (!--v1.skip_width)
|
|
//return _scaleIndexX;
|
|
goto end_jump;
|
|
height = _height;
|
|
y = v1.y;
|
|
|
|
scaleytab = &v1.scaletable[_scaleIndexY];
|
|
|
|
|
|
if (_scaleX == 255 || v1.scaletable[_scaleIndexX] < _scaleX) {
|
|
v1.x += v1.scaleXstep;
|
|
if (v1.x < 0 || v1.x >= _out_w)
|
|
//return _scaleIndexX;
|
|
goto end_jump;
|
|
maskbit = revBitMask(v1.x & 7);
|
|
v1.destptr += v1.scaleXstep;
|
|
}
|
|
_scaleIndexX += v1.scaleXstep;
|
|
dst = v1.destptr;
|
|
mask = v1.mask_ptr + v1.x / 8;
|
|
}
|
|
StartPos:;
|
|
} while (--len);
|
|
} while (1);
|
|
|
|
end_jump:
|
|
// v1comp->x = ByteSwap32(v1.x);
|
|
// v1comp->destptr = (byte *)ByteSwap32(v1.destptr);
|
|
|
|
return _scaleIndexX;
|
|
}
|