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