From 0181a84160e754717ebd26290628220f998ff66f Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Wed, 4 Oct 2017 13:25:01 -0400 Subject: Make CPDF_FontGlobals members private This CL makes the embedded maps and the cmap manager private to CPDF_FontGlobals and adds accessor methods as needed. Change-Id: I50350fcfad5428defe5e68d9d3b29e8961e66e9f Reviewed-on: https://pdfium-review.googlesource.com/15412 Commit-Queue: dsinclair Reviewed-by: Henrique Nakashima --- core/fpdfapi/font/cpdf_cid2unicodemap.cpp | 4 +-- core/fpdfapi/font/cpdf_cidfont.cpp | 41 ++++++++++++++++++------------- core/fpdfapi/font/cpdf_fontglobals.h | 22 ++++++++++++++++- core/fpdfapi/font/cpdf_tounicodemap.cpp | 3 ++- 4 files changed, 49 insertions(+), 21 deletions(-) (limited to 'core/fpdfapi/font') diff --git a/core/fpdfapi/font/cpdf_cid2unicodemap.cpp b/core/fpdfapi/font/cpdf_cid2unicodemap.cpp index cb378aa9d6..650856419a 100644 --- a/core/fpdfapi/font/cpdf_cid2unicodemap.cpp +++ b/core/fpdfapi/font/cpdf_cid2unicodemap.cpp @@ -37,6 +37,6 @@ void CPDF_CID2UnicodeMap::Load(CPDF_CMapManager* pMgr, CPDF_FontGlobals* pFontGlobals = CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); - m_pEmbeddedMap = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap; - m_EmbeddedCount = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count; + std::tie(m_EmbeddedCount, m_pEmbeddedMap) = + pFontGlobals->GetEmbeddedToUnicode(charset); } diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp index 0140cc8a23..be0f7b7cba 100644 --- a/core/fpdfapi/font/cpdf_cidfont.cpp +++ b/core/fpdfapi/font/cpdf_cidfont.cpp @@ -147,9 +147,14 @@ wchar_t EmbeddedUnicodeFromCharcode(const FXCMAP_CMap* pEmbedMap, return 0; uint16_t cid = FPDFAPI_CIDFromCharCode(pEmbedMap, charcode); - const auto& codes = GetFontGlobals()->m_EmbeddedToUnicodes[charset]; - if (codes.m_pMap && cid && cid < codes.m_Count) - return codes.m_pMap[cid]; + if (!cid) + return 0; + + const uint16_t* map; + uint32_t count; + std::tie(count, map) = GetFontGlobals()->GetEmbeddedToUnicode(charset); + if (map && cid < count) + return map[cid]; return 0; } @@ -159,16 +164,17 @@ uint32_t EmbeddedCharcodeFromUnicode(const FXCMAP_CMap* pEmbedMap, if (!IsValidEmbeddedCharcodeFromUnicodeCharset(charset)) return 0; - const auto& codes = GetFontGlobals()->m_EmbeddedToUnicodes[charset]; - const uint16_t* pCodes = codes.m_pMap; - if (!pCodes) + const uint16_t* map; + uint32_t count; + std::tie(count, map) = GetFontGlobals()->GetEmbeddedToUnicode(charset); + if (!map) return 0; - for (uint32_t i = 0; i < codes.m_Count; ++i) { - if (pCodes[i] == unicode) { - uint32_t CharCode = FPDFAPI_CharCodeFromCID(pEmbedMap, i); - if (CharCode) - return CharCode; + for (uint32_t i = 0; i < count; ++i) { + if (map[i] == unicode) { + uint32_t charCode = FPDFAPI_CharCodeFromCID(pEmbedMap, i); + if (charCode) + return charCode; } } return 0; @@ -359,11 +365,11 @@ bool CPDF_CIDFont::Load() { ByteString subtype = pCIDFontDict->GetStringFor("Subtype"); m_bType1 = (subtype == "CIDFontType0"); - CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; + CPDF_CMapManager* manager = GetFontGlobals()->GetCMapManager(); if (pEncoding->IsName()) { ByteString cmap = pEncoding->GetString(); bool bPromptCJK = m_pFontFile && m_bType1; - m_pCMap = manager.GetPredefinedCMap(cmap, bPromptCJK); + m_pCMap = manager->GetPredefinedCMap(cmap, bPromptCJK); if (!m_pCMap) return false; } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { @@ -386,7 +392,7 @@ bool CPDF_CIDFont::Load() { if (m_Charset != CIDSET_UNKNOWN) { bool bPromptCJK = !m_pFontFile && (m_pCMap->m_Coding == CIDCODING_CID || pCIDFontDict->KeyExist("W")); - m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, bPromptCJK); + m_pCID2UnicodeMap = manager->GetCID2UnicodeMap(m_Charset, bPromptCJK); } if (m_Font.GetFace()) { if (m_bType1) @@ -841,9 +847,10 @@ void CPDF_CIDFont::LoadGB2312() { m_Charset = CIDSET_GB1; m_bType1 = false; - CPDF_CMapManager& manager = GetFontGlobals()->m_CMapManager; - m_pCMap = manager.GetPredefinedCMap("GBK-EUC-H", false); - m_pCID2UnicodeMap = manager.GetCID2UnicodeMap(m_Charset, false); + + CPDF_CMapManager* manager = GetFontGlobals()->GetCMapManager(); + m_pCMap = manager->GetPredefinedCMap("GBK-EUC-H", false); + m_pCID2UnicodeMap = manager->GetCID2UnicodeMap(m_Charset, false); if (!IsEmbedded()) LoadSubstFont(); diff --git a/core/fpdfapi/font/cpdf_fontglobals.h b/core/fpdfapi/font/cpdf_fontglobals.h index 239a757528..a47dfa13d0 100644 --- a/core/fpdfapi/font/cpdf_fontglobals.h +++ b/core/fpdfapi/font/cpdf_fontglobals.h @@ -9,6 +9,7 @@ #include #include +#include #include "core/fpdfapi/cmaps/cmap_int.h" #include "core/fpdfapi/font/cfx_stockfontarray.h" @@ -27,6 +28,26 @@ class CPDF_FontGlobals { uint32_t index, std::unique_ptr pFont); + void SetEmbeddedCharset(size_t idx, const FXCMAP_CMap* map, uint32_t count) { + m_EmbeddedCharsets[idx].m_pMapList = map; + m_EmbeddedCharsets[idx].m_Count = count; + } + std::pair GetEmbeddedCharset(size_t idx) const { + return {m_EmbeddedCharsets[idx].m_Count, + m_EmbeddedCharsets[idx].m_pMapList.Get()}; + } + void SetEmbeddedToUnicode(size_t idx, const uint16_t* map, uint32_t count) { + m_EmbeddedToUnicodes[idx].m_pMap = map; + m_EmbeddedToUnicodes[idx].m_Count = count; + } + std::pair GetEmbeddedToUnicode(size_t idx) { + return {m_EmbeddedToUnicodes[idx].m_Count, + m_EmbeddedToUnicodes[idx].m_pMap}; + } + + CPDF_CMapManager* GetCMapManager() { return &m_CMapManager; } + + private: CPDF_CMapManager m_CMapManager; struct { UnownedPtr m_pMapList; @@ -37,7 +58,6 @@ class CPDF_FontGlobals { uint32_t m_Count; } m_EmbeddedToUnicodes[CIDSET_NUM_SETS]; - private: std::map> m_StockMap; }; diff --git a/core/fpdfapi/font/cpdf_tounicodemap.cpp b/core/fpdfapi/font/cpdf_tounicodemap.cpp index 354f5061c3..0ddaa34e13 100644 --- a/core/fpdfapi/font/cpdf_tounicodemap.cpp +++ b/core/fpdfapi/font/cpdf_tounicodemap.cpp @@ -224,7 +224,8 @@ void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) { m_pBaseMap = CPDF_ModuleMgr::Get() ->GetPageModule() ->GetFontGlobals() - ->m_CMapManager.GetCID2UnicodeMap(cid_set, false); + ->GetCMapManager() + ->GetCID2UnicodeMap(cid_set, false); } else { m_pBaseMap = nullptr; } -- cgit v1.2.3