Files
Robin Eklind 66dacd0967 render: clean up inlined asm functions (#553)
* render: clean up inlined asm functions

Now, these functions no longer use references. Instead they
use pointer to pointer.
2019-01-05 22:14:15 +01:00

122 lines
3.2 KiB
C++

static __inline void asm_cel_light_edge(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);
static __inline void asm_cel_light_square(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);
static __inline void asm_trans_light_cel_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);
static __inline void asm_trans_light_edge_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);
static __inline void asm_trans_light_square_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);
static __inline void asm_trans_light_cel_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);
static __inline void asm_trans_light_edge_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);
static __inline void asm_trans_light_square_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);
static __inline unsigned int asm_trans_light_mask(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src, unsigned int mask);
static __inline void asm_cel_light_edge(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)
{
unsigned char l = w >> 1;
if (w & 1) {
(*dst)[0] = tbl[(*src)[0]];
(*src)++;
(*dst)++;
}
if (l & 1) {
(*dst)[0] = tbl[(*src)[0]];
(*dst)[1] = tbl[(*src)[1]];
*src += 2;
*dst += 2;
}
asm_cel_light_square(l >> 1, tbl, dst, src);
}
static __inline void asm_cel_light_square(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)
{
for (; w; --w) {
(*dst)[0] = tbl[(*src)[0]];
(*dst)[1] = tbl[(*src)[1]];
(*dst)[2] = tbl[(*src)[2]];
(*dst)[3] = tbl[(*src)[3]];
*src += 4;
*dst += 4;
}
}
static __inline void asm_trans_light_cel_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)
{
if (!(w & 1)) {
asm_trans_light_edge_1_3(w >> 1, tbl, dst, src);
} else {
(*src)++;
(*dst)++;
asm_trans_light_edge_0_2(w >> 1, tbl, dst, src);
}
}
static __inline void asm_trans_light_edge_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)
{
unsigned char l = w >> 1;
if (w & 1) {
(*dst)[0] = tbl[(*src)[0]];
*src += 2;
*dst += 2;
}
if (l) {
asm_trans_light_square_0_2(l, tbl, dst, src);
}
}
static __inline void asm_trans_light_square_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)
{
for (; w; --w) {
(*dst)[0] = tbl[(*src)[0]];
(*dst)[2] = tbl[(*src)[2]];
*src += 4;
*dst += 4;
}
}
static __inline void asm_trans_light_cel_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)
{
if (!(w & 1)) {
asm_trans_light_edge_0_2(w >> 1, tbl, dst, src);
} else {
(*dst)[0] = tbl[(*src)[0]];
(*src)++;
(*dst)++;
asm_trans_light_edge_1_3(w >> 1, tbl, dst, src);
}
}
static __inline void asm_trans_light_edge_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)
{
unsigned char l = w >> 1;
if (w & 1) {
(*dst)[1] = tbl[(*src)[1]];
*src += 2;
*dst += 2;
}
if (l) {
asm_trans_light_square_1_3(l, tbl, dst, src);
}
}
static __inline void asm_trans_light_square_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)
{
for (; w; --w) {
(*dst)[1] = tbl[(*src)[1]];
(*dst)[3] = tbl[(*src)[3]];
*src += 4;
*dst += 4;
}
}
static __inline unsigned int asm_trans_light_mask(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src, unsigned int mask)
{
for (; w; --w, (*src)++, (*dst)++, mask *= 2) {
if (mask & 0x80000000)
(*dst)[0] = tbl[(*src)[0]];
}
return mask;
}