OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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/cpdf_cidfont.h" | 7 #include "core/fpdfapi/fpdf_font/cpdf_cidfont.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <vector> | 10 #include <vector> |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 #else | 316 #else |
317 if (m_pCMap->m_pEmbedMap) { | 317 if (m_pCMap->m_pEmbedMap) { |
318 return EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, | 318 return EmbeddedCharcodeFromUnicode(m_pCMap->m_pEmbedMap, m_pCMap->m_Charset, |
319 unicode); | 319 unicode); |
320 } | 320 } |
321 #endif | 321 #endif |
322 return 0; | 322 return 0; |
323 } | 323 } |
324 | 324 |
325 FX_BOOL CPDF_CIDFont::Load() { | 325 FX_BOOL CPDF_CIDFont::Load() { |
326 if (m_pFontDict->GetStringBy("Subtype") == "TrueType") { | 326 if (m_pFontDict->GetStringFor("Subtype") == "TrueType") { |
327 LoadGB2312(); | 327 LoadGB2312(); |
328 return TRUE; | 328 return TRUE; |
329 } | 329 } |
330 | 330 |
331 CPDF_Array* pFonts = m_pFontDict->GetArrayBy("DescendantFonts"); | 331 CPDF_Array* pFonts = m_pFontDict->GetArrayFor("DescendantFonts"); |
332 if (!pFonts || pFonts->GetCount() != 1) | 332 if (!pFonts || pFonts->GetCount() != 1) |
333 return FALSE; | 333 return FALSE; |
334 | 334 |
335 CPDF_Dictionary* pCIDFontDict = pFonts->GetDictAt(0); | 335 CPDF_Dictionary* pCIDFontDict = pFonts->GetDictAt(0); |
336 if (!pCIDFontDict) | 336 if (!pCIDFontDict) |
337 return FALSE; | 337 return FALSE; |
338 | 338 |
339 m_BaseFont = pCIDFontDict->GetStringBy("BaseFont"); | 339 m_BaseFont = pCIDFontDict->GetStringFor("BaseFont"); |
340 if ((m_BaseFont.Compare("CourierStd") == 0 || | 340 if ((m_BaseFont.Compare("CourierStd") == 0 || |
341 m_BaseFont.Compare("CourierStd-Bold") == 0 || | 341 m_BaseFont.Compare("CourierStd-Bold") == 0 || |
342 m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || | 342 m_BaseFont.Compare("CourierStd-BoldOblique") == 0 || |
343 m_BaseFont.Compare("CourierStd-Oblique") == 0) && | 343 m_BaseFont.Compare("CourierStd-Oblique") == 0) && |
344 !IsEmbedded()) { | 344 !IsEmbedded()) { |
345 m_bAdobeCourierStd = true; | 345 m_bAdobeCourierStd = true; |
346 } | 346 } |
347 CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDictBy("FontDescriptor"); | 347 CPDF_Dictionary* pFontDesc = pCIDFontDict->GetDictFor("FontDescriptor"); |
348 if (pFontDesc) | 348 if (pFontDesc) |
349 LoadFontDescriptor(pFontDesc); | 349 LoadFontDescriptor(pFontDesc); |
350 | 350 |
351 CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectBy("Encoding"); | 351 CPDF_Object* pEncoding = m_pFontDict->GetDirectObjectFor("Encoding"); |
352 if (!pEncoding) | 352 if (!pEncoding) |
353 return FALSE; | 353 return FALSE; |
354 | 354 |
355 CFX_ByteString subtype = pCIDFontDict->GetStringBy("Subtype"); | 355 CFX_ByteString subtype = pCIDFontDict->GetStringFor("Subtype"); |
356 m_bType1 = (subtype == "CIDFontType0"); | 356 m_bType1 = (subtype == "CIDFontType0"); |
357 | 357 |
358 CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; | 358 CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; |
359 if (pEncoding->IsName()) { | 359 if (pEncoding->IsName()) { |
360 CFX_ByteString cmap = pEncoding->GetString(); | 360 CFX_ByteString cmap = pEncoding->GetString(); |
361 bool bPromptCJK = m_pFontFile && m_bType1; | 361 bool bPromptCJK = m_pFontFile && m_bType1; |
362 m_pCMap = manager.GetPredefinedCMap(cmap, bPromptCJK); | 362 m_pCMap = manager.GetPredefinedCMap(cmap, bPromptCJK); |
363 if (!m_pCMap) | 363 if (!m_pCMap) |
364 return FALSE; | 364 return FALSE; |
365 } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { | 365 } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { |
366 m_pCMap = new CPDF_CMap; | 366 m_pCMap = new CPDF_CMap; |
367 m_pAllocatedCMap.reset(m_pCMap); | 367 m_pAllocatedCMap.reset(m_pCMap); |
368 CPDF_StreamAcc acc; | 368 CPDF_StreamAcc acc; |
369 acc.LoadAllData(pStream, FALSE); | 369 acc.LoadAllData(pStream, FALSE); |
370 m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize()); | 370 m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize()); |
371 } else { | 371 } else { |
372 return FALSE; | 372 return FALSE; |
373 } | 373 } |
374 | 374 |
375 m_Charset = m_pCMap->m_Charset; | 375 m_Charset = m_pCMap->m_Charset; |
376 if (m_Charset == CIDSET_UNKNOWN) { | 376 if (m_Charset == CIDSET_UNKNOWN) { |
377 CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDictBy("CIDSystemInfo"); | 377 CPDF_Dictionary* pCIDInfo = pCIDFontDict->GetDictFor("CIDSystemInfo"); |
378 if (pCIDInfo) { | 378 if (pCIDInfo) { |
379 m_Charset = | 379 m_Charset = |
380 CharsetFromOrdering(pCIDInfo->GetStringBy("Ordering").AsStringC()); | 380 CharsetFromOrdering(pCIDInfo->GetStringFor("Ordering").AsStringC()); |
381 } | 381 } |
382 } | 382 } |
383 if (m_Charset != CIDSET_UNKNOWN) { | 383 if (m_Charset != CIDSET_UNKNOWN) { |
384 bool bPromptCJK = !m_pFontFile && (m_pCMap->m_Coding == CIDCODING_CID || | 384 bool bPromptCJK = !m_pFontFile && (m_pCMap->m_Coding == CIDCODING_CID || |
385 pCIDFontDict->KeyExist("W")); | 385 pCIDFontDict->KeyExist("W")); |
386 m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, bPromptCJK); | 386 m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, bPromptCJK); |
387 } | 387 } |
388 if (m_Font.GetFace()) { | 388 if (m_Font.GetFace()) { |
389 if (m_bType1) | 389 if (m_bType1) |
390 FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE); | 390 FXFT_Select_Charmap(m_Font.GetFace(), FXFT_ENCODING_UNICODE); |
391 else | 391 else |
392 FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding); | 392 FT_UseCIDCharmap(m_Font.GetFace(), m_pCMap->m_Coding); |
393 } | 393 } |
394 m_DefaultWidth = pCIDFontDict->GetIntegerBy("DW", 1000); | 394 m_DefaultWidth = pCIDFontDict->GetIntegerFor("DW", 1000); |
395 CPDF_Array* pWidthArray = pCIDFontDict->GetArrayBy("W"); | 395 CPDF_Array* pWidthArray = pCIDFontDict->GetArrayFor("W"); |
396 if (pWidthArray) | 396 if (pWidthArray) |
397 LoadMetricsArray(pWidthArray, m_WidthList, 1); | 397 LoadMetricsArray(pWidthArray, m_WidthList, 1); |
398 if (!IsEmbedded()) | 398 if (!IsEmbedded()) |
399 LoadSubstFont(); | 399 LoadSubstFont(); |
400 | 400 |
401 if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) { | 401 if (m_pFontFile || (GetSubstFont()->m_SubstFlags & FXFONT_SUBST_EXACT)) { |
402 CPDF_Object* pmap = pCIDFontDict->GetDirectObjectBy("CIDToGIDMap"); | 402 CPDF_Object* pmap = pCIDFontDict->GetDirectObjectFor("CIDToGIDMap"); |
403 if (pmap) { | 403 if (pmap) { |
404 if (CPDF_Stream* pStream = pmap->AsStream()) { | 404 if (CPDF_Stream* pStream = pmap->AsStream()) { |
405 m_pStreamAcc.reset(new CPDF_StreamAcc); | 405 m_pStreamAcc.reset(new CPDF_StreamAcc); |
406 m_pStreamAcc->LoadAllData(pStream, FALSE); | 406 m_pStreamAcc->LoadAllData(pStream, FALSE); |
407 } else if (pmap->GetString() == "Identity") { | 407 } else if (pmap->GetString() == "Identity") { |
408 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ | 408 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
409 if (m_pFontFile) { | 409 if (m_pFontFile) { |
410 m_bCIDIsGID = true; | 410 m_bCIDIsGID = true; |
411 } | 411 } |
412 #else | 412 #else |
413 m_bCIDIsGID = true; | 413 m_bCIDIsGID = true; |
414 #endif | 414 #endif |
415 } | 415 } |
416 } | 416 } |
417 } | 417 } |
418 | 418 |
419 CheckFontMetrics(); | 419 CheckFontMetrics(); |
420 if (IsVertWriting()) { | 420 if (IsVertWriting()) { |
421 pWidthArray = pCIDFontDict->GetArrayBy("W2"); | 421 pWidthArray = pCIDFontDict->GetArrayFor("W2"); |
422 if (pWidthArray) { | 422 if (pWidthArray) { |
423 LoadMetricsArray(pWidthArray, m_VertMetrics, 3); | 423 LoadMetricsArray(pWidthArray, m_VertMetrics, 3); |
424 } | 424 } |
425 CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayBy("DW2"); | 425 CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayFor("DW2"); |
426 if (pDefaultArray) { | 426 if (pDefaultArray) { |
427 m_DefaultVY = pDefaultArray->GetIntegerAt(0); | 427 m_DefaultVY = pDefaultArray->GetIntegerAt(0); |
428 m_DefaultW1 = pDefaultArray->GetIntegerAt(1); | 428 m_DefaultW1 = pDefaultArray->GetIntegerAt(1); |
429 } else { | 429 } else { |
430 m_DefaultVY = 880; | 430 m_DefaultVY = 880; |
431 m_DefaultW1 = -1000; | 431 m_DefaultW1 = -1000; |
432 } | 432 } |
433 } | 433 } |
434 return TRUE; | 434 return TRUE; |
435 } | 435 } |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 } | 825 } |
826 } | 826 } |
827 } | 827 } |
828 | 828 |
829 // static | 829 // static |
830 FX_FLOAT CPDF_CIDFont::CIDTransformToFloat(uint8_t ch) { | 830 FX_FLOAT CPDF_CIDFont::CIDTransformToFloat(uint8_t ch) { |
831 return (ch < 128 ? ch : ch - 255) * (1.0f / 127); | 831 return (ch < 128 ? ch : ch - 255) * (1.0f / 127); |
832 } | 832 } |
833 | 833 |
834 void CPDF_CIDFont::LoadGB2312() { | 834 void CPDF_CIDFont::LoadGB2312() { |
835 m_BaseFont = m_pFontDict->GetStringBy("BaseFont"); | 835 m_BaseFont = m_pFontDict->GetStringFor("BaseFont"); |
836 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictBy("FontDescriptor"); | 836 CPDF_Dictionary* pFontDesc = m_pFontDict->GetDictFor("FontDescriptor"); |
837 if (pFontDesc) | 837 if (pFontDesc) |
838 LoadFontDescriptor(pFontDesc); | 838 LoadFontDescriptor(pFontDesc); |
839 | 839 |
840 m_Charset = CIDSET_GB1; | 840 m_Charset = CIDSET_GB1; |
841 m_bType1 = false; | 841 m_bType1 = false; |
842 CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; | 842 CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; |
843 m_pCMap = manager.GetPredefinedCMap("GBK-EUC-H", FALSE); | 843 m_pCMap = manager.GetPredefinedCMap("GBK-EUC-H", FALSE); |
844 m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, FALSE); | 844 m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, FALSE); |
845 if (!IsEmbedded()) | 845 if (!IsEmbedded()) |
846 LoadSubstFont(); | 846 LoadSubstFont(); |
847 | 847 |
848 CheckFontMetrics(); | 848 CheckFontMetrics(); |
849 m_DefaultWidth = 1000; | 849 m_DefaultWidth = 1000; |
850 m_bAnsiWidthsFixed = true; | 850 m_bAnsiWidthsFixed = true; |
851 } | 851 } |
852 | 852 |
853 const uint8_t* CPDF_CIDFont::GetCIDTransform(uint16_t CID) const { | 853 const uint8_t* CPDF_CIDFont::GetCIDTransform(uint16_t CID) const { |
854 if (m_Charset != CIDSET_JAPAN1 || m_pFontFile) | 854 if (m_Charset != CIDSET_JAPAN1 || m_pFontFile) |
855 return nullptr; | 855 return nullptr; |
856 | 856 |
857 const auto* pEnd = g_Japan1_VertCIDs + FX_ArraySize(g_Japan1_VertCIDs); | 857 const auto* pEnd = g_Japan1_VertCIDs + FX_ArraySize(g_Japan1_VertCIDs); |
858 const auto* pTransform = std::lower_bound( | 858 const auto* pTransform = std::lower_bound( |
859 g_Japan1_VertCIDs, pEnd, CID, | 859 g_Japan1_VertCIDs, pEnd, CID, |
860 [](const CIDTransform& entry, uint16_t cid) { return entry.cid < cid; }); | 860 [](const CIDTransform& entry, uint16_t cid) { return entry.cid < cid; }); |
861 return pTransform < pEnd && CID == pTransform->cid ? &pTransform->a : nullptr; | 861 return pTransform < pEnd && CID == pTransform->cid ? &pTransform->a : nullptr; |
862 } | 862 } |
OLD | NEW |