• 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 _FX_FONT
8 #define _FX_FONT
9 class IFX_Font;
10 class IFX_FontMgr;
11 #define FX_FONTSTYLE_Normal 0x00
12 #define FX_FONTSTYLE_FixedPitch 0x01
13 #define FX_FONTSTYLE_Serif 0x02
14 #define FX_FONTSTYLE_Symbolic 0x04
15 #define FX_FONTSTYLE_Script 0x08
16 #define FX_FONTSTYLE_Italic 0x40
17 #define FX_FONTSTYLE_Bold 0x40000
18 #define FX_FONTSTYLE_BoldItalic (FX_FONTSTYLE_Bold | FX_FONTSTYLE_Italic)
19 #define FX_FONTSTYLE_ExactMatch 0x80000000
20 #define FX_FONTDECORATION_Underline 0x00000001
21 #define FX_FONTDECORATION_Strikeout 0x00000002
22 #define FX_FONTDECORATION_Overline 0x00000004
23 #define FX_FONTDECORATION_Emphasis 0x00000008
24 #define FX_FONTDECORATION_Superscript 0x00000010
25 #define FX_FONTDECORATION_Subscript 0x00000020
26 #define FX_FONTDECORATION_SmallCapital 0x00000040
27 #define FX_FONTDECORATION_Capital 0x00000080
28 #define FX_FONTDECORATION_Lowercase 0x000000C0
29 #define FX_FONTDECORATION_Raised 0x00000100
30 #define FX_FONTDECORATION_Sunken 0x00000200
31 #define FX_FONTDECORATION_Shadow 0x00000400
32 #define FX_FONTDECORATION_BoundingShape 0x20000000
33 #define FX_FONTDECORATION_Hide 0x40000000
34 #define FX_FONTDECORATION_StrokeFill 0x80000000
35 #define FX_BOUNDINGSHAPE_None 0
36 #define FX_BOUNDINGSHAPE_Circle 1
37 #define FX_BOUNDINGSHAPE_Square 2
38 #define FX_BOUNDINGSHAPE_Triangle 3
39 #define FX_BOUNDINGSHAPE_Diamond 4
40 
41 class IFX_FontProvider {
42  public:
~IFX_FontProvider()43   virtual ~IFX_FontProvider() {}
44   virtual FX_BOOL GetCharWidth(IFX_Font* pFont,
45                                FX_WCHAR wUnicode,
46                                int32_t& iWidth,
47                                FX_BOOL bCharCode = FALSE) = 0;
48 };
49 
50 class IFX_Font {
51  public:
52   static IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
53                             FX_DWORD dwFontStyles,
54                             FX_WORD wCodePage,
55                             IFX_FontMgr* pFontMgr);
56   static IFX_Font* LoadFont(const uint8_t* pBuffer,
57                             int32_t iLength,
58                             IFX_FontMgr* pFontMgr);
59   static IFX_Font* LoadFont(const FX_WCHAR* pszFileName, IFX_FontMgr* pFontMgr);
60   static IFX_Font* LoadFont(IFX_Stream* pFontStream,
61                             IFX_FontMgr* pFontMgr,
62                             FX_BOOL bSaveStream = FALSE);
63   static IFX_Font* LoadFont(CFX_Font* pExtFont,
64                             IFX_FontMgr* pFontMgr,
65                             FX_BOOL bTakeOver = FALSE);
~IFX_Font()66   virtual ~IFX_Font() {}
67   virtual void Release() = 0;
68   virtual IFX_Font* Retain() = 0;
69   virtual IFX_Font* Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage = 0) = 0;
70   virtual void GetFamilyName(CFX_WideString& wsFamily) const = 0;
71   virtual void GetPsName(CFX_WideString& wsName) const = 0;
72   virtual FX_DWORD GetFontStyles() const = 0;
73   virtual uint8_t GetCharSet() const = 0;
74   virtual FX_BOOL GetCharWidth(FX_WCHAR wUnicode,
75                                int32_t& iWidth,
76                                FX_BOOL bCharCode = FALSE) = 0;
77   virtual int32_t GetGlyphIndex(FX_WCHAR wUnicode,
78                                 FX_BOOL bCharCode = FALSE) = 0;
79   virtual int32_t GetAscent() const = 0;
80   virtual int32_t GetDescent() const = 0;
81   virtual FX_BOOL GetCharBBox(FX_WCHAR wUnicode,
82                               CFX_Rect& bbox,
83                               FX_BOOL bCharCode = FALSE) = 0;
84   virtual FX_BOOL GetBBox(CFX_Rect& bbox) = 0;
85   virtual int32_t GetItalicAngle() const = 0;
86   virtual void Reset() = 0;
87   virtual IFX_Font* GetSubstFont(int32_t iGlyphIndex) const = 0;
88   virtual void* GetDevFont() const = 0;
89   virtual void SetFontProvider(IFX_FontProvider* pProvider) = 0;
90 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
91   virtual void SetLogicalFontStyle(FX_DWORD dwLogFontStyle) = 0;
92 #endif
93 };
94 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
95 typedef struct _FX_FONTMATCHPARAMS {
96   const FX_WCHAR* pwsFamily;
97   FX_DWORD dwFontStyles;
98   FX_DWORD dwUSB;
99   FX_DWORD dwMatchFlags;
100   FX_WCHAR wUnicode;
101   FX_WORD wCodePage;
102 } FX_FONTMATCHPARAMS, *FX_LPFONTMATCHPARAMS;
103 typedef FX_FONTMATCHPARAMS const* FX_LPCFONTMATCHPARAMS;
104 typedef struct _FX_FONTSIGNATURE : public CFX_Target {
105   FX_DWORD fsUsb[4];
106   FX_DWORD fsCsb[2];
107 } FX_FONTSIGNATURE;
108 typedef struct _FX_FONTDESCRIPTOR : public CFX_Target {
109   FX_WCHAR wsFontFace[32];
110   FX_DWORD dwFontStyles;
111   uint8_t uCharSet;
112   FX_FONTSIGNATURE FontSignature;
113 } FX_FONTDESCRIPTOR, *FX_LPFONTDESCRIPTOR;
114 typedef FX_FONTDESCRIPTOR const* FX_LPCFONTDESCRIPTOR;
115 typedef CFX_MassArrayTemplate<FX_FONTDESCRIPTOR> CFX_FontDescriptors;
116 inline FX_BOOL operator==(const FX_FONTDESCRIPTOR& left,
117                           const FX_FONTDESCRIPTOR& right) {
118   return left.uCharSet == right.uCharSet &&
119          left.dwFontStyles == right.dwFontStyles &&
120          FXSYS_wcscmp(left.wsFontFace, right.wsFontFace) == 0 &&
121          FXSYS_memcmp(&left.FontSignature, &right.FontSignature,
122                       sizeof(FX_FONTSIGNATURE)) == 0;
123 }
124 #define FX_FONTMATCHPARA_MacthStyle 0x01
125 #define FX_FONTMATCHPARA_MacthFamily 0x02
126 #define FX_FONTMATCHPARA_MacthUnicode 0x04
127 typedef void (*FX_LPEnumAllFonts)(CFX_FontDescriptors& fonts,
128                                   void* pUserData,
129                                   const FX_WCHAR* pwsFaceName,
130                                   FX_WCHAR wUnicode);
131 FX_LPEnumAllFonts FX_GetDefFontEnumerator();
132 typedef FX_LPCFONTDESCRIPTOR (*FX_LPMatchFont)(FX_LPFONTMATCHPARAMS pParams,
133                                                const CFX_FontDescriptors& fonts,
134                                                void* pUserData);
135 FX_LPMatchFont FX_GetDefFontMatchor();
136 class IFX_FontMgr {
137  public:
138   static IFX_FontMgr* Create(FX_LPEnumAllFonts pEnumerator,
139                              FX_LPMatchFont pMatcher = NULL,
140                              void* pUserData = NULL);
~IFX_FontMgr()141   virtual ~IFX_FontMgr() {}
142   virtual void Release() = 0;
143   virtual IFX_Font* GetDefFontByCodePage(
144       FX_WORD wCodePage,
145       FX_DWORD dwFontStyles,
146       const FX_WCHAR* pszFontFamily = NULL) = 0;
147   virtual IFX_Font* GetDefFontByCharset(
148       uint8_t nCharset,
149       FX_DWORD dwFontStyles,
150       const FX_WCHAR* pszFontFamily = NULL) = 0;
151   virtual IFX_Font* GetDefFontByUnicode(
152       FX_WCHAR wUnicode,
153       FX_DWORD dwFontStyles,
154       const FX_WCHAR* pszFontFamily = NULL) = 0;
155   virtual IFX_Font* GetDefFontByLanguage(
156       FX_WORD wLanguage,
157       FX_DWORD dwFontStyles,
158       const FX_WCHAR* pszFontFamily = NULL) = 0;
159   virtual IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
160                              FX_DWORD dwFontStyles,
161                              FX_WORD wCodePage = 0xFFFF) = 0;
162   virtual IFX_Font* LoadFont(const uint8_t* pBuffer, int32_t iLength) = 0;
163   virtual IFX_Font* LoadFont(const FX_WCHAR* pszFileName) = 0;
164   virtual IFX_Font* LoadFont(IFX_Stream* pFontStream,
165                              const FX_WCHAR* pszFontAlias = NULL,
166                              FX_DWORD dwFontStyles = 0,
167                              FX_WORD wCodePage = 0,
168                              FX_BOOL bSaveStream = FALSE) = 0;
169   virtual IFX_Font* LoadFont(IFX_Font* pSrcFont,
170                              FX_DWORD dwFontStyles,
171                              FX_WORD wCodePage = 0xFFFF) = 0;
172   virtual void ClearFontCache() = 0;
173   virtual void RemoveFont(IFX_Font* pFont) = 0;
174 };
175 #else
176 class IFX_FontMgrDelegate {
177  public:
~IFX_FontMgrDelegate()178   virtual ~IFX_FontMgrDelegate() {}
179   virtual IFX_Font* GetDefFontByCodePage(
180       IFX_FontMgr* pFontMgr,
181       FX_WORD wCodePage,
182       FX_DWORD dwFontStyles,
183       const FX_WCHAR* pszFontFamily = NULL) = 0;
184   virtual IFX_Font* GetDefFontByCharset(
185       IFX_FontMgr* pFontMgr,
186       uint8_t nCharset,
187       FX_DWORD dwFontStyles,
188       const FX_WCHAR* pszFontFamily = NULL) = 0;
189   virtual IFX_Font* GetDefFontByUnicode(
190       IFX_FontMgr* pFontMgr,
191       FX_WCHAR wUnicode,
192       FX_DWORD dwFontStyles,
193       const FX_WCHAR* pszFontFamily = NULL) = 0;
194   virtual IFX_Font* GetDefFontByLanguage(
195       IFX_FontMgr* pFontMgr,
196       FX_WORD wLanguage,
197       FX_DWORD dwFontStyles,
198       const FX_WCHAR* pszFontFamily = NULL) = 0;
199 };
200 class IFX_FontSourceEnum {
201  public:
~IFX_FontSourceEnum()202   virtual ~IFX_FontSourceEnum() {}
203   virtual void Release() = 0;
204   virtual FX_POSITION GetStartPosition(void* pUserData = NULL) = 0;
205   virtual IFX_FileAccess* GetNext(FX_POSITION& pos, void* pUserData = NULL) = 0;
206 };
207 IFX_FontSourceEnum* FX_CreateDefaultFontSourceEnum();
208 class IFX_FontMgr {
209  public:
210   static IFX_FontMgr* Create(IFX_FontSourceEnum* pFontEnum,
211                              IFX_FontMgrDelegate* pDelegate = NULL,
212                              void* pUserData = NULL);
~IFX_FontMgr()213   virtual ~IFX_FontMgr() {}
214   virtual void Release() = 0;
215   virtual IFX_Font* GetDefFontByCodePage(
216       FX_WORD wCodePage,
217       FX_DWORD dwFontStyles,
218       const FX_WCHAR* pszFontFamily = NULL) = 0;
219   virtual IFX_Font* GetDefFontByCharset(
220       uint8_t nCharset,
221       FX_DWORD dwFontStyles,
222       const FX_WCHAR* pszFontFamily = NULL) = 0;
223   virtual IFX_Font* GetDefFontByUnicode(
224       FX_WCHAR wUnicode,
225       FX_DWORD dwFontStyles,
226       const FX_WCHAR* pszFontFamily = NULL) = 0;
227   virtual IFX_Font* GetDefFontByLanguage(
228       FX_WORD wLanguage,
229       FX_DWORD dwFontStyles,
230       const FX_WCHAR* pszFontFamily = NULL) = 0;
231   virtual IFX_Font* GetFontByCodePage(FX_WORD wCodePage,
232                                       FX_DWORD dwFontStyles,
233                                       const FX_WCHAR* pszFontFamily = NULL) = 0;
LoadFont(const FX_WCHAR * pszFontFamily,FX_DWORD dwFontStyles,FX_WORD wCodePage)234   inline IFX_Font* LoadFont(const FX_WCHAR* pszFontFamily,
235                             FX_DWORD dwFontStyles,
236                             FX_WORD wCodePage) {
237     return GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily);
238   }
239   virtual IFX_Font* GetFontByCharset(uint8_t nCharset,
240                                      FX_DWORD dwFontStyles,
241                                      const FX_WCHAR* pszFontFamily = NULL) = 0;
242   virtual IFX_Font* GetFontByUnicode(FX_WCHAR wUnicode,
243                                      FX_DWORD dwFontStyles,
244                                      const FX_WCHAR* pszFontFamily = NULL) = 0;
245   virtual IFX_Font* GetFontByLanguage(FX_WORD wLanguage,
246                                       FX_DWORD dwFontStyles,
247                                       const FX_WCHAR* pszFontFamily = NULL) = 0;
248   virtual IFX_Font* LoadFont(const uint8_t* pBuffer,
249                              int32_t iLength,
250                              int32_t iFaceIndex,
251                              int32_t* pFaceCount = NULL) = 0;
252   virtual IFX_Font* LoadFont(const FX_WCHAR* pszFileName,
253                              int32_t iFaceIndex,
254                              int32_t* pFaceCount = NULL) = 0;
255   virtual IFX_Font* LoadFont(IFX_Stream* pFontStream,
256                              int32_t iFaceIndex,
257                              int32_t* pFaceCount = NULL,
258                              FX_BOOL bSaveStream = FALSE) = 0;
259 
260   virtual void ClearFontCache() = 0;
261   virtual void RemoveFont(IFX_Font* pFont) = 0;
262 };
263 #endif
264 #endif
265