TGUI  1.0-beta
Loading...
Searching...
No Matches
BackendFontFreeType.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_FREETYPE_HPP
27#define TGUI_BACKEND_FONT_FREETYPE_HPP
28
29#include <TGUI/Backend/Font/BackendFont.hpp>
30#include <unordered_map>
31
33
34using FT_Library = struct FT_LibraryRec_*;
35using FT_Face = struct FT_FaceRec_*;
36using FT_Stroker = struct FT_StrokerRec_*;
37
39
40namespace tgui
41{
46 {
47 public:
48
53
54
63 bool loadFromMemory(std::unique_ptr<std::uint8_t[]> data, std::size_t sizeInBytes) override;
65
66
74 bool hasGlyph(char32_t codePoint) const override;
75
76
90 FontGlyph getGlyph(char32_t codePoint, unsigned int characterSize, bool bold, float outlineThickness = 0) override;
91
92
107 float getKerning(char32_t first, char32_t second, unsigned int characterSize, bool bold) override;
108
109
119 float getLineSpacing(unsigned int characterSize) override;
120
121
129 float getFontHeight(unsigned int characterSize) override;
130
131
139 float getAscent(unsigned int characterSize) override;
140
141
149 float getDescent(unsigned int characterSize) override;
150
151
161 float getUnderlinePosition(unsigned int characterSize) override;
162
163
173 float getUnderlineThickness(unsigned int characterSize) override;
174
175
184 std::shared_ptr<BackendTexture> getTexture(unsigned int characterSize, unsigned int& textureVersion) override;
185
186
194 Vector2u getTextureSize(unsigned int characterSize) override;
195
196
206 void setSmooth(bool smooth) override;
207
208
216 void setFontScale(float scale) override;
217
218
220 protected:
221
222 struct Glyph
223 {
224 float advance = 0;
225 float lsbDelta = 0;
226 float rsbDelta = 0;
229 };
230
232 // Loads a glyph with freetype
234 Glyph loadGlyph(char32_t codePoint, unsigned int characterSize, bool bold, float outlineThickness);
235
237 // Returns a cached glyph or calls loadGlyph to load it when this is the first time the glyph is requested
239 Glyph getInternalGlyph(char32_t codePoint, unsigned int characterSize, bool bold, float outlineThickness);
240
242 // Reserves space in the texture to place the glyph
244 UIntRect findAvailableGlyphRect(unsigned int width, unsigned int height);
245
247 // Sets the character size on which the freetype operations are performed
249 bool setCurrentSize(unsigned int characterSize);
250
252 // Destroys freetype resources
254 void cleanup();
255
257 protected:
258
259 struct Row
260 {
261 Row(unsigned int rowTop, unsigned int rowHeight) : width(0), top(rowTop), height(rowHeight) {}
262
263 unsigned int width;
264 unsigned int top;
265 unsigned int height;
266 };
267
268 FT_Library m_library = nullptr; // Handle to the freetype library
269 FT_Face m_face = nullptr; // Contains the font (typeface and style)
270 FT_Stroker m_stroker = nullptr; // Used for rendering outlines
271
272 std::unordered_map<unsigned int, float> m_cachedLineSpacing;
273 std::unordered_map<unsigned int, float> m_cachedFontHeights;
274 std::unordered_map<unsigned int, float> m_cachedAscents;
275 std::unordered_map<unsigned int, float> m_cachedDescents;
276
277 std::unordered_map<std::uint64_t, Glyph> m_glyphs;
278 unsigned int m_nextRow = 3;
279 std::vector<Row> m_rows;
280
281 std::unique_ptr<std::uint8_t[]> m_fileContents;
282 std::unique_ptr<std::uint8_t[]> m_pixels;
283 std::shared_ptr<BackendTexture> m_texture;
284 unsigned int m_textureSize = 0;
285 unsigned int m_textureVersion = 0;
286 };
287
289}
290
292
293#endif // TGUI_BACKEND_FONT_FREETYPE_HPP
Font implementations that uses FreeType directly to load glyphs.
Definition: BackendFontFreeType.hpp:46
float getUnderlineThickness(unsigned int characterSize) override
Get the thickness of the underline.
float getUnderlinePosition(unsigned int characterSize) override
Get the position of the underline.
float getAscent(unsigned int characterSize) override
Returns the maximum height of a glyph above the baseline.
float getKerning(char32_t first, char32_t second, unsigned int characterSize, bool bold) override
Returns the kerning offset of two glyphs.
~BackendFontFreetype() override
Destructor that cleans up the FreeType resources.
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.
unsigned int m_nextRow
Y position of the next new row in the texture (first 2 rows contain pixels for underlining)
Definition: BackendFontFreeType.hpp:278
FontGlyph getGlyph(char32_t codePoint, unsigned int characterSize, bool bold, float outlineThickness=0) override
Retrieve a glyph of the font.
Vector2u getTextureSize(unsigned int characterSize) override
Returns the size of the texture that is used to store glyphs of the given character size.
void setSmooth(bool smooth) override
Enable or disable the smooth filter.
float getFontHeight(unsigned int characterSize) override
Returns the height required to render a line of text.
float getDescent(unsigned int characterSize) override
Returns the maximum height of a glyph below the baseline.
bool loadFromMemory(std::unique_ptr< std::uint8_t[]> data, std::size_t sizeInBytes) override
Loads a font from memory.
bool hasGlyph(char32_t codePoint) const override
Returns whether a font contains a certain glyph.
float getLineSpacing(unsigned int characterSize) override
Returns the line spacing.
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
Definition: BackendFontFreeType.hpp:223
float rsbDelta
Right offset after forced autohint. Internally used by getKerning()
Definition: BackendFontFreeType.hpp:226
float lsbDelta
Left offset after forced autohint. Internally used by getKerning()
Definition: BackendFontFreeType.hpp:225
UIntRect textureRect
Texture coordinates of the glyph inside the font's texture.
Definition: BackendFontFreeType.hpp:228
float advance
Offset to move horizontally to the next character.
Definition: BackendFontFreeType.hpp:224
FloatRect bounds
Bounding rectangle of the glyph, in coordinates relative to the baseline.
Definition: BackendFontFreeType.hpp:227
Definition: BackendFontFreeType.hpp:260
unsigned int height
Height of the row.
Definition: BackendFontFreeType.hpp:265
unsigned int width
Current width of the row.
Definition: BackendFontFreeType.hpp:263
unsigned int top
Y position of the row into the texture.
Definition: BackendFontFreeType.hpp:264
Information about a glyph in the font.
Definition: Font.hpp:47