Pioneer
TextureFont.h
Go to the documentation of this file.
1 // Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _TEXT_TEXTUREFONT_H
5 #define _TEXT_TEXTUREFONT_H
6 
7 #include "FontConfig.h"
8 #include "RefCounted.h"
9 #include "graphics/Material.h"
10 #include "graphics/Texture.h"
11 #include "graphics/VertexBuffer.h"
12 
13 #include <unordered_map>
14 
15 namespace FileSystem {
16  class FileData;
17 }
18 
19 namespace Graphics {
20  class Renderer;
21  class RenderState;
22 }
23 
24 // forward declarations for FreeType types
25 struct FT_FaceRec_;
26 struct FT_LibraryRec_;
27 struct FT_StrokerRec_;
28 typedef struct FT_FaceRec_ *FT_Face;
29 typedef struct FT_LibraryRec_ *FT_Library;
30 typedef struct FT_StrokerRec_ *FT_Stroker;
31 
32 namespace Text {
33 
34  class TextureFont : public RefCounted {
35 
36  public:
37  TextureFont(const FontConfig &config, Graphics::Renderer *renderer, float scale = 1.0f);
38  ~TextureFont();
39 
40  void RenderBuffer(Graphics::VertexBuffer *vb, const Color &color = Color::WHITE);
41  void MeasureString(const std::string &str, float &w, float &h);
42  void MeasureCharacterPos(const std::string &str, int charIndex, float &x, float &y);
43  int PickCharacter(const std::string &str, float mouseX, float mouseY);
44 
45  void PopulateString(Graphics::VertexArray &va, const std::string &str, const float x, const float y, const Color &color = Color::WHITE);
46  Color PopulateMarkup(Graphics::VertexArray &va, const std::string &str, const float x, const float y, const Color &color = Color::WHITE);
47  Graphics::VertexBuffer *CreateVertexBuffer(const Graphics::VertexArray &va, const bool bIsStatic) const;
48  Graphics::VertexBuffer *CreateVertexBuffer(const Graphics::VertexArray &va, const std::string &str, const bool bIsStatic);
49  Graphics::VertexBuffer *GetCachedVertexBuffer(const std::string &str);
50 
51  // general baseline-to-baseline height
52  float GetHeight() const { return m_height; }
53  // general descender height
54  float GetDescender() const { return m_descender; }
55 
56  struct Glyph {
57  Glyph() :
58  advX(0),
59  advY(0),
60  width(0),
61  height(0),
62  texWidth(0),
63  texHeight(0),
64  offX(0),
65  offY(0),
66  offU(0),
67  offV(0),
68  ftFace(nullptr),
69  ftIndex(0) {}
70  float advX, advY;
71  float width, height;
73  int offX, offY;
74  float offU, offV; //atlas UV offset
76  Uint32 ftIndex;
77  };
78  const Glyph &GetGlyph(Uint32 ch);
79 
80  static int GetGlyphCount() { return s_glyphCount; }
81  static void ClearGlyphCount() { s_glyphCount = 0; }
82 
83  RefCountedPtr<Graphics::Texture> GetTexture() const { return m_texture; }
84  Graphics::Material *GetMaterial() const { return m_mat.get(); }
85 
86  private:
87  TextureFont(const TextureFont &);
88  TextureFont &operator=(const TextureFont &);
89 
90  void AddCachedVertexBuffer(Graphics::VertexBuffer *pVB, const std::string &str);
91  Uint32 CleanVertexBufferCache();
92 
93  FontConfig m_config;
94  Graphics::Renderer *m_renderer;
95  float m_scale;
96 
97  FT_Library m_ftLib;
98  FT_Stroker m_stroker;
99 
100  FT_Face GetFTFace(const FontConfig::Face &face);
101  std::map<FontConfig::Face, std::pair<FT_Face, RefCountedPtr<FileSystem::FileData>>> m_faces;
102 
103  Glyph BakeGlyph(Uint32 chr);
104 
105  float GetKern(const Glyph &a, const Glyph &b);
106 
107  void AddGlyphGeometry(Graphics::VertexArray &va, const Glyph &glyph, const float x, const float y, const Color &color);
108  float m_height;
109  float m_descender;
110  std::unique_ptr<Graphics::Material> m_mat;
111  Graphics::RenderState *m_renderState;
112 
113  static int s_glyphCount;
114 
115  std::map<Uint32, Glyph> m_glyphs;
116 
117  // UV offsets for glyphs
118  unsigned int m_atlasU;
119  unsigned int m_atlasV;
120  unsigned int m_atlasVIncrement;
121 
123  Graphics::TextureFormat m_texFormat;
124 
125  std::vector<unsigned char> m_buf;
126  int m_bufWidth, m_bufHeight;
127  int m_bpp;
128 
129  typedef std::unordered_map<std::string, std::pair<double, RefCountedPtr<Graphics::VertexBuffer>>> VBHashMap;
130  typedef VBHashMap::iterator VBHashMapIter;
131  typedef VBHashMap::const_iterator VBHashMapConstIter;
132  VBHashMap m_vbTextCache;
133  double m_lfLastCacheCleanTime;
134  };
135 
136 } // namespace Text
137 
138 #endif
struct FT_FaceRec_ * FT_Face
Definition: TextureFont.h:28
struct FT_LibraryRec_ * FT_Library
Definition: TextureFont.h:29
struct FT_StrokerRec_ * FT_Stroker
Definition: TextureFont.h:30
Definition: Material.h:81
Definition: RenderState.h:25
Definition: Renderer.h:39
Definition: VertexArray.h:19
Definition: VertexBuffer.h:80
Definition: RefCounted.h:11
Definition: FontConfig.h:13
Definition: TextureFont.h:34
void MeasureString(const std::string &str, float &w, float &h)
Definition: TextureFont.cpp:67
Graphics::Material * GetMaterial() const
Definition: TextureFont.h:84
Graphics::VertexBuffer * GetCachedVertexBuffer(const std::string &str)
Definition: TextureFont.cpp:348
static int GetGlyphCount()
Definition: TextureFont.h:80
Color PopulateMarkup(Graphics::VertexArray &va, const std::string &str, const float x, const float y, const Color &color=Color::WHITE)
Definition: TextureFont.cpp:245
~TextureFont()
Definition: TextureFont.cpp:645
float GetHeight() const
Definition: TextureFont.h:52
void PopulateString(Graphics::VertexArray &va, const std::string &str, const float x, const float y, const Color &color=Color::WHITE)
Definition: TextureFont.cpp:197
TextureFont(const FontConfig &config, Graphics::Renderer *renderer, float scale=1.0f)
Definition: TextureFont.cpp:579
static void ClearGlyphCount()
Definition: TextureFont.h:81
const Glyph & GetGlyph(Uint32 ch)
Definition: TextureFont.cpp:393
void MeasureCharacterPos(const std::string &str, int charIndex, float &x, float &y)
Definition: TextureFont.cpp:104
float GetDescender() const
Definition: TextureFont.h:54
int PickCharacter(const std::string &str, float mouseX, float mouseY)
Definition: TextureFont.cpp:138
Graphics::VertexBuffer * CreateVertexBuffer(const Graphics::VertexArray &va, const bool bIsStatic) const
Definition: TextureFont.cpp:311
RefCountedPtr< Graphics::Texture > GetTexture() const
Definition: TextureFont.h:83
void RenderBuffer(Graphics::VertexBuffer *vb, const Color &color=Color::WHITE)
Definition: TextureFont.cpp:189
Definition: IniConfig.h:10
Definition: Background.h:13
TextureFormat
Definition: Texture.h:14
Definition: GuiLabel.h:12
Definition: Color.h:66
static const Color4ub WHITE
Definition: Color.h:141
Definition: FontConfig.h:18
Definition: TextureFont.h:56
int offX
Definition: TextureFont.h:73
float texWidth
Definition: TextureFont.h:72
float height
Definition: TextureFont.h:71
float advY
Definition: TextureFont.h:70
float texHeight
Definition: TextureFont.h:72
FT_Face ftFace
Definition: TextureFont.h:75
Uint32 ftIndex
Definition: TextureFont.h:76
float offU
Definition: TextureFont.h:74
float width
Definition: TextureFont.h:71
float offV
Definition: TextureFont.h:74
float advX
Definition: TextureFont.h:70
Glyph()
Definition: TextureFont.h:57
int offY
Definition: TextureFont.h:73