mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-12 22:02:12 +00:00
Use color look-up table for PNG conversion
This commit is contained in:
parent
f24647dc4d
commit
4e437076c1
5 changed files with 36 additions and 21 deletions
|
@ -499,20 +499,22 @@ static size_t gifframe_size = 8192;
|
|||
// converts an RGB frame to a frame with a palette.
|
||||
//
|
||||
#ifdef HWRENDER
|
||||
static colorlookup_t gif_colorlookup;
|
||||
|
||||
static void GIF_rgbconvert(UINT8 *linear, UINT8 *scr)
|
||||
{
|
||||
UINT8 r, g, b;
|
||||
size_t src = 0, dest = 0;
|
||||
size_t size = (vid.width * vid.height * 3);
|
||||
|
||||
InitColorLUT(gif_framepalette, true);
|
||||
InitColorLUT(&gif_colorlookup, gif_framepalette, true);
|
||||
|
||||
while (src < size)
|
||||
{
|
||||
r = (UINT8)linear[src];
|
||||
g = (UINT8)linear[src + 1];
|
||||
b = (UINT8)linear[src + 2];
|
||||
scr[dest] = GetColorLUTDirect(r, g, b);
|
||||
scr[dest] = GetColorLUTDirect(&gif_colorlookup, r, g, b);
|
||||
src += (3 * scrbuf_downscaleamt);
|
||||
dest += scrbuf_downscaleamt;
|
||||
}
|
||||
|
|
|
@ -52,6 +52,10 @@
|
|||
|
||||
static unsigned char imgbuf[1<<26];
|
||||
|
||||
#ifdef PICTURE_PNG_USELOOKUP
|
||||
static colorlookup_t png_colorlookup;
|
||||
#endif
|
||||
|
||||
/** Converts a picture between two formats.
|
||||
*
|
||||
* \param informat Input picture format.
|
||||
|
@ -964,6 +968,11 @@ void *Picture_PNGConvert(
|
|||
if (outbpp == PICDEPTH_8BPP)
|
||||
memset(flat, TRANSPARENTPIXEL, (width * height));
|
||||
|
||||
#ifdef PICTURE_PNG_USELOOKUP
|
||||
if (outbpp != PICDEPTH_32BPP)
|
||||
InitColorLUT(&png_colorlookup, pMasterPalette, false);
|
||||
#endif
|
||||
|
||||
for (y = 0; y < height; y++)
|
||||
{
|
||||
png_bytep row = row_pointers[y];
|
||||
|
@ -988,7 +997,11 @@ void *Picture_PNGConvert(
|
|||
}
|
||||
else
|
||||
{
|
||||
#ifdef PICTURE_PNG_USELOOKUP
|
||||
UINT8 palidx = GetColorLUT(&png_colorlookup, red, green, blue);
|
||||
#else
|
||||
UINT8 palidx = NearestColor(red, green, blue);
|
||||
#endif
|
||||
if (outbpp == PICDEPTH_16BPP)
|
||||
{
|
||||
UINT16 *outflat = (UINT16 *)flat;
|
||||
|
|
|
@ -113,6 +113,8 @@ void *Picture_PNGConvert(
|
|||
boolean Picture_PNGDimensions(UINT8 *png, INT16 *width, INT16 *height, size_t size);
|
||||
#endif
|
||||
|
||||
#define PICTURE_PNG_USELOOKUP
|
||||
|
||||
// SpriteInfo
|
||||
extern spriteinfo_t spriteinfo[NUMSPRITES];
|
||||
void R_LoadSpriteInfoLumps(UINT16 wadnum, UINT16 numlumps);
|
||||
|
|
|
@ -3667,21 +3667,19 @@ Unoptimized version
|
|||
}
|
||||
|
||||
// Generates a RGB565 color look-up table
|
||||
static colorlookup_t colorlookup;
|
||||
|
||||
void InitColorLUT(RGBA_t *palette, boolean makecolors)
|
||||
void InitColorLUT(colorlookup_t *lut, RGBA_t *palette, boolean makecolors)
|
||||
{
|
||||
size_t palsize = (sizeof(RGBA_t) * 256);
|
||||
|
||||
if (!colorlookup.init || memcmp(colorlookup.palette, palette, palsize))
|
||||
if (!lut->init || memcmp(lut->palette, palette, palsize))
|
||||
{
|
||||
INT32 i;
|
||||
|
||||
colorlookup.init = true;
|
||||
memcpy(colorlookup.palette, palette, palsize);
|
||||
lut->init = true;
|
||||
memcpy(lut->palette, palette, palsize);
|
||||
|
||||
for (i = 0; i < 0xFFFF; i++)
|
||||
colorlookup.table[i] = 0xFFFF;
|
||||
lut->table[i] = 0xFFFF;
|
||||
|
||||
if (makecolors)
|
||||
{
|
||||
|
@ -3692,25 +3690,25 @@ void InitColorLUT(RGBA_t *palette, boolean makecolors)
|
|||
for (b = 0; b < 0xFF; b++)
|
||||
{
|
||||
i = CLUTINDEX(r, g, b);
|
||||
if (colorlookup.table[i] == 0xFFFF)
|
||||
colorlookup.table[i] = NearestPaletteColor(r, g, b, palette);
|
||||
if (lut->table[i] == 0xFFFF)
|
||||
lut->table[i] = NearestPaletteColor(r, g, b, palette);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UINT8 GetColorLUT(UINT8 r, UINT8 g, UINT8 b)
|
||||
UINT8 GetColorLUT(colorlookup_t *lut, UINT8 r, UINT8 g, UINT8 b)
|
||||
{
|
||||
INT32 i = CLUTINDEX(r, g, b);
|
||||
if (colorlookup.table[i] == 0xFFFF)
|
||||
colorlookup.table[i] = NearestPaletteColor(r << 3, g << 2, b << 3, colorlookup.palette);
|
||||
return colorlookup.table[i];
|
||||
if (lut->table[i] == 0xFFFF)
|
||||
lut->table[i] = NearestPaletteColor(r, g, b, lut->palette);
|
||||
return lut->table[i];
|
||||
}
|
||||
|
||||
UINT8 GetColorLUTDirect(UINT8 r, UINT8 g, UINT8 b)
|
||||
UINT8 GetColorLUTDirect(colorlookup_t *lut, UINT8 r, UINT8 g, UINT8 b)
|
||||
{
|
||||
INT32 i = CLUTINDEX(r, g, b);
|
||||
return colorlookup.table[i];
|
||||
return lut->table[i];
|
||||
}
|
||||
|
||||
// V_Init
|
||||
|
|
|
@ -40,10 +40,6 @@ void V_Init(void);
|
|||
// Color look-up table
|
||||
#define CLUTINDEX(r, g, b) (((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3)
|
||||
|
||||
void InitColorLUT(RGBA_t *palette, boolean makecolors);
|
||||
UINT8 GetColorLUT(UINT8 r, UINT8 g, UINT8 b);
|
||||
UINT8 GetColorLUTDirect(UINT8 r, UINT8 g, UINT8 b);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
boolean init;
|
||||
|
@ -51,6 +47,10 @@ typedef struct
|
|||
UINT16 table[0xFFFF];
|
||||
} colorlookup_t;
|
||||
|
||||
void InitColorLUT(colorlookup_t *lut, RGBA_t *palette, boolean makecolors);
|
||||
UINT8 GetColorLUT(colorlookup_t *lut, UINT8 r, UINT8 g, UINT8 b);
|
||||
UINT8 GetColorLUTDirect(colorlookup_t *lut, UINT8 r, UINT8 g, UINT8 b);
|
||||
|
||||
// Set the current RGB palette lookup to use for palettized graphics
|
||||
void V_SetPalette(INT32 palettenum);
|
||||
|
||||
|
|
Loading…
Reference in a new issue