diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2024-04-22 08:17:10 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2024-04-22 08:17:10 +1000 |
commit | 52dae03aae84afa78a9dbfc68976e99fd1b20ee2 (patch) | |
tree | 90977a5c89733bbe98f8257ae520ceb9f69bd6cd /source/rendering | |
parent | ca1426eabc873f781eb0dd389d45634b7d183250 (diff) |
Add UnifontEx fallback for glyphs that are missing from the current font
Diffstat (limited to 'source/rendering')
-rw-r--r-- | source/rendering/StarFontTextureGroup.cpp | 17 | ||||
-rw-r--r-- | source/rendering/StarFontTextureGroup.hpp | 3 | ||||
-rw-r--r-- | source/rendering/StarTextPainter.cpp | 1 |
3 files changed, 16 insertions, 5 deletions
diff --git a/source/rendering/StarFontTextureGroup.cpp b/source/rendering/StarFontTextureGroup.cpp index fb3a107..d5e6ef9 100644 --- a/source/rendering/StarFontTextureGroup.cpp +++ b/source/rendering/StarFontTextureGroup.cpp @@ -39,13 +39,19 @@ void FontTextureGroup::clearFonts() { m_font = m_defaultFont; } +void FontTextureGroup::setFallbackFont(String const& fontName) { + if (auto font = m_fonts.ptr(fontName)) + m_fallbackFont = *font; +} + const FontTextureGroup::GlyphTexture& FontTextureGroup::glyphTexture(String::Char c, unsigned size, Directives const* processingDirectives) { - auto res = m_glyphs.insert(GlyphDescriptor{c, size, processingDirectives ? processingDirectives->hash() : 0, m_font.get()}, GlyphTexture()); + Font* font = (m_font->exists(c) || !m_fallbackFont) ? m_font.get() : m_fallbackFont.get(); + auto res = m_glyphs.insert(GlyphDescriptor{c, size, processingDirectives ? processingDirectives->hash() : 0, font}, GlyphTexture()); if (res.second) { - m_font->setPixelSize(size); - auto pair = m_font->render(c); + font->setPixelSize(size); + auto pair = font->render(c); Image& image = pair.first; if (processingDirectives) { try { @@ -83,8 +89,9 @@ TexturePtr FontTextureGroup::glyphTexturePtr(String::Char c, unsigned size, Dire } unsigned FontTextureGroup::glyphWidth(String::Char c, unsigned fontSize) { - m_font->setPixelSize(fontSize); - return m_font->width(c); + Font* font = (m_font->exists(c) || !m_fallbackFont) ? m_font.get() : m_fallbackFont.get(); + font->setPixelSize(fontSize); + return font->width(c); } } diff --git a/source/rendering/StarFontTextureGroup.hpp b/source/rendering/StarFontTextureGroup.hpp index 9a32daf..864b44f 100644 --- a/source/rendering/StarFontTextureGroup.hpp +++ b/source/rendering/StarFontTextureGroup.hpp @@ -37,11 +37,14 @@ public: String const& activeFont(); void addFont(FontPtr const& font, String const& name, bool isDefault = false); void clearFonts(); + void setFallbackFont(String const& fontName); + private: CaseInsensitiveStringMap<FontPtr> m_fonts; String m_fontName; FontPtr m_font; FontPtr m_defaultFont; + FontPtr m_fallbackFont; TextureGroupPtr m_textureGroup; HashMap<GlyphDescriptor, GlyphTexture> m_glyphs; diff --git a/source/rendering/StarTextPainter.cpp b/source/rendering/StarTextPainter.cpp index 8198969..19e48f1 100644 --- a/source/rendering/StarTextPainter.cpp +++ b/source/rendering/StarTextPainter.cpp @@ -331,6 +331,7 @@ void TextPainter::reloadFonts() { loadFontsByExtension("ttf"); loadFontsByExtension("woff2"); m_fontTextureGroup.addFont(defaultFont, defaultName, true); + m_fontTextureGroup.setFallbackFont("unifont"); } void TextPainter::cleanup(int64_t timeout) { |