Kill IFX_FontMapper
[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 IFX_FontEncoding;
18 class CFX_PathData;
19 class CFX_SubstFont;
20 class CFX_FaceCache;
21 class CFX_FontMapper;
22 class IFX_SystemFontInfo;
23 class CFontFileFaceInfo;
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 {
54 public:
55     CFX_Font();
56     ~CFX_Font();
57
58     FX_BOOL                                     LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
59                                       int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical = FALSE);
60
61     FX_BOOL                                     LoadEmbedded(const uint8_t* data, FX_DWORD size);
62
63     FX_BOOL                                     LoadFile(IFX_FileRead* pFile);
64
65     FXFT_Face                           GetFace() const
66     {
67         return m_Face;
68     }
69
70
71     const CFX_SubstFont*        GetSubstFont() const
72     {
73         return m_pSubstFont;
74     }
75
76     CFX_PathData*                       LoadGlyphPath(FX_DWORD glyph_index, int dest_width = 0);
77
78     int                                         GetGlyphWidth(FX_DWORD glyph_index);
79
80     int                                         GetAscent() const;
81
82     int                                         GetDescent() const;
83
84     FX_BOOL                 GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox);
85
86     FX_BOOL                 IsItalic();
87
88     FX_BOOL                 IsBold();
89
90     FX_BOOL                 IsFixedWidth();
91
92     FX_BOOL                                     IsVertical() const
93     {
94         return m_bVertical;
95     }
96
97     CFX_WideString          GetPsName() const;
98
99
100     CFX_ByteString          GetFamilyName() const;
101
102     CFX_ByteString          GetFaceName() const;
103
104
105     FX_BOOL                 IsTTFont();
106
107     FX_BOOL                 GetBBox(FX_RECT &bbox);
108
109     int                     GetHeight();
110
111     int                     GetULPos();
112
113     int                     GetULthickness();
114
115     int                     GetMaxAdvanceWidth();
116
117     FXFT_Face                           m_Face;
118
119     CFX_SubstFont*                      m_pSubstFont;
120     FX_BOOL                                     IsEmbedded()
121     {
122         return m_bEmbedded;
123     }
124
125     void                                        AdjustMMParams(int glyph_index, int width, int weight);
126     uint8_t*                            m_pFontDataAllocation;
127     uint8_t*               m_pFontData;
128     uint8_t*                            m_pGsubData;
129     FX_DWORD                m_dwSize;
130     CFX_BinaryBuf           m_OtfFontData;
131     void*                   m_hHandle;
132     void*                   m_pPlatformFont;
133     void*                   m_pPlatformFontCollection;
134     void*                   m_pDwFont;
135     FX_BOOL                 m_bDwLoaded;
136     void                    ReleasePlatformResource();
137
138     void                                        DeleteFace();
139 protected:
140
141     FX_BOOL                                     m_bEmbedded;
142     FX_BOOL                                     m_bVertical;
143     void*                                       m_pOwnedStream;
144 };
145 #define ENCODING_INTERNAL               0
146 #define ENCODING_UNICODE                1
147 class IFX_FontEncoding
148 {
149 public:
150     virtual ~IFX_FontEncoding() {}
151
152     virtual FX_DWORD            GlyphFromCharCode(FX_DWORD charcode) = 0;
153
154     virtual CFX_WideString      UnicodeFromCharCode(FX_DWORD charcode) const = 0;
155
156     virtual FX_DWORD            CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;
157 };
158 IFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont);
159 #define FXFONT_SUBST_MM                         0x01
160 #define FXFONT_SUBST_GLYPHPATH          0x04
161 #define FXFONT_SUBST_CLEARTYPE          0x08
162 #define FXFONT_SUBST_TRANSFORM          0x10
163 #define FXFONT_SUBST_NONSYMBOL          0x20
164 #define FXFONT_SUBST_EXACT                      0x40
165 #define FXFONT_SUBST_STANDARD           0x80
166 class CFX_SubstFont
167 {
168 public:
169
170     CFX_SubstFont();
171
172     void*                               m_ExtHandle;
173
174     CFX_ByteString                      m_Family;
175
176     int                                         m_Charset;
177
178     FX_DWORD                            m_SubstFlags;
179
180     int                                         m_Weight;
181
182     int                                         m_ItalicAngle;
183
184     FX_BOOL                                     m_bSubstOfCJK;
185
186     int                                         m_WeightCJK;
187
188     FX_BOOL                                     m_bItlicCJK;
189 };
190 #define FX_FONT_FLAG_SERIF              0x01
191 #define FX_FONT_FLAG_FIXEDPITCH                 0x02
192 #define FX_FONT_FLAG_ITALIC                             0x04
193 #define FX_FONT_FLAG_BOLD                               0x08
194 #define FX_FONT_FLAG_SYMBOLIC_SYMBOL    0x10
195 #define FX_FONT_FLAG_SYMBOLIC_DINGBATS  0x20
196 #define FX_FONT_FLAG_MULTIPLEMASTER             0x40
197 typedef struct {
198     const uint8_t*      m_pFontData;
199     FX_DWORD    m_dwSize;
200 } FoxitFonts;
201 class CFX_FontMgr
202 {
203 public:
204     CFX_FontMgr();
205     ~CFX_FontMgr();
206     void                        InitFTLibrary();
207     FXFT_Face           GetCachedFace(const CFX_ByteString& face_name,
208                                   int weight, FX_BOOL bItalic, uint8_t*& pFontData);
209     FXFT_Face           AddCachedFace(const CFX_ByteString& face_name,
210                                   int weight, FX_BOOL bItalic, uint8_t* pData, FX_DWORD size, int face_index);
211     FXFT_Face           GetCachedTTCFace(int ttc_size, FX_DWORD checksum,
212                                      int font_offset, uint8_t*& pFontData);
213     FXFT_Face           AddCachedTTCFace(int ttc_size, FX_DWORD checksum,
214                                      uint8_t* pData, FX_DWORD size, int font_offset);
215     FXFT_Face           GetFileFace(const FX_CHAR* filename, int face_index);
216     FXFT_Face           GetFixedFace(const uint8_t* pData, FX_DWORD size, int face_index);
217     void                        ReleaseFace(FXFT_Face face);
218     void                        SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);
219     FXFT_Face           FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
220                                   int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);
221
222     void                        FreeCache();
223
224     FX_BOOL                     GetStandardFont(const uint8_t*& pFontData, FX_DWORD& size, int index);
225     CFX_FontMapper*     m_pBuiltinMapper;
226     CFX_MapByteStringToPtr      m_FaceMap;
227     FXFT_Library        m_FTLibrary;
228     FoxitFonts m_ExternalFonts[16];
229 };
230 class IFX_FontEnumerator
231 {
232 public:
233     virtual ~IFX_FontEnumerator() { }
234
235     virtual void                HitFont() = 0;
236
237     virtual void                Finish() = 0;
238 };
239 class IFX_AdditionalFontEnum
240 {
241 public:
242     virtual ~IFX_AdditionalFontEnum() { }
243     virtual int  CountFiles() = 0;
244     virtual IFX_FileStream* GetFontFile(int index) = 0;
245 };
246 class CFX_FontMapper
247 {
248 public:
249     CFX_FontMapper(CFX_FontMgr* mgr);
250     ~CFX_FontMapper();
251
252     void                                SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);
253     IFX_SystemFontInfo* GetSystemFontInfo()
254     {
255         return m_pFontInfo;
256     }
257     void                                AddInstalledFont(const CFX_ByteString& name, int charset);
258     void                                LoadInstalledFonts();
259     CFX_ByteStringArray m_InstalledTTFonts;
260     void                                SetFontEnumerator(IFX_FontEnumerator* pFontEnumerator)
261     {
262         m_pFontEnumerator = pFontEnumerator;
263     }
264     IFX_FontEnumerator* GetFontEnumerator() const
265     {
266         return m_pFontEnumerator;
267     }
268     FXFT_Face FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
269                             int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);
270 private:
271     CFX_ByteString              GetPSNameFromTT(void* hFont);
272     CFX_ByteString              MatchInstalledFonts(const CFX_ByteString& norm_name);
273     FXFT_Face                   UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily);
274
275     FX_BOOL                             m_bListLoaded;
276     FXFT_Face                   m_MMFaces[2];
277     CFX_ByteString              m_LastFamily;
278     CFX_DWordArray              m_CharsetArray;
279     CFX_ByteStringArray m_FaceArray;
280     IFX_SystemFontInfo* m_pFontInfo;
281     FXFT_Face                   m_FoxitFaces[14];
282     IFX_FontEnumerator*         m_pFontEnumerator;
283     CFX_FontMgr* const m_pFontMgr;
284 };
285 class IFX_SystemFontInfo
286 {
287 public:
288     static IFX_SystemFontInfo*  CreateDefault();
289     virtual void                Release() = 0;
290
291     virtual     FX_BOOL         EnumFontList(CFX_FontMapper* pMapper) = 0;
292     virtual void*               MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, const FX_CHAR* face, int& iExact) = 0;
293     virtual void*               GetFont(const FX_CHAR* face) = 0;
294     virtual FX_DWORD    GetFontData(void* hFont, FX_DWORD table, uint8_t* buffer, FX_DWORD size) = 0;
295     virtual FX_BOOL             GetFaceName(void* hFont, CFX_ByteString& name) = 0;
296     virtual FX_BOOL             GetFontCharset(void* hFont, int& charset) = 0;
297     virtual int                 GetFaceIndex(void* hFont)
298     {
299         return 0;
300     }
301     virtual void                DeleteFont(void* hFont) = 0;
302     virtual void*       RetainFont(void* hFont)
303     {
304         return NULL;
305     }
306 protected:
307     ~IFX_SystemFontInfo() { }
308 };
309 class CFX_FolderFontInfo : public IFX_SystemFontInfo
310 {
311 public:
312     CFX_FolderFontInfo();
313     virtual ~CFX_FolderFontInfo();
314     void AddPath(const CFX_ByteStringC& path);
315
316     // IFX_SytemFontInfo:
317     void Release() override;
318     FX_BOOL EnumFontList(CFX_FontMapper* pMapper) override;
319     void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family,
320                   const FX_CHAR* face, int& bExact) override;
321     void* GetFont(const FX_CHAR* face) override;
322     FX_DWORD GetFontData(void* hFont, FX_DWORD table,
323                          uint8_t* buffer, FX_DWORD size) override;
324     void DeleteFont(void* hFont) override;
325     FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) override;
326     FX_BOOL GetFontCharset(void* hFont, int& charset) override;
327
328 protected:
329     CFX_MapByteStringToPtr      m_FontList;
330     CFX_ByteStringArray m_PathList;
331     CFX_FontMapper*             m_pMapper;
332     void                                ScanPath(CFX_ByteString& path);
333     void                                ScanFile(CFX_ByteString& path);
334     void                                ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset);
335 };
336 class CFX_CountedFaceCache
337 {
338 public:
339     CFX_FaceCache*      m_Obj;
340     FX_DWORD            m_nCount;
341 };
342
343 class CFX_FontCache
344 {
345 public:
346     ~CFX_FontCache();
347     CFX_FaceCache*                      GetCachedFace(CFX_Font* pFont);
348     void                                        ReleaseCachedFace(CFX_Font* pFont);
349     void                                        FreeCache(FX_BOOL bRelease = FALSE);
350
351 private:
352     using CFX_FTCacheMap = std::map<FXFT_Face, CFX_CountedFaceCache*>;
353     CFX_FTCacheMap m_FTFaceMap;
354     CFX_FTCacheMap m_ExtFaceMap;
355 };
356 class CFX_AutoFontCache
357 {
358 public:
359     CFX_AutoFontCache(CFX_FontCache* pFontCache, CFX_Font* pFont)
360         : m_pFontCache(pFontCache)
361         , m_pFont(pFont)
362     {
363     }
364     ~CFX_AutoFontCache()
365     {
366         m_pFontCache->ReleaseCachedFace(m_pFont);
367     }
368     CFX_FontCache* m_pFontCache;
369     CFX_Font* m_pFont;
370 };
371 #define FX_FONTCACHE_DEFINE(pFontCache, pFont) CFX_AutoFontCache autoFontCache((pFontCache), (pFont))
372 class CFX_GlyphBitmap
373 {
374 public:
375     int                                         m_Top;
376     int                                         m_Left;
377     CFX_DIBitmap                        m_Bitmap;
378 };
379 class CFX_FaceCache
380 {
381 public:
382     ~CFX_FaceCache();
383     const CFX_GlyphBitmap*      LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,
384                                             int dest_width, int anti_alias, int& text_flags);
385     const CFX_PathData*         LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width);
386
387
388     CFX_FaceCache(FXFT_Face face);
389 private:
390     FXFT_Face                           m_Face;
391     CFX_GlyphBitmap*            RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,
392                                         const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);
393     CFX_GlyphBitmap*            RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index,
394             const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);
395     CFX_GlyphBitmap*        LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix, CFX_ByteStringC& FaceGlyphsKey,
396             FX_DWORD glyph_index, FX_BOOL bFontStyle, int dest_width, int anti_alias);
397     CFX_MapByteStringToPtr      m_SizeMap;
398     CFX_MapPtrToPtr                     m_PathMap;
399     CFX_DIBitmap*           m_pBitmap;
400
401     void                                    InitPlatform();
402     void                                    DestroyPlatform();
403 };
404 typedef struct {
405     const CFX_GlyphBitmap*      m_pGlyph;
406     int                                 m_OriginX, m_OriginY;
407     FX_FLOAT                    m_fOriginX, m_fOriginY;
408 } FXTEXT_GLYPHPOS;
409 FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
410 FX_BOOL OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,
411                     CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb);
412 FX_BOOL OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,
413                    CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb);
414 class IFX_GSUBTable
415 {
416 public:
417     static IFX_GSUBTable* Create(CFX_Font* pFont);
418     virtual ~IFX_GSUBTable() { }
419     virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) = 0;
420 };
421
422 #endif  // CORE_INCLUDE_FXGE_FX_FONT_H_