TGUI  1.0-beta
Loading...
Searching...
No Matches
BackendFontSDLttf.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2022 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 <TGUI/extlibs/IncludeSDL.hpp>
31#include <SDL_ttf.h>
32#include <unordered_map>
33
35
36namespace tgui
37{
42 {
43 public:
44
49
50
59 bool loadFromMemory(std::unique_ptr<std::uint8_t[]> data, std::size_t sizeInBytes) override;
61
62
70 bool hasGlyph(char32_t codePoint) const override;
71
72
86 FontGlyph getGlyph(char32_t codePoint, unsigned int characterSize, bool bold, float outlineThickness = 0) override;
87
88
103 float getKerning(char32_t first, char32_t second, unsigned int characterSize, bool bold) override;
104
105
115 float getLineSpacing(unsigned int characterSize) override;
116
117
125 float getFontHeight(unsigned int characterSize) override;
126
127
135 float getAscent(unsigned int characterSize) override;
136
137
145 float getDescent(unsigned int characterSize) override;
146
147
157 float getUnderlinePosition(unsigned int characterSize) override;
158
159
169 float getUnderlineThickness(unsigned int characterSize) override;
170
171
180 std::shared_ptr<BackendTexture> getTexture(unsigned int characterSize, unsigned int& textureVersion) override;
181
182
190 Vector2u getTextureSize(unsigned int characterSize) override;
191
192
202 void setSmooth(bool smooth) override;
203
204
212 void setFontScale(float scale) override;
213
214
221 TTF_Font* getInternalFont(unsigned int characterSize);
222
223
225 private:
226
228 // Finds the location and thickness of the underline, for the getUnderlinePosition and getUnderlineThickness functions
230 std::pair<int, int> getUnderlineInfo(unsigned int characterSize);
231
232
234 // Reserves space in the texture to place the glyph
236 UIntRect findAvailableGlyphRect(unsigned int width, unsigned int height);
237
238
240 private:
241
242 struct Row
243 {
244 Row(unsigned int rowTop, unsigned int rowHeight) : width(0), top(rowTop), height(rowHeight) {}
245
246 unsigned int width;
247 unsigned int top;
248 unsigned int height;
249 };
250
251 std::unique_ptr<std::uint8_t[]> m_fileContents;
252 std::size_t m_fileSize = 0;
253
254 // TTF_Font needs a character size, so we store one font per character size
255 std::unordered_map<unsigned int, TTF_Font*> m_fonts;
256 std::unordered_map<unsigned int, bool> m_lastBoldFlag;
257 std::unordered_map<unsigned int, int> m_lastOutlineThickness;
258
259 std::unordered_map<unsigned int, std::pair<int, int>> m_cachedUnderlineInfo; // character size -> (underline vertical offset, underline thickness)
260
261 std::unordered_map<std::uint64_t, FontGlyph> m_glyphs;
262 unsigned int m_nextRow = 3;
263 std::vector<Row> m_rows;
264
265 std::unique_ptr<std::uint8_t[]> m_pixels;
266 std::shared_ptr<BackendTexture> m_texture;
267 unsigned int m_textureSize = 0;
268 unsigned int m_textureVersion = 0;
269 };
270}
271
273
274#endif // TGUI_BACKEND_FONT_SDL_TTF_HPP
Font implementations that uses SDL_ttf to load glyphs.
Definition: BackendFontSDLttf.hpp:42
float getFontHeight(unsigned int characterSize) override
Returns the height required to render a line of text.
float getUnderlinePosition(unsigned int characterSize) override
Get the position of the underline.
float getLineSpacing(unsigned int characterSize) override
Returns the line spacing.
Vector2u getTextureSize(unsigned int characterSize) override
Returns the size of the texture that is used to store glyphs of the given character size.
bool loadFromMemory(std::unique_ptr< std::uint8_t[]> data, std::size_t sizeInBytes) override
Loads a font from memory.
~BackendFontSDLttf() override
Destructor that cleans up the SDL resources.
float getUnderlineThickness(unsigned int characterSize) override
Get the thickness of the underline.
float getAscent(unsigned int characterSize) override
Returns the maximum height of a glyph above the baseline.
float getDescent(unsigned int characterSize) override
Returns the maximum height of a glyph below the baseline.
void setSmooth(bool smooth) override
Enable or disable the smooth filter.
std::shared_ptr< BackendTexture > getTexture(unsigned int characterSize, unsigned int &textureVersion) override
Returns the texture that is used to store glyphs of the given character size.
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.
float getKerning(char32_t first, char32_t second, unsigned int characterSize, bool bold) override
Returns the kerning offset of two glyphs.
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