From 4a58d1427f8a1b105578f2d27391ceda238ca59c Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Fri, 24 Mar 2017 11:07:31 -0700 Subject: Refcount CPDF_CMap all the time. Change-Id: I85ea9529f4188bf818ee96c37944e4546411f79c Reviewed-on: https://pdfium-review.googlesource.com/3211 Reviewed-by: Lei Zhang Commit-Queue: Tom Sepez --- core/fpdfapi/font/cpdf_cidfont.cpp | 2 +- core/fpdfapi/font/cpdf_cidfont.h | 4 ++-- core/fpdfapi/font/font_int.h | 21 ++++++++++++--------- core/fpdfapi/font/fpdf_font_cid.cpp | 18 ++++++++---------- 4 files changed, 23 insertions(+), 22 deletions(-) (limited to 'core/fpdfapi/font') diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp index 217a6eaf2e..5aad5194cd 100644 --- a/core/fpdfapi/font/cpdf_cidfont.cpp +++ b/core/fpdfapi/font/cpdf_cidfont.cpp @@ -365,9 +365,9 @@ bool CPDF_CIDFont::Load() { if (!m_pCMap) return false; } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { - m_pCMap = pdfium::MakeUnique(); CPDF_StreamAcc acc; acc.LoadAllData(pStream, false); + m_pCMap = pdfium::MakeRetain(); m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize()); } else { return false; diff --git a/core/fpdfapi/font/cpdf_cidfont.h b/core/fpdfapi/font/cpdf_cidfont.h index ec7da6a9bf..938b537b1b 100644 --- a/core/fpdfapi/font/cpdf_cidfont.h +++ b/core/fpdfapi/font/cpdf_cidfont.h @@ -11,7 +11,7 @@ #include #include "core/fpdfapi/font/cpdf_font.h" -#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/cfx_retain_ptr.h" #include "core/fxcrt/fx_string.h" #include "core/fxcrt/fx_system.h" @@ -72,7 +72,7 @@ class CPDF_CIDFont : public CPDF_Font { void LoadSubstFont(); wchar_t GetUnicodeFromCharCode(uint32_t charcode) const; - CFX_MaybeOwned m_pCMap; + CFX_RetainPtr m_pCMap; CPDF_CID2UnicodeMap* m_pCID2UnicodeMap; CIDSet m_Charset; bool m_bType1; diff --git a/core/fpdfapi/font/font_int.h b/core/fpdfapi/font/font_int.h index 23513d4e90..926ea91a9e 100644 --- a/core/fpdfapi/font/font_int.h +++ b/core/fpdfapi/font/font_int.h @@ -12,7 +12,7 @@ #include #include "core/fpdfapi/font/cpdf_cidfont.h" -#include "core/fxcrt/cfx_maybe_owned.h" +#include "core/fxcrt/cfx_retain_ptr.h" #include "core/fxcrt/fx_basic.h" class CPDF_CID2UnicodeMap; @@ -31,17 +31,17 @@ class CPDF_CMapManager { CPDF_CMapManager(); ~CPDF_CMapManager(); - CFX_MaybeOwned GetPredefinedCMap(const CFX_ByteString& name, - bool bPromptCJK); + CFX_RetainPtr GetPredefinedCMap(const CFX_ByteString& name, + bool bPromptCJK); CPDF_CID2UnicodeMap* GetCID2UnicodeMap(CIDSet charset, bool bPromptCJK); private: - std::unique_ptr LoadPredefinedCMap(const CFX_ByteString& name, - bool bPromptCJK); + CFX_RetainPtr LoadPredefinedCMap(const CFX_ByteString& name, + bool bPromptCJK); std::unique_ptr LoadCID2UnicodeMap(CIDSet charset, bool bPromptCJK); - std::map> m_CMaps; + std::map> m_CMaps; std::unique_ptr m_CID2UnicodeMaps[6]; }; @@ -127,7 +127,7 @@ enum CIDCoding : uint8_t { CIDCODING_UTF16, }; -class CPDF_CMap { +class CPDF_CMap : public CFX_Retainable { public: enum CodingScheme : uint8_t { OneByte, @@ -136,8 +136,8 @@ class CPDF_CMap { MixedFourBytes }; - CPDF_CMap(); - ~CPDF_CMap(); + template + friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); void LoadPredefined(CPDF_CMapManager* pMgr, const CFX_ByteString& name, @@ -156,6 +156,9 @@ class CPDF_CMap { friend class CPDF_CMapParser; friend class CPDF_CIDFont; + CPDF_CMap(); + ~CPDF_CMap() override; + CFX_ByteString m_PredefinedCMap; bool m_bVertical; CIDSet m_Charset; diff --git a/core/fpdfapi/font/fpdf_font_cid.cpp b/core/fpdfapi/font/fpdf_font_cid.cpp index e6be712a13..ddc0c12b7d 100644 --- a/core/fpdfapi/font/fpdf_font_cid.cpp +++ b/core/fpdfapi/font/fpdf_font_cid.cpp @@ -286,30 +286,28 @@ CPDF_CMapManager::CPDF_CMapManager() {} CPDF_CMapManager::~CPDF_CMapManager() {} -CFX_MaybeOwned CPDF_CMapManager::GetPredefinedCMap( +CFX_RetainPtr CPDF_CMapManager::GetPredefinedCMap( const CFX_ByteString& name, bool bPromptCJK) { auto it = m_CMaps.find(name); if (it != m_CMaps.end()) - return CFX_MaybeOwned(it->second.get()); // Unowned. + return it->second; - std::unique_ptr pCMap = LoadPredefinedCMap(name, bPromptCJK); - if (name.IsEmpty()) - return CFX_MaybeOwned(std::move(pCMap)); // Owned. + CFX_RetainPtr pCMap = LoadPredefinedCMap(name, bPromptCJK); + if (!name.IsEmpty()) + m_CMaps[name] = pCMap; - CPDF_CMap* pUnowned = pCMap.get(); - m_CMaps[name] = std::move(pCMap); - return CFX_MaybeOwned(pUnowned); // Unowned. + return pCMap; } -std::unique_ptr CPDF_CMapManager::LoadPredefinedCMap( +CFX_RetainPtr CPDF_CMapManager::LoadPredefinedCMap( const CFX_ByteString& name, bool bPromptCJK) { - auto pCMap = pdfium::MakeUnique(); const char* pname = name.c_str(); if (*pname == '/') pname++; + auto pCMap = pdfium::MakeRetain(); pCMap->LoadPredefined(this, pname, bPromptCJK); return pCMap; } -- cgit v1.2.3