Use override in more classes in core/
[pdfium.git] / core / include / fxge / fx_font.h
index abfa9b8..ce06a8a 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 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;
+  CFX_MapByteStringToPtr m_FaceMap;
+  FXFT_Library m_FTLibrary;
+  FoxitFonts m_ExternalFonts[16];
+};
+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:
+  explicit CFX_FontMapper(CFX_FontMgr* mgr);
+  ~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; }
+  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;
+  CFX_FontMgr* const m_pFontMgr;
+};
+
+class IFX_SystemFontInfo {
+ public:
+  static IFX_SystemFontInfo* CreateDefault(const char** pUserPaths);
+  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:
+  virtual ~IFX_SystemFontInfo() {}
+};
+
+class CFX_FolderFontInfo : public IFX_SystemFontInfo {
+ public:
+  CFX_FolderFontInfo();
+  ~CFX_FolderFontInfo() override;
+  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);
+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_