summaryrefslogtreecommitdiff
path: root/src/graphics/text.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/graphics/text.cpp')
-rw-r--r--src/graphics/text.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/graphics/text.cpp b/src/graphics/text.cpp
new file mode 100644
index 0000000..82b8811
--- /dev/null
+++ b/src/graphics/text.cpp
@@ -0,0 +1,37 @@
+#include "text.h"
+
+using namespace Graphics;
+
+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);
+}