| 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/font/font_int.h" | 7 #include "core/fpdfapi/font/font_int.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/cpdf_modulemgr.h" | 9 #include "core/fpdfapi/cpdf_modulemgr.h" |
| 10 #include "core/fpdfapi/page/cpdf_form.h" | 10 #include "core/fpdfapi/page/cpdf_form.h" |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 } | 192 } |
| 193 return result; | 193 return result; |
| 194 } | 194 } |
| 195 return result; | 195 return result; |
| 196 } | 196 } |
| 197 | 197 |
| 198 CPDF_ToUnicodeMap::CPDF_ToUnicodeMap() : m_pBaseMap(nullptr) {} | 198 CPDF_ToUnicodeMap::CPDF_ToUnicodeMap() : m_pBaseMap(nullptr) {} |
| 199 | 199 |
| 200 CPDF_ToUnicodeMap::~CPDF_ToUnicodeMap() {} | 200 CPDF_ToUnicodeMap::~CPDF_ToUnicodeMap() {} |
| 201 | 201 |
| 202 uint32_t CPDF_ToUnicodeMap::GetUnicode() { |
| 203 FX_SAFE_UINT32 uni = m_MultiCharBuf.GetLength(); |
| 204 uni = uni * 0x10000 + 0xffff; |
| 205 return uni.ValueOrDefault(0); |
| 206 } |
| 207 |
| 202 void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) { | 208 void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) { |
| 203 CIDSet cid_set = CIDSET_UNKNOWN; | 209 CIDSet cid_set = CIDSET_UNKNOWN; |
| 204 CPDF_StreamAcc stream; | 210 CPDF_StreamAcc stream; |
| 205 stream.LoadAllData(pStream, FALSE); | 211 stream.LoadAllData(pStream, FALSE); |
| 206 CPDF_SimpleParser parser(stream.GetData(), stream.GetSize()); | 212 CPDF_SimpleParser parser(stream.GetData(), stream.GetSize()); |
| 207 while (1) { | 213 while (1) { |
| 208 CFX_ByteStringC word = parser.GetWord(); | 214 CFX_ByteStringC word = parser.GetWord(); |
| 209 if (word.IsEmpty()) { | 215 if (word.IsEmpty()) { |
| 210 break; | 216 break; |
| 211 } | 217 } |
| 212 if (word == "beginbfchar") { | 218 if (word == "beginbfchar") { |
| 213 while (1) { | 219 while (1) { |
| 214 word = parser.GetWord(); | 220 word = parser.GetWord(); |
| 215 if (word.IsEmpty() || word == "endbfchar") { | 221 if (word.IsEmpty() || word == "endbfchar") { |
| 216 break; | 222 break; |
| 217 } | 223 } |
| 218 uint32_t srccode = StringToCode(word); | 224 uint32_t srccode = StringToCode(word); |
| 219 word = parser.GetWord(); | 225 word = parser.GetWord(); |
| 220 CFX_WideString destcode = StringToWideString(word); | 226 CFX_WideString destcode = StringToWideString(word); |
| 221 int len = destcode.GetLength(); | 227 int len = destcode.GetLength(); |
| 222 if (len == 0) { | 228 if (len == 0) { |
| 223 continue; | 229 continue; |
| 224 } | 230 } |
| 225 if (len == 1) { | 231 if (len == 1) { |
| 226 m_Map[srccode] = destcode.GetAt(0); | 232 m_Map[srccode] = destcode.GetAt(0); |
| 227 } else { | 233 } else { |
| 228 FX_SAFE_UINT32 uni = m_MultiCharBuf.GetLength(); | 234 m_Map[srccode] = GetUnicode(); |
| 229 uni *= 0x10000; | |
| 230 uni += 0xffff; | |
| 231 m_Map[srccode] = uni.ValueOrDie(); | |
| 232 m_MultiCharBuf.AppendChar(destcode.GetLength()); | 235 m_MultiCharBuf.AppendChar(destcode.GetLength()); |
| 233 m_MultiCharBuf << destcode; | 236 m_MultiCharBuf << destcode; |
| 234 } | 237 } |
| 235 } | 238 } |
| 236 } else if (word == "beginbfrange") { | 239 } else if (word == "beginbfrange") { |
| 237 while (1) { | 240 while (1) { |
| 238 CFX_ByteString low, high; | 241 CFX_ByteString low, high; |
| 239 low = parser.GetWord(); | 242 low = parser.GetWord(); |
| 240 if (low.IsEmpty() || low == "endbfrange") { | 243 if (low.IsEmpty() || low == "endbfrange") { |
| 241 break; | 244 break; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 252 for (uint32_t code = lowcode; code <= highcode; code++) { | 255 for (uint32_t code = lowcode; code <= highcode; code++) { |
| 253 CFX_ByteString dest(parser.GetWord()); | 256 CFX_ByteString dest(parser.GetWord()); |
| 254 CFX_WideString destcode = StringToWideString(dest.AsStringC()); | 257 CFX_WideString destcode = StringToWideString(dest.AsStringC()); |
| 255 int len = destcode.GetLength(); | 258 int len = destcode.GetLength(); |
| 256 if (len == 0) { | 259 if (len == 0) { |
| 257 continue; | 260 continue; |
| 258 } | 261 } |
| 259 if (len == 1) { | 262 if (len == 1) { |
| 260 m_Map[code] = destcode.GetAt(0); | 263 m_Map[code] = destcode.GetAt(0); |
| 261 } else { | 264 } else { |
| 262 FX_SAFE_UINT32 uni = m_MultiCharBuf.GetLength(); | 265 m_Map[code] = GetUnicode(); |
| 263 uni *= 0x10000; | |
| 264 uni += 0xffff; | |
| 265 m_Map[code] = uni.ValueOrDie(); | |
| 266 m_MultiCharBuf.AppendChar(destcode.GetLength()); | 266 m_MultiCharBuf.AppendChar(destcode.GetLength()); |
| 267 m_MultiCharBuf << destcode; | 267 m_MultiCharBuf << destcode; |
| 268 } | 268 } |
| 269 } | 269 } |
| 270 parser.GetWord(); | 270 parser.GetWord(); |
| 271 } else { | 271 } else { |
| 272 CFX_WideString destcode = StringToWideString(start.AsStringC()); | 272 CFX_WideString destcode = StringToWideString(start.AsStringC()); |
| 273 int len = destcode.GetLength(); | 273 int len = destcode.GetLength(); |
| 274 uint32_t value = 0; | 274 uint32_t value = 0; |
| 275 if (len == 1) { | 275 if (len == 1) { |
| 276 value = StringToCode(start.AsStringC()); | 276 value = StringToCode(start.AsStringC()); |
| 277 for (uint32_t code = lowcode; code <= highcode; code++) { | 277 for (uint32_t code = lowcode; code <= highcode; code++) { |
| 278 m_Map[code] = value++; | 278 m_Map[code] = value++; |
| 279 } | 279 } |
| 280 } else { | 280 } else { |
| 281 for (uint32_t code = lowcode; code <= highcode; code++) { | 281 for (uint32_t code = lowcode; code <= highcode; code++) { |
| 282 CFX_WideString retcode; | 282 CFX_WideString retcode; |
| 283 if (code == lowcode) { | 283 if (code == lowcode) { |
| 284 retcode = destcode; | 284 retcode = destcode; |
| 285 } else { | 285 } else { |
| 286 retcode = StringDataAdd(destcode); | 286 retcode = StringDataAdd(destcode); |
| 287 } | 287 } |
| 288 FX_SAFE_UINT32 uni = m_MultiCharBuf.GetLength(); | 288 m_Map[code] = GetUnicode(); |
| 289 uni *= 0x10000; | |
| 290 uni += 0xffff; | |
| 291 m_Map[code] = uni.ValueOrDie(); | |
| 292 m_MultiCharBuf.AppendChar(retcode.GetLength()); | 289 m_MultiCharBuf.AppendChar(retcode.GetLength()); |
| 293 m_MultiCharBuf << retcode; | 290 m_MultiCharBuf << retcode; |
| 294 destcode = retcode; | 291 destcode = retcode; |
| 295 } | 292 } |
| 296 } | 293 } |
| 297 } | 294 } |
| 298 } | 295 } |
| 299 } else if (word == "/Adobe-Korea1-UCS2") { | 296 } else if (word == "/Adobe-Korea1-UCS2") { |
| 300 cid_set = CIDSET_KOREA1; | 297 cid_set = CIDSET_KOREA1; |
| 301 } else if (word == "/Adobe-Japan1-UCS2") { | 298 } else if (word == "/Adobe-Japan1-UCS2") { |
| 302 cid_set = CIDSET_JAPAN1; | 299 cid_set = CIDSET_JAPAN1; |
| 303 } else if (word == "/Adobe-CNS1-UCS2") { | 300 } else if (word == "/Adobe-CNS1-UCS2") { |
| 304 cid_set = CIDSET_CNS1; | 301 cid_set = CIDSET_CNS1; |
| 305 } else if (word == "/Adobe-GB1-UCS2") { | 302 } else if (word == "/Adobe-GB1-UCS2") { |
| 306 cid_set = CIDSET_GB1; | 303 cid_set = CIDSET_GB1; |
| 307 } | 304 } |
| 308 } | 305 } |
| 309 if (cid_set) { | 306 if (cid_set) { |
| 310 m_pBaseMap = CPDF_ModuleMgr::Get() | 307 m_pBaseMap = CPDF_ModuleMgr::Get() |
| 311 ->GetPageModule() | 308 ->GetPageModule() |
| 312 ->GetFontGlobals() | 309 ->GetFontGlobals() |
| 313 ->m_CMapManager.GetCID2UnicodeMap(cid_set, FALSE); | 310 ->m_CMapManager.GetCID2UnicodeMap(cid_set, FALSE); |
| 314 } else { | 311 } else { |
| 315 m_pBaseMap = nullptr; | 312 m_pBaseMap = nullptr; |
| 316 } | 313 } |
| 317 } | 314 } |
| OLD | NEW |