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/pdfwindow/PDFWindow.h" | 7 #include "../../include/pdfwindow/PDFWindow.h" |
8 #include "../../include/pdfwindow/PWL_Wnd.h" | 8 #include "../../include/pdfwindow/PWL_Wnd.h" |
9 #include "../../include/pdfwindow/PWL_FontMap.h" | 9 #include "../../include/pdfwindow/PWL_FontMap.h" |
10 | 10 |
11 #define DEFAULT_FONT_NAME» » » "Helvetica" | 11 #define DEFAULT_FONT_NAME "Helvetica" |
12 | 12 |
13 /* ------------------------------ CPWL_FontMap ------------------------------ */ | 13 /* ------------------------------ CPWL_FontMap ------------------------------ */ |
14 | 14 |
15 CPWL_FontMap::CPWL_FontMap(IFX_SystemHandler* pSystemHandler) : » | 15 CPWL_FontMap::CPWL_FontMap(IFX_SystemHandler* pSystemHandler) |
16 » m_pPDFDoc(NULL), | 16 : m_pPDFDoc(NULL), m_pSystemHandler(pSystemHandler) { |
17 » m_pSystemHandler(pSystemHandler) | 17 ASSERT(m_pSystemHandler != NULL); |
18 { | |
19 » ASSERT(m_pSystemHandler != NULL); | |
20 } | 18 } |
21 | 19 |
22 CPWL_FontMap::~CPWL_FontMap() | 20 CPWL_FontMap::~CPWL_FontMap() { |
23 { | 21 if (m_pPDFDoc) { |
24 » if (m_pPDFDoc) | 22 delete m_pPDFDoc; |
25 » { | 23 m_pPDFDoc = NULL; |
26 » » delete m_pPDFDoc; | 24 } |
27 » » m_pPDFDoc = NULL; | |
28 » } | |
29 | 25 |
30 » Empty(); | 26 Empty(); |
31 } | 27 } |
32 | 28 |
33 void CPWL_FontMap::SetSystemHandler(IFX_SystemHandler* pSystemHandler) | 29 void CPWL_FontMap::SetSystemHandler(IFX_SystemHandler* pSystemHandler) { |
34 { | 30 m_pSystemHandler = pSystemHandler; |
35 » m_pSystemHandler = pSystemHandler; | |
36 } | 31 } |
37 | 32 |
38 CPDF_Document* CPWL_FontMap::GetDocument() | 33 CPDF_Document* CPWL_FontMap::GetDocument() { |
39 { | 34 if (!m_pPDFDoc) { |
40 » if (!m_pPDFDoc) | 35 if (CPDF_ModuleMgr::Get()) { |
41 » { | 36 m_pPDFDoc = FX_NEW CPDF_Document; |
42 » » if (CPDF_ModuleMgr::Get()) | 37 m_pPDFDoc->CreateNewDoc(); |
43 » » { | 38 } |
44 » » » m_pPDFDoc = FX_NEW CPDF_Document; | 39 } |
45 » » » m_pPDFDoc->CreateNewDoc(); | |
46 » » } | |
47 » } | |
48 | 40 |
49 » return m_pPDFDoc; | 41 return m_pPDFDoc; |
50 } | 42 } |
51 | 43 |
52 CPDF_Font* CPWL_FontMap::GetPDFFont(FX_INT32 nFontIndex) | 44 CPDF_Font* CPWL_FontMap::GetPDFFont(FX_INT32 nFontIndex) { |
53 { | 45 if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { |
54 » if (nFontIndex >=0 && nFontIndex < m_aData.GetSize()) | 46 if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) { |
55 » { | 47 return pData->pFont; |
56 » » if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) | 48 } |
57 » » { | 49 } |
58 » » » return pData->pFont; | |
59 » » } | |
60 » } | |
61 | 50 |
62 » return NULL; | 51 return NULL; |
63 } | 52 } |
64 | 53 |
65 CFX_ByteString CPWL_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex) | 54 CFX_ByteString CPWL_FontMap::GetPDFFontAlias(FX_INT32 nFontIndex) { |
66 { | 55 if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { |
67 » if (nFontIndex >=0 && nFontIndex < m_aData.GetSize()) | 56 if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) { |
68 » { | 57 return pData->sFontName; |
69 » » if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) | 58 } |
70 » » { | 59 } |
71 » » » return pData->sFontName; | |
72 » » } | |
73 » } | |
74 | 60 |
75 » return ""; | 61 return ""; |
76 } | 62 } |
77 | 63 |
78 FX_BOOL CPWL_FontMap::KnowWord(FX_INT32 nFontIndex, FX_WORD word) | 64 FX_BOOL CPWL_FontMap::KnowWord(FX_INT32 nFontIndex, FX_WORD word) { |
79 { | 65 if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { |
80 » if (nFontIndex >=0 && nFontIndex < m_aData.GetSize()) | 66 if (m_aData.GetAt(nFontIndex)) { |
81 » { | 67 return CharCodeFromUnicode(nFontIndex, word) >= 0; |
82 » » if (m_aData.GetAt(nFontIndex)) | 68 } |
83 » » {» | 69 } |
84 » » » return CharCodeFromUnicode(nFontIndex, word) >= 0; | |
85 » » } | |
86 » } | |
87 | 70 |
88 » return FALSE; | 71 return FALSE; |
89 } | 72 } |
90 | 73 |
91 FX_INT32 CPWL_FontMap::GetWordFontIndex(FX_WORD word, FX_INT32 nCharset, FX_INT3
2 nFontIndex) | 74 FX_INT32 CPWL_FontMap::GetWordFontIndex(FX_WORD word, |
92 { | 75 FX_INT32 nCharset, |
93 » if (nFontIndex > 0) | 76 FX_INT32 nFontIndex) { |
94 » { | 77 if (nFontIndex > 0) { |
95 » » if (KnowWord(nFontIndex, word)) | 78 if (KnowWord(nFontIndex, word)) |
96 » » » return nFontIndex; | 79 return nFontIndex; |
97 » } | 80 } else { |
98 » else | 81 if (const CPWL_FontMap_Data* pData = GetFontMapData(0)) { |
99 » { | 82 if (nCharset == DEFAULT_CHARSET || pData->nCharset == SYMBOL_CHARSET || |
100 » » if (const CPWL_FontMap_Data* pData = GetFontMapData(0)) | 83 nCharset == pData->nCharset) { |
101 » » { | 84 if (KnowWord(0, word)) { |
102 » » » if (nCharset == DEFAULT_CHARSET || | 85 return 0; |
103 » » » » pData->nCharset == SYMBOL_CHARSET || | 86 } |
104 » » » » nCharset == pData->nCharset) | 87 } |
105 » » » { | 88 } |
106 » » » » if (KnowWord(0, word)) | 89 } |
107 » » » » { | |
108 » » » » » return 0; | |
109 » » » » } | |
110 » » » } | |
111 » » } | |
112 » } | |
113 | 90 |
114 » FX_INT32 nNewFontIndex = -1; | 91 FX_INT32 nNewFontIndex = -1; |
115 | 92 |
116 » nNewFontIndex = this->GetFontIndex(GetNativeFontName(nCharset), nCharset
, TRUE); | 93 nNewFontIndex = |
117 » if (nNewFontIndex >= 0) | 94 this->GetFontIndex(GetNativeFontName(nCharset), nCharset, TRUE); |
118 » { | 95 if (nNewFontIndex >= 0) { |
119 » » if (KnowWord(nNewFontIndex, word)) | 96 if (KnowWord(nNewFontIndex, word)) |
120 » » » return nNewFontIndex; | 97 return nNewFontIndex; |
121 » } | 98 } |
122 | 99 |
123 » nNewFontIndex = this->GetFontIndex("Arial Unicode MS", DEFAULT_CHARSET,
FALSE); | 100 nNewFontIndex = |
124 » if (nNewFontIndex >= 0) | 101 this->GetFontIndex("Arial Unicode MS", DEFAULT_CHARSET, FALSE); |
125 » { | 102 if (nNewFontIndex >= 0) { |
126 » » if (KnowWord(nNewFontIndex, word)) | 103 if (KnowWord(nNewFontIndex, word)) |
127 » » return nNewFontIndex; | 104 return nNewFontIndex; |
128 » } | 105 } |
129 | 106 |
130 » return -1; | 107 return -1; |
131 } | 108 } |
132 | 109 |
133 FX_INT32 CPWL_FontMap::CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word) | 110 FX_INT32 CPWL_FontMap::CharCodeFromUnicode(FX_INT32 nFontIndex, FX_WORD word) { |
134 { | 111 if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) { |
135 » if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) | 112 if (pData->pFont) { |
136 » { | 113 if (pData->pFont->IsUnicodeCompatible()) { |
137 » » if (pData->pFont) | 114 int nCharCode = pData->pFont->CharCodeFromUnicode(word); |
138 » » { | 115 pData->pFont->GlyphFromCharCode(nCharCode); |
139 » » » if (pData->pFont->IsUnicodeCompatible()) | 116 return nCharCode; |
140 » » » { | 117 } else { |
141 » » » » int nCharCode = pData->pFont->CharCodeFromUnicod
e(word); | 118 if (word < 0xFF) |
142 » » » » pData->pFont->GlyphFromCharCode(nCharCode); | 119 return word; |
143 » » » » return nCharCode; | 120 } |
144 » » » } | 121 } |
145 » » » else | 122 } |
146 » » » { | |
147 » » » » if (word < 0xFF) | |
148 » » » » » return word; | |
149 » » » } | |
150 » » } | |
151 » } | |
152 | 123 |
153 » return -1; | 124 return -1; |
154 } | 125 } |
155 | 126 |
156 CFX_ByteString CPWL_FontMap::GetNativeFontName(FX_INT32 nCharset) | 127 CFX_ByteString CPWL_FontMap::GetNativeFontName(FX_INT32 nCharset) { |
157 { | 128 // searching native font is slow, so we must save time |
158 » //searching native font is slow, so we must save time | 129 for (FX_INT32 i = 0, sz = m_aNativeFont.GetSize(); i < sz; i++) { |
159 » for (FX_INT32 i=0,sz=m_aNativeFont.GetSize(); i<sz; i++) | 130 if (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i)) { |
160 » { | 131 if (pData->nCharset == nCharset) |
161 » » if (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i)) | 132 return pData->sFontName; |
162 » » { | 133 } |
163 » » » if (pData->nCharset == nCharset) | 134 } |
164 » » » » return pData->sFontName; | |
165 » » } | |
166 » } | |
167 | 135 |
168 » CFX_ByteString sNew = GetNativeFont(nCharset); | 136 CFX_ByteString sNew = GetNativeFont(nCharset); |
169 | 137 |
170 » if (!sNew.IsEmpty()) | 138 if (!sNew.IsEmpty()) { |
171 » { | 139 CPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native; |
172 » » CPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native; | 140 pNewData->nCharset = nCharset; |
173 » » pNewData->nCharset = nCharset; | 141 pNewData->sFontName = sNew; |
174 » » pNewData->sFontName = sNew; | |
175 | 142 |
176 » » m_aNativeFont.Add(pNewData); | 143 m_aNativeFont.Add(pNewData); |
177 » } | 144 } |
178 | 145 |
179 » return sNew; | 146 return sNew; |
180 } | 147 } |
181 | 148 |
182 void CPWL_FontMap::Empty() | 149 void CPWL_FontMap::Empty() { |
183 { | 150 { |
184 » { | 151 for (FX_INT32 i = 0, sz = m_aData.GetSize(); i < sz; i++) |
185 » » for (FX_INT32 i=0, sz=m_aData.GetSize(); i<sz; i++) | 152 delete m_aData.GetAt(i); |
186 » » » delete m_aData.GetAt(i); | |
187 | 153 |
188 » » m_aData.RemoveAll(); | 154 m_aData.RemoveAll(); |
189 » } | 155 } |
190 » { | 156 { |
191 » » for (FX_INT32 i=0, sz=m_aNativeFont.GetSize(); i<sz; i++) | 157 for (FX_INT32 i = 0, sz = m_aNativeFont.GetSize(); i < sz; i++) |
192 » » » delete m_aNativeFont.GetAt(i); | 158 delete m_aNativeFont.GetAt(i); |
193 | 159 |
194 » » m_aNativeFont.RemoveAll(); | 160 m_aNativeFont.RemoveAll(); |
195 » } | 161 } |
196 } | 162 } |
197 | 163 |
198 void CPWL_FontMap::Initial(FX_LPCSTR fontname) | 164 void CPWL_FontMap::Initial(FX_LPCSTR fontname) { |
199 { | 165 CFX_ByteString sFontName = fontname; |
200 » CFX_ByteString sFontName = fontname; | |
201 | 166 |
202 » if (sFontName.IsEmpty()) | 167 if (sFontName.IsEmpty()) |
203 » » sFontName = DEFAULT_FONT_NAME; | 168 sFontName = DEFAULT_FONT_NAME; |
204 | 169 |
205 » GetFontIndex(sFontName, ANSI_CHARSET, FALSE); | 170 GetFontIndex(sFontName, ANSI_CHARSET, FALSE); |
206 | 171 |
207 » //GetFontIndex(this->GetNativeFontName(nCharset), nCharset); | 172 // GetFontIndex(this->GetNativeFontName(nCharset), nCharset); |
208 } | 173 } |
209 | |
210 | 174 |
211 /* | 175 /* |
212 List of currently supported standard fonts: | 176 List of currently supported standard fonts: |
213 Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique | 177 Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique |
214 Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique | 178 Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique |
215 Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic | 179 Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic |
216 Symbol, ZapfDingbats | 180 Symbol, ZapfDingbats |
217 */ | 181 */ |
218 | 182 |
219 const char* g_sDEStandardFontName[] = {"Courier", "Courier-Bold", "Courier-BoldO
blique", "Courier-Oblique", | 183 const char* g_sDEStandardFontName[] = { |
220 » "Helvetica", "Helvetica-Bold", "Helvetica-BoldOblique", "Helvetica-Obliq
ue", | 184 "Courier", "Courier-Bold", "Courier-BoldOblique", "Courier-Oblique", |
221 » "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic", | 185 "Helvetica", "Helvetica-Bold", "Helvetica-BoldOblique", "Helvetica-Oblique", |
222 » "Symbol", "ZapfDingbats"}; | 186 "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic", |
223 | 187 "Symbol", "ZapfDingbats" |
224 FX_BOOL»CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName) | 188 }; |
| 189 |
| 190 FX_BOOL CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName) { |
| 191 for (FX_INT32 i = 0; i < 14; i++) { |
| 192 if (sFontName == g_sDEStandardFontName[i]) |
| 193 return TRUE; |
| 194 } |
| 195 |
| 196 return FALSE; |
| 197 } |
| 198 |
| 199 FX_INT32 CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, |
| 200 FX_INT32 nCharset) { |
| 201 for (FX_INT32 i = 0, sz = m_aData.GetSize(); i < sz; i++) { |
| 202 if (CPWL_FontMap_Data* pData = m_aData.GetAt(i)) { |
| 203 if (nCharset == DEFAULT_CHARSET || nCharset == pData->nCharset) { |
| 204 if (sFontName.IsEmpty() || pData->sFontName == sFontName) |
| 205 return i; |
| 206 } |
| 207 } |
| 208 } |
| 209 |
| 210 return -1; |
| 211 } |
| 212 |
| 213 FX_INT32 CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, |
| 214 FX_INT32 nCharset, |
| 215 FX_BOOL bFind) { |
| 216 FX_INT32 nFontIndex = |
| 217 FindFont(EncodeFontAlias(sFontName, nCharset), nCharset); |
| 218 if (nFontIndex >= 0) |
| 219 return nFontIndex; |
| 220 |
| 221 //» nFontIndex = FindFont("", nCharset); |
| 222 //» if (nFontIndex >= 0) return nFontIndex; |
| 223 |
| 224 CFX_ByteString sAlias; |
| 225 CPDF_Font* pFont = NULL; |
| 226 |
| 227 if (bFind) |
| 228 pFont = FindFontSameCharset(sAlias, nCharset); |
| 229 |
| 230 if (!pFont) { |
| 231 CFX_ByteString sTemp = sFontName; |
| 232 pFont = AddFontToDocument(GetDocument(), sTemp, nCharset); |
| 233 |
| 234 /* |
| 235 if (FindFont(sAlias)) |
| 236 { |
| 237 sAlias = EncodeFontAlias(sTemp, nCharset); |
| 238 } |
| 239 else |
| 240 */ |
| 241 { sAlias = EncodeFontAlias(sTemp, nCharset); } |
| 242 } |
| 243 |
| 244 AddedFont(pFont, sAlias); |
| 245 |
| 246 return AddFontData(pFont, sAlias, nCharset); |
| 247 } |
| 248 |
| 249 FX_INT32 CPWL_FontMap::GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset) { |
| 250 FX_INT32 nFind = -1; |
| 251 |
| 252 for (FX_INT32 i = 0, sz = m_aData.GetSize(); i < sz; i++) { |
| 253 if (CPWL_FontMap_Data* pData = m_aData.GetAt(i)) { |
| 254 if (pData->nCharset == nCharset) { |
| 255 nFind = i; |
| 256 break; |
| 257 } |
| 258 } |
| 259 } |
| 260 |
| 261 CPDF_Font* pNewFont = GetPDFFont(nFind); |
| 262 |
| 263 if (!pNewFont) |
| 264 return -1; |
| 265 |
| 266 /* |
| 267 if (CPDF_Font* pFont = GetPDFFont(nFind)) |
225 { | 268 { |
226 » for (FX_INT32 i=0; i<14; i++) | 269 PWLFont.AddWordToFontDict(pFontDict, word); |
227 » { | 270 } |
228 » » if (sFontName == g_sDEStandardFontName[i]) | 271 */ |
229 » » » return TRUE; | |
230 » } | |
231 | |
232 » return FALSE; | |
233 } | |
234 | |
235 FX_INT32 CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, FX_INT32 nChars
et) | |
236 { | |
237 » for (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++) | |
238 » { | |
239 » » if (CPWL_FontMap_Data* pData = m_aData.GetAt(i)) | |
240 » » { | |
241 » » » if (nCharset == DEFAULT_CHARSET || nCharset == pData->nC
harset) | |
242 » » » { | |
243 » » » » if (sFontName.IsEmpty() || pData->sFontName == s
FontName) | |
244 » » » » » return i; | |
245 » » » } | |
246 » » } | |
247 » } | |
248 | |
249 » return -1; | |
250 } | |
251 | |
252 FX_INT32 CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, FX_INT32 nC
harset, FX_BOOL bFind) | |
253 { | |
254 » FX_INT32 nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCh
arset); | |
255 » if (nFontIndex >= 0) return nFontIndex; | |
256 | |
257 //» nFontIndex = FindFont("", nCharset); | |
258 //» if (nFontIndex >= 0) return nFontIndex; | |
259 | |
260 » CFX_ByteString sAlias; | |
261 » CPDF_Font* pFont = NULL; | |
262 | |
263 » if (bFind) | |
264 » » pFont = FindFontSameCharset(sAlias, nCharset); | |
265 | |
266 » if (!pFont) | |
267 » { | |
268 » » CFX_ByteString sTemp = sFontName; | |
269 » » pFont = AddFontToDocument(GetDocument(), sTemp, nCharset); | |
270 | |
271 » » /* | |
272 » » if (FindFont(sAlias)) | |
273 » » { | |
274 » » » sAlias = EncodeFontAlias(sTemp, nCharset); | |
275 » » } | |
276 » » else | |
277 » » */ | |
278 » » { | |
279 » » » sAlias = EncodeFontAlias(sTemp, nCharset); | |
280 » » }» » | |
281 » } | |
282 | |
283 » AddedFont(pFont, sAlias); | |
284 | |
285 » return AddFontData(pFont, sAlias, nCharset); | |
286 } | |
287 | |
288 FX_INT32 CPWL_FontMap::GetPWLFontIndex(FX_WORD word, FX_INT32 nCharset) | |
289 { | |
290 » FX_INT32 nFind = -1; | |
291 | |
292 » for (FX_INT32 i=0,sz=m_aData.GetSize(); i<sz; i++) | |
293 » { | |
294 » » if (CPWL_FontMap_Data* pData = m_aData.GetAt(i)) | |
295 » » { | |
296 » » » if (pData->nCharset == nCharset) | |
297 » » » { | |
298 » » » » nFind = i; | |
299 » » » » break; | |
300 » » » } | |
301 » » } | |
302 » } | |
303 | |
304 » CPDF_Font* pNewFont = GetPDFFont(nFind); | |
305 | |
306 » if (!pNewFont) return -1; | |
307 | |
308 » /* | |
309 » if (CPDF_Font* pFont = GetPDFFont(nFind)) | |
310 » { | |
311 » » PWLFont.AddWordToFontDict(pFontDict, word); | |
312 » } | |
313 » */ | |
314 | 272 |
315 #ifdef FOXIT_CHROME_BUILD | 273 #ifdef FOXIT_CHROME_BUILD |
316 CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset); | 274 CFX_ByteString sAlias = EncodeFontAlias("Arial_Chrome", nCharset); |
317 #else | 275 #else |
318 » CFX_ByteString sAlias = EncodeFontAlias("Arial_Foxit", nCharset); | 276 CFX_ByteString sAlias = EncodeFontAlias("Arial_Foxit", nCharset); |
319 #endif | 277 #endif |
320 » AddedFont(pNewFont, sAlias); | 278 AddedFont(pNewFont, sAlias); |
321 | 279 |
322 » return AddFontData(pNewFont, sAlias, nCharset); | 280 return AddFontData(pNewFont, sAlias, nCharset); |
323 } | 281 } |
324 | 282 |
325 CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, FX_INT3
2 nCharset) | 283 CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, |
326 { | 284 FX_INT32 nCharset) { |
327 » return NULL; | 285 return NULL; |
328 } | 286 } |
329 | 287 |
330 FX_INT32 CPWL_FontMap::AddFontData(CPDF_Font* pFont, const CFX_ByteString& sFont
Alias, FX_INT32 nCharset) | 288 FX_INT32 CPWL_FontMap::AddFontData(CPDF_Font* pFont, |
331 { | 289 const CFX_ByteString& sFontAlias, |
332 » CPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data; | 290 FX_INT32 nCharset) { |
333 » pNewData->pFont = pFont; | 291 CPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data; |
334 » pNewData->sFontName = sFontAlias; | 292 pNewData->pFont = pFont; |
335 » pNewData->nCharset = nCharset; | 293 pNewData->sFontName = sFontAlias; |
336 | 294 pNewData->nCharset = nCharset; |
337 » m_aData.Add(pNewData); | 295 |
338 | 296 m_aData.Add(pNewData); |
339 » return m_aData.GetSize() -1; | 297 |
340 } | 298 return m_aData.GetSize() - 1; |
341 | 299 } |
342 void CPWL_FontMap::AddedFont(CPDF_Font* pFont, const CFX_ByteString& sFontAlias) | 300 |
343 { | 301 void CPWL_FontMap::AddedFont(CPDF_Font* pFont, |
344 } | 302 const CFX_ByteString& sFontAlias) { |
345 | 303 } |
346 CFX_ByteString CPWL_FontMap::GetFontName(FX_INT32 nFontIndex) | 304 |
347 { | 305 CFX_ByteString CPWL_FontMap::GetFontName(FX_INT32 nFontIndex) { |
348 » if (nFontIndex >=0 && nFontIndex < m_aData.GetSize()) | 306 if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { |
349 » { | 307 if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) { |
350 » » if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) | 308 return pData->sFontName; |
351 » » { | 309 } |
352 » » » return pData->sFontName; | 310 } |
353 » » } | 311 |
354 » } | 312 return ""; |
355 | 313 } |
356 » return ""; | 314 |
357 } | 315 CFX_ByteString CPWL_FontMap::GetNativeFont(FX_INT32 nCharset) { |
358 | 316 CFX_ByteString sFontName; |
359 CFX_ByteString CPWL_FontMap::GetNativeFont(FX_INT32 nCharset) | 317 |
360 { | 318 if (nCharset == DEFAULT_CHARSET) |
361 » CFX_ByteString sFontName; | 319 nCharset = GetNativeCharset(); |
362 | 320 |
363 » if (nCharset == DEFAULT_CHARSET) | 321 sFontName = GetDefaultFontByCharset(nCharset); |
364 » » nCharset = GetNativeCharset(); | 322 |
365 | 323 if (m_pSystemHandler) { |
366 » sFontName = GetDefaultFontByCharset(nCharset); | 324 if (m_pSystemHandler->FindNativeTrueTypeFont(nCharset, sFontName)) |
367 | 325 return sFontName; |
368 » if (m_pSystemHandler) | 326 |
369 » { | 327 sFontName = m_pSystemHandler->GetNativeTrueTypeFont(nCharset); |
370 » » if (m_pSystemHandler->FindNativeTrueTypeFont(nCharset, sFontName
)) | 328 } |
371 » » » return sFontName; | 329 |
372 | 330 return sFontName; |
373 » » sFontName = m_pSystemHandler->GetNativeTrueTypeFont(nCharset); | 331 } |
374 » } | 332 |
375 | 333 CPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, |
376 » return sFontName; | 334 CFX_ByteString& sFontName, |
377 } | 335 FX_BYTE nCharset) { |
378 | 336 if (IsStandardFont(sFontName)) |
379 CPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, CFX_ByteString&
sFontName, FX_BYTE nCharset) | 337 return AddStandardFont(pDoc, sFontName); |
380 { | 338 else |
381 » if (IsStandardFont(sFontName)) | 339 return AddSystemFont(pDoc, sFontName, nCharset); |
382 » » return AddStandardFont(pDoc, sFontName); | 340 } |
383 » else | 341 |
384 » » return AddSystemFont(pDoc, sFontName, nCharset); | 342 CPDF_Font* CPWL_FontMap::AddStandardFont(CPDF_Document* pDoc, |
385 } | 343 CFX_ByteString& sFontName) { |
386 | 344 if (!pDoc) |
387 CPDF_Font* CPWL_FontMap::AddStandardFont(CPDF_Document* pDoc, CFX_ByteString& sF
ontName) | 345 return NULL; |
388 { | 346 |
389 » if (!pDoc) return NULL; | 347 CPDF_Font* pFont = NULL; |
390 | 348 |
391 » CPDF_Font* pFont = NULL; | 349 if (sFontName == "ZapfDingbats") |
392 | 350 pFont = pDoc->AddStandardFont(sFontName, NULL); |
393 » if (sFontName == "ZapfDingbats") | 351 else { |
394 » » pFont = pDoc->AddStandardFont(sFontName, NULL); | 352 CPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI); |
395 » else | 353 pFont = pDoc->AddStandardFont(sFontName, &fe); |
396 » { | 354 } |
397 » » CPDF_FontEncoding fe(PDFFONT_ENCODING_WINANSI); | 355 |
398 » » pFont = pDoc->AddStandardFont(sFontName, &fe); | 356 return pFont; |
399 » } | 357 } |
400 | 358 |
401 » return pFont; | 359 CPDF_Font* CPWL_FontMap::AddSystemFont(CPDF_Document* pDoc, |
402 } | 360 CFX_ByteString& sFontName, |
403 | 361 FX_BYTE nCharset) { |
404 CPDF_Font* CPWL_FontMap::AddSystemFont(CPDF_Document* pDoc, CFX_ByteString& sFon
tName, FX_BYTE nCharset) | 362 if (!pDoc) |
405 { | 363 return NULL; |
406 » if (!pDoc) return NULL; | 364 |
407 | 365 if (sFontName.IsEmpty()) |
408 » if (sFontName.IsEmpty()) sFontName = GetNativeFont(nCharset); | 366 sFontName = GetNativeFont(nCharset); |
409 » if (nCharset == DEFAULT_CHARSET) nCharset = GetNativeCharset(); | 367 if (nCharset == DEFAULT_CHARSET) |
410 | 368 nCharset = GetNativeCharset(); |
411 » if (m_pSystemHandler) | 369 |
412 » » return m_pSystemHandler->AddNativeTrueTypeFontToPDF(pDoc, sFontN
ame, nCharset); | 370 if (m_pSystemHandler) |
413 » | 371 return m_pSystemHandler->AddNativeTrueTypeFontToPDF( |
414 » return NULL; | 372 pDoc, sFontName, nCharset); |
415 } | 373 |
416 | 374 return NULL; |
417 CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName, FX
_INT32 nCharset) | 375 } |
418 { | 376 |
419 » CFX_ByteString sPostfix; | 377 CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName, |
420 » sPostfix.Format("_%02X", nCharset); | 378 FX_INT32 nCharset) { |
421 » return EncodeFontAlias(sFontName) + sPostfix; | 379 CFX_ByteString sPostfix; |
422 } | 380 sPostfix.Format("_%02X", nCharset); |
423 | 381 return EncodeFontAlias(sFontName) + sPostfix; |
424 CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName) | 382 } |
425 { | 383 |
426 » CFX_ByteString sRet = sFontName; | 384 CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName) { |
427 » sRet.Remove(' '); | 385 CFX_ByteString sRet = sFontName; |
428 » return sRet; | 386 sRet.Remove(' '); |
429 } | 387 return sRet; |
430 | 388 } |
431 FX_INT32 CPWL_FontMap::GetFontMapCount() const | 389 |
432 { | 390 FX_INT32 CPWL_FontMap::GetFontMapCount() const { |
433 » return m_aData.GetSize(); | 391 return m_aData.GetSize(); |
434 } | 392 } |
435 | 393 |
436 const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(FX_INT32 nIndex) const | 394 const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(FX_INT32 nIndex) const { |
437 { | 395 if (nIndex >= 0 && nIndex < m_aData.GetSize()) { |
438 » if (nIndex >=0 && nIndex < m_aData.GetSize()) | 396 return m_aData.GetAt(nIndex); |
439 » { | 397 } |
440 » » return m_aData.GetAt(nIndex); | 398 |
441 » } | 399 return NULL; |
442 | 400 } |
443 » return NULL; | 401 |
444 } | 402 FX_INT32 CPWL_FontMap::GetNativeCharset() { |
445 | 403 FX_BYTE nCharset = ANSI_CHARSET; |
446 FX_INT32 CPWL_FontMap::GetNativeCharset() | 404 FX_INT32 iCodePage = FXSYS_GetACP(); |
447 { | 405 switch (iCodePage) { |
448 » FX_BYTE nCharset = ANSI_CHARSET; | 406 case 932: // Japan |
449 » FX_INT32 iCodePage = FXSYS_GetACP(); | 407 nCharset = SHIFTJIS_CHARSET; |
450 » switch (iCodePage) | 408 break; |
451 » { | 409 case 936: // Chinese (PRC, Singapore) |
452 » case 932://Japan | 410 nCharset = GB2312_CHARSET; |
453 » » nCharset = SHIFTJIS_CHARSET; | 411 break; |
454 » » break; | 412 case 950: // Chinese (Taiwan; Hong Kong SAR, PRC) |
455 » case 936://Chinese (PRC, Singapore) | 413 nCharset = GB2312_CHARSET; |
456 » » nCharset = GB2312_CHARSET; | 414 break; |
457 » » break; | 415 case 1252: // Windows 3.1 Latin 1 (US, Western Europe) |
458 » case 950://Chinese (Taiwan; Hong Kong SAR, PRC) | 416 nCharset = ANSI_CHARSET; |
459 » » nCharset = GB2312_CHARSET; | 417 break; |
460 » » break; | 418 case 874: // Thai |
461 » case 1252://Windows 3.1 Latin 1 (US, Western Europe) | 419 nCharset = THAI_CHARSET; |
462 » » nCharset = ANSI_CHARSET; | 420 break; |
463 » » break; | 421 case 949: // Korean |
464 » case 874://Thai | 422 nCharset = HANGUL_CHARSET; |
465 » » nCharset = THAI_CHARSET; | 423 break; |
466 » » break; | 424 case 1200: // Unicode (BMP of ISO 10646) |
467 » case 949://Korean | 425 nCharset = ANSI_CHARSET; |
468 » » nCharset = HANGUL_CHARSET; | 426 break; |
469 » » break; | 427 case 1250: // Windows 3.1 Eastern European |
470 » case 1200://Unicode (BMP of ISO 10646) | 428 nCharset = EASTEUROPE_CHARSET; |
471 » » nCharset = ANSI_CHARSET; | 429 break; |
472 » » break; | 430 case 1251: // Windows 3.1 Cyrillic |
473 » case 1250://Windows 3.1 Eastern European | 431 nCharset = RUSSIAN_CHARSET; |
474 » » nCharset = EASTEUROPE_CHARSET; | 432 break; |
475 » » break; | 433 case 1253: // Windows 3.1 Greek |
476 » case 1251://Windows 3.1 Cyrillic | 434 nCharset = GREEK_CHARSET; |
477 » » nCharset = RUSSIAN_CHARSET; | 435 break; |
478 » » break; | 436 case 1254: // Windows 3.1 Turkish |
479 » case 1253://Windows 3.1 Greek | 437 nCharset = TURKISH_CHARSET; |
480 » » nCharset = GREEK_CHARSET; | 438 break; |
481 » » break; | 439 case 1255: // Hebrew |
482 » case 1254://Windows 3.1 Turkish | 440 nCharset = HEBREW_CHARSET; |
483 » » nCharset = TURKISH_CHARSET; | 441 break; |
484 » » break; | 442 case 1256: // Arabic |
485 » case 1255://Hebrew | 443 nCharset = ARABIC_CHARSET; |
486 » » nCharset = HEBREW_CHARSET; | 444 break; |
487 » » break; | 445 case 1257: // Baltic |
488 » case 1256://Arabic | 446 nCharset = BALTIC_CHARSET; |
489 » » nCharset = ARABIC_CHARSET; | 447 break; |
490 » » break; | 448 case 1258: // Vietnamese |
491 » case 1257://Baltic | 449 nCharset = VIETNAMESE_CHARSET; |
492 » » nCharset = BALTIC_CHARSET; | 450 break; |
493 » » break; | 451 case 1361: // Korean(Johab) |
494 » case 1258://Vietnamese | 452 nCharset = JOHAB_CHARSET; |
495 » » nCharset = VIETNAMESE_CHARSET; | 453 break; |
496 » » break; | 454 } |
497 » case 1361://Korean(Johab) | 455 return nCharset; |
498 » » nCharset = JOHAB_CHARSET; | |
499 » » break; | |
500 » } | |
501 » return nCharset; | |
502 } | 456 } |
503 | 457 |
504 const CPWL_FontMap::CharsetFontMap CPWL_FontMap::defaultTTFMap[] = { | 458 const CPWL_FontMap::CharsetFontMap CPWL_FontMap::defaultTTFMap[] = { |
505 » { ANSI_CHARSET, "Helvetica" }, | 459 { ANSI_CHARSET, "Helvetica" }, |
506 » { GB2312_CHARSET, "SimSun" }, | 460 { GB2312_CHARSET, "SimSun" }, |
507 » { CHINESEBIG5_CHARSET, "MingLiU" }, | 461 { CHINESEBIG5_CHARSET, "MingLiU" }, |
508 » { SHIFTJIS_CHARSET, "MS Gothic" }, | 462 { SHIFTJIS_CHARSET, "MS Gothic" }, |
509 » { HANGUL_CHARSET, "Batang" }, | 463 { HANGUL_CHARSET, "Batang" }, |
510 » { RUSSIAN_CHARSET, "Arial" }, | 464 { RUSSIAN_CHARSET, "Arial" }, |
511 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || _FXM_PLATFORM_ == _FXM_PLATFORM_AP
PLE_ | 465 #if _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_ || \ |
512 » { EASTEUROPE_CHARSET, "Arial" }, | 466 _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
| 467 { EASTEUROPE_CHARSET, "Arial" }, |
513 #else | 468 #else |
514 » { EASTEUROPE_CHARSET, "Tahoma" }, | 469 { EASTEUROPE_CHARSET, "Tahoma" }, |
515 #endif | 470 #endif |
516 » { ARABIC_CHARSET, "Arial" }, | 471 { ARABIC_CHARSET, "Arial" }, |
517 » { -1, NULL } | 472 { -1, NULL } |
518 }; | 473 }; |
519 | 474 |
520 CFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(FX_INT32 nCharset) | 475 CFX_ByteString CPWL_FontMap::GetDefaultFontByCharset(FX_INT32 nCharset) { |
521 { | 476 int i = 0; |
522 » int i = 0; | 477 while (defaultTTFMap[i].charset != -1) { |
523 » while (defaultTTFMap[i].charset != -1) { | 478 if (nCharset == defaultTTFMap[i].charset) |
524 » » if (nCharset == defaultTTFMap[i].charset) | 479 return defaultTTFMap[i].fontname; |
525 » » » return defaultTTFMap[i].fontname; | 480 ++i; |
526 ++i; | 481 } |
527 » } | 482 return ""; |
528 » return ""; | 483 } |
529 } | 484 |
530 | 485 FX_INT32 CPWL_FontMap::CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset) { |
531 FX_INT32 CPWL_FontMap::CharSetFromUnicode(FX_WORD word, FX_INT32 nOldCharset) | 486 if (m_pSystemHandler && (-1 != m_pSystemHandler->GetCharSet())) |
532 { | 487 return m_pSystemHandler->GetCharSet(); |
533 » if(m_pSystemHandler && (-1 != m_pSystemHandler->GetCharSet())) | 488 // to avoid CJK Font to show ASCII |
534 » » return m_pSystemHandler->GetCharSet(); | 489 if (word < 0x7F) |
535 » //to avoid CJK Font to show ASCII | 490 return ANSI_CHARSET; |
536 » if (word < 0x7F) return ANSI_CHARSET; | 491 // follow the old charset |
537 » //follow the old charset | 492 if (nOldCharset != DEFAULT_CHARSET) |
538 » if (nOldCharset != DEFAULT_CHARSET) return nOldCharset; | 493 return nOldCharset; |
539 | 494 |
540 » //find new charset | 495 // find new charset |
541 » if ((word >= 0x4E00 && word <= 0x9FA5) || | 496 if ((word >= 0x4E00 && word <= 0x9FA5) || |
542 » » (word >= 0xE7C7 && word <= 0xE7F3) || | 497 (word >= 0xE7C7 && word <= 0xE7F3) || |
543 » » (word >= 0x3000 && word <= 0x303F) || //£©"¡¶" "¡·" "¡£" "¡¢" | 498 (word >= 0x3000 && word <= 0x303F) || //£©"¡¶" "¡·" "¡£" "¡¢" |
544 » » (word >= 0x2000 && word <= 0x206F)) | 499 (word >= 0x2000 && word <= 0x206F)) { |
545 » { | 500 return GB2312_CHARSET; |
546 » » return GB2312_CHARSET; | 501 } |
547 » } | 502 |
548 | 503 if (((word >= 0x3040) && (word <= 0x309F)) || |
549 » if (((word >= 0x3040) && (word <= 0x309F)) || | 504 ((word >= 0x30A0) && (word <= 0x30FF)) || |
550 » » ((word >= 0x30A0) && (word <= 0x30FF)) || | 505 ((word >= 0x31F0) && (word <= 0x31FF)) || |
551 » » ((word >= 0x31F0) && (word <= 0x31FF)) || | 506 ((word >= 0xFF00) && (word <= 0xFFEF))) { |
552 » » ((word >= 0xFF00) && (word <= 0xFFEF)) ) | 507 return SHIFTJIS_CHARSET; |
553 » { | 508 } |
554 » » return SHIFTJIS_CHARSET; | 509 |
555 » } | 510 if (((word >= 0xAC00) && (word <= 0xD7AF)) || |
556 | 511 ((word >= 0x1100) && (word <= 0x11FF)) || |
557 » if (((word >= 0xAC00) && (word <= 0xD7AF)) || | 512 ((word >= 0x3130) && (word <= 0x318F))) { |
558 » » ((word >= 0x1100) && (word <= 0x11FF)) || | 513 return HANGUL_CHARSET; |
559 » » ((word >= 0x3130) && (word <= 0x318F))) | 514 } |
560 » { | 515 |
561 » » return HANGUL_CHARSET; | 516 if (word >= 0x0E00 && word <= 0x0E7F) |
562 » } | 517 return THAI_CHARSET; |
563 | 518 |
564 » if (word >= 0x0E00 && word <= 0x0E7F) | 519 if ((word >= 0x0370 && word <= 0x03FF) || (word >= 0x1F00 && word <= 0x1FFF)) |
565 » » return THAI_CHARSET; | 520 return GREEK_CHARSET; |
566 | 521 |
567 » if ((word >= 0x0370 && word <= 0x03FF) || | 522 if ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC)) |
568 » » (word >= 0x1F00 && word <= 0x1FFF)) | 523 return ARABIC_CHARSET; |
569 » » return GREEK_CHARSET; | 524 |
570 | 525 if (word >= 0x0590 && word <= 0x05FF) |
571 » if ((word >= 0x0600 && word <= 0x06FF) || | 526 return HEBREW_CHARSET; |
572 » » (word >= 0xFB50 && word <= 0xFEFC)) | 527 |
573 » » return ARABIC_CHARSET; | 528 if (word >= 0x0400 && word <= 0x04FF) |
574 | 529 return RUSSIAN_CHARSET; |
575 » if (word >= 0x0590 && word <= 0x05FF) | 530 |
576 » » return HEBREW_CHARSET; | 531 if (word >= 0x0100 && word <= 0x024F) |
577 | 532 return EASTEUROPE_CHARSET; |
578 » if (word >= 0x0400 && word <= 0x04FF) | 533 |
579 » » return RUSSIAN_CHARSET; | 534 if (word >= 0x1E00 && word <= 0x1EFF) |
580 | 535 return VIETNAMESE_CHARSET; |
581 » if (word >= 0x0100 && word <= 0x024F) | 536 |
582 » » return EASTEUROPE_CHARSET; | 537 return ANSI_CHARSET; |
583 | |
584 » if (word >= 0x1E00 && word <= 0x1EFF) | |
585 » » return VIETNAMESE_CHARSET; | |
586 | |
587 » return ANSI_CHARSET; | |
588 } | 538 } |
589 | 539 |
590 /* ------------------------ CPWL_DocFontMap ------------------------ */ | 540 /* ------------------------ CPWL_DocFontMap ------------------------ */ |
591 | 541 |
592 CPWL_DocFontMap::CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, CPDF_Documen
t* pAttachedDoc) | 542 CPWL_DocFontMap::CPWL_DocFontMap(IFX_SystemHandler* pSystemHandler, |
593 » : CPWL_FontMap(pSystemHandler), | 543 CPDF_Document* pAttachedDoc) |
594 » m_pAttachedDoc(pAttachedDoc) | 544 : CPWL_FontMap(pSystemHandler), m_pAttachedDoc(pAttachedDoc) { |
595 { | 545 } |
596 } | 546 |
597 | 547 CPWL_DocFontMap::~CPWL_DocFontMap() { |
598 CPWL_DocFontMap::~CPWL_DocFontMap() | 548 } |
599 { | 549 |
600 } | 550 CPDF_Document* CPWL_DocFontMap::GetDocument() { |
601 | 551 return m_pAttachedDoc; |
602 CPDF_Document* CPWL_DocFontMap::GetDocument() | 552 } |
603 { | |
604 » return m_pAttachedDoc; | |
605 } | |
OLD | NEW |