Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
fontengine.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2010-2014 sapier <sapier at gmx dot net>
4
5#pragma once
6
7#include <map>
8#include <unordered_map>
9#include "irr_ptr.h"
11#include "util/basic_macros.h"
12#include "irrlichttypes.h"
13#include "irrString.h" // utf8_to_wide
15
16namespace gui {
17 class IGUIEnvironment;
18 class IGUIFont;
19}
20
21#define FONT_SIZE_UNSPECIFIED 0xFFFFFFFF
22
23enum FontMode : u8 {
26
29
33
36
37 // ----------------------------
38
41};
42
43struct FontSpec {
44 FontSpec(unsigned int font_size, FontMode mode, bool bold, bool italic) :
45 size(font_size),
46 mode(mode),
47 bold(bold),
48 italic(italic) {}
49
50 static const unsigned VARIANT_BITS = 3;
51 static const size_t MAX_VARIANTS = FM_MaxMode << VARIANT_BITS;
52
53 u16 getHash() const
54 {
55 return (mode << VARIANT_BITS)
56 | (static_cast<u8>(allow_server_media) << 2)
57 | (static_cast<u8>(bold) << 1)
58 | static_cast<u8>(italic);
59 }
60
61 unsigned int size;
63 bool bold;
64 bool italic;
65 bool allow_server_media = true;
66};
67
69{
70public:
71
72 FontEngine(gui::IGUIEnvironment* env);
73
75
76 // Get best possible font specified by FontSpec
77 gui::IGUIFont *getFont(FontSpec spec);
78
79 gui::IGUIFont *getFont(unsigned int font_size=FONT_SIZE_UNSPECIFIED,
81 {
82 FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
83 return getFont(spec);
84 }
85
87 unsigned int getTextHeight(const FontSpec &spec);
88
90 unsigned int getTextHeight(
91 unsigned int font_size=FONT_SIZE_UNSPECIFIED,
93 {
94 FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
95 return getTextHeight(spec);
96 }
97
98 unsigned int getTextWidth(const std::wstring &text, const FontSpec &spec);
99
101 unsigned int getTextWidth(const std::wstring& text,
102 unsigned int font_size=FONT_SIZE_UNSPECIFIED,
104 {
105 FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
106 return getTextWidth(text, spec);
107 }
108
109 unsigned int getTextWidth(const std::string &text, const FontSpec &spec)
110 {
111 return getTextWidth(utf8_to_wide(text), spec);
112 }
113
114 unsigned int getTextWidth(const std::string& text,
115 unsigned int font_size=FONT_SIZE_UNSPECIFIED,
117 {
118 FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
119 return getTextWidth(utf8_to_wide(text), spec);
120 }
121
123 unsigned int getLineHeight(const FontSpec &spec);
124
125 unsigned int getLineHeight(unsigned int font_size=FONT_SIZE_UNSPECIFIED,
127 {
128 FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
129 return getLineHeight(spec);
130 }
131
133 unsigned int getDefaultFontSize();
134
136 unsigned int getFontSize(FontMode mode);
137
139 void readSettings();
140
142 void handleReload();
143
144 void setMediaFont(const std::string &name, const std::string &data);
145
146 void clearMediaFonts();
147
148private:
149 gui::IGUIFont *getFont(FontSpec spec, bool may_fail);
150
152 void updateCache();
153
155 gui::IGUIFont *initFont(FontSpec spec);
156
158 void updateSkin();
159
160 void clearCache();
161
163 void refresh();
164
165 gui::SGUITTFace *getOrLoadFace(const std::string &filename);
166
168 static void fontSettingChanged(const std::string &name, void *userdata);
169
171 gui::IGUIEnvironment* m_env = nullptr;
172
174 std::recursive_mutex m_font_mutex;
175
177 std::map<unsigned int, gui::IGUIFont*> m_font_cache[FontSpec::MAX_VARIANTS];
178
180 std::unordered_map<std::string, irr_ptr<gui::SGUITTFace>> m_local_faces;
181
183 std::unordered_map<std::string, irr_ptr<gui::SGUITTFace>> m_media_faces;
184
187
189 bool m_default_bold = false;
190 bool m_default_italic = false;
191
194
195 bool m_needs_reload = false;
196
198};
199
Definition fontengine.h:69
void updateCache()
update content of font cache in case of a setting change made it invalid
Definition fontengine.cpp:181
std::recursive_mutex m_font_mutex
mutex used to protect font init and cache
Definition fontengine.h:174
void handleReload()
reload fonts if settings were changed
Definition fontengine.cpp:164
unsigned int getTextHeight(unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
get text width of a text for a specific font
Definition fontengine.h:90
static void fontSettingChanged(const std::string &name, void *userdata)
callback to be used on change of font size setting
Definition fontengine.cpp:21
gui::IGUIFont * getFont(unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
Definition fontengine.h:79
bool m_default_italic
Definition fontengine.h:190
unsigned int getTextHeight(const FontSpec &spec)
get text height for a specific font
Definition fontengine.cpp:116
~FontEngine()
Definition fontengine.cpp:54
gui::SGUITTFace * getOrLoadFace(const std::string &filename)
Definition fontengine.cpp:226
gui::IGUIEnvironment * m_env
pointer to irrlicht gui environment
Definition fontengine.h:171
std::map< unsigned int, gui::IGUIFont * > m_font_cache[FontSpec::MAX_VARIANTS]
internal storage for caching fonts of different size
Definition fontengine.h:177
std::unordered_map< std::string, irr_ptr< gui::SGUITTFace > > m_local_faces
local faces, indexed by file path
Definition fontengine.h:180
bool m_default_bold
default bold and italic
Definition fontengine.h:189
void updateSkin()
update current minetest skin with font changes
Definition fontengine.cpp:173
unsigned int getFontSize(FontMode mode)
get font size for a specific mode
Definition fontengine.cpp:144
void clearMediaFonts()
Definition fontengine.cpp:219
FontEngine(gui::IGUIEnvironment *env)
Definition fontengine.cpp:37
unsigned int getTextWidth(const std::wstring &text, unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
get text width of a text for a specific font
Definition fontengine.h:101
void setMediaFont(const std::string &name, const std::string &data)
Definition fontengine.cpp:195
unsigned int getTextWidth(const std::wstring &text, const FontSpec &spec)
Definition fontengine.cpp:123
unsigned int getTextWidth(const std::string &text, unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
Definition fontengine.h:114
unsigned int m_default_size[FM_MaxMode]
default font size to use
Definition fontengine.h:186
void clearCache()
Definition fontengine.cpp:61
bool m_needs_reload
Definition fontengine.h:195
unsigned int getTextWidth(const std::string &text, const FontSpec &spec)
Definition fontengine.h:109
void readSettings()
update internal parameters from settings
Definition fontengine.cpp:152
DISABLE_CLASS_COPY(FontEngine)
std::unordered_map< std::string, irr_ptr< gui::SGUITTFace > > m_media_faces
media-provided faces, indexed by filename (without extension)
Definition fontengine.h:183
gui::IGUIFont * getFont(FontSpec spec)
Definition fontengine.cpp:75
unsigned int getDefaultFontSize()
get default font size
Definition fontengine.cpp:139
unsigned int getLineHeight(unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
Definition fontengine.h:125
void refresh()
refresh after fonts have been changed
Definition fontengine.cpp:188
unsigned int getLineHeight(const FontSpec &spec)
get line height for a specific font (including empty room between lines)
Definition fontengine.cpp:131
static const FontMode s_default_font_mode
default font engine mode (fixed)
Definition fontengine.h:193
gui::IGUIFont * initFont(FontSpec spec)
initialize a new TTF font
Definition fontengine.cpp:240
FontMode
Definition fontengine.h:23
@ FM_Standard
Regular font (settings "font_path*", overwritable)
Definition fontengine.h:25
@ FM_MaxMode
Sum of all font modes.
Definition fontengine.h:35
@ FM_Unspecified
Request the defult font specified by s_default_font_mode
Definition fontengine.h:40
@ FM_Mono
Monospace font (settings "mono_font*", overwritable)
Definition fontengine.h:28
@ _FM_Fallback
Use only in FontEngine.
Definition fontengine.h:32
FontEngine * g_fontengine
interface to access main font engine
Definition fontengine.cpp:19
#define FONT_SIZE_UNSPECIFIED
Definition fontengine.h:21
Definition fontengine.h:16
std::wstring utf8_to_wide(std::string_view input)
Definition string.cpp:87
Definition fontengine.h:43
bool italic
Definition fontengine.h:64
static const unsigned VARIANT_BITS
Definition fontengine.h:50
bool allow_server_media
Definition fontengine.h:65
bool bold
Definition fontengine.h:63
FontSpec(unsigned int font_size, FontMode mode, bool bold, bool italic)
Definition fontengine.h:44
unsigned int size
Definition fontengine.h:61
u16 getHash() const
Definition fontengine.h:53
static const size_t MAX_VARIANTS
Definition fontengine.h:51
FontMode mode
Definition fontengine.h:62
Definition CGUITTFont.h:54