#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 TextureFont::getGlyphMapping(const char ch){ unsigned int pos = static_cast( 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 { 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 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); }