TGUI  0.10-dev
BackendFontSDLttf.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2021 Bruno Van de Velde (vdv_b@tgui.eu)
5//
6// This software is provided 'as-is', without any express or implied warranty.
7// In no event will the authors be held liable for any damages arising from the use of this software.
8//
9// Permission is granted to anyone to use this software for any purpose,
10// including commercial applications, and to alter it and redistribute it freely,
11// subject to the following restrictions:
12//
13// 1. The origin of this software must not be misrepresented;
14// you must not claim that you wrote the original software.
15// If you use this software in a product, an acknowledgment
16// in the product documentation would be appreciated but is not required.
17//
18// 2. Altered source versions must be plainly marked as such,
19// and must not be misrepresented as being the original software.
20//
21// 3. This notice may not be removed or altered from any source distribution.
22//
24
25
26#ifndef TGUI_BACKEND_FONT_SDL_TTF_HPP
27#define TGUI_BACKEND_FONT_SDL_TTF_HPP
28
29#include <TGUI/Backend/Font/BackendFont.hpp>
30#include <SDL_ttf.h>
31#include <unordered_map>
32
34
35namespace tgui
36{
41 {
42 public:
43
48
49
58 virtual bool loadFromMemory(std::unique_ptr<std::uint8_t[]> data, std::size_t sizeInBytes) override;
60
61
69 bool hasGlyph(char32_t codePoint) const override;
70
71
85 virtual FontGlyph getGlyph(char32_t codePoint, unsigned int characterSize, bool bold, float outlineThickness = 0) override;
86
87
102 virtual float getKerning(char32_t first, char32_t second, unsigned int characterSize, bool bold) override;
103
104
114 virtual float getLineSpacing(unsigned int characterSize) override;
115
116
126 float getUnderlinePosition(unsigned int characterSize) override;
127
128
138 float getUnderlineThickness(unsigned int characterSize) override;
139
140
148 std::shared_ptr<BackendTexture> getTexture(unsigned int characterSize) override;
149
150
160 void setSmooth(bool smooth) override;
161
162
169 TTF_Font* getInternalFont(unsigned int characterSize);
170
171
173 private:
174
176 // Finds the location and thickness of the underline, for the getUnderlinePosition and getUnderlineThickness functions
178 std::pair<int, int> getUnderlineInfo(unsigned int characterSize);
179
180
182 // Reserves space in the texture to place the glyph
184 IntRect findAvailableGlyphRect(unsigned int width, unsigned int height);
185
186
188 private:
189
190 struct Row
191 {
192 Row(unsigned int rowTop, unsigned int rowHeight) : width(0), top(rowTop), height(rowHeight) {}
193
194 unsigned int width;
195 unsigned int top;
196 unsigned int height;
197 };
198
199 std::unique_ptr<std::uint8_t[]> m_fileContents;
200 std::size_t m_fileSize = 0;
201
202 // TTF_Font needs a character size, so we store one font per character size
203 std::unordered_map<unsigned int, TTF_Font*> m_fonts;
204 std::unordered_map<unsigned int, bool> m_lastBoldFlag;
205 std::unordered_map<unsigned int, float> m_lastOutlineThickness;
206
207 std::unordered_map<unsigned int, std::pair<int, int>> m_cachedUnderlineInfo; // character size -> (underline vertical offset, underline thickness)
208
209 std::unordered_map<std::uint64_t, FontGlyph> m_glyphs;
210 unsigned int m_nextRow = 3;
211 std::vector<Row> m_rows;
212
213 std::unique_ptr<std::uint8_t[]> m_pixels;
214 std::shared_ptr<BackendTexture> m_texture;
215 unsigned int m_textureSize = 0;
216 bool m_textureUpToDate = false;
217 };
218}
219
221
222#endif // TGUI_BACKEND_FONT_SDL_TTF_HPP
Font implementations that uses SDL_ttf to load glyphs.
Definition: BackendFontSDLttf.hpp:41
float getUnderlinePosition(unsigned int characterSize) override
Get the position of the underline.
float getUnderlineThickness(unsigned int characterSize) override
Get the thickness of the underline.
virtual float getLineSpacing(unsigned int characterSize) override
Returns the line spacing.
std::shared_ptr< BackendTexture > getTexture(unsigned int characterSize) override
Returns the texture that is used to store glyphs of the given character size.
virtual bool loadFromMemory(std::unique_ptr< std::uint8_t[]> data, std::size_t sizeInBytes) override
Loads a font from memory.
void setSmooth(bool smooth) override
Enable or disable the smooth filter.
virtual float getKerning(char32_t first, char32_t second, unsigned int characterSize, bool bold) override
Returns the kerning offset of two glyphs.
virtual FontGlyph getGlyph(char32_t codePoint, unsigned int characterSize, bool bold, float outlineThickness=0) override
Retrieve a glyph of the font.
bool hasGlyph(char32_t codePoint) const override
Returns whether a font contains a certain glyph.
~BackendFontSDLttf()
Destructor that cleans up the SDL resources.
Base class for font implementations that depend on the backend.
Definition: BackendFont.hpp:43
virtual bool loadFromMemory(std::unique_ptr< std::uint8_t[]> data, std::size_t sizeInBytes)=0
Loads a font from memory.
Namespace that contains all TGUI functions and classes.
Definition: AbsoluteOrRelativeValue.hpp:36
Information about a glyph in the font.
Definition: Font.hpp:47