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