From 50ef07c339ca721f9f597c5c04b2cd7935cda053 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20B=C3=A1lint=20Misius?= Date: Fri, 23 Dec 2022 07:39:58 +0100 Subject: [PATCH] Add underline escape sequence to text renderer This allows us to do underline the app name in the intro text correctly. More important than it used to be now that the app name can be changed. --- data/IntroText.h | 4 ++-- src/graphics/RasterDrawMethods.inl | 31 ++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/data/IntroText.h b/data/IntroText.h index c53517ef4..c7ce4bd12 100644 --- a/data/IntroText.h +++ b/data/IntroText.h @@ -2,8 +2,8 @@ #include "Config.h" const char *const introTextData = - "\bl" APPNAME " - Version " MTOS(SAVE_VERSION) "." MTOS(MINOR_VERSION) " - https://powdertoy.co.uk, irc.libera.chat #powder, https://tpt.io/discord\n" - "\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\xEE\x81\xA9\n" + "\bl\bU" APPNAME "\bU - Version " MTOS(SAVE_VERSION) "." MTOS(MINOR_VERSION) " - https://powdertoy.co.uk, irc.libera.chat #powder, https://tpt.io/discord\n" + "\n" "\n" "\bgControl+C/V/X are Copy, Paste and cut respectively.\n" "\bgTo choose a material, hover over one of the icons on the right, it will show a selection of elements in that group.\n" diff --git a/src/graphics/RasterDrawMethods.inl b/src/graphics/RasterDrawMethods.inl index 08220a6a8..c4f35154b 100644 --- a/src/graphics/RasterDrawMethods.inl +++ b/src/graphics/RasterDrawMethods.inl @@ -17,6 +17,7 @@ int PIXELMETHODS_CLASS::drawtext(int x, int y, const String &str, int r, int g, if(!str.size()) return 0; + bool underline = false; int invert = 0; int oR = r, oG = g, oB = b; int characterX = x, characterY = y; @@ -57,18 +58,20 @@ int PIXELMETHODS_CLASS::drawtext(int x, int y, const String &str, int r, int g, { if (str.length() <= i + 1) break; + auto colorCode = false; switch (str[i + 1]) { - case 'w': r = 255; g = 255; b = 255; break; - case 'g': r = 192; g = 192; b = 192; break; - case 'o': r = 255; g = 216; b = 32; break; - case 'r': r = 255; g = 0; b = 0; break; - case 'l': r = 255; g = 75; b = 75; break; - case 'b': r = 0; g = 0; b = 255; break; - case 't': b = 255; g = 170; r = 32; break; - case 'u': r = 147; g = 83; b = 211; break; + case 'U': underline = !underline; break; + case 'w': r = 255; g = 255; b = 255; colorCode = true; break; + case 'g': r = 192; g = 192; b = 192; colorCode = true; break; + case 'o': r = 255; g = 216; b = 32; colorCode = true; break; + case 'r': r = 255; g = 0; b = 0; colorCode = true; break; + case 'l': r = 255; g = 75; b = 75; colorCode = true; break; + case 'b': r = 0; g = 0; b = 255; colorCode = true; break; + case 't': b = 255; g = 170; r = 32; colorCode = true; break; + case 'u': r = 147; g = 83; b = 211; colorCode = true; break; } - if(invert) + if (colorCode && invert) { r = 255-r; g = 255-g; @@ -78,7 +81,15 @@ int PIXELMETHODS_CLASS::drawtext(int x, int y, const String &str, int r, int g, } else { - characterX = drawchar(characterX, characterY, str[i], r, g, b, a); + auto newCharacterX = drawchar(characterX, characterY, str[i], r, g, b, a); + if (underline) + { + for (int i = characterX; i < newCharacterX; ++i) + { + blendpixel(i, y + FONT_H, r, g, b, a); + } + } + characterX = newCharacterX; } } return x;