Minetest  5.4.0
fontengine.h
Go to the documentation of this file.
1 /*
2 Minetest
3 Copyright (C) 2010-2014 sapier <sapier at gmx dot net>
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
14 
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 
20 #pragma once
21 
22 #include <map>
23 #include <vector>
24 #include "util/basic_macros.h"
25 #include "irrlichttypes.h"
26 #include <IGUIFont.h>
27 #include <IGUISkin.h>
28 #include <IGUIEnvironment.h>
29 #include "settings.h"
30 
31 #define FONT_SIZE_UNSPECIFIED 0xFFFFFFFF
32 
33 enum FontMode : u8 {
41 };
42 
43 struct 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  u16 getHash()
51  {
52  return (mode << 2) | (static_cast<u8>(bold) << 1) | static_cast<u8>(italic);
53  }
54 
55  unsigned int size;
57  bool bold;
58  bool italic;
59 };
60 
62 {
63 public:
64 
65  FontEngine(gui::IGUIEnvironment* env);
66 
67  ~FontEngine();
68 
69  // Get best possible font specified by FontSpec
70  irr::gui::IGUIFont *getFont(FontSpec spec);
71 
72  irr::gui::IGUIFont *getFont(unsigned int font_size=FONT_SIZE_UNSPECIFIED,
74  {
75  FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
76  return getFont(spec);
77  }
78 
80  unsigned int getTextHeight(const FontSpec &spec);
81 
83  unsigned int getTextHeight(
84  unsigned int font_size=FONT_SIZE_UNSPECIFIED,
86  {
87  FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
88  return getTextHeight(spec);
89  }
90 
91  unsigned int getTextWidth(const std::wstring &text, const FontSpec &spec);
92 
94  unsigned int getTextWidth(const std::wstring& text,
95  unsigned int font_size=FONT_SIZE_UNSPECIFIED,
97  {
98  FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
99  return getTextWidth(text, spec);
100  }
101 
102  unsigned int getTextWidth(const std::string &text, const FontSpec &spec)
103  {
104  return getTextWidth(utf8_to_wide(text), spec);
105  }
106 
107  unsigned int getTextWidth(const std::string& text,
108  unsigned int font_size=FONT_SIZE_UNSPECIFIED,
110  {
111  FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
112  return getTextWidth(utf8_to_wide(text), spec);
113  }
114 
116  unsigned int getLineHeight(const FontSpec &spec);
117 
118  unsigned int getLineHeight(unsigned int font_size=FONT_SIZE_UNSPECIFIED,
120  {
121  FontSpec spec(font_size, mode, m_default_bold, m_default_italic);
122  return getLineHeight(spec);
123  }
124 
126  unsigned int getDefaultFontSize();
127 
129  unsigned int getFontSize(FontMode mode);
130 
132  void readSettings();
133 
134 private:
136  void updateFontCache();
137 
139  gui::IGUIFont *initFont(const FontSpec &spec);
140 
142  gui::IGUIFont *initSimpleFont(const FontSpec &spec);
143 
145  void updateSkin();
146 
148  void cleanCache();
149 
151  gui::IGUIEnvironment* m_env = nullptr;
152 
154  std::map<unsigned int, irr::gui::IGUIFont*> m_font_cache[FM_MaxMode << 2];
155 
157  unsigned int m_default_size[FM_MaxMode];
158 
160  bool m_default_bold = false;
161  bool m_default_italic = false;
162 
165 
167 };
168 
170 extern FontEngine* g_fontengine;
Definition: fontengine.h:62
unsigned int getTextHeight(unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
get text width if a text for a specific font
Definition: fontengine.h:83
gui::IGUIFont * initFont(const FontSpec &spec)
initialize a new font
Definition: fontengine.cpp:268
bool m_default_italic
Definition: fontengine.h:161
unsigned int getTextHeight(const FontSpec &spec)
get text height for a specific font
Definition: fontengine.cpp:139
~FontEngine()
Definition: fontengine.cpp:84
FontMode m_currentMode
current font engine mode
Definition: fontengine.h:164
gui::IGUIEnvironment * m_env
pointer to irrlicht gui environment
Definition: fontengine.h:151
std::map< unsigned int, irr::gui::IGUIFont * > m_font_cache[FM_MaxMode<< 2]
internal storage for caching fonts of different size
Definition: fontengine.h:154
bool m_default_bold
default bold and italic
Definition: fontengine.h:160
void updateSkin()
update current minetest skin with font changes
Definition: fontengine.cpp:238
unsigned int getFontSize(FontMode mode)
get font size for a specific mode
Definition: fontengine.cpp:188
irr::gui::IGUIFont * getFont(unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
Definition: fontengine.h:72
FontEngine(gui::IGUIEnvironment *env)
Definition: fontengine.cpp:45
unsigned int getTextWidth(const std::wstring &text, unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
get text width if a text for a specific font
Definition: fontengine.h:94
unsigned int getTextWidth(const std::wstring &text, const FontSpec &spec)
Definition: fontengine.cpp:153
unsigned int getTextWidth(const std::string &text, unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
Definition: fontengine.h:107
unsigned int m_default_size[FM_MaxMode]
default font size to use
Definition: fontengine.h:157
irr::gui::IGUIFont * getFont(FontSpec spec)
Definition: fontengine.cpp:103
unsigned int getTextWidth(const std::string &text, const FontSpec &spec)
Definition: fontengine.h:102
void readSettings()
update internal parameters from settings
Definition: fontengine.cpp:204
DISABLE_CLASS_COPY(FontEngine)
unsigned int getDefaultFontSize()
get default font size
Definition: fontengine.cpp:183
unsigned int getLineHeight(unsigned int font_size=FONT_SIZE_UNSPECIFIED, FontMode mode=FM_Unspecified)
Definition: fontengine.h:118
unsigned int getLineHeight(const FontSpec &spec)
get line height for a specific font (including empty room between lines)
Definition: fontengine.cpp:168
void updateFontCache()
update content of font cache in case of a setting change made it invalid
Definition: fontengine.cpp:260
void cleanCache()
clean cache
Definition: fontengine.cpp:90
gui::IGUIFont * initSimpleFont(const FontSpec &spec)
initialize a font without freetype
Definition: fontengine.cpp:343
FontMode
Definition: fontengine.h:33
@ FM_SimpleMono
Definition: fontengine.h:38
@ FM_Standard
Definition: fontengine.h:34
@ FM_MaxMode
Definition: fontengine.h:39
@ FM_Unspecified
Definition: fontengine.h:40
@ FM_Fallback
Definition: fontengine.h:36
@ FM_Simple
Definition: fontengine.h:37
@ FM_Mono
Definition: fontengine.h:35
FontEngine * g_fontengine
interface to access main font engine
Definition: fontengine.cpp:36
#define FONT_SIZE_UNSPECIFIED
Definition: fontengine.h:31
std::wstring utf8_to_wide(const std::string &input)
Definition: string.cpp:90
Definition: fontengine.h:43
bool italic
Definition: fontengine.h:58
bool bold
Definition: fontengine.h:57
FontSpec(unsigned int font_size, FontMode mode, bool bold, bool italic)
Definition: fontengine.h:44
unsigned int size
Definition: fontengine.h:55
FontMode mode
Definition: fontengine.h:56
u16 getHash()
Definition: fontengine.h:50