Skip to content

Commit

Permalink
HUD: Text element color support
Browse files Browse the repository at this point in the history
  • Loading branch information
SmallJoker committed Apr 18, 2024
1 parent 5727d74 commit 3551c2d
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 12 deletions.
2 changes: 2 additions & 0 deletions games/devtest/mods/testhud/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ local font_states = {
{4, "Monospace font"},
{5, "Bold and monospace font"},
{7, "ZOMG all the font styles"},
{7, "Colors test! " .. minetest.colorize("green", "Green") ..
minetest.colorize("red", "\nRed") .. " END"},
}


Expand Down
24 changes: 18 additions & 6 deletions src/client/hud.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "client/renderingengine.h"
#include "client/minimap.h"
#include "gui/touchscreengui.h"
#include "util/enriched_string.h"
#include "irrlicht_changes/CGUITTFont.h"

#define OBJECT_CROSSHAIR_LINE_SIZE 8
#define CROSSHAIR_LINE_SIZE 10
Expand Down Expand Up @@ -377,24 +379,34 @@ void Hud::drawLuaElements(const v3s16 &camera_offset)
(e->style & HUD_STYLE_MONO) ? FM_Mono : FM_Unspecified,
e->style & HUD_STYLE_BOLD, e->style & HUD_STYLE_ITALIC));

irr::gui::CGUITTFont *ttfont = nullptr;
if (textfont->getType() == irr::gui::EGFT_CUSTOM)
ttfont = static_cast<irr::gui::CGUITTFont *>(textfont);

video::SColor color(255, (e->number >> 16) & 0xFF,
(e->number >> 8) & 0xFF,
(e->number >> 0) & 0xFF);
std::wstring text = unescape_translate(utf8_to_wide(e->text));
EnrichedString text(unescape_string(utf8_to_wide(e->text)), color);
core::dimension2d<u32> textsize = textfont->getDimension(text.c_str());

v2s32 offset(0, (e->align.Y - 1.0) * (textsize.Height / 2));
core::rect<s32> size(0, 0, e->scale.X * m_scale_factor,
text_height * e->scale.Y * m_scale_factor);
v2s32 offs(e->offset.X * m_scale_factor,
e->offset.Y * m_scale_factor);
std::wstringstream wss(text);
std::wstring line;
while (std::getline(wss, line, L'\n'))
{

// Draw each line
// See also: GUIFormSpecMenu::parseLabel
size_t str_pos = 0;
while (str_pos < text.size()) {
EnrichedString line = text.getNextLine(&str_pos);

core::dimension2d<u32> linesize = textfont->getDimension(line.c_str());
v2s32 line_offset((e->align.X - 1.0) * (linesize.Width / 2), 0);
textfont->draw(line.c_str(), size + pos + offset + offs + line_offset, color);
if (ttfont)
ttfont->draw(line, size + pos + offset + offs + line_offset);
else
textfont->draw(line.c_str(), size + pos + offset + offs + line_offset, color);
offset.Y += linesize.Height;
}
break; }
Expand Down
7 changes: 1 addition & 6 deletions src/gui/guiFormSpecMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1771,12 +1771,7 @@ void GUIFormSpecMenu::parseLabel(parserData* data, const std::string &element)
size_t str_pos = 0;

for (size_t i = 0; str_pos < str.size(); ++i) {
// Split per line
size_t str_nl = str.getString().find(L'\n', str_pos);
if (str_nl == std::wstring::npos)
str_nl = str.getString().size();
EnrichedString line = str.substr(str_pos, str_nl - str_pos);
str_pos += line.size() + 1;
EnrichedString line = str.getNextLine(&str_pos);

core::rect<s32> rect;

Expand Down
15 changes: 15 additions & 0 deletions src/util/enriched_string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,21 @@ void EnrichedString::operator+=(const EnrichedString &other)
}
}

EnrichedString EnrichedString::getNextLine(size_t *pos) const
{
size_t str_pos = *pos;

// Split per line
size_t str_nl = getString().find(L'\n', str_pos);
if (str_nl == std::wstring::npos)
str_nl = getString().size();
EnrichedString line = substr(str_pos, str_nl - str_pos);
str_pos += line.size() + 1;

*pos = str_pos;
return line;
}

EnrichedString EnrichedString::substr(size_t pos, size_t len) const
{
if (pos >= m_string.length())
Expand Down
1 change: 1 addition & 0 deletions src/util/enriched_string.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class EnrichedString {
// color. The color used will be the one from the last character.
void addCharNoColor(wchar_t c);

EnrichedString getNextLine(size_t *pos) const;
EnrichedString substr(size_t pos = 0, size_t len = std::string::npos) const;
EnrichedString operator+(const EnrichedString &other) const;
void operator+=(const EnrichedString &other);
Expand Down

0 comments on commit 3551c2d

Please sign in to comment.