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