From d638a6092bd6291c983490ba3f966162c7ca06c2 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 31 Oct 2020 09:46:32 +0100 Subject: Load fonts on demand --- src/Text.cpp | 54 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 20 deletions(-) (limited to 'src/Text.cpp') diff --git a/src/Text.cpp b/src/Text.cpp index 360f290..9650964 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -1,4 +1,5 @@ #include "../include/Text.hpp" +#include "../include/FontLoader.hpp" #include #include #include @@ -24,11 +25,10 @@ namespace QuickMedia return -1; } - Text::Text(const sf::Font *_font, const sf::Font *_cjk_font) : Text("", _font, _cjk_font, 0, 0.0f) {} + Text::Text(bool bold_font) : Text("", bold_font, 0, 0.0f) {} - Text::Text(sf::String _str, const sf::Font *_font, const sf::Font *_cjk_font, unsigned int _characterSize, float _maxWidth) : - font(_font), - cjk_font(_cjk_font), + Text::Text(sf::String _str, bool bold_font, unsigned int _characterSize, float _maxWidth) : + bold_font(bold_font), characterSize(_characterSize), maxWidth(_maxWidth), color(sf::Color::White), @@ -123,11 +123,6 @@ namespace QuickMedia return characterSize; } - const sf::Font* Text::getFont() const - { - return font; - } - void Text::setFillColor(sf::Color color) { if(color != this->color) @@ -251,7 +246,7 @@ namespace QuickMedia else offset = find_end_of_non_cjk(str.getData() + index + 1, size - index - 1); textElements.push_back({ StringViewUtf32(str.getData() + index, offset + 1), TextElement::Type::TEXT }); - textElements.back().is_cjk = is_cjk; + textElements.back().text_type = is_cjk ? TextElement::TextType::CJK : TextElement::TextType::LATIN; index += 1 + offset; } } @@ -313,18 +308,24 @@ namespace QuickMedia vertices[1].clear(); boundingBox = sf::FloatRect(); - float hspace = font->getGlyph(' ', characterSize, false).advance + characterSpacing; - float vspace = font->getLineSpacing(characterSize); // TODO: What about japanese font??? + sf::Font *latin_font; + if(bold_font) + latin_font = FontLoader::get_font(FontLoader::FontType::LATIN_BOLD); + else + latin_font = FontLoader::get_font(FontLoader::FontType::LATIN); + + float hspace = latin_font->getGlyph(' ', characterSize, false).advance + characterSpacing; + float vspace = latin_font->getLineSpacing(characterSize); // TODO: What about japanese font??? sf::Vector2f glyphPos; sf::Uint32 prevCodePoint = 0; for(usize textElementIndex = 0; textElementIndex < textElements.size(); ++textElementIndex) { TextElement &textElement = textElements[textElementIndex]; - const sf::Font *ff = font; + const sf::Font *ff = latin_font; int vertices_index = 0; - if(textElement.is_cjk) { - ff = cjk_font; + if(textElement.text_type == TextElement::TextType::CJK) { + ff = FontLoader::get_font(FontLoader::FontType::CJK); vertices_index = 1; } @@ -498,9 +499,16 @@ namespace QuickMedia void Text::updateCaret() { assert(!dirty && !dirtyText); + + sf::Font *latin_font; + if(bold_font) + latin_font = FontLoader::get_font(FontLoader::FontType::LATIN_BOLD); + else + latin_font = FontLoader::get_font(FontLoader::FontType::LATIN); + if(vertices_linear.empty()) { caretIndex = 0; - caretPosition = sf::Vector2f(0.0f, floor(font->getLineSpacing(characterSize))); + caretPosition = sf::Vector2f(0.0f, floor(latin_font->getLineSpacing(characterSize))); caret_offset_x = 0.0f; return; } @@ -546,10 +554,10 @@ namespace QuickMedia caretPosition.x = 0.0f; else caretPosition.x = get_text_quad_right_side(last_vertex); - caretPosition.y = (1 + get_vertex_line(caretIndex)) * floor(font->getLineSpacing(characterSize) + lineSpacing); + caretPosition.y = (1 + get_vertex_line(caretIndex)) * floor(latin_font->getLineSpacing(characterSize) + lineSpacing); } else { caretPosition.x = get_caret_offset_by_caret_index(caretIndex); - caretPosition.y = (1 + get_vertex_line(caretIndex)) * floor(font->getLineSpacing(characterSize) + lineSpacing); + caretPosition.y = (1 + get_vertex_line(caretIndex)) * floor(latin_font->getLineSpacing(characterSize) + lineSpacing); } } @@ -735,10 +743,16 @@ namespace QuickMedia sf::Vector2f pos = position; - const float vspace = font->getLineSpacing(characterSize); + sf::Font *latin_font; + if(bold_font) + latin_font = FontLoader::get_font(FontLoader::FontType::LATIN_BOLD); + else + latin_font = FontLoader::get_font(FontLoader::FontType::LATIN); + + const float vspace = latin_font->getLineSpacing(characterSize); pos.y += floor(vspace); // Origin is at bottom left, we want it to be at top left - const sf::Font *fonts[] = { font, cjk_font }; + const sf::Font *fonts[] = { latin_font, FontLoader::get_font(FontLoader::FontType::CJK) }; for(size_t i = 0; i < 2; ++i) { sf::RenderStates states; states.transform.translate(pos); -- cgit v1.2.3