Avoid recreating the color LUT mid-recording-frame

This commit is contained in:
Jaime Passos 2019-12-17 15:37:43 -03:00
parent 0af71fafc5
commit c3f0e6aa44
3 changed files with 17 additions and 12 deletions

View File

@ -33,6 +33,7 @@ consvar_t cv_gif_downscale = {"gif_downscale", "On", CV_SAVE, CV_OnOff, NULL, 0
#ifdef HAVE_ANIGIF #ifdef HAVE_ANIGIF
static boolean gif_optimize = false; // So nobody can do something dumb static boolean gif_optimize = false; // So nobody can do something dumb
static boolean gif_downscale = false; // like changing cvars mid output static boolean gif_downscale = false; // like changing cvars mid output
static RGBA_t *gif_palette = NULL;
static FILE *gif_out = NULL; static FILE *gif_out = NULL;
static INT32 gif_frames = 0; static INT32 gif_frames = 0;
@ -432,13 +433,7 @@ static void GIF_headwrite(void)
// write color table // write color table
{ {
RGBA_t *pal = ((cv_screenshot_colorprofile.value RGBA_t *pal = gif_palette;
#ifdef HWRENDER
&& (rendermode == render_soft)
#endif
) ? pLocalPalette
: pMasterPalette);
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
WRITEUINT8(p, pal[i].s.red); WRITEUINT8(p, pal[i].s.red);
@ -473,7 +468,7 @@ static void hwrconvert(void)
INT32 x, y; INT32 x, y;
size_t i = 0; size_t i = 0;
InitColorLUT(); InitColorLUT(gif_palette);
for (y = 0; y < vid.height; y++) for (y = 0; y < vid.height; y++)
{ {
@ -643,6 +638,16 @@ INT32 GIF_open(const char *filename)
gif_optimize = (!!cv_gif_optimize.value); gif_optimize = (!!cv_gif_optimize.value);
gif_downscale = (!!cv_gif_downscale.value); gif_downscale = (!!cv_gif_downscale.value);
// GIF color table
// In hardware mode, uses the master palette
gif_palette = ((cv_screenshot_colorprofile.value
#ifdef HWRENDER
&& (rendermode == render_soft)
#endif
) ? pLocalPalette
: pMasterPalette);
GIF_headwrite(); GIF_headwrite();
gif_frames = 0; gif_frames = 0;
return 1; return 1;

View File

@ -3251,19 +3251,19 @@ Unoptimized version
UINT8 colorlookup[CLUTSIZE][CLUTSIZE][CLUTSIZE]; UINT8 colorlookup[CLUTSIZE][CLUTSIZE][CLUTSIZE];
void InitColorLUT(void) void InitColorLUT(RGBA_t *palette)
{ {
UINT8 r, g, b; UINT8 r, g, b;
static boolean clutinit = false; static boolean clutinit = false;
static RGBA_t *lastpalette = NULL; static RGBA_t *lastpalette = NULL;
if ((!clutinit) || (lastpalette != pLocalPalette)) if ((!clutinit) || (lastpalette != palette))
{ {
for (r = 0; r < CLUTSIZE; r++) for (r = 0; r < CLUTSIZE; r++)
for (g = 0; g < CLUTSIZE; g++) for (g = 0; g < CLUTSIZE; g++)
for (b = 0; b < CLUTSIZE; b++) for (b = 0; b < CLUTSIZE; b++)
colorlookup[r][g][b] = NearestColor(r << SHIFTCOLORBITS, g << SHIFTCOLORBITS, b << SHIFTCOLORBITS); colorlookup[r][g][b] = NearestColor(r << SHIFTCOLORBITS, g << SHIFTCOLORBITS, b << SHIFTCOLORBITS);
clutinit = true; clutinit = true;
lastpalette = pLocalPalette; lastpalette = palette;
} }
} }

View File

@ -47,7 +47,7 @@ void V_Init(void);
extern UINT8 colorlookup[CLUTSIZE][CLUTSIZE][CLUTSIZE]; extern UINT8 colorlookup[CLUTSIZE][CLUTSIZE][CLUTSIZE];
void InitColorLUT(void); void InitColorLUT(RGBA_t *palette);
// Set the current RGB palette lookup to use for palettized graphics // Set the current RGB palette lookup to use for palettized graphics
void V_SetPalette(INT32 palettenum); void V_SetPalette(INT32 palettenum);