try optimizing deemph vs scale2x (should fix #375)

This commit is contained in:
zeromus 2021-06-17 22:20:04 -04:00
parent 359b5c3786
commit 907af7f87e
3 changed files with 23 additions and 11 deletions

View File

@ -466,7 +466,7 @@ void Blit8To8(uint8 *src, uint8 *dest, int xr, int yr, int pitch, int xscale, in
/* Todo: Make sure 24bpp code works right with big-endian cpus */
//takes a pointer to XBuf and applies fully modern deemph palettizing
u32 ModernDeemphColorMap(u8* src, u8* srcbuf, int xscale, int yscale)
template<int SCALE> static u32 _ModernDeemphColorMap(u8* src, u8* srcbuf)
{
u8 pixel = *src;
@ -476,8 +476,8 @@ u32 ModernDeemphColorMap(u8* src, u8* srcbuf, int xscale, int yscale)
int ofs = src-srcbuf;
int xofs = ofs&255;
int yofs = ofs>>8;
if(xscale!=1) xofs /= xscale; //untested optimization
if(yscale!=1) yofs /= yscale; //untested optimization
xofs /= SCALE;
yofs /= SCALE;
ofs = xofs+yofs*256;
//find out which deemph bitplane value we're on
@ -490,6 +490,15 @@ u32 ModernDeemphColorMap(u8* src, u8* srcbuf, int xscale, int yscale)
return color;
}
u32 ModernDeemphColorMap(u8* src, u8* srcbuf, int scale)
{
if(scale == 1)_ModernDeemphColorMap<1>(src,srcbuf);
else if(scale == 2) _ModernDeemphColorMap<2>(src,srcbuf);
else if(scale == 3) _ModernDeemphColorMap<3>(src,srcbuf);
else if(scale == 4) _ModernDeemphColorMap<4>(src,srcbuf);
else abort();
}
void Blit8ToHigh(uint8 *src, uint8 *dest, int xr, int yr, int pitch, int xscale, int yscale)
{
int x,y;
@ -513,6 +522,9 @@ void Blit8ToHigh(uint8 *src, uint8 *dest, int xr, int yr, int pitch, int xscale,
Blit8To8(src, specbuf8bpp, xr, yr, 256*mult, xscale, yscale, 0, silt);
int mdcmxs = xscale*mult;
int mdcmys = yscale*mult;
if(mdcmxs != mdcmys)
abort();
xr *= mult;
yr *= mult;
@ -528,7 +540,7 @@ void Blit8ToHigh(uint8 *src, uint8 *dest, int xr, int yr, int pitch, int xscale,
{
for(x=xr;x;x--)
{
*(uint32 *)dest=ModernDeemphColorMap(src,specbuf8bpp,mdcmxs, mdcmys);
*(uint32 *)dest=ModernDeemphColorMap(src,specbuf8bpp,mdcmxs);
dest+=4;
src++;
}
@ -541,7 +553,7 @@ void Blit8ToHigh(uint8 *src, uint8 *dest, int xr, int yr, int pitch, int xscale,
{
for(x=xr;x;x--)
{
uint32 tmp=ModernDeemphColorMap(src,specbuf8bpp,mdcmxs, mdcmys);
uint32 tmp=ModernDeemphColorMap(src,specbuf8bpp,mdcmxs);
*(uint8 *)dest=tmp;
*((uint8 *)dest+1)=tmp>>8;
*((uint8 *)dest+2)=tmp>>16;
@ -581,7 +593,7 @@ void Blit8ToHigh(uint8 *src, uint8 *dest, int xr, int yr, int pitch, int xscale,
{
for(x=xr; x; x--)
{
*(uint32 *)dest = ModernDeemphColorMap(src,XBuf,1,1);
*(uint32 *)dest = ModernDeemphColorMap(src,XBuf,1);
dest += 4;
src++;
}
@ -920,7 +932,7 @@ void Blit8ToHigh(uint8 *src, uint8 *dest, int xr, int yr, int pitch, int xscale,
for(x=xr;x;x--)
{
//THE MAIN BLITTING CODEPATH (there may be others that are important)
*(uint32 *)dest = ModernDeemphColorMap(src,XBuf,1,1);
*(uint32 *)dest = ModernDeemphColorMap(src,XBuf,1);
dest+=4;
src++;
}
@ -933,7 +945,7 @@ void Blit8ToHigh(uint8 *src, uint8 *dest, int xr, int yr, int pitch, int xscale,
{
for(x=xr;x;x--)
{
uint32 tmp = ModernDeemphColorMap(src,XBuf,1,1);
uint32 tmp = ModernDeemphColorMap(src,XBuf,1);
*(uint8 *)dest=tmp;
*((uint8 *)dest+1)=tmp>>8;
*((uint8 *)dest+2)=tmp>>16;
@ -949,7 +961,7 @@ void Blit8ToHigh(uint8 *src, uint8 *dest, int xr, int yr, int pitch, int xscale,
{
for(x=xr;x;x--)
{
*(uint16 *)dest = ModernDeemphColorMap(src,XBuf,1,1);
*(uint16 *)dest = ModernDeemphColorMap(src,XBuf,1);
dest+=2;
src++;
}

View File

@ -29,4 +29,4 @@ void Blit32to16(uint32 *src, uint16 *dest, int xr, int yr, int dpitch,
int shiftr[3], int shiftl[3]);
u32 ModernDeemphColorMap(u8* src, u8* srcbuf, int xscale, int yscale);
u32 ModernDeemphColorMap(u8* src, u8* srcbuf, int scale);

View File

@ -582,7 +582,7 @@ int SaveSnapshot(void)
dest++;
for(x=256;x;x--)
{
u32 color = ModernDeemphColorMap(tmp,XBuf,1,1);
u32 color = ModernDeemphColorMap(tmp,XBuf,1);
*dest++=(color>>0x10)&0xFF;
*dest++=(color>>0x08)&0xFF;
*dest++=(color>>0x00)&0xFF;