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 13 typedef struct FT_FaceRec_* FXFT_Face; 14 typedef void* FXFT_Library; 15 class IFX_FontEncoding; 16 class CFX_PathData; 17 class CFX_SubstFont; 18 class CFX_FaceCache; 19 class IFX_FontMapper; 20 class CFX_FontMapper; 21 class IFX_SystemFontInfo; 22 class 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 51 class CFX_Font 52 { 53 public: 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 GetFace()64 FXFT_Face GetFace() const 65 { 66 return m_Face; 67 } 68 69 GetSubstFont()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 IsVertical()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; IsEmbedded()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(); 138 protected: 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 146 class IFX_FontEncoding 147 { 148 public: ~IFX_FontEncoding()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 }; 157 IFX_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 165 class CFX_SubstFont 166 { 167 public: 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 196 typedef struct { 197 FX_LPCBYTE m_pFontData; 198 FX_DWORD m_dwSize; 199 } FoxitFonts; 200 class CFX_FontMgr 201 { 202 public: 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 }; 230 class IFX_FontMapper 231 { 232 public: 233 ~IFX_FontMapper()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 }; 241 class IFX_FontEnumerator 242 { 243 public: ~IFX_FontEnumerator()244 virtual ~IFX_FontEnumerator() { } 245 246 virtual void HitFont() = 0; 247 248 virtual void Finish() = 0; 249 }; 250 class IFX_AdditionalFontEnum 251 { 252 public: ~IFX_AdditionalFontEnum()253 virtual ~IFX_AdditionalFontEnum() { } 254 virtual int CountFiles() = 0; 255 virtual IFX_FileStream* GetFontFile(int index) = 0; 256 }; 257 class CFX_FontMapper : public IFX_FontMapper 258 { 259 public: 260 CFX_FontMapper(); 261 virtual ~CFX_FontMapper(); 262 void SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo); GetSystemFontInfo()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; SetFontEnumerator(IFX_FontEnumerator * pFontEnumerator)270 void SetFontEnumerator(IFX_FontEnumerator* pFontEnumerator) 271 { 272 m_pFontEnumerator = pFontEnumerator; 273 } GetFontEnumerator()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); 280 private: 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 }; 294 class IFX_SystemFontInfo 295 { 296 public: 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; GetFaceIndex(void * hFont)306 virtual int GetFaceIndex(void* hFont) 307 { 308 return 0; 309 } 310 virtual void DeleteFont(void* hFont) = 0; RetainFont(void * hFont)311 virtual void* RetainFont(void* hFont) 312 { 313 return NULL; 314 } 315 protected: ~IFX_SystemFontInfo()316 ~IFX_SystemFontInfo() { } 317 }; 318 class CFX_FolderFontInfo : public IFX_SystemFontInfo 319 { 320 public: 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); 332 protected: 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 }; 340 class CFX_CountedFaceCache 341 { 342 public: 343 CFX_FaceCache* m_Obj; 344 FX_DWORD m_nCount; 345 }; 346 typedef CFX_MapPtrTemplate<FXFT_Face, CFX_CountedFaceCache*> CFX_FTCacheMap; 347 class CFX_FontCache 348 { 349 public: 350 ~CFX_FontCache(); 351 CFX_FaceCache* GetCachedFace(CFX_Font* pFont); 352 void ReleaseCachedFace(CFX_Font* pFont); 353 void FreeCache(FX_BOOL bRelease = FALSE); 354 355 private: 356 CFX_FTCacheMap m_FTFaceMap; 357 CFX_FTCacheMap m_ExtFaceMap; 358 }; 359 class CFX_AutoFontCache 360 { 361 public: CFX_AutoFontCache(CFX_FontCache * pFontCache,CFX_Font * pFont)362 CFX_AutoFontCache(CFX_FontCache* pFontCache, CFX_Font* pFont) 363 : m_pFontCache(pFontCache) 364 , m_pFont(pFont) 365 { 366 } ~CFX_AutoFontCache()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)) 375 class CFX_GlyphBitmap 376 { 377 public: 378 int m_Top; 379 int m_Left; 380 CFX_DIBitmap m_Bitmap; 381 }; 382 class CFX_FaceCache 383 { 384 public: 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); 392 private: 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 }; 414 typedef struct { 415 const CFX_GlyphBitmap* m_pGlyph; 416 int m_OriginX, m_OriginY; 417 FX_FLOAT m_fOriginX, m_fOriginY; 418 } FXTEXT_GLYPHPOS; 419 FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX = 1.0f, FX_FLOAT retinaScaleY = 1.0f); 420 FX_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); 422 FX_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); 424 class IFX_GSUBTable 425 { 426 public: 427 virtual void Release() = 0; 428 virtual FX_BOOL GetVerticalGlyph(FX_DWORD glyphnum, FX_DWORD* vglyphnum) = 0; 429 430 protected: ~IFX_GSUBTable()431 ~IFX_GSUBTable() { } 432 }; 433 IFX_GSUBTable* FXGE_CreateGSUBTable(CFX_Font* pFont); 434 435 #endif // CORE_INCLUDE_FXGE_FX_FONT_H_ 436