You.i Engine
YiTextEngine.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_TEXT_ENGINE_H_
3 #define _YI_TEXT_ENGINE_H_
4 
5 #include "framework/YiPredef.h"
7 #include "graphics/YiBitmap.h"
8 #include "utility/YiColor.h"
9 #include "utility/YiString.h"
10 #include "renderer/YiMaterial.h"
11 
12 #include <glm/gtc/type_ptr.hpp>
13 
14 class CYIGenericFontRegistry;
15 class CYISDFTextAtlas;
16 class CYITextAtlas;
17 class CYITextLayout;
18 class CYITextRenderer;
19 
24 
25 #define YI_TEXT_LEFT 0x00000001
26 #define YI_TEXT_CENTER_H 0x00000002
27 #define YI_TEXT_RIGHT 0x00000004
28 #define YI_TEXT_ELLIPSES 0x00000008
29 #define YI_TEXT_MULTILINE 0x00000010
30 #define YI_TEXT_USER_WIDTH 0x00000020
31 #define YI_TEXT_FONT_TABLES 0x00000040
32 
34 {
39 
40  bool operator<(YI_TEXT_HEIGHT const& other) const;
41  bool operator==(YI_TEXT_HEIGHT const& other) const;
42 };
43 
45 {
51 };
52 
54 {
58 };
59 
61 {
66 };
67 
69 {
72 };
73 
75 {
76  YI_TEXT_STYLE();
77 
79  float fFontSize;
80  float fLeading;
83  float fTracking;
84  float fKerning;
87 
89 
90  bool operator<(YI_TEXT_STYLE const& other) const;
91  bool operator==(YI_TEXT_STYLE const& other) const;
92 };
93 
98 {
100  YI_TEXT_RENDER_INFO(uint32_t uFlags, float fOffsetX, float fYScale, const YI_FLOAT_RECT &rect, const CYIString &text, const std::vector<YI_TEXT_STYLE> &styles);
101 
102  /*
103  If you update this structure, make sure to update the comparison operators.
104  */
105  uint32_t uFlags;
106  float fOffsetX;
107  float fYScale;
110 
111  std::vector<YI_TEXT_STYLE> styles;
112 
113  /* Comparator used by the \a std::map. */
114  bool operator<(YI_TEXT_RENDER_INFO const& other) const;
115 
116  /*
117  This function should be kept up to date with any field that would cause
118  a relayout.
119  */
120  bool operator==(const YI_TEXT_RENDER_INFO &other) const;
121  bool operator!=(const YI_TEXT_RENDER_INFO &other) const;
122 
123 };
124 
130 {
131 public:
135  static const uint32_t g_uTextEllipsisCodepointIndex;
136 
140  static const float g_fLineSpacingFactor;
141 
142  CYITextEngine();
143  virtual ~CYITextEngine();
144 
147  bool Init(uint16_t nMaxFonts, uint16_t uFontAtlasSize);
148 
149  bool IsInitialized();
150 
151  std::unique_ptr<CYITextLayout> CreateTextLayout() const;
152 
154  ssize_t GetFontId(const CYIString &fontName) const;
155 
157  ssize_t GetFontId(const CYIString &fontFamilyName, const CYIString &fontStyleName, bool bIgnoreCase = false) const;
158 
160  ssize_t GetFontIdFromNameAndStyle(const CYIString &fontName, const CYIString &fontStyleName, bool bIgnoreCase = false) const;
161 
163  const YI_FONT_INFO &GetFontInfo(ssize_t nFontID) const;
164 
166  std::vector<CYIString> GetFontStyles(ssize_t nFontID) const;
167 
169  std::vector<CYIString> GetFontStyles(const CYIString &fontFamilyName) const;
170 
172  std::vector<CYIString> ReadFontStyles(const CYIString &url) const;
173 
175  std::vector<CYIString> ReadFontStyles(const uint8_t *pFontData, uint32_t uDataSize) const;
176 
178  ssize_t AddFont(const CYIString &URL);
179 
184  ssize_t AddFont(const CYIString &URL, const CYIString &fontName);
185 
187  ssize_t AddFont(const CYIString &URL, const CYIString &fontName, const CYIString &fontStyle);
188 
190  ssize_t AddFontWithOverrides(const CYIString &URL, const CYIString &fontName, const CYIString &fontFamily, const CYIString &fontStyle);
191 
193  ssize_t AddFont(const uint8_t *pFontData, uint32_t uDataSize);
194 
196  bool IsFontInFile(const CYIString &familyName, const CYIString &styleName, const CYIString &URL);
197 
199  uint32_t GetNumFonts();
200 
202  YI_TEXT_HEIGHT GetTextHeight(ssize_t nFontID, int32_t nFontSize);
203 
205  bool RenderText(const CYITextLayout *pTextLayout,
206  CYIBitmap *pDest,
207  const YI_TEXT_RENDER_INFO &rTextRenderInfo,
208  const glm::vec2 &vRenderOffset,
209  const YI_FLOAT_RECT *pTextExtents = nullptr);
210 
219  int32_t RenderGlyphIntoAtlas(YI_GLYPH_DETAILS *pGlyph, CYIAbstractTextAtlas *pAtlas);
220 
224  uint32_t GetCharacterIndex(ssize_t nFontID, uint32_t uChar) const;
225 
233  int32_t GetIndexOfPosition(const CYITextLayout *pTextLayout, float fX, float fY, float fHorizontalPixelRatio, float fVerticalPixelRatio) const;
234 
239  YI_FLOAT_RECT GetRectForTextRange(const CYITextLayout *pTextLayout, int32_t nStartIndex, int32_t nEndIndex, float fHorizontalPixelRatio, float fVerticalPixelRatio) const;
240 
244  CYITextAtlas *GetTextAtlas();
245 
249  CYISDFTextAtlas *GetSDFTextAtlas();
250 
254  bool SetTextAtlas(CYITextAtlas *pAtlas);
255 
259  bool SetSDFTextAtlas(CYISDFTextAtlas *pAtlas);
260 
261  CYITextRenderer * GetTextRenderer();
262 
267  uint16_t GetFontAtlasSize() const;
268 
272  std::shared_ptr<const CYITextLayout> GetTextLayout(const YI_TEXT_RENDER_INFO &rTextInfo);
273 
277  void TryRemoveCachedTextLayout(const YI_TEXT_RENDER_INFO &rTextInfo);
278 
282  ssize_t FindFontByFamilyName(const CYIString &fontFamilyName, YI_FONT_STYLE fontStyle = YI_FONT_STYLE_REGULAR);
283 
284 private:
285  void AddFontPriv(ssize_t nFontID, const CYIString &filename, const CYIString &fontName, const CYIString &fontFamilyName, const CYIString &fontStyleName);
286 
288  std::vector<YI_FONT_INFO> m_fontsInfo;
289 
290  CYITextRenderer *m_pTextRenderer;
291 
292  CYITextAtlas *m_pTextAtlas;
293  CYISDFTextAtlas *m_pSDFTextAtlas;
294 
295  std::map<YI_TEXT_RENDER_INFO, std::weak_ptr<const CYITextLayout>> m_layoutCacheMap;
296 
297  uint16_t m_uFontAtlasSize;
298 
300  std::map<CYIString, ssize_t> m_fontFamilyCache;
301 
302  CYIGenericFontRegistry *m_pGenericFontRegistry;
303 
305 };
306 
309 #endif // _YI_TEXT_ENGINE_H_
static const float g_fLineSpacingFactor
Definition: YiTextEngine.h:140
ssize_t nFontID
Definition: YiTextEngine.h:78
Definition: YiTextEngine.h:62
CYIColor Color
Definition: YiTextEngine.h:85
#define YI_DISALLOW_COPY_AND_ASSIGN(TypeName)
Delete the copy constructor and assignment operator (and consequently the move constructor as well) ...
Definition: YiPredef.h:114
uint32_t uFlags
Definition: YiTextEngine.h:105
Definition: YiTextEngine.h:63
float fHeightAboveBase
Definition: YiTextEngine.h:35
Container class for Unicode strings. Conceptually, a CYIString object is a sequence of Unicode charac...
Definition: YiString.h:35
static const uint32_t g_uTextEllipsisCodepointIndex
Definition: YiTextEngine.h:135
Class for text rendering.
Definition: YiTextEngine.h:129
Definition: YiTextEngine.h:33
Definition: YiAbstractTextAtlas.h:15
uint32_t uLastCodepointIndex
Definition: YiTextEngine.h:88
The core bitmap container class used by You.i Engine.
Definition: YiBitmap.h:20
std::vector< YI_TEXT_STYLE > styles
Definition: YiTextEngine.h:111
bool operator!=(const CYIVariant &rLHS, const CYIVariant &rRHS)
Supported types: Int, String, Float, FloatVector and Quaternion.
Definition: YiTextEngine.h:64
CYIString family
Definition: YiTextEngine.h:49
float fYScale
Definition: YiTextEngine.h:107
Definition: YiTextEngine.h:57
Class for a text atlas.
Definition: YiTextAtlas.h:15
CYIString name
Definition: YiTextEngine.h:48
Definition: YiTextEngine.h:44
float fTrueBaseOffset
Definition: YiTextEngine.h:37
Abstract class for a text atlas.
Definition: YiAbstractTextAtlas.h:29
Definition: YiTextEngine.h:74
YI_FLOAT_RECT rect
Definition: YiTextEngine.h:108
Definition: YiPredef.h:273
Class for a signed distance field text atlas.
Definition: YiSDFTextAtlas.h:22
float fKerning
Definition: YiTextEngine.h:84
Base class for abstracting the layout for text.
Definition: YiTextLayout.h:33
CYIString filename
Definition: YiTextEngine.h:47
float fFontSize
Definition: YiTextEngine.h:79
CYIString style
Definition: YiTextEngine.h:50
float fOffsetX
Definition: YiTextEngine.h:106
Definition: YiTextEngine.h:70
CYIString text
Definition: YiTextEngine.h:109
Definition: YiTextEngine.h:65
YI_FONT_STYLE
Definition: YiTextEngine.h:60
bool operator==(YI_TEXT_HEIGHT const &other) const
float fBaselineShift
Definition: YiTextEngine.h:82
Definition: YiTextEngine.h:71
YI_TEXT_LINE_STYLE
Definition: YiTextEngine.h:68
bool operator<(YI_TEXT_HEIGHT const &other) const
float fLeading
Definition: YiTextEngine.h:80
int ssize_t
Definition: YiPredefWin32.h:133
float fLowercaseLHeightAboveBase
Definition: YiTextEngine.h:38
YI_SCRIPT_MODE
Definition: YiTextEngine.h:53
ssize_t nEngineID
Definition: YiTextEngine.h:46
Struct used to pass information when rendering text.
Definition: YiTextEngine.h:97
A class used to represent a color value.
Definition: YiColor.h:31
Definition: YiTextEngine.h:56
float fTracking
Definition: YiTextEngine.h:83
Definition: YiTextEngine.h:55
YI_SCRIPT_MODE eScriptMode
Definition: YiTextEngine.h:81
float fHeightBelowBase
Definition: YiTextEngine.h:36
YI_TEXT_LINE_STYLE eTextLineStyle
Definition: YiTextEngine.h:86