fix uncapped rendering for fizzle and crossfade (#1953)

* reformat and cosmetics
This commit is contained in:
Roman Fomin 2024-10-09 14:44:09 +07:00 committed by GitHub
parent 04f1323554
commit 55d6b31b32
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -60,6 +60,11 @@ static int wipe_initColorXForm(int width, int height, int ticks)
static int wipe_doColorXForm(int width, int height, int ticks) static int wipe_doColorXForm(int width, int height, int ticks)
{ {
if (ticks <= 0)
{
return 0;
}
for (int y = 0; y < height; y++) for (int y = 0; y < height; y++)
{ {
byte *sta = wipe_scr_start + y * width; byte *sta = wipe_scr_start + y * width;
@ -330,9 +335,13 @@ static int wipe_initFizzle(int width, int height, int ticks)
int rndbits = rndbits_x + rndbits_y; int rndbits = rndbits_x + rndbits_y;
if (rndbits < 17) if (rndbits < 17)
{
rndbits = 17; // no problem, just a bit slower rndbits = 17; // no problem, just a bit slower
}
else if (rndbits > 25) else if (rndbits > 25)
{
rndbits = 25; // fizzle fade will not fill whole screen rndbits = 25; // fizzle fade will not fill whole screen
}
rndmask = rndmasks[rndbits - 17]; rndmask = rndmasks[rndbits - 17];
@ -345,6 +354,11 @@ static int wipe_initFizzle(int width, int height, int ticks)
static int wipe_doFizzle(int width, int height, int ticks) static int wipe_doFizzle(int width, int height, int ticks)
{ {
if (ticks <= 0)
{
return false;
}
const int pixperframe = (video.unscaledw * WIPE_ROWS) >> 5; const int pixperframe = (video.unscaledw * WIPE_ROWS) >> 5;
unsigned int rndval = lastrndval; unsigned int rndval = lastrndval;
@ -395,23 +409,21 @@ static int wipe_doFizzle(int width, int height, int ticks)
return false; return false;
} }
static int (*const wipes[])(int, int, int) = { typedef int (*wipefunc_t)(int, int, int);
wipe_NOP,
wipe_NOP, typedef struct
wipe_NOP, {
wipe_exit, wipefunc_t init;
wipe_initMelt, wipefunc_t update;
wipe_doMelt, wipefunc_t render;
wipe_renderMelt, wipefunc_t exit;
wipe_exitMelt, } wipe_t;
wipe_initColorXForm,
wipe_doColorXForm, static wipe_t wipes[] = {
wipe_NOP, {wipe_NOP, wipe_NOP, wipe_NOP, wipe_exit },
wipe_exit, {wipe_initMelt, wipe_doMelt, wipe_renderMelt, wipe_exitMelt},
wipe_initFizzle, {wipe_initColorXForm, wipe_doColorXForm, wipe_NOP, wipe_exit },
wipe_doFizzle, {wipe_initFizzle, wipe_doFizzle, wipe_NOP, wipe_exit },
wipe_NOP,
wipe_exit,
}; };
// killough 3/5/98: reformatted and cleaned up // killough 3/5/98: reformatted and cleaned up
@ -423,15 +435,15 @@ int wipe_ScreenWipe(int wipeno, int x, int y, int width, int height, int ticks)
{ {
go = 1; go = 1;
wipe_scr = I_VideoBuffer; wipe_scr = I_VideoBuffer;
wipes[wipeno*4](width, height, ticks); wipes[wipeno].init(width, height, ticks);
} }
int rc = wipes[wipeno*4+1](width, height, ticks); int rc = wipes[wipeno].update(width, height, ticks);
wipes[wipeno*4+2](width, height, ticks); wipes[wipeno].render(width, height, ticks);
if (rc) // final stuff if (rc) // final stuff
{ {
wipes[wipeno*4+3](width, height, ticks); wipes[wipeno].exit(width, height, ticks);
go = 0; go = 0;
} }
return !go; return !go;