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 "core/fpdfapi/fpdf_font/font_int.h" | 7 #include "core/fpdfapi/fpdf_font/font_int.h" |
8 | 8 |
9 #include "core/fpdfapi/fpdf_page/include/cpdf_form.h" | 9 #include "core/fpdfapi/fpdf_page/include/cpdf_form.h" |
10 #include "core/fpdfapi/fpdf_page/pageint.h" | 10 #include "core/fpdfapi/fpdf_page/pageint.h" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 | 83 |
84 | 84 |
85 | 85 |
86 short TT2PDF(int m, FXFT_Face face) { | 86 short TT2PDF(int m, FXFT_Face face) { |
87 int upm = FXFT_Get_Face_UnitsPerEM(face); | 87 int upm = FXFT_Get_Face_UnitsPerEM(face); |
88 if (upm == 0) | 88 if (upm == 0) |
89 return (short)m; | 89 return (short)m; |
90 return (m * 1000 + upm / 2) / upm; | 90 return (m * 1000 + upm / 2) / upm; |
91 } | 91 } |
92 | 92 |
93 | 93 CFX_WideString CPDF_ToUnicodeMap::Lookup(uint32_t charcode) { |
94 CFX_WideString CPDF_ToUnicodeMap::Lookup(FX_DWORD charcode) { | |
95 auto it = m_Map.find(charcode); | 94 auto it = m_Map.find(charcode); |
96 if (it != m_Map.end()) { | 95 if (it != m_Map.end()) { |
97 FX_DWORD value = it->second; | 96 uint32_t value = it->second; |
98 FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff); | 97 FX_WCHAR unicode = (FX_WCHAR)(value & 0xffff); |
99 if (unicode != 0xffff) { | 98 if (unicode != 0xffff) { |
100 return unicode; | 99 return unicode; |
101 } | 100 } |
102 const FX_WCHAR* buf = m_MultiCharBuf.GetBuffer(); | 101 const FX_WCHAR* buf = m_MultiCharBuf.GetBuffer(); |
103 FX_DWORD buf_len = m_MultiCharBuf.GetLength(); | 102 uint32_t buf_len = m_MultiCharBuf.GetLength(); |
104 if (!buf || buf_len == 0) { | 103 if (!buf || buf_len == 0) { |
105 return CFX_WideString(); | 104 return CFX_WideString(); |
106 } | 105 } |
107 FX_DWORD index = value >> 16; | 106 uint32_t index = value >> 16; |
108 if (index >= buf_len) { | 107 if (index >= buf_len) { |
109 return CFX_WideString(); | 108 return CFX_WideString(); |
110 } | 109 } |
111 FX_DWORD len = buf[index]; | 110 uint32_t len = buf[index]; |
112 if (index + len < index || index + len >= buf_len) { | 111 if (index + len < index || index + len >= buf_len) { |
113 return CFX_WideString(); | 112 return CFX_WideString(); |
114 } | 113 } |
115 return CFX_WideString(buf + index + 1, len); | 114 return CFX_WideString(buf + index + 1, len); |
116 } | 115 } |
117 if (m_pBaseMap) { | 116 if (m_pBaseMap) { |
118 return m_pBaseMap->UnicodeFromCID((uint16_t)charcode); | 117 return m_pBaseMap->UnicodeFromCID((uint16_t)charcode); |
119 } | 118 } |
120 return CFX_WideString(); | 119 return CFX_WideString(); |
121 } | 120 } |
122 | 121 |
123 FX_DWORD CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode) { | 122 uint32_t CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode) { |
124 for (const auto& pair : m_Map) { | 123 for (const auto& pair : m_Map) { |
125 if (pair.second == unicode) | 124 if (pair.second == unicode) |
126 return pair.first; | 125 return pair.first; |
127 } | 126 } |
128 return 0; | 127 return 0; |
129 } | 128 } |
130 | 129 |
131 // Static. | 130 // Static. |
132 FX_DWORD CPDF_ToUnicodeMap::StringToCode(const CFX_ByteStringC& str) { | 131 uint32_t CPDF_ToUnicodeMap::StringToCode(const CFX_ByteStringC& str) { |
133 const FX_CHAR* buf = str.GetCStr(); | 132 const FX_CHAR* buf = str.GetCStr(); |
134 int len = str.GetLength(); | 133 int len = str.GetLength(); |
135 if (len == 0) | 134 if (len == 0) |
136 return 0; | 135 return 0; |
137 | 136 |
138 int result = 0; | 137 int result = 0; |
139 if (buf[0] == '<') { | 138 if (buf[0] == '<') { |
140 for (int i = 1; i < len && std::isxdigit(buf[i]); ++i) | 139 for (int i = 1; i < len && std::isxdigit(buf[i]); ++i) |
141 result = result * 16 + FXSYS_toHexDigit(buf[i]); | 140 result = result * 16 + FXSYS_toHexDigit(buf[i]); |
142 return result; | 141 return result; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 CFX_ByteStringC word = parser.GetWord(); | 201 CFX_ByteStringC word = parser.GetWord(); |
203 if (word.IsEmpty()) { | 202 if (word.IsEmpty()) { |
204 break; | 203 break; |
205 } | 204 } |
206 if (word == "beginbfchar") { | 205 if (word == "beginbfchar") { |
207 while (1) { | 206 while (1) { |
208 word = parser.GetWord(); | 207 word = parser.GetWord(); |
209 if (word.IsEmpty() || word == "endbfchar") { | 208 if (word.IsEmpty() || word == "endbfchar") { |
210 break; | 209 break; |
211 } | 210 } |
212 FX_DWORD srccode = StringToCode(word); | 211 uint32_t srccode = StringToCode(word); |
213 word = parser.GetWord(); | 212 word = parser.GetWord(); |
214 CFX_WideString destcode = StringToWideString(word); | 213 CFX_WideString destcode = StringToWideString(word); |
215 int len = destcode.GetLength(); | 214 int len = destcode.GetLength(); |
216 if (len == 0) { | 215 if (len == 0) { |
217 continue; | 216 continue; |
218 } | 217 } |
219 if (len == 1) { | 218 if (len == 1) { |
220 m_Map[srccode] = destcode.GetAt(0); | 219 m_Map[srccode] = destcode.GetAt(0); |
221 } else { | 220 } else { |
222 m_Map[srccode] = m_MultiCharBuf.GetLength() * 0x10000 + 0xffff; | 221 m_Map[srccode] = m_MultiCharBuf.GetLength() * 0x10000 + 0xffff; |
223 m_MultiCharBuf.AppendChar(destcode.GetLength()); | 222 m_MultiCharBuf.AppendChar(destcode.GetLength()); |
224 m_MultiCharBuf << destcode; | 223 m_MultiCharBuf << destcode; |
225 } | 224 } |
226 } | 225 } |
227 } else if (word == "beginbfrange") { | 226 } else if (word == "beginbfrange") { |
228 while (1) { | 227 while (1) { |
229 CFX_ByteString low, high; | 228 CFX_ByteString low, high; |
230 low = parser.GetWord(); | 229 low = parser.GetWord(); |
231 if (low.IsEmpty() || low == "endbfrange") { | 230 if (low.IsEmpty() || low == "endbfrange") { |
232 break; | 231 break; |
233 } | 232 } |
234 high = parser.GetWord(); | 233 high = parser.GetWord(); |
235 FX_DWORD lowcode = StringToCode(low); | 234 uint32_t lowcode = StringToCode(low); |
236 FX_DWORD highcode = | 235 uint32_t highcode = |
237 (lowcode & 0xffffff00) | (StringToCode(high) & 0xff); | 236 (lowcode & 0xffffff00) | (StringToCode(high) & 0xff); |
238 if (highcode == (FX_DWORD)-1) { | 237 if (highcode == (uint32_t)-1) { |
239 break; | 238 break; |
240 } | 239 } |
241 CFX_ByteString start = parser.GetWord(); | 240 CFX_ByteString start = parser.GetWord(); |
242 if (start == "[") { | 241 if (start == "[") { |
243 for (FX_DWORD code = lowcode; code <= highcode; code++) { | 242 for (uint32_t code = lowcode; code <= highcode; code++) { |
244 CFX_ByteString dest = parser.GetWord(); | 243 CFX_ByteString dest = parser.GetWord(); |
245 CFX_WideString destcode = StringToWideString(dest); | 244 CFX_WideString destcode = StringToWideString(dest); |
246 int len = destcode.GetLength(); | 245 int len = destcode.GetLength(); |
247 if (len == 0) { | 246 if (len == 0) { |
248 continue; | 247 continue; |
249 } | 248 } |
250 if (len == 1) { | 249 if (len == 1) { |
251 m_Map[code] = destcode.GetAt(0); | 250 m_Map[code] = destcode.GetAt(0); |
252 } else { | 251 } else { |
253 m_Map[code] = m_MultiCharBuf.GetLength() * 0x10000 + 0xffff; | 252 m_Map[code] = m_MultiCharBuf.GetLength() * 0x10000 + 0xffff; |
254 m_MultiCharBuf.AppendChar(destcode.GetLength()); | 253 m_MultiCharBuf.AppendChar(destcode.GetLength()); |
255 m_MultiCharBuf << destcode; | 254 m_MultiCharBuf << destcode; |
256 } | 255 } |
257 } | 256 } |
258 parser.GetWord(); | 257 parser.GetWord(); |
259 } else { | 258 } else { |
260 CFX_WideString destcode = StringToWideString(start); | 259 CFX_WideString destcode = StringToWideString(start); |
261 int len = destcode.GetLength(); | 260 int len = destcode.GetLength(); |
262 FX_DWORD value = 0; | 261 uint32_t value = 0; |
263 if (len == 1) { | 262 if (len == 1) { |
264 value = StringToCode(start); | 263 value = StringToCode(start); |
265 for (FX_DWORD code = lowcode; code <= highcode; code++) { | 264 for (uint32_t code = lowcode; code <= highcode; code++) { |
266 m_Map[code] = value++; | 265 m_Map[code] = value++; |
267 } | 266 } |
268 } else { | 267 } else { |
269 for (FX_DWORD code = lowcode; code <= highcode; code++) { | 268 for (uint32_t code = lowcode; code <= highcode; code++) { |
270 CFX_WideString retcode; | 269 CFX_WideString retcode; |
271 if (code == lowcode) { | 270 if (code == lowcode) { |
272 retcode = destcode; | 271 retcode = destcode; |
273 } else { | 272 } else { |
274 retcode = StringDataAdd(destcode); | 273 retcode = StringDataAdd(destcode); |
275 } | 274 } |
276 m_Map[code] = m_MultiCharBuf.GetLength() * 0x10000 + 0xffff; | 275 m_Map[code] = m_MultiCharBuf.GetLength() * 0x10000 + 0xffff; |
277 m_MultiCharBuf.AppendChar(retcode.GetLength()); | 276 m_MultiCharBuf.AppendChar(retcode.GetLength()); |
278 m_MultiCharBuf << retcode; | 277 m_MultiCharBuf << retcode; |
279 destcode = retcode; | 278 destcode = retcode; |
(...skipping 13 matching lines...) Expand all Loading... |
293 } | 292 } |
294 if (cid_set) { | 293 if (cid_set) { |
295 m_pBaseMap = CPDF_ModuleMgr::Get() | 294 m_pBaseMap = CPDF_ModuleMgr::Get() |
296 ->GetPageModule() | 295 ->GetPageModule() |
297 ->GetFontGlobals() | 296 ->GetFontGlobals() |
298 ->m_CMapManager.GetCID2UnicodeMap(cid_set, FALSE); | 297 ->m_CMapManager.GetCID2UnicodeMap(cid_set, FALSE); |
299 } else { | 298 } else { |
300 m_pBaseMap = NULL; | 299 m_pBaseMap = NULL; |
301 } | 300 } |
302 } | 301 } |
OLD | NEW |