Add ability to flip fonticons either vertically and horizontally or both with the suffixes +h +v +hv

This commit is contained in:
Jan 2021-09-06 14:46:30 +02:00
parent 677ac700ca
commit 69352103b8
2 changed files with 69 additions and 13 deletions

View File

@ -134,17 +134,45 @@ namespace Components
return nullptr; return nullptr;
} }
bool TextRenderer::IsFontIcon(const char*& text, Game::Material*& fontIconMaterial) bool TextRenderer::IsFontIcon(const char*& text, FontIconInfo& fontIcon)
{ {
const auto* curPos = text; const auto* curPos = text;
while (*curPos != ' ' && *curPos != ':' && *curPos != 0) while (*curPos != ' ' && *curPos != ':' && *curPos != 0 && *curPos != '+')
curPos++; curPos++;
const auto* nameEnd = curPos;
if(*curPos == '+')
{
auto breakArgs = false;
while(!breakArgs)
{
curPos++;
switch(*curPos)
{
case 'h':
fontIcon.flipHorizontal = true;
break;
case 'v':
fontIcon.flipVertical = true;
break;
case ':':
breakArgs = true;
break;
default:
return false;
}
}
}
if (*curPos != ':') if (*curPos != ':')
return false; return false;
const std::string fontIconName(text, curPos - text); const std::string fontIconName(text, nameEnd - text);
auto* materialEntry = Game::DB_FindXAssetEntry(Game::XAssetType::ASSET_TYPE_MATERIAL, fontIconName.data()); auto* materialEntry = Game::DB_FindXAssetEntry(Game::XAssetType::ASSET_TYPE_MATERIAL, fontIconName.data());
if (materialEntry == nullptr) if (materialEntry == nullptr)
@ -154,21 +182,43 @@ namespace Components
return false; return false;
text = curPos + 1; text = curPos + 1;
fontIconMaterial = material; fontIcon.material = material;
return true; return true;
} }
float TextRenderer::DrawFontIcon(Game::Material* fontIconMaterial, const float x, const float y, const float sinAngle, const float cosAngle, const Game::Font_s* font, const float xScale, const float yScale, const unsigned color) float TextRenderer::DrawFontIcon(const FontIconInfo& fontIcon, const float x, const float y, const float sinAngle, const float cosAngle, const Game::Font_s* font, const float xScale, const float yScale, const unsigned color)
{ {
const auto* colorMap = GetFontIconColorMap(fontIconMaterial); const auto* colorMap = GetFontIconColorMap(fontIcon.material);
if (colorMap == nullptr) if (colorMap == nullptr)
return 0; return 0;
float s0, t0, s1, t1;
if(fontIcon.flipHorizontal)
{
s0 = 1.0f;
s1 = 0.0f;
}
else
{
s0 = 0.0f;
s1 = 1.0f;
}
if(fontIcon.flipVertical)
{
t0 = 1.0f;
t1 = 0.0f;
}
else
{
t0 = 0.0f;
t1 = 1.0f;
}
const auto h = static_cast<float>(font->pixelHeight) * yScale; const auto h = static_cast<float>(font->pixelHeight) * yScale;
const auto w = static_cast<float>(font->pixelHeight) * (static_cast<float>(colorMap->width) / static_cast<float>(colorMap->height)) * xScale; const auto w = static_cast<float>(font->pixelHeight) * (static_cast<float>(colorMap->width) / static_cast<float>(colorMap->height)) * xScale;
const auto yy = y - (h + yScale * static_cast<float>(font->pixelHeight)) * 0.5f; const auto yy = y - (h + yScale * static_cast<float>(font->pixelHeight)) * 0.5f;
Game::RB_DrawStretchPicRotate(fontIconMaterial, x, yy, w, h, 0.0, 0.0, 1.0, 1.0, sinAngle, cosAngle, color); Game::RB_DrawStretchPicRotate(fontIcon.material, x, yy, w, h, s0, t0, s1, t1, sinAngle, cosAngle, color);
return w; return w;
} }
@ -356,11 +406,11 @@ namespace Components
if(letter == ':') if(letter == ':')
{ {
Game::Material* fontIconMaterial; FontIconInfo fontIconInfo{};
if(IsFontIcon(curText, fontIconMaterial)) if(IsFontIcon(curText, fontIconInfo))
{ {
RotateXY(cosAngle, sinAngle, startX, startY, xa, xy, &xRot, &yRot); RotateXY(cosAngle, sinAngle, startX, startY, xa, xy, &xRot, &yRot);
xa += DrawFontIcon(fontIconMaterial, xRot, yRot, sinAngle, cosAngle, font, xScale, yScale, ColorRgba(255, 255, 255, finalColor.array[3])); xa += DrawFontIcon(fontIconInfo, xRot, yRot, sinAngle, cosAngle, font, xScale, yScale, ColorRgba(255, 255, 255, finalColor.array[3]));
if (renderFlags & Game::TEXT_RENDERFLAG_PADDING) if (renderFlags & Game::TEXT_RENDERFLAG_PADDING)
xa += xScale * padding; xa += xScale * padding;

View File

@ -42,6 +42,13 @@ namespace Components
class TextRenderer : public Component class TextRenderer : public Component
{ {
struct FontIconInfo
{
Game::Material* material;
bool flipHorizontal;
bool flipVertical;
};
struct HsvColor struct HsvColor
{ {
unsigned char h; unsigned char h;
@ -74,12 +81,11 @@ namespace Components
TextRenderer(); TextRenderer();
private: private:
static unsigned HsvToRgb(HsvColor hsv); static unsigned HsvToRgb(HsvColor hsv);
static Game::GfxImage* GetFontIconColorMap(Game::Material* fontIconMaterial); static Game::GfxImage* GetFontIconColorMap(Game::Material* fontIconMaterial);
static bool IsFontIcon(const char*& text, Game::Material*& fontIconMaterial); static bool IsFontIcon(const char*& text, FontIconInfo& fontIcon);
static float DrawFontIcon(Game::Material* fontIconMaterial, float x, float y, float sinAngle, float cosAngle, const Game::Font_s* font, float xScale, float yScale, unsigned color); static float DrawFontIcon(const FontIconInfo& fontIcon, float x, float y, float sinAngle, float cosAngle, const Game::Font_s* font, float xScale, float yScale, unsigned color);
static float GetMonospaceWidth(Game::Font_s* font, int rendererFlags); static float GetMonospaceWidth(Game::Font_s* font, int rendererFlags);
static void GlowColor(Game::GfxColor* result, Game::GfxColor baseColor, Game::GfxColor forcedGlowColor, int renderFlags); static void GlowColor(Game::GfxColor* result, Game::GfxColor baseColor, Game::GfxColor forcedGlowColor, int renderFlags);