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