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