• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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