OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../../include/fxge/fx_ge.h" | 7 #include "../../../include/fxge/fx_ge.h" |
8 #include "../agg/include/fx_agg_driver.h" | 8 #include "../agg/include/fx_agg_driver.h" |
9 #include "text_int.h" | 9 #include "text_int.h" |
10 | 10 |
11 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ | 11 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ |
12 static const struct { | |
13 const FX_CHAR* m_pName; | |
14 const FX_CHAR* m_pSubstName; | |
15 } Base14Substs[] = { | |
16 {"Courier", "Courier New"}, | |
17 {"Courier-Bold", "Courier New Bold"}, | |
18 {"Courier-BoldOblique", "Courier New Bold Italic"}, | |
19 {"Courier-Oblique", "Courier New Italic"}, | |
20 {"Helvetica", "Arial"}, | |
21 {"Helvetica-Bold", "Arial Bold"}, | |
22 {"Helvetica-BoldOblique", "Arial Bold Italic"}, | |
23 {"Helvetica-Oblique", "Arial Italic"}, | |
24 {"Times-Roman", "Times New Roman"}, | |
25 {"Times-Bold", "Times New Roman Bold"}, | |
26 {"Times-BoldItalic", "Times New Roman Bold Italic"}, | |
27 {"Times-Italic", "Times New Roman Italic"}, | |
28 }; | |
29 class CFX_LinuxFontInfo : public CFX_FolderFontInfo { | 12 class CFX_LinuxFontInfo : public CFX_FolderFontInfo { |
30 public: | 13 public: |
31 void* MapFont(int weight, | 14 void* MapFont(int weight, |
32 FX_BOOL bItalic, | 15 FX_BOOL bItalic, |
33 int charset, | 16 int charset, |
34 int pitch_family, | 17 int pitch_family, |
35 const FX_CHAR* family, | 18 const FX_CHAR* family, |
36 int& iExact) override; | 19 int& iExact) override; |
37 FX_BOOL ParseFontCfg(const char** pUserPaths); | 20 FX_BOOL ParseFontCfg(const char** pUserPaths); |
38 void* FindFont(int weight, | |
39 FX_BOOL bItalic, | |
40 int charset, | |
41 int pitch_family, | |
42 const FX_CHAR* family, | |
43 FX_BOOL bMatchName); | |
44 }; | 21 }; |
45 #define LINUX_GPNAMESIZE 6 | 22 #define LINUX_GPNAMESIZE 6 |
46 static const struct { | 23 static const struct { |
47 const FX_CHAR* NameArr[LINUX_GPNAMESIZE]; | 24 const FX_CHAR* NameArr[LINUX_GPNAMESIZE]; |
48 } LinuxGpFontList[] = { | 25 } LinuxGpFontList[] = { |
49 {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", | 26 {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", |
50 "VL Gothic regular"}}, | 27 "VL Gothic regular"}}, |
51 {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL, | 28 {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL, |
52 "VL Gothic regular"}}, | 29 "VL Gothic regular"}}, |
53 {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL, | 30 {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL, |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 return 0; | 64 return 0; |
88 } | 65 } |
89 return 2; | 66 return 2; |
90 } | 67 } |
91 void* CFX_LinuxFontInfo::MapFont(int weight, | 68 void* CFX_LinuxFontInfo::MapFont(int weight, |
92 FX_BOOL bItalic, | 69 FX_BOOL bItalic, |
93 int charset, | 70 int charset, |
94 int pitch_family, | 71 int pitch_family, |
95 const FX_CHAR* cstr_face, | 72 const FX_CHAR* cstr_face, |
96 int& iExact) { | 73 int& iExact) { |
97 CFX_ByteString face = cstr_face; | 74 void* font = GetSubstFont(cstr_face); |
98 int iBaseFont; | 75 if (font) { |
99 for (iBaseFont = 0; iBaseFont < 12; iBaseFont++) | 76 iExact = 1; |
100 if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) { | 77 return font; |
101 face = Base14Substs[iBaseFont].m_pSubstName; | |
102 iExact = 1; | |
103 break; | |
104 } | |
105 if (iBaseFont < 12) { | |
106 return GetFont(face); | |
107 } | 78 } |
108 FX_BOOL bCJK = TRUE; | 79 FX_BOOL bCJK = TRUE; |
109 switch (charset) { | 80 switch (charset) { |
110 case FXFONT_SHIFTJIS_CHARSET: { | 81 case FXFONT_SHIFTJIS_CHARSET: { |
111 int32_t index = GetJapanesePreference(cstr_face, weight, pitch_family); | 82 int32_t index = GetJapanesePreference(cstr_face, weight, pitch_family); |
112 if (index < 0) { | 83 if (index < 0) { |
113 break; | 84 break; |
114 } | 85 } |
115 for (int32_t i = 0; i < LINUX_GPNAMESIZE; i++) { | 86 for (int32_t i = 0; i < LINUX_GPNAMESIZE; i++) { |
116 auto it = m_FontList.find(LinuxGpFontList[index].NameArr[i]); | 87 auto it = m_FontList.find(LinuxGpFontList[index].NameArr[i]); |
(...skipping 23 matching lines...) Expand all Loading... |
140 auto it = m_FontList.find(g_LinuxHGFontList[i]); | 111 auto it = m_FontList.find(g_LinuxHGFontList[i]); |
141 if (it != m_FontList.end()) { | 112 if (it != m_FontList.end()) { |
142 return it->second; | 113 return it->second; |
143 } | 114 } |
144 } | 115 } |
145 } break; | 116 } break; |
146 default: | 117 default: |
147 bCJK = FALSE; | 118 bCJK = FALSE; |
148 break; | 119 break; |
149 } | 120 } |
150 if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) { | |
151 return GetFont("Courier New"); | |
152 } | |
153 return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK); | 121 return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK); |
154 } | 122 } |
155 static FX_DWORD _LinuxGetCharset(int charset) { | |
156 switch (charset) { | |
157 case FXFONT_SHIFTJIS_CHARSET: | |
158 return CHARSET_FLAG_SHIFTJIS; | |
159 case FXFONT_GB2312_CHARSET: | |
160 return CHARSET_FLAG_GB; | |
161 case FXFONT_CHINESEBIG5_CHARSET: | |
162 return CHARSET_FLAG_BIG5; | |
163 case FXFONT_HANGEUL_CHARSET: | |
164 return CHARSET_FLAG_KOREAN; | |
165 case FXFONT_SYMBOL_CHARSET: | |
166 return CHARSET_FLAG_SYMBOL; | |
167 case FXFONT_ANSI_CHARSET: | |
168 return CHARSET_FLAG_ANSI; | |
169 default: | |
170 break; | |
171 } | |
172 return 0; | |
173 } | |
174 static int32_t _LinuxGetSimilarValue(int weight, | |
175 FX_BOOL bItalic, | |
176 int pitch_family, | |
177 FX_DWORD style) { | |
178 int32_t iSimilarValue = 0; | |
179 if ((style & FXFONT_BOLD) == (weight > 400)) { | |
180 iSimilarValue += 16; | |
181 } | |
182 if ((style & FXFONT_ITALIC) == bItalic) { | |
183 iSimilarValue += 16; | |
184 } | |
185 if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) { | |
186 iSimilarValue += 16; | |
187 } | |
188 if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) { | |
189 iSimilarValue += 8; | |
190 } | |
191 if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) { | |
192 iSimilarValue += 8; | |
193 } | |
194 return iSimilarValue; | |
195 } | |
196 void* CFX_LinuxFontInfo::FindFont(int weight, | |
197 FX_BOOL bItalic, | |
198 int charset, | |
199 int pitch_family, | |
200 const FX_CHAR* family, | |
201 FX_BOOL bMatchName) { | |
202 CFX_FontFaceInfo* pFind = NULL; | |
203 FX_DWORD charset_flag = _LinuxGetCharset(charset); | |
204 int32_t iBestSimilar = 0; | |
205 for (const auto& it : m_FontList) { | |
206 const CFX_ByteString& bsName = it.first; | |
207 CFX_FontFaceInfo* pFont = it.second; | |
208 if (!(pFont->m_Charsets & charset_flag) && | |
209 charset != FXFONT_DEFAULT_CHARSET) { | |
210 continue; | |
211 } | |
212 int32_t iSimilarValue = 0; | |
213 int32_t index = bsName.Find(family); | |
214 if (bMatchName && index < 0) { | |
215 continue; | |
216 } | |
217 if (!bMatchName && index > 0) { | |
218 iSimilarValue += 64; | |
219 } | |
220 iSimilarValue = | |
221 _LinuxGetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles); | |
222 if (iSimilarValue > iBestSimilar) { | |
223 iBestSimilar = iSimilarValue; | |
224 pFind = pFont; | |
225 } | |
226 } | |
227 return pFind; | |
228 } | |
229 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUserPaths) { | 123 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUserPaths) { |
230 CFX_LinuxFontInfo* pInfo = new CFX_LinuxFontInfo; | 124 CFX_LinuxFontInfo* pInfo = new CFX_LinuxFontInfo; |
231 if (!pInfo->ParseFontCfg(pUserPaths)) { | 125 if (!pInfo->ParseFontCfg(pUserPaths)) { |
232 pInfo->AddPath("/usr/share/fonts"); | 126 pInfo->AddPath("/usr/share/fonts"); |
233 pInfo->AddPath("/usr/share/X11/fonts/Type1"); | 127 pInfo->AddPath("/usr/share/X11/fonts/Type1"); |
234 pInfo->AddPath("/usr/share/X11/fonts/TTF"); | 128 pInfo->AddPath("/usr/share/X11/fonts/TTF"); |
235 pInfo->AddPath("/usr/local/share/fonts"); | 129 pInfo->AddPath("/usr/local/share/fonts"); |
236 } | 130 } |
237 return pInfo; | 131 return pInfo; |
238 } | 132 } |
239 FX_BOOL CFX_LinuxFontInfo::ParseFontCfg(const char** pUserPaths) { | 133 FX_BOOL CFX_LinuxFontInfo::ParseFontCfg(const char** pUserPaths) { |
240 if (!pUserPaths) { | 134 if (!pUserPaths) { |
241 return FALSE; | 135 return FALSE; |
242 } | 136 } |
243 for (const char** pPath = pUserPaths; *pPath; ++pPath) { | 137 for (const char** pPath = pUserPaths; *pPath; ++pPath) { |
244 AddPath(*pPath); | 138 AddPath(*pPath); |
245 } | 139 } |
246 return TRUE; | 140 return TRUE; |
247 } | 141 } |
248 void CFX_GEModule::InitPlatform() { | 142 void CFX_GEModule::InitPlatform() { |
249 m_pFontMgr->SetSystemFontInfo( | 143 m_pFontMgr->SetSystemFontInfo( |
250 IFX_SystemFontInfo::CreateDefault(m_pUserFontPaths)); | 144 IFX_SystemFontInfo::CreateDefault(m_pUserFontPaths)); |
251 } | 145 } |
252 void CFX_GEModule::DestroyPlatform() {} | 146 void CFX_GEModule::DestroyPlatform() {} |
253 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ | 147 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ |
OLD | NEW |