From afd0d1f488ea55da545b3310fd8f22e45522a695 Mon Sep 17 00:00:00 2001 From: Tom Sepez Date: Tue, 4 Apr 2017 14:37:18 -0700 Subject: RefCount CPDF_StreamAcc all the time. Pass stream argument to constructor; it feels like a stream accessor should always be made from a stream rather than passing one in after the fact. Change-Id: Iaa46cb37677b81f0170f5d39bab76ad38ea4af44 Reviewed-on: https://pdfium-review.googlesource.com/3620 Commit-Queue: Tom Sepez Reviewed-by: Lei Zhang --- core/fpdfapi/edit/fpdf_edit_create.cpp | 28 ++++++++-------- core/fpdfapi/font/cpdf_cidfont.cpp | 10 +++--- core/fpdfapi/font/cpdf_cidfont.h | 2 +- core/fpdfapi/font/cpdf_font.cpp | 4 +-- core/fpdfapi/font/cpdf_font.h | 4 +-- core/fpdfapi/font/fpdf_font.cpp | 6 ++-- core/fpdfapi/page/cpdf_colorspace.cpp | 6 ++-- core/fpdfapi/page/cpdf_contentparser.cpp | 13 ++++---- core/fpdfapi/page/cpdf_contentparser.h | 5 +-- core/fpdfapi/page/cpdf_docpagedata.cpp | 52 ++++++++--------------------- core/fpdfapi/page/cpdf_docpagedata.h | 7 ++-- core/fpdfapi/page/cpdf_meshstream.cpp | 9 +++-- core/fpdfapi/page/cpdf_meshstream.h | 3 +- core/fpdfapi/page/fpdf_page_func.cpp | 12 +++---- core/fpdfapi/page/pageint.h | 9 +++-- core/fpdfapi/parser/cpdf_document.cpp | 3 +- core/fpdfapi/parser/cpdf_document.h | 2 +- core/fpdfapi/parser/cpdf_hint_tables.cpp | 8 ++--- core/fpdfapi/parser/cpdf_parser.cpp | 28 ++++++++-------- core/fpdfapi/parser/cpdf_parser.h | 8 ++--- core/fpdfapi/parser/cpdf_stream.cpp | 14 ++++---- core/fpdfapi/parser/cpdf_stream_acc.cpp | 30 ++++++++--------- core/fpdfapi/parser/cpdf_stream_acc.h | 15 +++++---- core/fpdfapi/parser/fpdf_parser_utility.cpp | 6 ++-- core/fpdfapi/render/cpdf_dibsource.cpp | 20 +++++------ core/fpdfapi/render/cpdf_dibsource.h | 4 +-- 26 files changed, 146 insertions(+), 162 deletions(-) (limited to 'core/fpdfapi') diff --git a/core/fpdfapi/edit/fpdf_edit_create.cpp b/core/fpdfapi/edit/fpdf_edit_create.cpp index 59d3de35a9..d08e4b5302 100644 --- a/core/fpdfapi/edit/fpdf_edit_create.cpp +++ b/core/fpdfapi/edit/fpdf_edit_create.cpp @@ -182,12 +182,12 @@ int32_t PDF_CreatorAppendObject(const CPDF_Object* pObj, return -1; } offset += 8; - CPDF_StreamAcc acc; - acc.LoadAllData(p, true); - if (pFile->AppendBlock(acc.GetData(), acc.GetSize()) < 0) { + auto pAcc = pdfium::MakeRetain(p); + pAcc->LoadAllData(true); + if (pFile->AppendBlock(pAcc->GetData(), pAcc->GetSize()) < 0) { return -1; } - offset += acc.GetSize(); + offset += pAcc->GetSize(); if ((len = pFile->AppendString("\r\nendstream")) < 0) { return -1; } @@ -411,7 +411,7 @@ class CPDF_FlateEncoder { uint32_t m_dwSize; CFX_MaybeOwned m_pData; CFX_MaybeOwned m_pDict; - CPDF_StreamAcc m_Acc; + CFX_RetainPtr m_pAcc; }; void CPDF_FlateEncoder::CloneDict() { @@ -422,27 +422,27 @@ void CPDF_FlateEncoder::CloneDict() { } CPDF_FlateEncoder::CPDF_FlateEncoder(CPDF_Stream* pStream, bool bFlateEncode) - : m_dwSize(0) { - m_Acc.LoadAllData(pStream, true); + : m_dwSize(0), m_pAcc(pdfium::MakeRetain(pStream)) { + m_pAcc->LoadAllData(true); bool bHasFilter = pStream && pStream->HasFilter(); if (bHasFilter && !bFlateEncode) { - CPDF_StreamAcc destAcc; - destAcc.LoadAllData(pStream); - m_dwSize = destAcc.GetSize(); - m_pData = destAcc.DetachData(); + auto pDestAcc = pdfium::MakeRetain(pStream); + pDestAcc->LoadAllData(); + m_dwSize = pDestAcc->GetSize(); + m_pData = pDestAcc->DetachData(); m_pDict = ToDictionary(pStream->GetDict()->Clone()); m_pDict->RemoveFor("Filter"); return; } if (bHasFilter || !bFlateEncode) { - m_pData = const_cast(m_Acc.GetData()); - m_dwSize = m_Acc.GetSize(); + m_pData = const_cast(m_pAcc->GetData()); + m_dwSize = m_pAcc->GetSize(); m_pDict = pStream->GetDict(); return; } // TODO(thestig): Move to Init() and check return value. uint8_t* buffer = nullptr; - ::FlateEncode(m_Acc.GetData(), m_Acc.GetSize(), &buffer, &m_dwSize); + ::FlateEncode(m_pAcc->GetData(), m_pAcc->GetSize(), &buffer, &m_dwSize); m_pData = std::unique_ptr(buffer); m_pDict = ToDictionary(pStream->GetDict()->Clone()); m_pDict->SetNewFor("Length", static_cast(m_dwSize)); diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp index 5aad5194cd..c309ac1d26 100644 --- a/core/fpdfapi/font/cpdf_cidfont.cpp +++ b/core/fpdfapi/font/cpdf_cidfont.cpp @@ -365,10 +365,10 @@ bool CPDF_CIDFont::Load() { if (!m_pCMap) return false; } else if (CPDF_Stream* pStream = pEncoding->AsStream()) { - CPDF_StreamAcc acc; - acc.LoadAllData(pStream, false); + auto pAcc = pdfium::MakeRetain(pStream); + pAcc->LoadAllData(false); m_pCMap = pdfium::MakeRetain(); - m_pCMap->LoadEmbedded(acc.GetData(), acc.GetSize()); + m_pCMap->LoadEmbedded(pAcc->GetData(), pAcc->GetSize()); } else { return false; } @@ -403,8 +403,8 @@ bool CPDF_CIDFont::Load() { CPDF_Object* pmap = pCIDFontDict->GetDirectObjectFor("CIDToGIDMap"); if (pmap) { if (CPDF_Stream* pStream = pmap->AsStream()) { - m_pStreamAcc = pdfium::MakeUnique(); - m_pStreamAcc->LoadAllData(pStream, false); + m_pStreamAcc = pdfium::MakeRetain(pStream); + m_pStreamAcc->LoadAllData(false); } else if (pmap->GetString() == "Identity") { #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ if (m_pFontFile) diff --git a/core/fpdfapi/font/cpdf_cidfont.h b/core/fpdfapi/font/cpdf_cidfont.h index 938b537b1b..cc9bec1612 100644 --- a/core/fpdfapi/font/cpdf_cidfont.h +++ b/core/fpdfapi/font/cpdf_cidfont.h @@ -78,7 +78,7 @@ class CPDF_CIDFont : public CPDF_Font { bool m_bType1; bool m_bCIDIsGID; uint16_t m_DefaultWidth; - std::unique_ptr m_pStreamAcc; + CFX_RetainPtr m_pStreamAcc; bool m_bAnsiWidthsFixed; FX_RECT m_CharBBox[256]; std::vector m_WidthList; diff --git a/core/fpdfapi/font/cpdf_font.cpp b/core/fpdfapi/font/cpdf_font.cpp index f0b5ac16b7..60eb1b361d 100644 --- a/core/fpdfapi/font/cpdf_font.cpp +++ b/core/fpdfapi/font/cpdf_font.cpp @@ -61,7 +61,7 @@ CPDF_Font::CPDF_Font() CPDF_Font::~CPDF_Font() { if (m_pFontFile) { - m_pDocument->GetPageData()->ReleaseFontFileStreamAcc( + m_pDocument->GetPageData()->MaybePurgeFontFileStreamAcc( m_pFontFile->GetStream()->AsStream()); } } @@ -219,7 +219,7 @@ void CPDF_Font::LoadFontDescriptor(CPDF_Dictionary* pFontDesc) { const uint8_t* pFontData = m_pFontFile->GetData(); uint32_t dwFontSize = m_pFontFile->GetSize(); if (!m_Font.LoadEmbedded(pFontData, dwFontSize)) { - m_pDocument->GetPageData()->ReleaseFontFileStreamAcc( + m_pDocument->GetPageData()->MaybePurgeFontFileStreamAcc( m_pFontFile->GetStream()->AsStream()); m_pFontFile = nullptr; } diff --git a/core/fpdfapi/font/cpdf_font.h b/core/fpdfapi/font/cpdf_font.h index 6dac3f2778..8ef68e6031 100644 --- a/core/fpdfapi/font/cpdf_font.h +++ b/core/fpdfapi/font/cpdf_font.h @@ -10,6 +10,7 @@ #include #include +#include "core/fpdfapi/parser/cpdf_stream_acc.h" #include "core/fxcrt/fx_string.h" #include "core/fxcrt/fx_system.h" #include "core/fxge/fx_font.h" @@ -19,7 +20,6 @@ class CPDF_CIDFont; class CPDF_Dictionary; class CPDF_Document; class CPDF_Object; -class CPDF_StreamAcc; class CPDF_TrueTypeFont; class CPDF_Type1Font; class CPDF_Type3Font; @@ -101,7 +101,7 @@ class CPDF_Font { int charcode); CFX_ByteString m_BaseFont; - CPDF_StreamAcc* m_pFontFile; + CFX_RetainPtr m_pFontFile; CPDF_Dictionary* m_pFontDict; mutable std::unique_ptr m_pToUnicodeMap; mutable bool m_bToUnicodeLoaded; diff --git a/core/fpdfapi/font/fpdf_font.cpp b/core/fpdfapi/font/fpdf_font.cpp index 23b46759d8..a5616ea963 100644 --- a/core/fpdfapi/font/fpdf_font.cpp +++ b/core/fpdfapi/font/fpdf_font.cpp @@ -208,9 +208,9 @@ uint32_t CPDF_ToUnicodeMap::GetUnicode() { void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) { CIDSet cid_set = CIDSET_UNKNOWN; - CPDF_StreamAcc stream; - stream.LoadAllData(pStream, false); - CPDF_SimpleParser parser(stream.GetData(), stream.GetSize()); + auto pAcc = pdfium::MakeRetain(pStream); + pAcc->LoadAllData(false); + CPDF_SimpleParser parser(pAcc->GetData(), pAcc->GetSize()); while (1) { CFX_ByteStringC word = parser.GetWord(); if (word.IsEmpty()) { diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp index 500de26c56..400b7a9150 100644 --- a/core/fpdfapi/page/cpdf_colorspace.cpp +++ b/core/fpdfapi/page/cpdf_colorspace.cpp @@ -1084,9 +1084,9 @@ bool CPDF_IndexedCS::v_Load(CPDF_Document* pDoc, CPDF_Array* pArray) { if (CPDF_String* pString = pTableObj->AsString()) { m_Table = pString->GetString(); } else if (CPDF_Stream* pStream = pTableObj->AsStream()) { - CPDF_StreamAcc acc; - acc.LoadAllData(pStream, false); - m_Table = CFX_ByteStringC(acc.GetData(), acc.GetSize()); + auto pAcc = pdfium::MakeRetain(pStream); + pAcc->LoadAllData(false); + m_Table = CFX_ByteStringC(pAcc->GetData(), pAcc->GetSize()); } return true; } diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp index 46e2c52c75..96bc7a2221 100644 --- a/core/fpdfapi/page/cpdf_contentparser.cpp +++ b/core/fpdfapi/page/cpdf_contentparser.cpp @@ -55,8 +55,8 @@ void CPDF_ContentParser::Start(CPDF_Page* pPage) { } if (CPDF_Stream* pStream = pContent->AsStream()) { m_nStreams = 0; - m_pSingleStream = pdfium::MakeUnique(); - m_pSingleStream->LoadAllData(pStream, false); + m_pSingleStream = pdfium::MakeRetain(pStream); + m_pSingleStream->LoadAllData(false); } else if (CPDF_Array* pArray = pContent->AsArray()) { m_nStreams = pArray->GetCount(); if (m_nStreams) @@ -114,8 +114,8 @@ void CPDF_ContentParser::Start(CPDF_Form* pForm, pState->SetSoftMask(nullptr); } m_nStreams = 0; - m_pSingleStream = pdfium::MakeUnique(); - m_pSingleStream->LoadAllData(pForm->m_pFormStream, false); + m_pSingleStream = pdfium::MakeRetain(pForm->m_pFormStream); + m_pSingleStream->LoadAllData(false); m_pData = (uint8_t*)m_pSingleStream->GetData(); m_Size = m_pSingleStream->GetSize(); m_Status = ToBeContinued; @@ -156,10 +156,11 @@ void CPDF_ContentParser::Continue(IFX_Pause* pPause) { } else { CPDF_Array* pContent = m_pObjectHolder->m_pFormDict->GetArrayFor("Contents"); - m_StreamArray[m_CurrentOffset] = pdfium::MakeUnique(); CPDF_Stream* pStreamObj = ToStream( pContent ? pContent->GetDirectObjectAt(m_CurrentOffset) : nullptr); - m_StreamArray[m_CurrentOffset]->LoadAllData(pStreamObj, false); + m_StreamArray[m_CurrentOffset] = + pdfium::MakeRetain(pStreamObj); + m_StreamArray[m_CurrentOffset]->LoadAllData(false); m_CurrentOffset++; } } diff --git a/core/fpdfapi/page/cpdf_contentparser.h b/core/fpdfapi/page/cpdf_contentparser.h index 5fd11f6c0b..402fd2fdd0 100644 --- a/core/fpdfapi/page/cpdf_contentparser.h +++ b/core/fpdfapi/page/cpdf_contentparser.h @@ -12,6 +12,7 @@ #include "core/fpdfapi/page/cpdf_pageobjectholder.h" #include "core/fpdfapi/page/cpdf_streamcontentparser.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" class CPDF_AllStates; class CPDF_Form; @@ -48,8 +49,8 @@ class CPDF_ContentParser { bool m_bForm; CPDF_Type3Char* m_pType3Char; uint32_t m_nStreams; - std::unique_ptr m_pSingleStream; - std::vector> m_StreamArray; + CFX_RetainPtr m_pSingleStream; + std::vector> m_StreamArray; uint8_t* m_pData; uint32_t m_Size; uint32_t m_CurrentOffset; diff --git a/core/fpdfapi/page/cpdf_docpagedata.cpp b/core/fpdfapi/page/cpdf_docpagedata.cpp index a57c42d3cd..5e13740c21 100644 --- a/core/fpdfapi/page/cpdf_docpagedata.cpp +++ b/core/fpdfapi/page/cpdf_docpagedata.cpp @@ -96,15 +96,8 @@ void CPDF_DocPageData::Clear(bool bForceRelease) { for (auto it = m_FontFileMap.begin(); it != m_FontFileMap.end();) { auto curr_it = it++; - CPDF_CountedStreamAcc* pCountedFont = curr_it->second; - if (!pCountedFont->get()) - continue; - - if (bForceRelease || pCountedFont->use_count() < 2) { - delete pCountedFont->get(); - delete pCountedFont; + if (bForceRelease || curr_it->second->HasOneRef()) m_FontFileMap.erase(curr_it); - } } m_ImageMap.clear(); @@ -408,11 +401,11 @@ CFX_RetainPtr CPDF_DocPageData::GetIccProfile( if (it != m_IccProfileMap.end()) return it->second; - CPDF_StreamAcc accessor; - accessor.LoadAllData(pProfileStream, false); + auto pAccessor = pdfium::MakeRetain(pProfileStream); + pAccessor->LoadAllData(false); uint8_t digest[20]; - CRYPT_SHA1Generate(accessor.GetData(), accessor.GetSize(), digest); + CRYPT_SHA1Generate(pAccessor->GetData(), pAccessor->GetSize(), digest); CFX_ByteString bsDigest(digest, 20); auto hash_it = m_HashProfileMap.find(bsDigest); @@ -422,7 +415,7 @@ CFX_RetainPtr CPDF_DocPageData::GetIccProfile( return it_copied_stream->second; } auto pProfile = pdfium::MakeRetain( - pProfileStream, accessor.GetData(), accessor.GetSize()); + pProfileStream, pAccessor->GetData(), pAccessor->GetSize()); m_IccProfileMap[pProfileStream] = pProfile; m_HashProfileMap[bsDigest] = pProfileStream; return pProfile; @@ -435,13 +428,12 @@ void CPDF_DocPageData::MaybePurgeIccProfile(CPDF_Stream* pProfileStream) { m_IccProfileMap.erase(it); } -CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc( +CFX_RetainPtr CPDF_DocPageData::GetFontFileStreamAcc( CPDF_Stream* pFontStream) { ASSERT(pFontStream); - auto it = m_FontFileMap.find(pFontStream); if (it != m_FontFileMap.end()) - return it->second->AddRef(); + return it->second; CPDF_Dictionary* pFontDict = pFontStream->GetDict(); int32_t org_size = pFontDict->GetIntegerFor("Length1") + @@ -449,36 +441,20 @@ CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc( pFontDict->GetIntegerFor("Length3"); org_size = std::max(org_size, 0); - auto pFontAcc = pdfium::MakeUnique(); - pFontAcc->LoadAllData(pFontStream, false, org_size); - - CPDF_CountedStreamAcc* pCountedFont = - new CPDF_CountedStreamAcc(std::move(pFontAcc)); - m_FontFileMap[pFontStream] = pCountedFont; - return pCountedFont->AddRef(); + auto pFontAcc = pdfium::MakeRetain(pFontStream); + pFontAcc->LoadAllData(false, org_size); + m_FontFileMap[pFontStream] = pFontAcc; + return pFontAcc; } -void CPDF_DocPageData::ReleaseFontFileStreamAcc( +void CPDF_DocPageData::MaybePurgeFontFileStreamAcc( const CPDF_Stream* pFontStream) { if (!pFontStream) return; auto it = m_FontFileMap.find(pFontStream); - if (it == m_FontFileMap.end()) - return; - - CPDF_CountedStreamAcc* pCountedStream = it->second; - if (!pCountedStream) - return; - - pCountedStream->RemoveRef(); - if (pCountedStream->use_count() > 1) - return; - - // We have item only in m_FontFileMap cache. Clean it. - delete pCountedStream->get(); - delete pCountedStream; - m_FontFileMap.erase(it); + if (it != m_FontFileMap.end() && it->second->HasOneRef()) + m_FontFileMap.erase(it); } CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr( diff --git a/core/fpdfapi/page/cpdf_docpagedata.h b/core/fpdfapi/page/cpdf_docpagedata.h index 24e0006efd..f5ac303290 100644 --- a/core/fpdfapi/page/cpdf_docpagedata.h +++ b/core/fpdfapi/page/cpdf_docpagedata.h @@ -53,15 +53,14 @@ class CPDF_DocPageData { CFX_RetainPtr GetIccProfile(CPDF_Stream* pProfileStream); void MaybePurgeIccProfile(CPDF_Stream* pProfileStream); - CPDF_StreamAcc* GetFontFileStreamAcc(CPDF_Stream* pFontStream); - void ReleaseFontFileStreamAcc(const CPDF_Stream* pFontStream); + CFX_RetainPtr GetFontFileStreamAcc(CPDF_Stream* pFontStream); + void MaybePurgeFontFileStreamAcc(const CPDF_Stream* pFontStream); CPDF_CountedColorSpace* FindColorSpacePtr(CPDF_Object* pCSObj) const; CPDF_CountedPattern* FindPatternPtr(CPDF_Object* pPatternObj) const; private: using CPDF_CountedFont = CPDF_CountedObject; - using CPDF_CountedStreamAcc = CPDF_CountedObject; CPDF_ColorSpace* GetColorSpaceImpl(CPDF_Object* pCSObj, const CPDF_Dictionary* pResources, @@ -71,7 +70,7 @@ class CPDF_DocPageData { bool m_bForceClear; std::map m_HashProfileMap; std::map m_ColorSpaceMap; - std::map m_FontFileMap; + std::map> m_FontFileMap; std::map m_FontMap; std::map> m_IccProfileMap; std::map> m_ImageMap; diff --git a/core/fpdfapi/page/cpdf_meshstream.cpp b/core/fpdfapi/page/cpdf_meshstream.cpp index b0a21c627a..c173bc633a 100644 --- a/core/fpdfapi/page/cpdf_meshstream.cpp +++ b/core/fpdfapi/page/cpdf_meshstream.cpp @@ -107,14 +107,17 @@ CPDF_MeshStream::CPDF_MeshStream( m_xmin(0), m_xmax(0), m_ymin(0), - m_ymax(0) { + m_ymax(0), + m_pStream(pdfium::MakeRetain(pShadingStream)) { memset(&m_ColorMin, 0, sizeof(m_ColorMin)); memset(&m_ColorMax, 0, sizeof(m_ColorMax)); } +CPDF_MeshStream::~CPDF_MeshStream() {} + bool CPDF_MeshStream::Load() { - m_Stream.LoadAllData(m_pShadingStream); - m_BitStream.Init(m_Stream.GetData(), m_Stream.GetSize()); + m_pStream->LoadAllData(); + m_BitStream.Init(m_pStream->GetData(), m_pStream->GetSize()); CPDF_Dictionary* pDict = m_pShadingStream->GetDict(); m_nCoordBits = pDict->GetIntegerFor("BitsPerCoordinate"); m_nComponentBits = pDict->GetIntegerFor("BitsPerComponent"); diff --git a/core/fpdfapi/page/cpdf_meshstream.h b/core/fpdfapi/page/cpdf_meshstream.h index e58e354b35..e02c3bb4e8 100644 --- a/core/fpdfapi/page/cpdf_meshstream.h +++ b/core/fpdfapi/page/cpdf_meshstream.h @@ -39,6 +39,7 @@ class CPDF_MeshStream { const std::vector>& funcs, CPDF_Stream* pShadingStream, CPDF_ColorSpace* pCS); + ~CPDF_MeshStream(); bool Load(); @@ -80,7 +81,7 @@ class CPDF_MeshStream { float m_ymax; float m_ColorMin[kMaxComponents]; float m_ColorMax[kMaxComponents]; - CPDF_StreamAcc m_Stream; + CFX_RetainPtr m_pStream; CFX_BitStream m_BitStream; }; diff --git a/core/fpdfapi/page/fpdf_page_func.cpp b/core/fpdfapi/page/fpdf_page_func.cpp index 9be1edb7ff..bc66adf726 100644 --- a/core/fpdfapi/page/fpdf_page_func.cpp +++ b/core/fpdfapi/page/fpdf_page_func.cpp @@ -90,10 +90,10 @@ class CPDF_PSFunc : public CPDF_Function { }; bool CPDF_PSFunc::v_Init(CPDF_Object* pObj) { - CPDF_StreamAcc acc; - acc.LoadAllData(pObj->AsStream(), false); - return m_PS.Parse(reinterpret_cast(acc.GetData()), - acc.GetSize()); + auto pAcc = pdfium::MakeRetain(pObj->AsStream()); + pAcc->LoadAllData(false); + return m_PS.Parse(reinterpret_cast(pAcc->GetData()), + pAcc->GetSize()); } bool CPDF_PSFunc::v_Call(float* inputs, float* results) const { @@ -487,8 +487,8 @@ bool CPDF_SampledFunc::v_Init(CPDF_Object* pObj) { return false; m_SampleMax = 0xffffffff >> (32 - m_nBitsPerSample); - m_pSampleStream = pdfium::MakeUnique(); - m_pSampleStream->LoadAllData(pStream, false); + m_pSampleStream = pdfium::MakeRetain(pStream); + m_pSampleStream->LoadAllData(false); FX_SAFE_UINT32 nTotalSampleBits = 1; m_EncodeInfo.resize(m_nInputs); for (uint32_t i = 0; i < m_nInputs; i++) { diff --git a/core/fpdfapi/page/pageint.h b/core/fpdfapi/page/pageint.h index a7a00f02ee..05865ca58e 100644 --- a/core/fpdfapi/page/pageint.h +++ b/core/fpdfapi/page/pageint.h @@ -12,14 +12,13 @@ #include "core/fpdfapi/page/cpdf_colorspace.h" #include "core/fpdfapi/page/cpdf_countedobject.h" +#include "core/fpdfapi/parser/cpdf_stream_acc.h" #include "core/fxcrt/cfx_retain_ptr.h" class CPDF_ExpIntFunc; class CPDF_Pattern; class CPDF_SampledFunc; class CPDF_StitchFunc; -class CPDF_Stream; -class CPDF_StreamAcc; class CPDF_Function { public: @@ -102,8 +101,8 @@ class CPDF_SampledFunc : public CPDF_Function { return m_EncodeInfo; } uint32_t GetBitsPerSample() const { return m_nBitsPerSample; } - const CPDF_StreamAcc* GetSampleStream() const { - return m_pSampleStream.get(); + CFX_RetainPtr GetSampleStream() const { + return m_pSampleStream; } private: @@ -111,7 +110,7 @@ class CPDF_SampledFunc : public CPDF_Function { std::vector m_DecodeInfo; uint32_t m_nBitsPerSample; uint32_t m_SampleMax; - std::unique_ptr m_pSampleStream; + CFX_RetainPtr m_pSampleStream; }; class CPDF_StitchFunc : public CPDF_Function { diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index a2816d48a9..4d99ac910f 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp @@ -630,7 +630,8 @@ CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict) { return m_pDocPage->GetFont(pFontDict); } -CPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream) { +CFX_RetainPtr CPDF_Document::LoadFontFile( + CPDF_Stream* pStream) { return m_pDocPage->GetFontFileStreamAcc(pStream); } diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index 91cc2d7419..8d3525419f 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h @@ -79,7 +79,7 @@ class CPDF_Document : public CPDF_IndirectObjectHolder { const CFX_Matrix& matrix); CFX_RetainPtr LoadImageFromPageData(uint32_t dwStreamObjNum); - CPDF_StreamAcc* LoadFontFile(CPDF_Stream* pStream); + CFX_RetainPtr LoadFontFile(CPDF_Stream* pStream); CFX_RetainPtr LoadIccProfile(CPDF_Stream* pStream); void LoadDoc(); diff --git a/core/fpdfapi/parser/cpdf_hint_tables.cpp b/core/fpdfapi/parser/cpdf_hint_tables.cpp index e000188e7d..24abf5dd13 100644 --- a/core/fpdfapi/parser/cpdf_hint_tables.cpp +++ b/core/fpdfapi/parser/cpdf_hint_tables.cpp @@ -464,10 +464,10 @@ bool CPDF_HintTables::LoadHintStream(CPDF_Stream* pHintStream) { if (shared_hint_table_offset <= 0) return false; - CPDF_StreamAcc acc; - acc.LoadAllData(pHintStream); + auto pAcc = pdfium::MakeRetain(pHintStream); + pAcc->LoadAllData(); - uint32_t size = acc.GetSize(); + uint32_t size = pAcc->GetSize(); // The header section of page offset hint table is 36 bytes. // The header section of shared object hint table is 24 bytes. // Hint table has at least 60 bytes. @@ -482,7 +482,7 @@ bool CPDF_HintTables::LoadHintStream(CPDF_Stream* pHintStream) { } CFX_BitStream bs; - bs.Init(acc.GetData(), size); + bs.Init(pAcc->GetData(), size); return ReadPageHintTable(&bs) && ReadSharedObjHintTable(&bs, shared_hint_table_offset); } diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp index cac678762d..20e9418904 100644 --- a/core/fpdfapi/parser/cpdf_parser.cpp +++ b/core/fpdfapi/parser/cpdf_parser.cpp @@ -40,11 +40,11 @@ uint32_t GetVarInt(const uint8_t* p, int32_t n) { return result; } -int32_t GetStreamNCount(CPDF_StreamAcc* pObjStream) { +int32_t GetStreamNCount(const CFX_RetainPtr& pObjStream) { return pObjStream->GetDict()->GetIntegerFor("N"); } -int32_t GetStreamFirst(CPDF_StreamAcc* pObjStream) { +int32_t GetStreamFirst(const CFX_RetainPtr& pObjStream) { return pObjStream->GetDict()->GetIntegerFor("First"); } @@ -997,11 +997,11 @@ bool CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, bool bMainXRef) { return false; uint32_t totalWidth = dwAccWidth.ValueOrDie(); - CPDF_StreamAcc acc; - acc.LoadAllData(pStream); + auto pAcc = pdfium::MakeRetain(pStream); + pAcc->LoadAllData(); - const uint8_t* pData = acc.GetData(); - uint32_t dwTotalSize = acc.GetSize(); + const uint8_t* pData = pAcc->GetData(); + uint32_t dwTotalSize = pAcc->GetSize(); uint32_t segindex = 0; for (uint32_t i = 0; i < arrIndex.size(); i++) { int32_t startnum = arrIndex[i].first; @@ -1114,7 +1114,8 @@ std::unique_ptr CPDF_Parser::ParseIndirectObject( if (GetObjectType(objnum) != 2) return nullptr; - CPDF_StreamAcc* pObjStream = GetObjectStream(m_ObjectInfo[objnum].pos); + CFX_RetainPtr pObjStream = + GetObjectStream(m_ObjectInfo[objnum].pos); if (!pObjStream) return nullptr; @@ -1141,10 +1142,10 @@ std::unique_ptr CPDF_Parser::ParseIndirectObject( return syntax.GetObject(pObjList, 0, 0, true); } -CPDF_StreamAcc* CPDF_Parser::GetObjectStream(uint32_t objnum) { +CFX_RetainPtr CPDF_Parser::GetObjectStream(uint32_t objnum) { auto it = m_ObjectStreamMap.find(objnum); if (it != m_ObjectStreamMap.end()) - return it->second.get(); + return it->second; if (!m_pDocument) return nullptr; @@ -1154,9 +1155,9 @@ CPDF_StreamAcc* CPDF_Parser::GetObjectStream(uint32_t objnum) { if (!pStream) return nullptr; - CPDF_StreamAcc* pStreamAcc = new CPDF_StreamAcc; - pStreamAcc->LoadAllData(pStream); - m_ObjectStreamMap[objnum].reset(pStreamAcc); + auto pStreamAcc = pdfium::MakeRetain(pStream); + pStreamAcc->LoadAllData(); + m_ObjectStreamMap[objnum] = pStreamAcc; return pStreamAcc; } @@ -1190,7 +1191,8 @@ void CPDF_Parser::GetIndirectBinary(uint32_t objnum, return; if (GetObjectType(objnum) == 2) { - CPDF_StreamAcc* pObjStream = GetObjectStream(m_ObjectInfo[objnum].pos); + CFX_RetainPtr pObjStream = + GetObjectStream(m_ObjectInfo[objnum].pos); if (!pObjStream) return; diff --git a/core/fpdfapi/parser/cpdf_parser.h b/core/fpdfapi/parser/cpdf_parser.h index 0b73857649..47c2c9b885 100644 --- a/core/fpdfapi/parser/cpdf_parser.h +++ b/core/fpdfapi/parser/cpdf_parser.h @@ -140,7 +140,7 @@ class CPDF_Parser { bool LoadLinearizedCrossRefV4(FX_FILESIZE pos, uint32_t dwObjCount); bool LoadLinearizedAllCrossRefV5(FX_FILESIZE pos); Error LoadLinearizedMainXRefTable(); - CPDF_StreamAcc* GetObjectStream(uint32_t number); + CFX_RetainPtr GetObjectStream(uint32_t number); bool IsLinearizedFile( const CFX_RetainPtr& pFileAccess, uint32_t offset); @@ -165,8 +165,8 @@ class CPDF_Parser { std::unique_ptr m_pLinearized; uint32_t m_dwXrefStartObjNum; - // A map of object numbers to indirect streams. Map owns the streams. - std::map> m_ObjectStreamMap; + // A map of object numbers to indirect streams. + std::map> m_ObjectStreamMap; // Mapping of object numbers to offsets. The offsets are relative to the first // object in the stream. @@ -174,7 +174,7 @@ class CPDF_Parser { // Mapping of streams to their object caches. This is valid as long as the // streams in |m_ObjectStreamMap| are valid. - std::map m_ObjCache; + std::map, StreamObjectCache> m_ObjCache; // All indirect object numbers that are being parsed. std::set m_ParsingObjNums; diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp index 532fd753f8..e4f279a32d 100644 --- a/core/fpdfapi/parser/cpdf_stream.cpp +++ b/core/fpdfapi/parser/cpdf_stream.cpp @@ -83,17 +83,17 @@ std::unique_ptr CPDF_Stream::CloneNonCyclic( bool bDirect, std::set* pVisited) const { pVisited->insert(this); - CPDF_StreamAcc acc; - acc.LoadAllData(this, true); + auto pAcc = pdfium::MakeRetain(this); + pAcc->LoadAllData(true); - uint32_t streamSize = acc.GetSize(); + uint32_t streamSize = pAcc->GetSize(); CPDF_Dictionary* pDict = GetDict(); std::unique_ptr pNewDict; if (pDict && !pdfium::ContainsKey(*pVisited, pDict)) { pNewDict = ToDictionary( static_cast(pDict)->CloneNonCyclic(bDirect, pVisited)); } - return pdfium::MakeUnique(acc.DetachData(), streamSize, + return pdfium::MakeUnique(pAcc->DetachData(), streamSize, std::move(pNewDict)); } @@ -127,7 +127,7 @@ bool CPDF_Stream::HasFilter() const { } CFX_WideString CPDF_Stream::GetUnicodeText() const { - CPDF_StreamAcc stream; - stream.LoadAllData(this, false); - return PDF_DecodeText(stream.GetData(), stream.GetSize()); + auto pAcc = pdfium::MakeRetain(this); + pAcc->LoadAllData(false); + return PDF_DecodeText(pAcc->GetData(), pAcc->GetSize()); } diff --git a/core/fpdfapi/parser/cpdf_stream_acc.cpp b/core/fpdfapi/parser/cpdf_stream_acc.cpp index 59ac289b7c..77ef2ff2bc 100644 --- a/core/fpdfapi/parser/cpdf_stream_acc.cpp +++ b/core/fpdfapi/parser/cpdf_stream_acc.cpp @@ -8,40 +8,38 @@ #include "core/fpdfapi/parser/fpdf_parser_decode.h" -CPDF_StreamAcc::CPDF_StreamAcc() +CPDF_StreamAcc::CPDF_StreamAcc(const CPDF_Stream* pStream) : m_pData(nullptr), m_dwSize(0), m_bNewBuf(false), m_pImageParam(nullptr), - m_pStream(nullptr), + m_pStream(pStream), m_pSrcData(nullptr) {} -void CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, - bool bRawAccess, +void CPDF_StreamAcc::LoadAllData(bool bRawAccess, uint32_t estimated_size, bool bImageAcc) { - if (!pStream) + if (!m_pStream) return; - m_pStream = pStream; - if (pStream->IsMemoryBased() && (!pStream->HasFilter() || bRawAccess)) { - m_dwSize = pStream->GetRawSize(); - m_pData = pStream->GetRawData(); + if (m_pStream->IsMemoryBased() && (!m_pStream->HasFilter() || bRawAccess)) { + m_dwSize = m_pStream->GetRawSize(); + m_pData = m_pStream->GetRawData(); return; } - uint32_t dwSrcSize = pStream->GetRawSize(); + uint32_t dwSrcSize = m_pStream->GetRawSize(); if (dwSrcSize == 0) return; uint8_t* pSrcData; - if (!pStream->IsMemoryBased()) { + if (!m_pStream->IsMemoryBased()) { pSrcData = m_pSrcData = FX_Alloc(uint8_t, dwSrcSize); - if (!pStream->ReadRawData(0, pSrcData, dwSrcSize)) + if (!m_pStream->ReadRawData(0, pSrcData, dwSrcSize)) return; } else { - pSrcData = pStream->GetRawData(); + pSrcData = m_pStream->GetRawData(); } - if (!pStream->HasFilter() || bRawAccess) { + if (!m_pStream->HasFilter() || bRawAccess) { m_pData = pSrcData; m_dwSize = dwSrcSize; } else if (!PDF_DataDecode(pSrcData, dwSrcSize, m_pStream->GetDict(), m_pData, @@ -50,10 +48,10 @@ void CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, m_pData = pSrcData; m_dwSize = dwSrcSize; } - if (pSrcData != pStream->GetRawData() && pSrcData != m_pData) + if (pSrcData != m_pStream->GetRawData() && pSrcData != m_pData) FX_Free(pSrcData); m_pSrcData = nullptr; - m_bNewBuf = m_pData != pStream->GetRawData(); + m_bNewBuf = m_pData != m_pStream->GetRawData(); } CPDF_StreamAcc::~CPDF_StreamAcc() { diff --git a/core/fpdfapi/parser/cpdf_stream_acc.h b/core/fpdfapi/parser/cpdf_stream_acc.h index 51a8a18332..5bfdd186c4 100644 --- a/core/fpdfapi/parser/cpdf_stream_acc.h +++ b/core/fpdfapi/parser/cpdf_stream_acc.h @@ -11,19 +11,19 @@ #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fpdfapi/parser/cpdf_stream.h" +#include "core/fxcrt/cfx_retain_ptr.h" #include "core/fxcrt/fx_string.h" #include "core/fxcrt/fx_system.h" -class CPDF_StreamAcc { +class CPDF_StreamAcc : public CFX_Retainable { public: - CPDF_StreamAcc(); - ~CPDF_StreamAcc(); + template + friend CFX_RetainPtr pdfium::MakeRetain(Args&&... args); CPDF_StreamAcc(const CPDF_StreamAcc&) = delete; CPDF_StreamAcc& operator=(const CPDF_StreamAcc&) = delete; - void LoadAllData(const CPDF_Stream* pStream, - bool bRawAccess = false, + void LoadAllData(bool bRawAccess = false, uint32_t estimated_size = 0, bool bImageAcc = false); @@ -39,12 +39,15 @@ class CPDF_StreamAcc { std::unique_ptr DetachData(); protected: + explicit CPDF_StreamAcc(const CPDF_Stream* pStream); + ~CPDF_StreamAcc() override; + uint8_t* m_pData; uint32_t m_dwSize; bool m_bNewBuf; CFX_ByteString m_ImageDecoder; CPDF_Dictionary* m_pImageParam; - const CPDF_Stream* m_pStream; + const CPDF_Stream* const m_pStream; uint8_t* m_pSrcData; }; diff --git a/core/fpdfapi/parser/fpdf_parser_utility.cpp b/core/fpdfapi/parser/fpdf_parser_utility.cpp index 10ba23125e..d6ea1a2c50 100644 --- a/core/fpdfapi/parser/fpdf_parser_utility.cpp +++ b/core/fpdfapi/parser/fpdf_parser_utility.cpp @@ -208,9 +208,9 @@ CFX_ByteTextBuf& operator<<(CFX_ByteTextBuf& buf, const CPDF_Object* pObj) { case CPDF_Object::STREAM: { const CPDF_Stream* p = pObj->AsStream(); buf << p->GetDict() << "stream\r\n"; - CPDF_StreamAcc acc; - acc.LoadAllData(p, true); - buf.AppendBlock(acc.GetData(), acc.GetSize()); + auto pAcc = pdfium::MakeRetain(p); + pAcc->LoadAllData(true); + buf.AppendBlock(pAcc->GetData(), pAcc->GetSize()); buf << "\r\nendstream"; break; } diff --git a/core/fpdfapi/render/cpdf_dibsource.cpp b/core/fpdfapi/render/cpdf_dibsource.cpp index 12bfadb19d..e60d0329d0 100644 --- a/core/fpdfapi/render/cpdf_dibsource.cpp +++ b/core/fpdfapi/render/cpdf_dibsource.cpp @@ -165,8 +165,8 @@ bool CPDF_DIBSource::Load(CPDF_Document* pDoc, const CPDF_Stream* pStream) { if (!src_size.IsValid()) return false; - m_pStreamAcc = pdfium::MakeUnique(); - m_pStreamAcc->LoadAllData(pStream, false, src_size.ValueOrDie(), true); + m_pStreamAcc = pdfium::MakeRetain(pStream); + m_pStreamAcc->LoadAllData(false, src_size.ValueOrDie(), true); if (m_pStreamAcc->GetSize() == 0 || !m_pStreamAcc->GetData()) return false; @@ -278,8 +278,8 @@ int CPDF_DIBSource::StartLoadDIBSource(CPDF_Document* pDoc, if (!src_size.IsValid()) { return 0; } - m_pStreamAcc = pdfium::MakeUnique(); - m_pStreamAcc->LoadAllData(pStream, false, src_size.ValueOrDie(), true); + m_pStreamAcc = pdfium::MakeRetain(pStream); + m_pStreamAcc->LoadAllData(false, src_size.ValueOrDie(), true); if (m_pStreamAcc->GetSize() == 0 || !m_pStreamAcc->GetData()) { return 0; } @@ -325,17 +325,17 @@ int CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause) { CPDF_Stream* pGlobals = m_pStreamAcc->GetImageParam()->GetStreamFor("JBIG2Globals"); if (pGlobals) { - m_pGlobalStream = pdfium::MakeUnique(); - m_pGlobalStream->LoadAllData(pGlobals, false); + m_pGlobalStream = pdfium::MakeRetain(pGlobals); + m_pGlobalStream->LoadAllData(false); } } ret = pJbig2Module->StartDecode( m_pJbig2Context.get(), m_pDocument->CodecContext(), m_Width, m_Height, - m_pStreamAcc.get(), m_pGlobalStream.get(), - m_pCachedBitmap->GetBuffer(), m_pCachedBitmap->GetPitch(), pPause); + m_pStreamAcc, m_pGlobalStream, m_pCachedBitmap->GetBuffer(), + m_pCachedBitmap->GetPitch(), pPause); if (ret < 0) { m_pCachedBitmap.Reset(); - m_pGlobalStream.reset(); + m_pGlobalStream.Reset(); m_pJbig2Context.reset(); return 0; } @@ -358,7 +358,7 @@ int CPDF_DIBSource::ContinueLoadDIBSource(IFX_Pause* pPause) { ret = pJbig2Module->ContinueDecode(m_pJbig2Context.get(), pPause); if (ret < 0) { m_pCachedBitmap.Reset(); - m_pGlobalStream.reset(); + m_pGlobalStream.Reset(); m_pJbig2Context.reset(); return 0; } diff --git a/core/fpdfapi/render/cpdf_dibsource.h b/core/fpdfapi/render/cpdf_dibsource.h index c77aac1776..f484f57d75 100644 --- a/core/fpdfapi/render/cpdf_dibsource.h +++ b/core/fpdfapi/render/cpdf_dibsource.h @@ -118,7 +118,7 @@ class CPDF_DIBSource : public CFX_DIBSource { CPDF_Document* m_pDocument; const CPDF_Stream* m_pStream; - std::unique_ptr m_pStreamAcc; + CFX_RetainPtr m_pStreamAcc; const CPDF_Dictionary* m_pDict; CPDF_ColorSpace* m_pColorSpace; uint32_t m_Family; @@ -139,8 +139,8 @@ class CPDF_DIBSource : public CFX_DIBSource { uint8_t* m_pMaskedLine; CFX_RetainPtr m_pCachedBitmap; CFX_RetainPtr m_pMask; + CFX_RetainPtr m_pGlobalStream; std::unique_ptr m_pDecoder; - std::unique_ptr m_pGlobalStream; std::unique_ptr m_pJbig2Context; CPDF_Stream* m_pMaskStream; int m_Status; -- cgit v1.2.3