diff options
author | Ekaitz Zarraga <ekaitz@elenq.tech> | 2022-12-10 20:42:27 +0100 |
---|---|---|
committer | Ekaitz Zarraga <ekaitz@elenq.tech> | 2022-12-10 20:46:26 +0100 |
commit | d0ee939a32fc7cec65a77d028d72881ee8ea1495 (patch) | |
tree | dc6983005b145c6be2dbcde5268544adee4fcba7 /src/graphics/textureFont.cpp | |
parent | 2b6cd04c1fcf9807b6da9aa03e9920c28780db2c (diff) |
Move font support and clean
Diffstat (limited to 'src/graphics/textureFont.cpp')
-rw-r--r-- | src/graphics/textureFont.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/graphics/textureFont.cpp b/src/graphics/textureFont.cpp new file mode 100644 index 0000000..a95c71c --- /dev/null +++ b/src/graphics/textureFont.cpp @@ -0,0 +1,85 @@ +#include "textureFont.h" + +using namespace Graphics; + +// TextureFont + +TextureFont::TextureFont(const sf::Texture &texture, + TextureFont::Descr description) + : tex_(texture) + , description_(description) +{ + sf::Vector2u totalSize = tex_.getSize(); + sf::Vector2f totalSize_f (totalSize.x, totalSize.y); + glyphSize_ = sf::Vector2f( totalSize.x / description_.numcols, + totalSize.y / description_.numrows ); +} + +std::array<sf::Vector2f, 4> TextureFont::getGlyphMapping(const char ch){ + unsigned int pos = static_cast<unsigned int>( description_.mapping.find_first_of(ch)); + if (pos == std::string::npos){ + // TODO: Error handling! + pos = 0; + } + unsigned int x = pos % description_.numcols; + unsigned int y = (pos - x) / description_.numcols; + + sf::Vector2f basePos(x*glyphSize_.x, y*glyphSize_.y); + + // 1 --- 2 + // | | + // 4 --- 3 + return std::array<sf::Vector2f,4> { + basePos, + basePos + sf::Vector2f( glyphSize_.x, 0 ), + basePos + glyphSize_, + basePos + sf::Vector2f( 0, glyphSize_.y ), + }; +} + +sf::Vector2f TextureFont::getGlyphSize(){ + return glyphSize_; +} + +const sf::Texture * TextureFont::getTexture(){ + return &tex_; +} + + + + +// Text + +Text::Text(TextureFont &font, const std::string &text) + : font_(font) + , text_(text) + , vertices_(sf::Quads, text.size()*4) +{ + unsigned int length = vertices_.getVertexCount(); + sf::Vector2f glyphSize = font_.getGlyphSize(); + // TODO: this is the simplest rendering way: everything in one line + // we should improve this to make it handle newlines or max witdths + for(unsigned int i=0; i < length; i=i+4){ + vertices_[i+0].position = sf::Vector2f(glyphSize.x * i/4, 0); + vertices_[i+1].position = sf::Vector2f(glyphSize.x * (i/4 + 1), 0); + vertices_[i+2].position = sf::Vector2f(glyphSize.x * (i/4 + 1), glyphSize.y); + vertices_[i+3].position = sf::Vector2f(glyphSize.x * i/4, glyphSize.y); + + std::array<sf::Vector2f, 4> glyph = font_.getGlyphMapping(text_[i/4]); + + vertices_[i+0].texCoords = glyph[0]; + vertices_[i+1].texCoords = glyph[1]; + vertices_[i+2].texCoords = glyph[2]; + vertices_[i+3].texCoords = glyph[3]; + } +} + +void Text::draw(sf::RenderTarget& target, sf::RenderStates states) const +{ + // TODO: only repaint if needed: when repainting is needed + // vertices_.clear() and fun + states.transform *= getTransform(); + states.texture = font_.getTexture(); + // you may also override states.shader or states.blendMode if you want + target.draw(vertices_, states); +} |