Luanti 5.16.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"
10#include "util/basic_macros.h"
11#include "irrlichttypes.h"
12#include "irrString.h" // utf8_to_wide
14
15namespace gui {
16 class IGUIEnvironment;
17 class IGUIFont;
18}
19
20// Luanti namespace
21namespace gui {
22 struct SGUITTFace;
23}
24
25#define FONT_SIZE_UNSPECIFIED 0xFFFFFFFF
26
27enum FontMode : u8 {
30
33
37
40
41 // ----------------------------
42
45};
46
47struct FontSpec {
48 FontSpec(unsigned int font_size, FontMode mode, bool bold, bool italic) :
49 size(font_size),
50 mode(mode),
51 bold(bold),
52 italic(italic) {}
53
54 static const unsigned VARIANT_BITS = 3;
55 static const size_t MAX_VARIANTS = FM_MaxMode << VARIANT_BITS;
56
57 u16 getHash() const
58 {
59 return (mode << VARIANT_BITS)
60 | (static_cast<u8>(allow_server_media) << 2)
61 | (static_cast<u8>(bold) << 1)
62 | static_cast<u8>(italic);
63 }
64
65 unsigned int size;
67 bool bold;
68 bool italic;
69 bool allow_server_media = true;
70};
71
73{
74public:
75
76 FontEngine(gui::IGUIEnvironment* env);
77
79
80 // Get best possible font specified by FontSpec
81 gui::IGUIFont *getFont(FontSpec spec);
82
83 gui::IGUIFont *getFont(unsigned int font_size=FONT_SIZE_UNSPECIFIED,
85 {
86 FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
87 return getFont(spec);
88 }
89
91 unsigned int getTextHeight(const FontSpec &spec);
92
94 unsigned int getTextHeight(
95 unsigned int font_size=FONT_SIZE_UNSPECIFIED,
97 {
98 FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
99 return getTextHeight(spec);
100 }
101
102 unsigned int getTextWidth(const std::wstring &text, const FontSpec &spec);
103
105 unsigned int getTextWidth(const std::wstring& text,
106 unsigned int font_size=FONT_SIZE_UNSPECIFIED,
108 {
109 FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
110 return getTextWidth(text, spec);
111 }
112
113 unsigned int getTextWidth(const std::string &text, const FontSpec &spec)
114 {
115 return getTextWidth(utf8_to_wide(text), spec);
116 }
117
118 unsigned int getTextWidth(const std::string& text,
119 unsigned int font_size=FONT_SIZE_UNSPECIFIED,
121 {
122 FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
123 return getTextWidth(utf8_to_wide(text), spec);
124 }
125
127 unsigned int getLineHeight(const FontSpec &spec);
128
129 unsigned int getLineHeight(unsigned int font_size=FONT_SIZE_UNSPECIFIED,
131 {
132 FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
133 return getLineHeight(spec);
134 }
135
137 unsigned int getDefaultFontSize();
138
140 unsigned int getFontSize(FontMode mode);
141
143 void readSettings();
144
146 void handleReload();
147
148 void setMediaFont(const std::string &name, const std::string &data);
149
150 void clearMediaFonts();
151
152private:
153 gui::IGUIFont *getFont(FontSpec spec, bool may_fail);
154
156 void updateCache();
157
159 gui::IGUIFont *initFont(FontSpec spec);
160
162 void updateSkin();
163
164 void clearCache();
165
167 void refresh();
168
169 gui::SGUITTFace *getOrLoadFace(const std::string &filename);
170
172 static void fontSettingChanged(const std::string &name, void *userdata);
173
175 gui::IGUIEnvironment* m_env = nullptr;
176
178 std::recursive_mutex m_font_mutex;
179
181 std::map<unsigned int, gui::IGUIFont*> m_font_cache[FontSpec::MAX_VARIANTS];
182
184 std::unordered_map<std::string, irr_ptr<gui::SGUITTFace>> m_local_faces;
185
187 std::unordered_map<std::string, irr_ptr<gui::SGUITTFace>> m_media_faces;
188
191
193 bool m_default_bold = false;
194 bool m_default_italic = false;
195
198
199 bool m_needs_reload = false;
200
202};
203
Definition fontengine.h:73
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:178
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:94
static void fontSettingChanged(const std::string &name, void *userdata)
callback to be used on change of font size setting
Definition fontengine.cpp:23
gui::IGUIFont * getFont(unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
Definition fontengine.h:83
bool m_default_italic
Definition fontengine.h:194
unsigned int getTextHeight(const FontSpec &spec)
get text height for a specific font
Definition fontengine.cpp:116
~FontEngine()
Definition fontengine.cpp:56
gui::SGUITTFace * getOrLoadFace(const std::string &filename)
Definition fontengine.cpp:226
gui::IGUIEnvironment * m_env
pointer to irrlicht gui environment
Definition fontengine.h:175
std::map< unsigned int, gui::IGUIFont * > m_font_cache[FontSpec::MAX_VARIANTS]
internal storage for caching fonts of different size
Definition fontengine.h:181
std::unordered_map< std::string, irr_ptr< gui::SGUITTFace > > m_local_faces
local faces, indexed by file path
Definition fontengine.h:184
bool m_default_bold
default bold and italic
Definition fontengine.h:193
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:39
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:105
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:118
unsigned int m_default_size[FM_MaxMode]
default font size to use
Definition fontengine.h:190
void clearCache()
Definition fontengine.cpp:63
bool m_needs_reload
Definition fontengine.h:199
unsigned int getTextWidth(const std::string &text, const FontSpec &spec)
Definition fontengine.h:113
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:187
gui::IGUIFont * getFont(FontSpec spec)
Definition fontengine.cpp:77
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:129
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:197
gui::IGUIFont * initFont(FontSpec spec)
initialize a new TTF font
Definition fontengine.cpp:240
FontEngine * g_fontengine
reference to access font engine, has to be initialized by main
Definition fontengine.cpp:21
FontMode
Definition fontengine.h:27
@ FM_Standard
Regular font (settings "font_path*", overwritable).
Definition fontengine.h:29
@ FM_MaxMode
Sum of all font modes.
Definition fontengine.h:39
@ FM_Unspecified
Request the defult font specified by s_default_font_mode.
Definition fontengine.h:44
@ FM_Mono
Monospace font (settings "mono_font*", overwritable).
Definition fontengine.h:32
@ _FM_Fallback
Use only in FontEngine.
Definition fontengine.h:36
#define FONT_SIZE_UNSPECIFIED
Definition fontengine.h:25
Definition fontengine.h:15
std::wstring utf8_to_wide(std::string_view input)
Definition string.cpp:87
Definition fontengine.h:47
bool italic
Definition fontengine.h:68
static const unsigned VARIANT_BITS
Definition fontengine.h:54
bool allow_server_media
Definition fontengine.h:69
bool bold
Definition fontengine.h:67
FontSpec(unsigned int font_size, FontMode mode, bool bold, bool italic)
Definition fontengine.h:48
unsigned int size
Definition fontengine.h:65
u16 getHash() const
Definition fontengine.h:57
static const size_t MAX_VARIANTS
Definition fontengine.h:55
FontMode mode
Definition fontengine.h:66
Definition CGUITTFont.h:101