aboutsummaryrefslogtreecommitdiff
path: root/src/Text.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2020-10-31 09:46:32 +0100
committerdec05eba <dec05eba@protonmail.com>2020-10-31 09:46:32 +0100
commitd638a6092bd6291c983490ba3f966162c7ca06c2 (patch)
tree45b9421e0f3dd22265b33be8ecdcd974e12b0346 /src/Text.cpp
parent11f644afe434ce6b6d570c9da2a95590321871b3 (diff)
Load fonts on demand
Diffstat (limited to 'src/Text.cpp')
-rw-r--r--src/Text.cpp54
1 files changed, 34 insertions, 20 deletions
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 <SFML/Graphics/RectangleShape.hpp>
#include <SFML/Window/Clipboard.hpp>
#include <SFML/Window/Event.hpp>
@@ -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);