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