Fix FX_BOOL type mismatches.
[pdfium.git] / core / include / fxge / fx_font.h
index abfa9b8..2832fbf 100644 (file)
-// Copyright 2014 PDFium Authors. All rights reserved.\r
-// Use of this source code is governed by a BSD-style license that can be\r
-// found in the LICENSE file.\r
\r
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
-\r
-#ifndef _FX_FONT_H_\r
-#define _FX_FONT_H_\r
-#ifndef _FXCRT_EXTENSION_\r
-#include "../../include/fxcrt/fx_ext.h"\r
-#endif\r
-#ifndef _FX_DIB_H_\r
-#include "fx_dib.h"\r
-#endif\r
-typedef struct FT_FaceRec_* FXFT_Face;\r
-typedef void* FXFT_Library;\r
-class IFX_FontEncoding;\r
-class CFX_PathData;\r
-class CFX_SubstFont;\r
-class CFX_FaceCache;\r
-class IFX_FontMapper;\r
-class CFX_FontMapper;\r
-class IFX_SystemFontInfo;\r
-class CFontFileFaceInfo;\r
-#define FXFONT_FIXED_PITCH             0x01\r
-#define FXFONT_SERIF                   0x02\r
-#define FXFONT_SYMBOLIC                        0x04\r
-#define FXFONT_SCRIPT                  0x08\r
-#define FXFONT_ITALIC                  0x40\r
-#define FXFONT_BOLD                            0x40000\r
-#define FXFONT_USEEXTERNATTR   0x80000\r
-#define FXFONT_CIDFONT                 0x100000\r
-#define FXFONT_ANSI_CHARSET            0\r
-#define FXFONT_DEFAULT_CHARSET 1\r
-#define FXFONT_SYMBOL_CHARSET  2\r
-#define FXFONT_SHIFTJIS_CHARSET        128\r
-#define FXFONT_HANGEUL_CHARSET 129\r
-#define FXFONT_GB2312_CHARSET  134\r
-#define FXFONT_CHINESEBIG5_CHARSET     136\r
-#define FXFONT_THAI_CHARSET            222\r
-#define FXFONT_EASTEUROPE_CHARSET      238\r
-#define FXFONT_RUSSIAN_CHARSET 204\r
-#define FXFONT_GREEK_CHARSET   161\r
-#define FXFONT_TURKISH_CHARSET 162\r
-#define FXFONT_HEBREW_CHARSET  177\r
-#define FXFONT_ARABIC_CHARSET  178\r
-#define FXFONT_BALTIC_CHARSET  186\r
-#define FXFONT_FF_FIXEDPITCH   1\r
-#define FXFONT_FF_ROMAN                        (1<<4)\r
-#define FXFONT_FF_SCRIPT               (4<<4)\r
-#define FXFONT_FW_NORMAL               400\r
-#define FXFONT_FW_BOLD                 700\r
-class CFX_Font : public CFX_Object\r
-{\r
-public:\r
-    CFX_Font();\r
-    ~CFX_Font();\r
-\r
-    FX_BOOL                                    LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,\r
-                                      int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical = FALSE);\r
-\r
-    FX_BOOL                                    LoadEmbedded(FX_LPCBYTE data, FX_DWORD size);\r
-\r
-    FX_BOOL                                    LoadFile(IFX_FileRead* pFile);\r
-\r
-    FXFT_Face                          GetFace() const\r
-    {\r
-        return m_Face;\r
-    }\r
-\r
-\r
-    const CFX_SubstFont*       GetSubstFont() const\r
-    {\r
-        return m_pSubstFont;\r
-    }\r
-\r
-    CFX_PathData*                      LoadGlyphPath(FX_DWORD glyph_index, int dest_width = 0);\r
-\r
-    int                                                GetGlyphWidth(FX_DWORD glyph_index);\r
-\r
-    int                                                GetAscent() const;\r
-\r
-    int                                                GetDescent() const;\r
-\r
-    FX_BOOL                 GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox);\r
-\r
-    FX_BOOL                 IsItalic();\r
-\r
-    FX_BOOL                 IsBold();\r
-\r
-    FX_BOOL                 IsFixedWidth();\r
-\r
-    FX_BOOL                                    IsVertical() const\r
-    {\r
-        return m_bVertical;\r
-    }\r
-\r
-    CFX_WideString          GetPsName() const;\r
-\r
-\r
-    CFX_ByteString          GetFamilyName() const;\r
-\r
-    CFX_ByteString          GetFaceName() const;\r
-\r
-\r
-    FX_BOOL                 IsTTFont();\r
-\r
-    FX_BOOL                 GetBBox(FX_RECT &bbox);\r
-\r
-    int                     GetHeight();\r
-\r
-    int                     GetULPos();\r
-\r
-    int                     GetULthickness();\r
-\r
-    int                     GetMaxAdvanceWidth();\r
-\r
-    FXFT_Face                          m_Face;\r
-\r
-    CFX_SubstFont*                     m_pSubstFont;\r
-    FX_BOOL                                    IsEmbedded()\r
-    {\r
-        return m_bEmbedded;\r
-    }\r
-\r
-    void                                       AdjustMMParams(int glyph_index, int width, int weight);\r
-    FX_LPBYTE                          m_pFontDataAllocation;\r
-    FX_LPBYTE               m_pFontData;\r
-    FX_LPBYTE                          m_pGsubData;\r
-    FX_DWORD                m_dwSize;\r
-    CFX_BinaryBuf           m_OtfFontData;\r
-    void*                   m_hHandle;\r
-    void*                   m_pPlatformFont;\r
-    void*                   m_pPlatformFontCollection;\r
-    void*                   m_pDwFont;\r
-    FX_BOOL                 m_bDwLoaded;\r
-    void                    ReleasePlatformResource();\r
-\r
-    void                                       DeleteFace();\r
-protected:\r
-\r
-    FX_BOOL                                    m_bEmbedded;\r
-    FX_BOOL                                    m_bVertical;\r
-    void*                                      m_pOwnedStream;\r
-};\r
-#define ENCODING_INTERNAL              0\r
-#define ENCODING_UNICODE               1\r
-class IFX_FontEncoding : public CFX_Object\r
-{\r
-public:\r
-    virtual ~IFX_FontEncoding() {}\r
-\r
-    virtual FX_DWORD           GlyphFromCharCode(FX_DWORD charcode) = 0;\r
-\r
-    virtual CFX_WideString     UnicodeFromCharCode(FX_DWORD charcode) const = 0;\r
-\r
-    virtual FX_DWORD           CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;\r
-};\r
-IFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont);\r
-#define FXFONT_SUBST_MM                                0x01\r
-#define FXFONT_SUBST_GLYPHPATH         0x04\r
-#define FXFONT_SUBST_CLEARTYPE         0x08\r
-#define FXFONT_SUBST_TRANSFORM         0x10\r
-#define FXFONT_SUBST_NONSYMBOL         0x20\r
-#define FXFONT_SUBST_EXACT                     0x40\r
-#define FXFONT_SUBST_STANDARD          0x80\r
-class CFX_SubstFont : public CFX_Object\r
-{\r
-public:\r
-\r
-    CFX_SubstFont();\r
-\r
-    FX_LPVOID                          m_ExtHandle;\r
-\r
-    CFX_ByteString                     m_Family;\r
-\r
-    int                                                m_Charset;\r
-\r
-    FX_DWORD                           m_SubstFlags;\r
-\r
-    int                                                m_Weight;\r
-\r
-    int                                                m_ItalicAngle;\r
-\r
-    FX_BOOL                                    m_bSubstOfCJK;\r
-\r
-    int                                                m_WeightCJK;\r
-\r
-    FX_BOOL                                    m_bItlicCJK;\r
-};\r
-#define FX_FONT_FLAG_SERIF              0x01\r
-#define FX_FONT_FLAG_FIXEDPITCH                        0x02\r
-#define FX_FONT_FLAG_ITALIC                            0x04\r
-#define FX_FONT_FLAG_BOLD                              0x08\r
-#define FX_FONT_FLAG_SYMBOLIC_SYMBOL   0x10\r
-#define FX_FONT_FLAG_SYMBOLIC_DINGBATS 0x20\r
-#define FX_FONT_FLAG_MULTIPLEMASTER            0x40\r
-typedef struct {\r
-    FX_LPCBYTE m_pFontData;\r
-    FX_DWORD   m_dwSize;\r
-} FoxitFonts;\r
-class CFX_FontMgr : public CFX_Object\r
-{\r
-public:\r
-    CFX_FontMgr();\r
-    ~CFX_FontMgr();\r
-    void                       InitFTLibrary();\r
-    FXFT_Face          GetCachedFace(const CFX_ByteString& face_name,\r
-                                  int weight, FX_BOOL bItalic, FX_LPBYTE& pFontData);\r
-    FXFT_Face          AddCachedFace(const CFX_ByteString& face_name,\r
-                                  int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index);\r
-    FXFT_Face          GetCachedTTCFace(int ttc_size, FX_DWORD checksum,\r
-                                     int font_offset, FX_LPBYTE& pFontData);\r
-    FXFT_Face          AddCachedTTCFace(int ttc_size, FX_DWORD checksum,\r
-                                     FX_LPBYTE pData, FX_DWORD size, int font_offset);\r
-    FXFT_Face          GetFileFace(FX_LPCSTR filename, int face_index);\r
-    FXFT_Face          GetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index);\r
-    void                       ReleaseFace(FXFT_Face face);\r
-    void                       SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);\r
-    FXFT_Face          FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,\r
-                                  int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);\r
-\r
-    void                       FreeCache();\r
-\r
-    FX_BOOL                    GetStandardFont(FX_LPCBYTE& pFontData, FX_DWORD& size, int index);\r
-    CFX_FontMapper*    m_pBuiltinMapper;\r
-    IFX_FontMapper*    m_pExtMapper;\r
-    CFX_MapByteStringToPtr     m_FaceMap;\r
-    FXFT_Library       m_FTLibrary;\r
-    FoxitFonts m_ExternalFonts[16];\r
-};\r
-class IFX_FontMapper : public CFX_Object\r
-{\r
-public:\r
-\r
-    virtual ~IFX_FontMapper() {}\r
-\r
-    virtual FXFT_Face  FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,\r
-                                      int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont) = 0;\r
-\r
-    CFX_FontMgr*               m_pFontMgr;\r
-};\r
-class IFX_FontEnumerator\r
-{\r
-public:\r
-\r
-    virtual void               HitFont() = 0;\r
-\r
-    virtual void               Finish() = 0;\r
-};\r
-class IFX_AdditionalFontEnum\r
-{\r
-public:\r
-    virtual int  CountFiles() = 0;\r
-    virtual IFX_FileStream* GetFontFile(int index) = 0;\r
-};\r
-class CFX_FontMapper : public IFX_FontMapper\r
-{\r
-public:\r
-    CFX_FontMapper();\r
-    virtual ~CFX_FontMapper();\r
-    void                               SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);\r
-    IFX_SystemFontInfo*        GetSystemFontInfo()\r
-    {\r
-        return m_pFontInfo;\r
-    }\r
-    void                               AddInstalledFont(const CFX_ByteString& name, int charset);\r
-    void                               LoadInstalledFonts();\r
-    CFX_ByteStringArray        m_InstalledTTFonts;\r
-    void                               SetFontEnumerator(IFX_FontEnumerator* pFontEnumerator)\r
-    {\r
-        m_pFontEnumerator = pFontEnumerator;\r
-    }\r
-    IFX_FontEnumerator*        GetFontEnumerator() const\r
-    {\r
-        return m_pFontEnumerator;\r
-    }\r
-    virtual FXFT_Face  FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,\r
-                                      int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);\r
-private:\r
-    CFX_ByteString             GetPSNameFromTT(void* hFont);\r
-    CFX_ByteString             MatchInstalledFonts(const CFX_ByteString& norm_name);\r
-    FXFT_Face                  UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily);\r
-\r
-    FX_BOOL                            m_bListLoaded;\r
-    FXFT_Face                  m_MMFaces[2];\r
-    CFX_ByteString             m_LastFamily;\r
-    CFX_DWordArray             m_CharsetArray;\r
-    CFX_ByteStringArray        m_FaceArray;\r
-    IFX_SystemFontInfo*        m_pFontInfo;\r
-    FXFT_Face                  m_FoxitFaces[14];\r
-    IFX_FontEnumerator*                m_pFontEnumerator;\r
-};\r
-class IFX_SystemFontInfo : public CFX_Object\r
-{\r
-public:\r
-    static IFX_SystemFontInfo* CreateDefault();\r
-    virtual void               Release() = 0;\r
-    virtual    FX_BOOL         EnumFontList(CFX_FontMapper* pMapper) = 0;\r
-    virtual void*              MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact) = 0;\r
-    virtual void*              GetFont(FX_LPCSTR face) = 0;\r
-    virtual FX_DWORD   GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size) = 0;\r
-    virtual FX_BOOL            GetFaceName(void* hFont, CFX_ByteString& name) = 0;\r
-    virtual FX_BOOL            GetFontCharset(void* hFont, int& charset) = 0;\r
-    virtual int                        GetFaceIndex(void* hFont)\r
-    {\r
-        return 0;\r
-    }\r
-    virtual void               DeleteFont(void* hFont) = 0;\r
-    virtual void*       RetainFont(void* hFont)\r
-    {\r
-        return NULL;\r
-    }\r
-};\r
-class CFX_FolderFontInfo : public IFX_SystemFontInfo\r
-{\r
-public:\r
-    CFX_FolderFontInfo();\r
-    ~CFX_FolderFontInfo();\r
-    void                               AddPath(FX_BSTR path);\r
-    virtual void               Release();\r
-    virtual    FX_BOOL         EnumFontList(CFX_FontMapper* pMapper);\r
-    virtual void*              MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);\r
-    virtual void*              GetFont(FX_LPCSTR face);\r
-    virtual FX_DWORD   GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);\r
-    virtual void               DeleteFont(void* hFont);\r
-    virtual    FX_BOOL         GetFaceName(void* hFont, CFX_ByteString& name);\r
-    virtual FX_BOOL            GetFontCharset(void* hFont, int& charset);\r
-protected:\r
-    CFX_MapByteStringToPtr     m_FontList;\r
-    CFX_ByteStringArray        m_PathList;\r
-    CFX_FontMapper*            m_pMapper;\r
-    void                               ScanPath(CFX_ByteString& path);\r
-    void                               ScanFile(CFX_ByteString& path);\r
-    void                               ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset);\r
-};\r
-class CFX_CountedFaceCache : public CFX_Object\r
-{\r
-public:\r
-    CFX_FaceCache*     m_Obj;\r
-    FX_DWORD           m_nCount;\r
-};\r
-typedef CFX_MapPtrTemplate<FXFT_Face, CFX_CountedFaceCache*> CFX_FTCacheMap;\r
-class CFX_FontCache : public CFX_Object\r
-{\r
-public:\r
-    ~CFX_FontCache();\r
-    CFX_FaceCache*                     GetCachedFace(CFX_Font* pFont);\r
-    void                                       ReleaseCachedFace(CFX_Font* pFont);\r
-    void                                       FreeCache(FX_BOOL bRelease = FALSE);\r
-\r
-private:\r
-    CFX_FTCacheMap                     m_FTFaceMap;\r
-    CFX_FTCacheMap                     m_ExtFaceMap;\r
-};\r
-class CFX_AutoFontCache\r
-{\r
-public:\r
-    CFX_AutoFontCache(CFX_FontCache* pFontCache, CFX_Font* pFont)\r
-        : m_pFontCache(pFontCache)\r
-        , m_pFont(pFont)\r
-    {\r
-    }\r
-    ~CFX_AutoFontCache()\r
-    {\r
-        m_pFontCache->ReleaseCachedFace(m_pFont);\r
-    }\r
-    CFX_FontCache* m_pFontCache;\r
-    CFX_Font* m_pFont;\r
-};\r
-#define FX_FONTCACHE_DEFINE(pFontCache, pFont) CFX_AutoFontCache autoFontCache((pFontCache), (pFont))\r
-class CFX_GlyphBitmap : public CFX_Object\r
-{\r
-public:\r
-    int                                                m_Top;\r
-    int                                                m_Left;\r
-    CFX_DIBitmap                       m_Bitmap;\r
-};\r
-class CFX_FaceCache : public CFX_Object\r
-{\r
-public:\r
-    ~CFX_FaceCache();\r
-    const CFX_GlyphBitmap*     LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,\r
-                                            int dest_width, int anti_alias, int& text_flags);\r
-    const CFX_PathData*                LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width);\r
-\r
-\r
-    CFX_FaceCache(FXFT_Face face);\r
-private:\r
-    FXFT_Face                          m_Face;\r
-    CFX_GlyphBitmap*           RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,\r
-                                        const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);\r
-    CFX_GlyphBitmap*           RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index,\r
-            const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);\r
-    CFX_GlyphBitmap*        LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix, CFX_ByteStringC& FaceGlyphsKey,\r
-            FX_DWORD glyph_index, FX_BOOL bFontStyle, int dest_width, int anti_alias);\r
-    CFX_MapByteStringToPtr     m_SizeMap;\r
-    CFX_MapPtrToPtr                    m_PathMap;\r
-    CFX_DIBitmap*           m_pBitmap;\r
-    void*                   m_pPlatformGraphics;\r
-    void*                   m_pPlatformBitmap;\r
-    void*                   m_hDC;\r
-    void*                   m_hBitmap;\r
-    void*                   m_hOldBitmap;\r
-    void*                   m_hGdiFont;\r
-    void*                   m_hOldGdiFont;\r
-\r
-    void                                   InitPlatform();\r
-    void                                   DestroyPlatform();\r
-};\r
-typedef struct {\r
-    const CFX_GlyphBitmap*     m_pGlyph;\r
-    int                                        m_OriginX, m_OriginY;\r
-    FX_FLOAT                   m_fOriginX, m_fOriginY;\r
-} FXTEXT_GLYPHPOS;\r
-FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);\r
-FX_BOOL        OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,\r
-                    CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb);\r
-FX_BOOL        OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,\r
-                   CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb);\r
-class IFX_GSUBTable\r
-{\r
-public:\r
-    virtual void       Release() = 0;\r
-    virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) = 0;\r
-};\r
-IFX_GSUBTable* FXGE_CreateGSUBTable(CFX_Font* pFont);\r
-#endif\r
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef CORE_INCLUDE_FXGE_FX_FONT_H_
+#define CORE_INCLUDE_FXGE_FX_FONT_H_
+
+#include <map>
+
+#include "../fxcrt/fx_system.h"
+#include "fx_dib.h"
+
+typedef struct FT_FaceRec_* FXFT_Face;
+typedef void* FXFT_Library;
+class IFX_FontEncoding;
+class CFX_PathData;
+class CFX_SubstFont;
+class CFX_FaceCache;
+class IFX_FontMapper;
+class CFX_FontMapper;
+class IFX_SystemFontInfo;
+class CFontFileFaceInfo;
+#define FXFONT_FIXED_PITCH             0x01
+#define FXFONT_SERIF                   0x02
+#define FXFONT_SYMBOLIC                        0x04
+#define FXFONT_SCRIPT                  0x08
+#define FXFONT_ITALIC                  0x40
+#define FXFONT_BOLD                            0x40000
+#define FXFONT_USEEXTERNATTR   0x80000
+#define FXFONT_CIDFONT                 0x100000
+#define FXFONT_ANSI_CHARSET            0
+#define FXFONT_DEFAULT_CHARSET 1
+#define FXFONT_SYMBOL_CHARSET  2
+#define FXFONT_SHIFTJIS_CHARSET        128
+#define FXFONT_HANGEUL_CHARSET 129
+#define FXFONT_GB2312_CHARSET  134
+#define FXFONT_CHINESEBIG5_CHARSET     136
+#define FXFONT_THAI_CHARSET            222
+#define FXFONT_EASTEUROPE_CHARSET      238
+#define FXFONT_RUSSIAN_CHARSET 204
+#define FXFONT_GREEK_CHARSET   161
+#define FXFONT_TURKISH_CHARSET 162
+#define FXFONT_HEBREW_CHARSET  177
+#define FXFONT_ARABIC_CHARSET  178
+#define FXFONT_BALTIC_CHARSET  186
+#define FXFONT_FF_FIXEDPITCH   1
+#define FXFONT_FF_ROMAN                        (1<<4)
+#define FXFONT_FF_SCRIPT               (4<<4)
+#define FXFONT_FW_NORMAL               400
+#define FXFONT_FW_BOLD                 700
+class CFX_Font
+{
+public:
+    CFX_Font();
+    ~CFX_Font();
+
+    FX_BOOL                                    LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+                                      int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical = FALSE);
+
+    FX_BOOL                                    LoadEmbedded(const uint8_t* data, FX_DWORD size);
+
+    FX_BOOL                                    LoadFile(IFX_FileRead* pFile);
+
+    FXFT_Face                          GetFace() const
+    {
+        return m_Face;
+    }
+
+
+    const CFX_SubstFont*       GetSubstFont() const
+    {
+        return m_pSubstFont;
+    }
+
+    CFX_PathData*                      LoadGlyphPath(FX_DWORD glyph_index, int dest_width = 0);
+
+    int                                                GetGlyphWidth(FX_DWORD glyph_index);
+
+    int                                                GetAscent() const;
+
+    int                                                GetDescent() const;
+
+    FX_BOOL                 GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox);
+
+    FX_BOOL                 IsItalic();
+
+    FX_BOOL                 IsBold();
+
+    FX_BOOL                 IsFixedWidth();
+
+    FX_BOOL                                    IsVertical() const
+    {
+        return m_bVertical;
+    }
+
+    CFX_WideString          GetPsName() const;
+
+
+    CFX_ByteString          GetFamilyName() const;
+
+    CFX_ByteString          GetFaceName() const;
+
+
+    FX_BOOL                 IsTTFont();
+
+    FX_BOOL                 GetBBox(FX_RECT &bbox);
+
+    int                     GetHeight();
+
+    int                     GetULPos();
+
+    int                     GetULthickness();
+
+    int                     GetMaxAdvanceWidth();
+
+    FXFT_Face                          m_Face;
+
+    CFX_SubstFont*                     m_pSubstFont;
+    FX_BOOL                                    IsEmbedded()
+    {
+        return m_bEmbedded;
+    }
+
+    void                                       AdjustMMParams(int glyph_index, int width, int weight);
+    uint8_t*                           m_pFontDataAllocation;
+    uint8_t*               m_pFontData;
+    uint8_t*                           m_pGsubData;
+    FX_DWORD                m_dwSize;
+    CFX_BinaryBuf           m_OtfFontData;
+    void*                   m_hHandle;
+    void*                   m_pPlatformFont;
+    void*                   m_pPlatformFontCollection;
+    void*                   m_pDwFont;
+    FX_BOOL                 m_bDwLoaded;
+    void                    ReleasePlatformResource();
+
+    void                                       DeleteFace();
+protected:
+
+    FX_BOOL                                    m_bEmbedded;
+    FX_BOOL                                    m_bVertical;
+    void*                                      m_pOwnedStream;
+};
+#define ENCODING_INTERNAL              0
+#define ENCODING_UNICODE               1
+class IFX_FontEncoding
+{
+public:
+    virtual ~IFX_FontEncoding() {}
+
+    virtual FX_DWORD           GlyphFromCharCode(FX_DWORD charcode) = 0;
+
+    virtual CFX_WideString     UnicodeFromCharCode(FX_DWORD charcode) const = 0;
+
+    virtual FX_DWORD           CharCodeFromUnicode(FX_WCHAR Unicode) const = 0;
+};
+IFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont);
+#define FXFONT_SUBST_MM                                0x01
+#define FXFONT_SUBST_GLYPHPATH         0x04
+#define FXFONT_SUBST_CLEARTYPE         0x08
+#define FXFONT_SUBST_TRANSFORM         0x10
+#define FXFONT_SUBST_NONSYMBOL         0x20
+#define FXFONT_SUBST_EXACT                     0x40
+#define FXFONT_SUBST_STANDARD          0x80
+class CFX_SubstFont
+{
+public:
+
+    CFX_SubstFont();
+
+    void*                              m_ExtHandle;
+
+    CFX_ByteString                     m_Family;
+
+    int                                                m_Charset;
+
+    FX_DWORD                           m_SubstFlags;
+
+    int                                                m_Weight;
+
+    int                                                m_ItalicAngle;
+
+    FX_BOOL                                    m_bSubstOfCJK;
+
+    int                                                m_WeightCJK;
+
+    FX_BOOL                                    m_bItlicCJK;
+};
+#define FX_FONT_FLAG_SERIF              0x01
+#define FX_FONT_FLAG_FIXEDPITCH                        0x02
+#define FX_FONT_FLAG_ITALIC                            0x04
+#define FX_FONT_FLAG_BOLD                              0x08
+#define FX_FONT_FLAG_SYMBOLIC_SYMBOL   0x10
+#define FX_FONT_FLAG_SYMBOLIC_DINGBATS 0x20
+#define FX_FONT_FLAG_MULTIPLEMASTER            0x40
+typedef struct {
+    const uint8_t*     m_pFontData;
+    FX_DWORD   m_dwSize;
+} FoxitFonts;
+class CFX_FontMgr
+{
+public:
+    CFX_FontMgr();
+    ~CFX_FontMgr();
+    void                       InitFTLibrary();
+    FXFT_Face          GetCachedFace(const CFX_ByteString& face_name,
+                                  int weight, FX_BOOL bItalic, uint8_t*& pFontData);
+    FXFT_Face          AddCachedFace(const CFX_ByteString& face_name,
+                                  int weight, FX_BOOL bItalic, uint8_t* pData, FX_DWORD size, int face_index);
+    FXFT_Face          GetCachedTTCFace(int ttc_size, FX_DWORD checksum,
+                                     int font_offset, uint8_t*& pFontData);
+    FXFT_Face          AddCachedTTCFace(int ttc_size, FX_DWORD checksum,
+                                     uint8_t* pData, FX_DWORD size, int font_offset);
+    FXFT_Face          GetFileFace(const FX_CHAR* filename, int face_index);
+    FXFT_Face          GetFixedFace(const uint8_t* pData, FX_DWORD size, int face_index);
+    void                       ReleaseFace(FXFT_Face face);
+    void                       SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);
+    FXFT_Face          FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+                                  int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);
+
+    void                       FreeCache();
+
+    FX_BOOL                    GetStandardFont(const uint8_t*& pFontData, FX_DWORD& size, int index);
+    CFX_FontMapper*    m_pBuiltinMapper;
+    IFX_FontMapper*    m_pExtMapper;
+    CFX_MapByteStringToPtr     m_FaceMap;
+    FXFT_Library       m_FTLibrary;
+    FoxitFonts m_ExternalFonts[16];
+};
+class IFX_FontMapper
+{
+public:
+
+    virtual ~IFX_FontMapper() {}
+
+    virtual FXFT_Face  FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+                                      int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont) = 0;
+
+    CFX_FontMgr*               m_pFontMgr;
+};
+class IFX_FontEnumerator
+{
+public:
+    virtual ~IFX_FontEnumerator() { }
+
+    virtual void               HitFont() = 0;
+
+    virtual void               Finish() = 0;
+};
+class IFX_AdditionalFontEnum
+{
+public:
+    virtual ~IFX_AdditionalFontEnum() { }
+    virtual int  CountFiles() = 0;
+    virtual IFX_FileStream* GetFontFile(int index) = 0;
+};
+class CFX_FontMapper : public IFX_FontMapper
+{
+public:
+    CFX_FontMapper();
+    virtual ~CFX_FontMapper();
+    void                               SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo);
+    IFX_SystemFontInfo*        GetSystemFontInfo()
+    {
+        return m_pFontInfo;
+    }
+    void                               AddInstalledFont(const CFX_ByteString& name, int charset);
+    void                               LoadInstalledFonts();
+    CFX_ByteStringArray        m_InstalledTTFonts;
+    void                               SetFontEnumerator(IFX_FontEnumerator* pFontEnumerator)
+    {
+        m_pFontEnumerator = pFontEnumerator;
+    }
+    IFX_FontEnumerator*        GetFontEnumerator() const
+    {
+        return m_pFontEnumerator;
+    }
+    virtual FXFT_Face  FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+                                      int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont);
+private:
+    CFX_ByteString             GetPSNameFromTT(void* hFont);
+    CFX_ByteString             MatchInstalledFonts(const CFX_ByteString& norm_name);
+    FXFT_Face                  UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily);
+
+    FX_BOOL                            m_bListLoaded;
+    FXFT_Face                  m_MMFaces[2];
+    CFX_ByteString             m_LastFamily;
+    CFX_DWordArray             m_CharsetArray;
+    CFX_ByteStringArray        m_FaceArray;
+    IFX_SystemFontInfo*        m_pFontInfo;
+    FXFT_Face                  m_FoxitFaces[14];
+    IFX_FontEnumerator*                m_pFontEnumerator;
+};
+class IFX_SystemFontInfo
+{
+public:
+    static IFX_SystemFontInfo* CreateDefault();
+    virtual void               Release() = 0;
+
+    virtual    FX_BOOL         EnumFontList(CFX_FontMapper* pMapper) = 0;
+    virtual void*              MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, const FX_CHAR* face, int& iExact) = 0;
+    virtual void*              GetFont(const FX_CHAR* face) = 0;
+    virtual FX_DWORD   GetFontData(void* hFont, FX_DWORD table, uint8_t* buffer, FX_DWORD size) = 0;
+    virtual FX_BOOL            GetFaceName(void* hFont, CFX_ByteString& name) = 0;
+    virtual FX_BOOL            GetFontCharset(void* hFont, int& charset) = 0;
+    virtual int                        GetFaceIndex(void* hFont)
+    {
+        return 0;
+    }
+    virtual void               DeleteFont(void* hFont) = 0;
+    virtual void*       RetainFont(void* hFont)
+    {
+        return NULL;
+    }
+protected:
+    ~IFX_SystemFontInfo() { }
+};
+class CFX_FolderFontInfo : public IFX_SystemFontInfo
+{
+public:
+    CFX_FolderFontInfo();
+    virtual ~CFX_FolderFontInfo();
+    void AddPath(const CFX_ByteStringC& path);
+
+    // IFX_SytemFontInfo:
+    void Release() override;
+    FX_BOOL EnumFontList(CFX_FontMapper* pMapper) override;
+    void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family,
+                  const FX_CHAR* face, int& bExact) override;
+    void* GetFont(const FX_CHAR* face) override;
+    FX_DWORD GetFontData(void* hFont, FX_DWORD table,
+                         uint8_t* buffer, FX_DWORD size) override;
+    void DeleteFont(void* hFont) override;
+    FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name) override;
+    FX_BOOL GetFontCharset(void* hFont, int& charset) override;
+
+protected:
+    CFX_MapByteStringToPtr     m_FontList;
+    CFX_ByteStringArray        m_PathList;
+    CFX_FontMapper*            m_pMapper;
+    void                               ScanPath(CFX_ByteString& path);
+    void                               ScanFile(CFX_ByteString& path);
+    void                               ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset);
+};
+class CFX_CountedFaceCache
+{
+public:
+    CFX_FaceCache*     m_Obj;
+    FX_DWORD           m_nCount;
+};
+
+class CFX_FontCache
+{
+public:
+    ~CFX_FontCache();
+    CFX_FaceCache*                     GetCachedFace(CFX_Font* pFont);
+    void                                       ReleaseCachedFace(CFX_Font* pFont);
+    void                                       FreeCache(FX_BOOL bRelease = FALSE);
+
+private:
+    using CFX_FTCacheMap = std::map<FXFT_Face, CFX_CountedFaceCache*>;
+    CFX_FTCacheMap m_FTFaceMap;
+    CFX_FTCacheMap m_ExtFaceMap;
+};
+class CFX_AutoFontCache
+{
+public:
+    CFX_AutoFontCache(CFX_FontCache* pFontCache, CFX_Font* pFont)
+        : m_pFontCache(pFontCache)
+        , m_pFont(pFont)
+    {
+    }
+    ~CFX_AutoFontCache()
+    {
+        m_pFontCache->ReleaseCachedFace(m_pFont);
+    }
+    CFX_FontCache* m_pFontCache;
+    CFX_Font* m_pFont;
+};
+#define FX_FONTCACHE_DEFINE(pFontCache, pFont) CFX_AutoFontCache autoFontCache((pFontCache), (pFont))
+class CFX_GlyphBitmap
+{
+public:
+    int                                                m_Top;
+    int                                                m_Left;
+    CFX_DIBitmap                       m_Bitmap;
+};
+class CFX_FaceCache
+{
+public:
+    ~CFX_FaceCache();
+    const CFX_GlyphBitmap*     LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,
+                                            int dest_width, int anti_alias, int& text_flags);
+    const CFX_PathData*                LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width);
+
+
+    CFX_FaceCache(FXFT_Face face);
+private:
+    FXFT_Face                          m_Face;
+    CFX_GlyphBitmap*           RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,
+                                        const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);
+    CFX_GlyphBitmap*           RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index,
+            const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias);
+    CFX_GlyphBitmap*        LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix, CFX_ByteStringC& FaceGlyphsKey,
+            FX_DWORD glyph_index, FX_BOOL bFontStyle, int dest_width, int anti_alias);
+    CFX_MapByteStringToPtr     m_SizeMap;
+    CFX_MapPtrToPtr                    m_PathMap;
+    CFX_DIBitmap*           m_pBitmap;
+
+    void                                   InitPlatform();
+    void                                   DestroyPlatform();
+};
+typedef struct {
+    const CFX_GlyphBitmap*     m_pGlyph;
+    int                                        m_OriginX, m_OriginY;
+    FX_FLOAT                   m_fOriginX, m_fOriginY;
+} FXTEXT_GLYPHPOS;
+FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f);
+FX_BOOL        OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,
+                    CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb);
+FX_BOOL        OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,
+                   CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb);
+class IFX_GSUBTable
+{
+public:
+    static IFX_GSUBTable* Create(CFX_Font* pFont);
+    virtual ~IFX_GSUBTable() { }
+    virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) = 0;
+};
+
+#endif  // CORE_INCLUDE_FXGE_FX_FONT_H_