]> git.localhorst.tv Git - blank.git/blobdiff - src/graphics/render.cpp
combine text handling stuff into a class
[blank.git] / src / graphics / render.cpp
index 3d0bbd47c6cf2e00feb6efb10798c22469a694a8..1a6d1abd80c124e7367969b863b84771ffc6b40b 100644 (file)
@@ -1,6 +1,9 @@
+#include "BlendedSprite.hpp"
 #include "Font.hpp"
 #include "Format.hpp"
+#include "Text.hpp"
 #include "Texture.hpp"
+#include "Viewport.hpp"
 
 #include <algorithm>
 #include <cstring>
@@ -34,6 +37,31 @@ Font &Font::operator =(Font &&other) noexcept {
 }
 
 
+int Font::Style() const noexcept {
+       return TTF_GetFontStyle(handle);
+}
+
+void Font::Style(int s) const noexcept {
+       TTF_SetFontStyle(handle, s);
+}
+
+int Font::Outline() const noexcept {
+       return TTF_GetFontOutline(handle);
+}
+
+void Font::Outline(int px) noexcept {
+       TTF_SetFontOutline(handle, px);
+}
+
+
+int Font::Hinting() const noexcept {
+       return TTF_GetFontHinting(handle);
+}
+
+void Font::Hinting(int h) const noexcept {
+       TTF_SetFontHinting(handle, h);
+}
+
 bool Font::Kerning() const noexcept {
        return TTF_GetFontKerning(handle);
 }
@@ -60,6 +88,15 @@ int Font::LineSkip() const noexcept {
 }
 
 
+const char *Font::FamilyName() const noexcept {
+       return TTF_FontFaceFamilyName(handle);
+}
+
+const char *Font::StyleName() const noexcept {
+       return TTF_FontFaceStyleName(handle);
+}
+
+
 bool Font::HasGlyph(Uint16 c) const noexcept {
        return TTF_GlyphIsProvided(handle, c);
 }
@@ -73,17 +110,21 @@ glm::tvec2<int> Font::TextSize(const char *text) const {
        return size;
 }
 
-Texture Font::Render(const char *text, SDL_Color color) const {
-       SDL_Surface *srf = TTF_RenderUTF8_Blended(handle, text, color);
+Texture Font::Render(const char *text) const {
+       Texture tex;
+       Render(text, tex);
+       return tex;
+}
+
+void Font::Render(const char *text, Texture &tex) const {
+       SDL_Surface *srf = TTF_RenderUTF8_Blended(handle, text, { 0xFF, 0xFF, 0xFF, 0xFF });
        if (!srf) {
                throw std::runtime_error(TTF_GetError());
        }
-       Texture tex;
        tex.Bind();
        tex.Data(*srf, false);
        tex.FilterLinear();
        SDL_FreeSurface(srf);
-       return tex;
 }
 
 
@@ -117,6 +158,45 @@ void Format::ReadPixelFormat(const SDL_PixelFormat &fmt) {
 }
 
 
+Text::Text() noexcept
+: tex()
+, sprite()
+, bg(1.0f, 1.0f, 1.0f, 0.0f)
+, fg(1.0f, 1.0f, 1.0f, 1.0f)
+, size(0.0f)
+, pos(0.0f)
+, grav(Gravity::NORTH_WEST)
+, pivot(Gravity::NORTH_WEST)
+, dirty(false)
+, visible(false) {
+
+}
+
+void Text::Set(const Font &font, const char *text) {
+       font.Render(text, tex);
+       size = font.TextSize(text);
+       dirty = true;
+}
+
+void Text::Update() {
+       sprite.LoadRect(size.x, size.y, align(pivot, size));
+       dirty = false;
+}
+
+void Text::Render(Viewport &viewport) noexcept {
+       if (dirty) {
+               Update();
+       }
+       BlendedSprite &prog = viewport.SpriteProgram();
+       viewport.SetCursor(pos, grav);
+       prog.SetM(viewport.Cursor());
+       prog.SetTexture(tex);
+       prog.SetBG(bg);
+       prog.SetFG(fg);
+       sprite.Draw();
+}
+
+
 Texture::Texture()
 : handle(0)
 , width(0)