Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fgas / include / fx_fnt.h
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #ifndef _FX_FONT\r
8 #define _FX_FONT\r
9 class IFX_Font;\r
10 class IFX_FontMgr;\r
11 #define FX_FONTSTYLE_Normal                                     0x00\r
12 #define FX_FONTSTYLE_FixedPitch                         0x01\r
13 #define FX_FONTSTYLE_Serif                                      0x02\r
14 #define FX_FONTSTYLE_Symbolic                           0x04\r
15 #define FX_FONTSTYLE_Script                                     0x08\r
16 #define FX_FONTSTYLE_Italic                                     0x40\r
17 #define FX_FONTSTYLE_Bold                                       0x40000\r
18 #define FX_FONTSTYLE_BoldItalic                         (FX_FONTSTYLE_Bold|FX_FONTSTYLE_Italic)\r
19 #define FX_FONTSTYLE_ExactMatch                         0x80000000\r
20 #define FX_FONTDECORATION_Underline                     0x00000001\r
21 #define FX_FONTDECORATION_Strikeout                     0x00000002\r
22 #define FX_FONTDECORATION_Overline                      0x00000004\r
23 #define FX_FONTDECORATION_Emphasis                      0x00000008\r
24 #define FX_FONTDECORATION_Superscript           0x00000010\r
25 #define FX_FONTDECORATION_Subscript                     0x00000020\r
26 #define FX_FONTDECORATION_SmallCapital          0x00000040\r
27 #define FX_FONTDECORATION_Capital                       0x00000080\r
28 #define FX_FONTDECORATION_Lowercase                     0x000000C0\r
29 #define FX_FONTDECORATION_Raised                        0x00000100\r
30 #define FX_FONTDECORATION_Sunken                        0x00000200\r
31 #define FX_FONTDECORATION_Shadow                        0x00000400\r
32 #define FX_FONTDECORATION_BoundingShape         0x20000000\r
33 #define FX_FONTDECORATION_Hide                          0x40000000\r
34 #define FX_FONTDECORATION_StrokeFill            0x80000000\r
35 #define FX_BOUNDINGSHAPE_None                   0\r
36 #define FX_BOUNDINGSHAPE_Circle                 1\r
37 #define FX_BOUNDINGSHAPE_Square                 2\r
38 #define FX_BOUNDINGSHAPE_Triangle               3\r
39 #define FX_BOUNDINGSHAPE_Diamond                4\r
40 class IFX_FontProvider\r
41 {\r
42 public:\r
43     virtual FX_BOOL             GetCharWidth(IFX_Font* pFont, FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bCharCode = FALSE) = 0;\r
44 };\r
45 class IFX_Font\r
46 {\r
47 public:\r
48     static IFX_Font*            LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage, IFX_FontMgr *pFontMgr);\r
49     static IFX_Font*            LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength, IFX_FontMgr *pFontMgr);\r
50     static IFX_Font*            LoadFont(FX_LPCWSTR pszFileName, IFX_FontMgr *pFontMgr);\r
51     static IFX_Font*            LoadFont(IFX_Stream *pFontStream, IFX_FontMgr *pFontMgr, FX_BOOL bSaveStream = FALSE);\r
52     static IFX_Font*            LoadFont(CFX_Font *pExtFont, IFX_FontMgr *pFontMgr, FX_BOOL bTakeOver = FALSE);\r
53     virtual void                        Release() = 0;\r
54     virtual IFX_Font*           Retain() = 0;\r
55     virtual IFX_Font*           Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage = 0) = 0;\r
56     virtual void                        GetFamilyName(CFX_WideString &wsFamily) const = 0;\r
57     virtual void                        GetPsName(CFX_WideString &wsName) const = 0;\r
58     virtual FX_DWORD            GetFontStyles() const = 0;\r
59     virtual FX_BYTE                     GetCharSet() const = 0;\r
60     virtual FX_BOOL                     GetCharWidth(FX_WCHAR wUnicode, FX_INT32 &iWidth, FX_BOOL bCharCode = FALSE) = 0;\r
61     virtual FX_INT32            GetGlyphIndex(FX_WCHAR wUnicode, FX_BOOL bCharCode = FALSE) = 0;\r
62     virtual FX_INT32            GetAscent() const = 0;\r
63     virtual FX_INT32            GetDescent() const = 0;\r
64     virtual FX_BOOL                     GetCharBBox(FX_WCHAR wUnicode, CFX_Rect &bbox, FX_BOOL bCharCode = FALSE) = 0;\r
65     virtual FX_BOOL                     GetBBox(CFX_Rect &bbox) = 0;\r
66     virtual FX_INT32            GetItalicAngle() const = 0;\r
67     virtual void                        Reset() = 0;\r
68     virtual IFX_Font*           GetSubstFont(FX_INT32 iGlyphIndex) const = 0;\r
69     virtual void*                       GetDevFont() const = 0;\r
70     virtual void                        SetFontProvider(IFX_FontProvider* pProvider) = 0;\r
71 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_\r
72     virtual void                        SetLogicalFontStyle(FX_DWORD dwLogFontStyle) = 0;\r
73 #endif\r
74 };\r
75 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\r
76 typedef struct _FX_FONTMATCHPARAMS : public CFX_Object {\r
77     FX_LPCWSTR                          pwsFamily;\r
78     FX_DWORD                            dwFontStyles;\r
79     FX_DWORD                            dwUSB;\r
80     FX_DWORD                            dwMatchFlags;\r
81     FX_WCHAR                            wUnicode;\r
82     FX_WORD                                     wCodePage;\r
83 } FX_FONTMATCHPARAMS, * FX_LPFONTMATCHPARAMS;\r
84 typedef FX_FONTMATCHPARAMS const * FX_LPCFONTMATCHPARAMS;\r
85 typedef struct _FX_FONTSIGNATURE : public CFX_Target {\r
86     FX_DWORD                            fsUsb[4];\r
87     FX_DWORD                            fsCsb[2];\r
88 } FX_FONTSIGNATURE;\r
89 typedef struct _FX_FONTDESCRIPTOR : public CFX_Target {\r
90     FX_WCHAR                            wsFontFace[32];\r
91     FX_DWORD                            dwFontStyles;\r
92     FX_BYTE                                     uCharSet;\r
93     FX_FONTSIGNATURE            FontSignature;\r
94 } FX_FONTDESCRIPTOR, * FX_LPFONTDESCRIPTOR;\r
95 typedef FX_FONTDESCRIPTOR const * FX_LPCFONTDESCRIPTOR;\r
96 typedef CFX_MassArrayTemplate<FX_FONTDESCRIPTOR> CFX_FontDescriptors;\r
97 inline FX_BOOL operator == (const FX_FONTDESCRIPTOR &left, const FX_FONTDESCRIPTOR &right)\r
98 {\r
99     return left.uCharSet == right.uCharSet\r
100            && left.dwFontStyles == right.dwFontStyles\r
101            && FXSYS_wcscmp(left.wsFontFace, right.wsFontFace) == 0\r
102            && FXSYS_memcmp(&left.FontSignature, &right.FontSignature, sizeof(FX_FONTSIGNATURE)) == 0;\r
103 }\r
104 #define FX_FONTMATCHPARA_MacthStyle             0x01\r
105 #define FX_FONTMATCHPARA_MacthFamily    0x02\r
106 #define FX_FONTMATCHPARA_MacthUnicode   0x04\r
107 typedef void (*FX_LPEnumAllFonts)(CFX_FontDescriptors &fonts, FX_LPVOID pUserData, FX_LPCWSTR pwsFaceName, FX_WCHAR wUnicode);\r
108 FX_LPEnumAllFonts FX_GetDefFontEnumerator();\r
109 typedef FX_LPCFONTDESCRIPTOR (*FX_LPMatchFont)(FX_LPFONTMATCHPARAMS pParams, const CFX_FontDescriptors &fonts, FX_LPVOID pUserData);\r
110 FX_LPMatchFont FX_GetDefFontMatchor();\r
111 class IFX_FontMgr\r
112 {\r
113 public:\r
114     static IFX_FontMgr* Create(FX_LPEnumAllFonts pEnumerator, FX_LPMatchFont pMatcher = NULL, FX_LPVOID pUserData = NULL);\r
115     virtual void                        Release() = 0;\r
116     virtual IFX_Font*           GetDefFontByCodePage(FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
117     virtual IFX_Font*           GetDefFontByCharset(FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
118     virtual IFX_Font*           GetDefFontByUnicode(FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
119     virtual IFX_Font*           GetDefFontByLanguage(FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
120     virtual IFX_Font*           LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage = 0xFFFF) = 0;\r
121     virtual IFX_Font*           LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength) = 0;\r
122     virtual IFX_Font*           LoadFont(FX_LPCWSTR pszFileName) = 0;\r
123     virtual IFX_Font*           LoadFont(IFX_Stream *pFontStream, FX_LPCWSTR pszFontAlias = NULL, FX_DWORD dwFontStyles = 0, FX_WORD wCodePage = 0, FX_BOOL bSaveStream = FALSE) = 0;\r
124     virtual IFX_Font*           LoadFont(IFX_Font *pSrcFont, FX_DWORD dwFontStyles, FX_WORD wCodePage = 0xFFFF) = 0;\r
125     virtual void                        ClearFontCache() = 0;\r
126     virtual void                        RemoveFont(IFX_Font *pFont) = 0;\r
127 };\r
128 #else\r
129 class IFX_FontMgrDelegate\r
130 {\r
131 public:\r
132     virtual IFX_Font*           GetDefFontByCodePage(IFX_FontMgr* pFontMgr, FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
133     virtual IFX_Font*           GetDefFontByCharset(IFX_FontMgr* pFontMgr, FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
134     virtual IFX_Font*           GetDefFontByUnicode(IFX_FontMgr* pFontMgr, FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
135     virtual IFX_Font*           GetDefFontByLanguage(IFX_FontMgr* pFontMgr, FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
136 };\r
137 class IFX_FontSourceEnum\r
138 {\r
139 public:\r
140     virtual     void                    Release() = 0;\r
141     virtual FX_POSITION         GetStartPosition(FX_LPVOID pUserData = NULL) = 0;\r
142     virtual IFX_FileAccess*     GetNext(FX_POSITION& pos, FX_LPVOID pUserData = NULL) = 0;\r
143 };\r
144 IFX_FontSourceEnum*     FX_CreateDefaultFontSourceEnum();\r
145 class IFX_FontMgr\r
146 {\r
147 public:\r
148     static IFX_FontMgr* Create(IFX_FontSourceEnum* pFontEnum, IFX_FontMgrDelegate* pDelegate = NULL, FX_LPVOID pUserData = NULL);\r
149     virtual void                Release() = 0;\r
150     virtual IFX_Font*           GetDefFontByCodePage(FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
151     virtual IFX_Font*           GetDefFontByCharset(FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
152     virtual IFX_Font*           GetDefFontByUnicode(FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
153     virtual IFX_Font*           GetDefFontByLanguage(FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
154     virtual IFX_Font*           GetFontByCodePage(FX_WORD wCodePage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
155     inline IFX_Font*            LoadFont(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage)\r
156     {\r
157         return GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily);\r
158     }\r
159     virtual IFX_Font*           GetFontByCharset(FX_BYTE nCharset, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
160     virtual IFX_Font*           GetFontByUnicode(FX_WCHAR wUnicode, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
161     virtual IFX_Font*           GetFontByLanguage(FX_WORD wLanguage, FX_DWORD dwFontStyles, FX_LPCWSTR pszFontFamily = NULL) = 0;\r
162     virtual IFX_Font*           LoadFont(FX_LPCBYTE pBuffer, FX_INT32 iLength, FX_INT32 iFaceIndex, FX_INT32* pFaceCount = NULL) = 0;\r
163     virtual IFX_Font*           LoadFont(FX_LPCWSTR pszFileName, FX_INT32 iFaceIndex, FX_INT32* pFaceCount = NULL) = 0;\r
164     virtual IFX_Font*           LoadFont(IFX_Stream *pFontStream, FX_INT32 iFaceIndex, FX_INT32* pFaceCount = NULL, FX_BOOL bSaveStream = FALSE) = 0;\r
165 \r
166     virtual void                        ClearFontCache() = 0;\r
167     virtual void                        RemoveFont(IFX_Font *pFont) = 0;\r
168 };\r
169 #endif\r
170 #endif\r