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