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 XFA_FGAS_FONT_CFGAS_GEFONT_H_ 8 #define XFA_FGAS_FONT_CFGAS_GEFONT_H_ 9 10 #include <map> 11 #include <memory> 12 #include <vector> 13 14 #include "core/fxcrt/cfx_retain_ptr.h" 15 #include "core/fxcrt/fx_memory.h" 16 #include "xfa/fgas/crt/fgas_utils.h" 17 #include "xfa/fgas/font/cfgas_fontmgr.h" 18 19 #define FXFONT_SUBST_ITALIC 0x02 20 21 class CFGAS_FontMgr; 22 class CFX_UnicodeEncoding; 23 class CXFA_PDFFontMgr; 24 25 class CFGAS_GEFont : public CFX_Retainable { 26 public: 27 template <typename T> 28 friend class CFX_RetainPtr; 29 template <typename T, typename... Args> 30 friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args); 31 32 static CFX_RetainPtr<CFGAS_GEFont> LoadFont(const FX_WCHAR* pszFontFamily, 33 uint32_t dwFontStyles, 34 uint16_t wCodePage, 35 CFGAS_FontMgr* pFontMgr); 36 static CFX_RetainPtr<CFGAS_GEFont> LoadFont(CFX_Font* pExternalFont, 37 CFGAS_FontMgr* pFontMgr); 38 static CFX_RetainPtr<CFGAS_GEFont> LoadFont( 39 std::unique_ptr<CFX_Font> pInternalFont, 40 CFGAS_FontMgr* pFontMgr); 41 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 42 static CFX_RetainPtr<CFGAS_GEFont> LoadFont(const uint8_t* pBuffer, 43 int32_t iLength, 44 CFGAS_FontMgr* pFontMgr); 45 static CFX_RetainPtr<CFGAS_GEFont> LoadFont( 46 const CFX_RetainPtr<IFGAS_Stream>& pFontStream, 47 CFGAS_FontMgr* pFontMgr, 48 bool bSaveStream); 49 #endif 50 51 CFX_RetainPtr<CFGAS_GEFont> Derive(uint32_t dwFontStyles, 52 uint16_t wCodePage = 0); 53 uint32_t GetFontStyles() const; 54 bool GetCharWidth(FX_WCHAR wUnicode, int32_t& iWidth, bool bCharCode); 55 int32_t GetGlyphIndex(FX_WCHAR wUnicode, bool bCharCode = false); 56 int32_t GetAscent() const; 57 int32_t GetDescent() const; 58 bool GetCharBBox(FX_WCHAR wUnicode, CFX_Rect* bbox, bool bCharCode = false); 59 bool GetBBox(CFX_Rect* bbox); 60 CFX_RetainPtr<CFGAS_GEFont> GetSubstFont(int32_t iGlyphIndex); GetDevFont()61 CFX_Font* GetDevFont() const { return m_pFont; } SetFontProvider(CXFA_PDFFontMgr * pProvider)62 void SetFontProvider(CXFA_PDFFontMgr* pProvider) { m_pProvider = pProvider; } 63 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ SetLogicalFontStyle(uint32_t dwLogFontStyle)64 void SetLogicalFontStyle(uint32_t dwLogFontStyle) { 65 m_bUseLogFontStyle = true; 66 m_dwLogFontStyle = dwLogFontStyle; 67 } 68 #endif 69 70 private: 71 explicit CFGAS_GEFont(CFGAS_FontMgr* pFontMgr); 72 CFGAS_GEFont(const CFX_RetainPtr<CFGAS_GEFont>& src, uint32_t dwFontStyles); 73 ~CFGAS_GEFont() override; 74 75 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 76 bool LoadFontInternal(const FX_WCHAR* pszFontFamily, 77 uint32_t dwFontStyles, 78 uint16_t wCodePage); 79 bool LoadFontInternal(const uint8_t* pBuffer, int32_t length); 80 bool LoadFontInternal(const CFX_RetainPtr<IFGAS_Stream>& pFontStream, 81 bool bSaveStream); 82 #endif 83 bool LoadFontInternal(CFX_Font* pExternalFont); 84 bool LoadFontInternal(std::unique_ptr<CFX_Font> pInternalFont); 85 bool InitFont(); 86 bool GetCharBBoxInternal(FX_WCHAR wUnicode, 87 CFX_Rect* bbox, 88 bool bRecursive, 89 bool bCharCode = false); 90 bool GetCharWidthInternal(FX_WCHAR wUnicode, 91 int32_t& iWidth, 92 bool bRecursive, 93 bool bCharCode); 94 int32_t GetGlyphIndex(FX_WCHAR wUnicode, 95 bool bRecursive, 96 CFX_RetainPtr<CFGAS_GEFont>* ppFont, 97 bool bCharCode = false); 98 CFX_WideString GetFamilyName() const; 99 100 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ 101 bool m_bUseLogFontStyle; 102 uint32_t m_dwLogFontStyle; 103 #endif 104 CFX_Font* m_pFont; 105 CFX_RetainPtr<CFGAS_GEFont> m_pSrcFont; // Only set by ctor, so no cycles. 106 CFGAS_FontMgr* const m_pFontMgr; 107 bool m_bExternalFont; 108 CFX_RetainPtr<IFGAS_Stream> m_pStream; 109 CFX_RetainPtr<IFX_SeekableReadStream> m_pFileRead; 110 std::unique_ptr<CFX_UnicodeEncoding> m_pFontEncoding; 111 std::unique_ptr<CFX_DiscreteArrayTemplate<uint16_t>> m_pCharWidthMap; 112 std::map<FX_WCHAR, CFX_Rect> m_BBoxMap; 113 CXFA_PDFFontMgr* m_pProvider; // not owned. 114 std::vector<CFX_RetainPtr<CFGAS_GEFont>> m_SubstFonts; 115 std::map<FX_WCHAR, CFX_RetainPtr<CFGAS_GEFont>> m_FontMapper; 116 }; 117 118 #endif // XFA_FGAS_FONT_CFGAS_GEFONT_H_ 119