optional solid color status bar background for widescreen mode (#655)

* optional solid-colored status bar background

Fixes #651

* Update m_misc.c

* parametrize "analyzation depth"

* tune down to half saturation

* minor clean-up
This commit is contained in:
Fabian Greffrath 2022-07-14 09:04:50 +02:00 committed by GitHub
parent 399e88c97e
commit b9abe20746
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 100 additions and 30 deletions

View File

@ -3801,6 +3801,7 @@ enum {
general_swirl,
general_smoothlight,
general_brightmaps,
general_solidbackground,
general_stub2,
general_diskicon,
general_hom,
@ -3928,6 +3929,9 @@ setup_menu_t gen_settings2[] = { // General Settings screen2
{"Brightmaps for Textures and Sprites", S_YESNO, m_null, M_X,
G_Y3 + general_brightmaps*M_SPC, {"brightmaps"}},
{"Solid Status Bar Background", S_YESNO, m_null, M_X,
G_Y3 + general_solidbackground*M_SPC, {"st_solidbackground"}},
{"", S_SKIP, m_null, M_X, M_Y + general_stub2*M_SPC},
{"Flash Icon During Disk IO", S_YESNO, m_null, M_X,

View File

@ -255,7 +255,14 @@ default_t defaults[] = {
{0}, {0,1}, number, ss_gen, wad_yes,
"1 to enable brightmaps for textures and sprites"
},
{
"st_solidbackground",
(config_t *) &st_solidbackground, NULL,
{0}, {0,1}, number, ss_gen, wad_yes,
"1 for solid color status bar background in widescreen mode"
},
{
"gamma2",
(config_t *) &gamma2, NULL,

View File

@ -333,52 +333,109 @@ extern char *mapnames[];
void ST_Stop(void);
int st_solidbackground;
void ST_refreshBackground(boolean force)
{
if (st_classicstatusbar)
{
// [crispy] this is our own local copy of R_FillBackScreen() to
// fill the entire background of st_backing_screen with the bezel pattern,
// so it appears to the left and right of the status bar in widescreen mode
if (SCREENWIDTH != ST_WIDTH)
{
int x, y;
byte *src;
byte *dest;
const char *name = (gamemode == commercial) ? "GRNROCK" : "FLOOR7_2";
byte *dest = screens[BG];
src = W_CacheLumpNum(firstflat + R_FlatNumForName(name), PU_CACHE);
dest = screens[BG];
if (hires)
if (st_solidbackground)
{
for (y = (SCREENHEIGHT-ST_HEIGHT)<<1; y < SCREENHEIGHT<<1; y++)
for (x = 0; x < SCREENWIDTH<<1; x += 2)
{
const byte dot = src[(((y>>1)&63)<<6) + ((x>>1)&63)];
// [FG] calculate average color of the 16px left and right of the status bar
const int vstep[][2] = {{0, 1}, {1, 2}, {2, ST_HEIGHT}};
const int hstep = hires ? (4 * SCREENWIDTH) : SCREENWIDTH;
const int w = SHORT(sbar->width);
const int depth = 16;
byte *pal = W_CacheLumpName("PLAYPAL", PU_STATIC);
int v;
*dest++ = dot;
*dest++ = dot;
// [FG] temporarily draw status bar to background buffer
V_DrawPatch(ST_X, 0, BG, sbar);
// [FG] separate colors for the top rows
for (v = 0; v < arrlen(vstep); v++)
{
const int v0 = vstep[v][0], v1 = vstep[v][1];
unsigned r = 0, g = 0, b = 0;
byte col;
for (y = v0; y < v1; y++)
{
for (x = 0; x < depth; x++)
{
byte *c = dest + y * hstep + ((x + WIDESCREENDELTA) << hires);
r += pal[3 * c[0] + 0];
g += pal[3 * c[0] + 1];
b += pal[3 * c[0] + 2];
c += (w - 2 * x - 1) << hires;
r += pal[3 * c[0] + 0];
g += pal[3 * c[0] + 1];
b += pal[3 * c[0] + 2];
}
}
r /= 2 * depth * (v1 - v0);
g /= 2 * depth * (v1 - v0);
b /= 2 * depth * (v1 - v0);
// [FG] tune down to half saturation (for empiric reasons)
col = I_GetPaletteIndex(pal, r/2, g/2, b/2);
// [FG] fill background buffer with average status bar color
for (y = (v0 << hires); y < (v1 << hires); y++)
{
memset(dest + y * (SCREENWIDTH << hires), col, (SCREENWIDTH << hires));
}
}
Z_ChangeTag (pal, PU_CACHE);
}
else
{
for (y = SCREENHEIGHT-ST_HEIGHT; y < SCREENHEIGHT; y++)
for (x = 0; x < SCREENWIDTH; x++)
{
*dest++ = src[((y&63)<<6) + (x&63)];
}
}
// [crispy] this is our own local copy of R_FillBackScreen() to
// fill the entire background of st_backing_screen with the bezel pattern,
// so it appears to the left and right of the status bar in widescreen mode
byte *src;
const char *name = (gamemode == commercial) ? "GRNROCK" : "FLOOR7_2";
// [crispy] preserve bezel bottom edge
if (scaledviewwidth == SCREENWIDTH)
{
patch_t *const patch = W_CacheLumpName("brdr_b", PU_CACHE);
src = W_CacheLumpNum(firstflat + R_FlatNumForName(name), PU_CACHE);
for (x = 0; x < WIDESCREENDELTA; x += 8)
if (hires)
{
V_DrawPatch(x - WIDESCREENDELTA, 0, BG, patch);
V_DrawPatch(ORIGWIDTH + WIDESCREENDELTA - x - 8, 0, BG, patch);
for (y = (SCREENHEIGHT-ST_HEIGHT)<<1; y < SCREENHEIGHT<<1; y++)
for (x = 0; x < SCREENWIDTH<<1; x += 2)
{
const byte dot = src[(((y>>1)&63)<<6) + ((x>>1)&63)];
*dest++ = dot;
*dest++ = dot;
}
}
else
{
for (y = SCREENHEIGHT-ST_HEIGHT; y < SCREENHEIGHT; y++)
for (x = 0; x < SCREENWIDTH; x++)
{
*dest++ = src[((y&63)<<6) + (x&63)];
}
}
// [crispy] preserve bezel bottom edge
if (scaledviewwidth == SCREENWIDTH)
{
patch_t *const patch = W_CacheLumpName("brdr_b", PU_CACHE);
for (x = 0; x < WIDESCREENDELTA; x += 8)
{
V_DrawPatch(x - WIDESCREENDELTA, 0, BG, patch);
V_DrawPatch(ORIGWIDTH + WIDESCREENDELTA - x - 8, 0, BG, patch);
}
}
}
}

View File

@ -95,6 +95,8 @@ extern int sts_traditional_keys; // display keys the traditional way
extern int hud_backpack_thresholds; // backpack changes thresholds
extern int hud_armor_type; // color of armor depends on type
extern int st_solidbackground;
#endif
//----------------------------------------------------------------------------