Pyrogenesis  trunk
Font.h
Go to the documentation of this file.
1 /* Copyright (C) 2022 Wildfire Games.
2  * This file is part of 0 A.D.
3  *
4  * 0 A.D. is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * 0 A.D. is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef INCLUDED_FONT
19 #define INCLUDED_FONT
20 
21 #include "graphics/Texture.h"
22 
23 /**
24  * Storage for a bitmap font. Loaded by CFontManager.
25  */
26 class CFont
27 {
28 public:
29  struct GlyphData
30  {
31  float u0, v0, u1, v1;
32  i16 x0, y0, x1, y1;
35  };
36 
37  /**
38  * Relatively efficient lookup of GlyphData from 16-bit Unicode codepoint.
39  * This is stored as a sparse 2D array, exploiting the knowledge that a font
40  * typically only supports a small number of 256-codepoint blocks, so most
41  * elements of m_Data will be NULL.
42  */
43  class GlyphMap
44  {
46  public:
47  GlyphMap();
48  ~GlyphMap();
49  void set(u16 i, const GlyphData& val);
50 
51  const GlyphData* get(u16 i) const
52  {
53  if (!m_Data[i >> 8])
54  return NULL;
55  if (!m_Data[i >> 8][i & 0xff].defined)
56  return NULL;
57  return &m_Data[i >> 8][i & 0xff];
58  }
59 
60  private:
61  GlyphData* m_Data[256];
62  };
63 
64  bool HasRGB() const { return m_HasRGB; }
65  int GetLineSpacing() const { return m_LineSpacing; }
66  int GetHeight() const { return m_Height; }
67  int GetCharacterWidth(wchar_t c) const;
68  void CalculateStringSize(const wchar_t* string, int& w, int& h) const;
69  void GetGlyphBounds(float& x0, float& y0, float& x1, float& y1) const
70  {
71  x0 = m_BoundsX0;
72  y0 = m_BoundsY0;
73  x1 = m_BoundsX1;
74  y1 = m_BoundsY1;
75  }
76  const GlyphMap& GetGlyphs() const { return m_Glyphs; }
77  CTexturePtr GetTexture() const { return m_Texture; }
78 
79 private:
80  friend class CFontManager;
81 
82  CFont() = default;
83 
85 
86  bool m_HasRGB; // true if RGBA, false if ALPHA
87 
89 
91  int m_Height; // height of a capital letter, roughly
92 
93  // Bounding box of all glyphs
94  float m_BoundsX0;
95  float m_BoundsY0;
96  float m_BoundsX1;
97  float m_BoundsY1;
98 };
99 
100 #endif // INCLUDED_FONT
#define NONCOPYABLE(className)
Indicates that a class is noncopyable (usually due to const or reference members, or because the clas...
Definition: code_annotation.h:227
u8 defined
Definition: Font.h:34
CFont()=default
i16 x0
Definition: Font.h:32
uint16_t u16
Definition: types.h:38
void CalculateStringSize(const wchar_t *string, int &w, int &h) const
Definition: Font.cpp:61
i16 y0
Definition: Font.h:32
const GlyphMap & GetGlyphs() const
Definition: Font.h:76
uint8_t u8
Definition: types.h:37
i16 x1
Definition: Font.h:32
Relatively efficient lookup of GlyphData from 16-bit Unicode codepoint.
Definition: Font.h:43
float u0
Definition: Font.h:31
i16 y1
Definition: Font.h:32
Storage for a bitmap font.
Definition: Font.h:26
float m_BoundsX0
Definition: Font.h:94
i16 xadvance
Definition: Font.h:33
bool m_HasRGB
Definition: Font.h:86
CTexturePtr m_Texture
Definition: Font.h:84
float m_BoundsY0
Definition: Font.h:95
Font manager: loads and caches bitmap fonts.
Definition: FontManager.h:30
int GetLineSpacing() const
Definition: Font.h:65
int GetHeight() const
Definition: Font.h:66
float u1
Definition: Font.h:31
bool HasRGB() const
Definition: Font.h:64
float v1
Definition: Font.h:31
int m_Height
Definition: Font.h:91
float m_BoundsY1
Definition: Font.h:97
float v0
Definition: Font.h:31
Definition: Font.h:29
GlyphMap m_Glyphs
Definition: Font.h:88
CTexturePtr GetTexture() const
Definition: Font.h:77
float m_BoundsX1
Definition: Font.h:96
int16_t i16
Definition: types.h:33
int m_LineSpacing
Definition: Font.h:90
std::shared_ptr< CTexture > CTexturePtr
Definition: Texture.h:22
void GetGlyphBounds(float &x0, float &y0, float &x1, float &y1) const
Definition: Font.h:69
int GetCharacterWidth(wchar_t c) const
Definition: Font.cpp:48