d9b557a87b9335149e7f2ed8c8461020b45e2f2a
[pdfium.git] / core / include / fxge / fx_font.h
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #ifndef CORE_INCLUDE_FXGE_FX_FONT_H_
8 #define CORE_INCLUDE_FXGE_FX_FONT_H_
9
10 #include <map>
11
12 #include "../fxcrt/fx_system.h"
13 #include "fx_dib.h"
14
15 typedef struct FT_FaceRec_* FXFT_Face;
16 typedef void* FXFT_Library;
17 class CFontFileFaceInfo;
18 class CFX_FaceCache;
19 class CFX_FontMapper;
20 class CFX_PathData;
21 class CFX_SubstFont;
22 class IFX_SystemFontInfo;
23
24 #define FXFONT_FIXED_PITCH 0x01
25 #define FXFONT_SERIF 0x02
26 #define FXFONT_SYMBOLIC 0x04
27 #define FXFONT_SCRIPT 0x08
28 #define FXFONT_ITALIC 0x40
29 #define FXFONT_BOLD 0x40000
30 #define FXFONT_USEEXTERNATTR 0x80000
31 #define FXFONT_CIDFONT 0x100000
32 #define FXFONT_ANSI_CHARSET 0
33 #define FXFONT_DEFAULT_CHARSET 1
34 #define FXFONT_SYMBOL_CHARSET 2
35 #define FXFONT_SHIFTJIS_CHARSET 128
36 #define FXFONT_HANGEUL_CHARSET 129
37 #define FXFONT_GB2312_CHARSET 134
38 #define FXFONT_CHINESEBIG5_CHARSET 136
39 #define FXFONT_THAI_CHARSET 222
40 #define FXFONT_EASTEUROPE_CHARSET 238
41 #define FXFONT_RUSSIAN_CHARSET 204
42 #define FXFONT_GREEK_CHARSET 161
43 #define FXFONT_TURKISH_CHARSET 162
44 #define FXFONT_HEBREW_CHARSET 177
45 #define FXFONT_ARABIC_CHARSET 178
46 #define FXFONT_BALTIC_CHARSET 186
47 #define FXFONT_FF_FIXEDPITCH 1
48 #define FXFONT_FF_ROMAN (1 << 4)
49 #define FXFONT_FF_SCRIPT (4 << 4)
50 #define FXFONT_FW_NORMAL 400
51 #define FXFONT_FW_BOLD 700
52 class CFX_Font {
53  public:
54   CFX_Font();
55   ~CFX_Font();
56
57   FX_BOOL LoadSubst(const CFX_ByteString& face_name,
58                     FX_BOOL bTrueType,
59                     FX_DWORD flags,
60                     int weight,
61                     int italic_angle,
62                     int CharsetCP,
63                     FX_BOOL bVertical = FALSE);
64
65   FX_BOOL LoadEmbedded(const uint8_t* data, FX_DWORD size);
66
67   FX_BOOL LoadFile(IFX_FileRead* pFile);
68
69   FXFT_Face GetFace() const { return m_Face; }
70
71   const CFX_SubstFont* GetSubstFont() const { return m_pSubstFont; }
72
73   CFX_PathData* LoadGlyphPath(FX_DWORD glyph_index, int dest_width = 0);
74
75   int GetGlyphWidth(FX_DWORD glyph_index);
76
77   int GetAscent() const;
78
79   int GetDescent() const;
80
81   FX_BOOL GetGlyphBBox(FX_DWORD glyph_index, FX_RECT& bbox);
82
83   FX_BOOL IsItalic();
84
85   FX_BOOL IsBold();
86
87   FX_BOOL IsFixedWidth();
88
89   FX_BOOL IsVertical() const { return m_bVertical; }
90
91   CFX_WideString GetPsName() const;
92
93   CFX_ByteString GetFamilyName() const;
94
95   CFX_ByteString GetFaceName() const;
96
97   FX_BOOL IsTTFont();
98
99   FX_BOOL GetBBox(FX_RECT& bbox);
100
101   int GetHeight();
102
103   int GetULPos();
104
105   int GetULthickness();
106
107   int GetMaxAdvanceWidth();
108
109   FXFT_Face m_Face;
110
111   CFX_SubstFont* m_pSubstFont;
112   FX_BOOL IsEmbedded() { return m_bEmbedded; }
113
114   void AdjustMMParams(int glyph_index, int width, int weight);
115   uint8_t* m_pFontDataAllocation;
116   uint8_t* m_pFontData;
117   uint8_t* m_pGsubData;
118   FX_DWORD m_dwSize;
119   CFX_BinaryBuf m_OtfFontData;
120   void* m_hHandle;
121   void* m_pPlatformFont;
122   void* m_pPlatformFontCollection;
123   void* m_pDwFont;
124   FX_BOOL m_bDwLoaded;
125   void ReleasePlatformResource();
126
127   void DeleteFace();
128
129  protected:
130   FX_BOOL m_bEmbedded;
131   FX_BOOL m_bVertical;
132   void* m_pOwnedStream;
133 };
134 #define ENCODING_INTERNAL 0
135 #define ENCODING_UNICODE 1
136
137 class CFX_UnicodeEncoding {
138  public:
139   explicit CFX_UnicodeEncoding(CFX_Font* pFont);
140   ~CFX_UnicodeEncoding();
141
142   FX_DWORD GlyphFromCharCode(FX_DWORD charcode);
143
144  private:
145   // Unowned, not nullptr.
146   CFX_Font* m_pFont;
147 };
148
149 #define FXFONT_SUBST_MM 0x01
150 #define FXFONT_SUBST_GLYPHPATH 0x04
151 #define FXFONT_SUBST_CLEARTYPE 0x08
152 #define FXFONT_SUBST_TRANSFORM 0x10
153 #define FXFONT_SUBST_NONSYMBOL 0x20
154 #define FXFONT_SUBST_EXACT 0x40
155 #define FXFONT_SUBST_STANDARD 0x80
156 class CFX_SubstFont {
157  public:
158   CFX_SubstFont();
159
160   void* m_ExtHandle;
161
162   CFX_ByteString m_Family;
163
164   int m_Charset;
165
166   FX_DWORD m_SubstFlags;
167
168   int m_Weight;
169
170   int m_ItalicAngle;
171
172   FX_BOOL m_bSubstOfCJK;
173
174   int m_WeightCJK;
175
176   FX_BOOL m_bItlicCJK;
177 };
178 #define FX_FONT_FLAG_SERIF 0x01
179 #define FX_FONT_FLAG_FIXEDPITCH 0x02
180 #define FX_FONT_FLAG_ITALIC 0x04
181 #define FX_FONT_FLAG_BOLD 0x08
182 #define FX_FONT_FLAG_SYMBOLIC_SYMBOL 0x10
183 #define FX_FONT_FLAG_SYMBOLIC_DINGBATS 0x20
184 #define FX_FONT_FLAG_MULTIPLEMASTER 0x40
185 typedef struct {
186   const uint8_t* m_pFontData;
187   FX_DWORD m_dwSize;
188 } FoxitFonts;
189 class CFX_FontMgr {
190  public:
191   CFX_FontMgr();
192   ~CFX_FontMgr();
193   void InitFTLibrary();
194   FXFT_Face GetCachedFace(const CFX_ByteString& face_name,
195                           int weight,
196                           FX_BOOL bItalic,
197                           uint8_t*& pFontData);
198   FXFT_Face AddCachedFace(const CFX_ByteString& face_name,
199                           int weight,
200                           FX_BOOL bItalic,
201                           uint8_t* pData,
202                           FX_DWORD size,
203                           int face_index);
204   FXFT_Face GetCachedTTCFace(int ttc_size,
205                              FX_DWORD checksum,
206                              int font_offset,
207                              uint8_t*& pFontData);
208   FXFT_Face AddCachedTTCFace(int ttc_size,
209                              FX_DWORD checksum,
210                              uint8_t* pData,
211                              FX_DWORD size,
212                              int font_offset);
213   FXFT_Face GetFileFace(const FX_CHAR* filename, int face_index);
214   FXFT_Face GetFixedFace(const uint8_t* pData, FX_DWORD size, int face_index);
215   void ReleaseFace(FXFT_Face face);
216   void SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);
217   FXFT_Face FindSubstFont(const CFX_ByteString& face_name,
218                           FX_BOOL bTrueType,
219                           FX_DWORD flags,
220                           int weight,
221                           int italic_angle,
222                           int CharsetCP,
223                           CFX_SubstFont* pSubstFont);
224
225   void FreeCache();
226
227   FX_BOOL GetStandardFont(const uint8_t*& pFontData, FX_DWORD& size, int index);
228   CFX_FontMapper* m_pBuiltinMapper;
229   CFX_MapByteStringToPtr m_FaceMap;
230   FXFT_Library m_FTLibrary;
231   FoxitFonts m_ExternalFonts[16];
232 };
233
234 class IFX_FontEnumerator {
235  public:
236   virtual void HitFont() = 0;
237
238   virtual void Finish() = 0;
239
240  protected:
241   virtual ~IFX_FontEnumerator() {}
242 };
243
244 class IFX_AdditionalFontEnum {
245  public:
246   virtual int CountFiles() = 0;
247   virtual IFX_FileStream* GetFontFile(int index) = 0;
248
249  protected:
250   virtual ~IFX_AdditionalFontEnum() {}
251 };
252
253 class CFX_FontMapper {
254  public:
255   explicit CFX_FontMapper(CFX_FontMgr* mgr);
256   ~CFX_FontMapper();
257
258   void SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);
259   IFX_SystemFontInfo* GetSystemFontInfo() { return m_pFontInfo; }
260   void AddInstalledFont(const CFX_ByteString& name, int charset);
261   void LoadInstalledFonts();
262   CFX_ByteStringArray m_InstalledTTFonts;
263   void SetFontEnumerator(IFX_FontEnumerator* pFontEnumerator) {
264     m_pFontEnumerator = pFontEnumerator;
265   }
266   IFX_FontEnumerator* GetFontEnumerator() const { return m_pFontEnumerator; }
267   FXFT_Face FindSubstFont(const CFX_ByteString& face_name,
268                           FX_BOOL bTrueType,
269                           FX_DWORD flags,
270                           int weight,
271                           int italic_angle,
272                           int CharsetCP,
273                           CFX_SubstFont* pSubstFont);
274
275  private:
276   CFX_ByteString GetPSNameFromTT(void* hFont);
277   CFX_ByteString MatchInstalledFonts(const CFX_ByteString& norm_name);
278   FXFT_Face UseInternalSubst(CFX_SubstFont* pSubstFont,
279                              int iBaseFont,
280                              int italic_angle,
281                              int weight,
282                              int picthfamily);
283
284   FX_BOOL m_bListLoaded;
285   FXFT_Face m_MMFaces[2];
286   CFX_ByteString m_LastFamily;
287   CFX_DWordArray m_CharsetArray;
288   CFX_ByteStringArray m_FaceArray;
289   IFX_SystemFontInfo* m_pFontInfo;
290   FXFT_Face m_FoxitFaces[14];
291   IFX_FontEnumerator* m_pFontEnumerator;
292   CFX_FontMgr* const m_pFontMgr;
293 };
294
295 class IFX_SystemFontInfo {
296  public:
297   static IFX_SystemFontInfo* CreateDefault(const char** pUserPaths);
298   virtual void Release() = 0;
299
300   virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper) = 0;
301   virtual void* MapFont(int weight,
302                         FX_BOOL bItalic,
303                         int charset,
304                         int pitch_family,
305                         const FX_CHAR* face,
306                         int& iExact) = 0;
307   virtual void* GetFont(const FX_CHAR* face) = 0;
308   virtual FX_DWORD GetFontData(void* hFont,
309                                FX_DWORD table,
310                                uint8_t* buffer,
311                                FX_DWORD size) = 0;
312   virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) = 0;
313   virtual FX_BOOL GetFontCharset(void* hFont, int& charset) = 0;
314   virtual int GetFaceIndex(void* hFont) { return 0; }
315   virtual void DeleteFont(void* hFont) = 0;
316   virtual void* RetainFont(void* hFont) { return NULL; }
317
318  protected:
319   virtual ~IFX_SystemFontInfo() {}
320 };
321
322 class CFX_FolderFontInfo : public IFX_SystemFontInfo {
323  public:
324   CFX_FolderFontInfo();
325   ~CFX_FolderFontInfo() override;
326   void AddPath(const CFX_ByteStringC& path);
327
328   // IFX_SytemFontInfo:
329   void Release() override;
330   FX_BOOL EnumFontList(CFX_FontMapper* pMapper) override;
331   void* MapFont(int weight,
332                 FX_BOOL bItalic,
333                 int charset,
334                 int pitch_family,
335                 const FX_CHAR* face,
336                 int& bExact) override;
337   void* GetFont(const FX_CHAR* face) override;
338   FX_DWORD GetFontData(void* hFont,
339                        FX_DWORD table,
340                        uint8_t* buffer,
341                        FX_DWORD size) override;
342   void DeleteFont(void* hFont) override;
343   FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) override;
344   FX_BOOL GetFontCharset(void* hFont, int& charset) override;
345
346  protected:
347   CFX_MapByteStringToPtr m_FontList;
348   CFX_ByteStringArray m_PathList;
349   CFX_FontMapper* m_pMapper;
350   void ScanPath(CFX_ByteString& path);
351   void ScanFile(CFX_ByteString& path);
352   void ReportFace(CFX_ByteString& path,
353                   FXSYS_FILE* pFile,
354                   FX_DWORD filesize,
355                   FX_DWORD offset);
356 };
357 class CFX_CountedFaceCache {
358  public:
359   CFX_FaceCache* m_Obj;
360   FX_DWORD m_nCount;
361 };
362
363 class CFX_FontCache {
364  public:
365   ~CFX_FontCache();
366   CFX_FaceCache* GetCachedFace(CFX_Font* pFont);
367   void ReleaseCachedFace(CFX_Font* pFont);
368   void FreeCache(FX_BOOL bRelease = FALSE);
369
370  private:
371   using CFX_FTCacheMap = std::map<FXFT_Face, CFX_CountedFaceCache*>;
372   CFX_FTCacheMap m_FTFaceMap;
373   CFX_FTCacheMap m_ExtFaceMap;
374 };
375 class CFX_AutoFontCache {
376  public:
377   CFX_AutoFontCache(CFX_FontCache* pFontCache, CFX_Font* pFont)
378       : m_pFontCache(pFontCache), m_pFont(pFont) {}
379   ~CFX_AutoFontCache() { m_pFontCache->ReleaseCachedFace(m_pFont); }
380   CFX_FontCache* m_pFontCache;
381   CFX_Font* m_pFont;
382 };
383 #define FX_FONTCACHE_DEFINE(pFontCache, pFont) \
384   CFX_AutoFontCache autoFontCache((pFontCache), (pFont))
385 class CFX_GlyphBitmap {
386  public:
387   int m_Top;
388   int m_Left;
389   CFX_DIBitmap m_Bitmap;
390 };
391 class CFX_FaceCache {
392  public:
393   ~CFX_FaceCache();
394   const CFX_GlyphBitmap* LoadGlyphBitmap(CFX_Font* pFont,
395                                          FX_DWORD glyph_index,
396                                          FX_BOOL bFontStyle,
397                                          const CFX_AffineMatrix* pMatrix,
398                                          int dest_width,
399                                          int anti_alias,
400                                          int& text_flags);
401   const CFX_PathData* LoadGlyphPath(CFX_Font* pFont,
402                                     FX_DWORD glyph_index,
403                                     int dest_width);
404
405   CFX_FaceCache(FXFT_Face face);
406
407  private:
408   FXFT_Face m_Face;
409   CFX_GlyphBitmap* RenderGlyph(CFX_Font* pFont,
410                                FX_DWORD glyph_index,
411                                FX_BOOL bFontStyle,
412                                const CFX_AffineMatrix* pMatrix,
413                                int dest_width,
414                                int anti_alias);
415   CFX_GlyphBitmap* RenderGlyph_Nativetext(CFX_Font* pFont,
416                                           FX_DWORD glyph_index,
417                                           const CFX_AffineMatrix* pMatrix,
418                                           int dest_width,
419                                           int anti_alias);
420   CFX_GlyphBitmap* LookUpGlyphBitmap(CFX_Font* pFont,
421                                      const CFX_AffineMatrix* pMatrix,
422                                      CFX_ByteStringC& FaceGlyphsKey,
423                                      FX_DWORD glyph_index,
424                                      FX_BOOL bFontStyle,
425                                      int dest_width,
426                                      int anti_alias);
427   CFX_MapByteStringToPtr m_SizeMap;
428   CFX_MapPtrToPtr m_PathMap;
429   CFX_DIBitmap* m_pBitmap;
430
431   void InitPlatform();
432   void DestroyPlatform();
433 };
434 typedef struct {
435   const CFX_GlyphBitmap* m_pGlyph;
436   int m_OriginX, m_OriginY;
437   FX_FLOAT m_fOriginX, m_fOriginY;
438 } FXTEXT_GLYPHPOS;
439 FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos,
440                            int nChars,
441                            int anti_alias,
442                            FX_FLOAT retinaScaleX = 1.0f,
443                            FX_FLOAT retinaScaleY = 1.0f);
444
445 class IFX_GSUBTable {
446  public:
447   static IFX_GSUBTable* Create(CFX_Font* pFont);
448   virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) = 0;
449
450  protected:
451   virtual ~IFX_GSUBTable() {}
452 };
453
454 #endif  // CORE_INCLUDE_FXGE_FX_FONT_H_