From bae0094039fcb869f6a91b5ab28e689a2b7ea9fc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 23 Feb 2019 19:44:00 +0100 Subject: [PATCH] - fixed the status bar string drawers which weren't UTF-8 capable yet. --- src/g_statusbar/sbarinfo.cpp | 21 +++++++++------------ src/g_statusbar/shared_sbar.cpp | 12 ++++++------ 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 58ad5ac11..964a23d76 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -1356,20 +1356,20 @@ public: { Scale = { 1.,1. }; } - while(*str != '\0') + int ch; + while (ch = GetCharFromString(str), ch != '\0') { - if(*str == ' ') + if(ch == ' ') { if(script->spacingCharacter == '\0') ax += font->GetSpaceWidth(); else ax += font->GetCharWidth((unsigned char) script->spacingCharacter); - str++; continue; } - else if(*str == TEXTCOLOR_ESCAPE) + else if(ch == TEXTCOLOR_ESCAPE) { - EColorRange newColor = V_ParseFontColor(++str, translation, boldTranslation); + EColorRange newColor = V_ParseFontColor(str, translation, boldTranslation); if(newColor != CR_UNDEFINED) fontcolor = newColor; continue; @@ -1377,17 +1377,15 @@ public: int width; if(script->spacingCharacter == '\0') //No monospace? - width = font->GetCharWidth((unsigned char) *str); + width = font->GetCharWidth(ch); else width = font->GetCharWidth((unsigned char) script->spacingCharacter); bool redirected = false; - FTexture* c = font->GetChar((unsigned char) *str, fontcolor, &width); + FTexture* c = font->GetChar(ch, fontcolor, &width); if(c == NULL) //missing character. { - str++; continue; } - int character = (unsigned char)*str; if (script->spacingCharacter == '\0') //If we are monospaced lets use the offset ax += (c->GetDisplayLeftOffset() + 1); //ignore x offsets since we adapt to character size @@ -1441,14 +1439,14 @@ public: double salpha = (Alpha *HR_SHADOW); double srx = rx + (shadowX*Scale.X); double sry = ry + (shadowY*Scale.Y); - screen->DrawChar(font, CR_UNTRANSLATED, srx, sry, character, + screen->DrawChar(font, CR_UNTRANSLATED, srx, sry, ch, DTA_DestWidthF, rw, DTA_DestHeightF, rh, DTA_Alpha, salpha, DTA_FillColor, 0, TAG_DONE); } - screen->DrawChar(font, fontcolor, rx, ry, character, + screen->DrawChar(font, fontcolor, rx, ry, ch, DTA_DestWidthF, rw, DTA_DestHeightF, rh, DTA_Alpha, Alpha, @@ -1457,7 +1455,6 @@ public: ax += width + spacing - (c->GetDisplayLeftOffsetDouble() + 1); else //width gets changed at the call to GetChar() ax += font->GetCharWidth((unsigned char) script->spacingCharacter) + spacing; - str++; } } diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index d1cbe48a3..4a2db9faf 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -1481,15 +1481,15 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d break; case DI_TEXT_ALIGN_RIGHT: if (!monospaced) - x -= static_cast (font->StringWidth(cstring) + (spacing * cstring.Len())); + x -= static_cast (font->StringWidth(cstring) + (spacing * cstring.CharacterCount())); else //monospaced, so just multiply the character size - x -= static_cast ((spacing) * cstring.Len()); + x -= static_cast ((spacing) * cstring.CharacterCount()); break; case DI_TEXT_ALIGN_CENTER: if (!monospaced) - x -= static_cast (font->StringWidth(cstring) + (spacing * cstring.Len())) / 2; + x -= static_cast (font->StringWidth(cstring) + (spacing * cstring.CharacterCount())) / 2; else //monospaced, so just multiply the character size - x -= static_cast ((spacing)* cstring.Len()) / 2; + x -= static_cast ((spacing)* cstring.CharacterCount()) / 2; break; } @@ -1527,7 +1527,7 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d Scale = { 1.,1. }; } int ch; - while (ch = *str++, ch != '\0') + while (ch = GetCharFromString(str), ch != '\0') { if (ch == ' ') { @@ -1543,7 +1543,7 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d } int width; - FTexture* c = font->GetChar((unsigned char)ch, fontcolor, &width); + FTexture* c = font->GetChar(ch, fontcolor, &width); if (c == NULL) //missing character. { continue;