From 8182c80f1e6b9ef82228eccc9b1b0bc8feef1611 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers <coelckers@users.noreply.github.com> Date: Wed, 10 Apr 2019 00:15:25 +0200 Subject: [PATCH] - use the Unicode font for the scoreboard. --- src/hu_scores.cpp | 63 +++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/src/hu_scores.cpp b/src/hu_scores.cpp index 26252c7bb..c8164499a 100644 --- a/src/hu_scores.cpp +++ b/src/hu_scores.cpp @@ -130,6 +130,9 @@ void HU_SortPlayers */ bool SB_ForceActive = false; +static FFont *displayFont; +static int FontScale; + // PRIVATE DATA DEFINITIONS ------------------------------------------------ @@ -143,6 +146,9 @@ bool SB_ForceActive = false; void HU_DrawScores (player_t *player) { + displayFont = NewSmallFont; + FontScale = MAX(screen->GetHeight() / 400, 1); + if (deathmatch) { if (teamplay) @@ -195,7 +201,7 @@ void HU_DrawScores (player_t *player) void HU_GetPlayerWidths(int &maxnamewidth, int &maxscorewidth, int &maxiconheight) { - maxnamewidth = SmallFont->StringWidth("Name"); + maxnamewidth = displayFont->StringWidth("Name"); maxscorewidth = 0; maxiconheight = 0; @@ -203,7 +209,7 @@ void HU_GetPlayerWidths(int &maxnamewidth, int &maxscorewidth, int &maxiconheigh { if (playeringame[i]) { - int width = SmallFont->StringWidth(players[i].userinfo.GetName()); + int width = displayFont->StringWidth(players[i].userinfo.GetName()); if (width > maxnamewidth) { maxnamewidth = width; @@ -235,6 +241,11 @@ void HU_GetPlayerWidths(int &maxnamewidth, int &maxscorewidth, int &maxiconheigh // //========================================================================== +static void HU_DrawFontScaled(double x, double y, int color, const char *text) +{ + screen->DrawText(displayFont, color, x / FontScale, y / FontScale, text, DTA_VirtualWidth, screen->GetWidth() / FontScale, DTA_VirtualHeight, screen->GetHeight() / FontScale, TAG_END); +} + static void HU_DoDrawScores (player_t *player, player_t *sortedplayers[MAXPLAYERS]) { int color; @@ -258,7 +269,7 @@ static void HU_DoDrawScores (player_t *player, player_t *sortedplayers[MAXPLAYER } HU_GetPlayerWidths(maxnamewidth, maxscorewidth, maxiconheight); - height = SmallFont->GetHeight() * CleanYfac; + height = displayFont->GetHeight() * FontScale; lineheight = MAX(height, maxiconheight * CleanYfac); ypadding = (lineheight - height + 1) / 2; @@ -327,23 +338,16 @@ static void HU_DoDrawScores (player_t *player, player_t *sortedplayers[MAXPLAYER *text_name = GStrings("SCORE_NAME"), *text_delay = GStrings("SCORE_DELAY"); - col2 = (SmallFont->StringWidth(text_color) + 8) * CleanXfac; - col3 = col2 + (SmallFont->StringWidth(text_frags) + 8) * CleanXfac; - col4 = col3 + maxscorewidth * CleanXfac; - col5 = col4 + (maxnamewidth + 8) * CleanXfac; - x = (SCREENWIDTH >> 1) - (((SmallFont->StringWidth(text_delay) * CleanXfac) + col5) >> 1); + col2 = (displayFont->StringWidth(text_color) + 16) * FontScale; + col3 = col2 + (displayFont->StringWidth(text_frags) + 16) * FontScale; + col4 = col3 + maxscorewidth * FontScale; + col5 = col4 + (maxnamewidth + 16) * FontScale; + x = (SCREENWIDTH >> 1) - (((displayFont->StringWidth(text_delay) * FontScale) + col5) >> 1); - screen->DrawText (SmallFont, color, x, y, text_color, - DTA_CleanNoMove, true, TAG_DONE); - - screen->DrawText (SmallFont, color, x + col2, y, text_frags, - DTA_CleanNoMove, true, TAG_DONE); - - screen->DrawText (SmallFont, color, x + col4, y, text_name, - DTA_CleanNoMove, true, TAG_DONE); - - screen->DrawText(SmallFont, color, x + col5, y, text_delay, - DTA_CleanNoMove, true, TAG_DONE); + //HU_DrawFontScaled(x, y, color, text_color); + HU_DrawFontScaled(x + col2, y, color, text_frags); + HU_DrawFontScaled(x + col4, y, color, text_name); + HU_DrawFontScaled(x + col5, y, color, text_delay); y += height + 6 * CleanYfac; bottom -= height; @@ -385,9 +389,8 @@ static void HU_DrawTimeRemaining (int y) mysnprintf (str, countof(str), "Level ends in %d:%02d:%02d", hours, minutes, seconds); else mysnprintf (str, countof(str), "Level ends in %d:%02d", minutes, seconds); - - screen->DrawText (SmallFont, CR_GREY, SCREENWIDTH/2 - SmallFont->StringWidth (str)/2*CleanXfac, - y, str, DTA_CleanNoMove, true, TAG_DONE); + + HU_DrawFontScaled(SCREENWIDTH / 2 - displayFont->StringWidth(str) / 2 * FontScale, y, CR_GRAY, str); } } @@ -407,7 +410,7 @@ static void HU_DrawPlayer (player_t *player, bool highlight, int col1, int col2, // The teamplay mode uses colors to show teams, so we need some // other way to do highlighting. And it may as well be used for // all modes for the sake of consistancy. - screen->Dim(MAKERGB(200,245,255), 0.125f, col1 - 12*CleanXfac, y - 1, col5 + (maxnamewidth + 24)*CleanXfac, height + 2); + screen->Dim(MAKERGB(200,245,255), 0.125f, col1 - 12*FontScale, y - 1, col5 + (maxnamewidth + 24)*FontScale, height + 2); } col2 += col1; @@ -419,8 +422,7 @@ static void HU_DrawPlayer (player_t *player, bool highlight, int col1, int col2, HU_DrawColorBar(col1, y, height, (int)(player - players)); mysnprintf (str, countof(str), "%d", deathmatch ? player->fragcount : player->killcount); - screen->DrawText (SmallFont, color, col2, y + ypadding, player->playerstate == PST_DEAD && !deathmatch ? "DEAD" : str, - DTA_CleanNoMove, true, TAG_DONE); + HU_DrawFontScaled(col2, y + ypadding, color, player->playerstate == PST_DEAD && !deathmatch ? "DEAD" : str); auto icon = FSetTextureID(player->mo->IntVar(NAME_ScoreIcon)); if (icon.isValid()) @@ -431,8 +433,7 @@ static void HU_DrawPlayer (player_t *player, bool highlight, int col1, int col2, TAG_DONE); } - screen->DrawText (SmallFont, color, col4, y + ypadding, player->userinfo.GetName(), - DTA_CleanNoMove, true, TAG_DONE); + HU_DrawFontScaled(col4, y + ypadding, color, player->userinfo.GetName()); int avgdelay = 0; for (int i = 0; i < BACKUPTICS; i++) @@ -443,8 +444,7 @@ static void HU_DrawPlayer (player_t *player, bool highlight, int col1, int col2, mysnprintf(str, countof(str), "%d", (avgdelay * ticdup) * (1000 / TICRATE)); - screen->DrawText(SmallFont, color, col5, y + ypadding, str, - DTA_CleanNoMove, true, TAG_DONE); + HU_DrawFontScaled(col5, y + ypadding, color, str); if (teamplay && Teams[player->userinfo.GetTeam()].GetLogo().IsNotEmpty ()) { @@ -467,7 +467,10 @@ void HU_DrawColorBar(int x, int y, int height, int playernum) D_GetPlayerColor (playernum, &h, &s, &v, NULL); HSVtoRGB (&r, &g, &b, h, s, v); - screen->Clear (x, y, x + 24*CleanXfac, y + height, -1, + //float aspect = ActiveRatio(SCREENWIDTH, SCREENHEIGHT); + //if (!AspectTallerThanWide(aspect)) x += (screen->GetWidth() - AspectBaseWidth(aspect)) / 2; + + screen->Clear (x, y, x + 24*FontScale, y + height, -1, MAKEARGB(255,clamp(int(r*255.f),0,255), clamp(int(g*255.f),0,255), clamp(int(b*255.f),0,255)));