From 41e49ec0259d4b02bf59fe581b9f48d7c2638456 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Wed, 19 Sep 2018 17:27:44 +0000 Subject: Consolidate raw data processing path in CPDF_StreamAcc. Add ProcessRawData() and ProcessFilteredData() helper methods for the consolidated branches. Change-Id: I88fb0ffb76e5d354bc311490a9d995e07fbc2174 Reviewed-on: https://pdfium-review.googlesource.com/42593 Commit-Queue: Lei Zhang Reviewed-by: Tom Sepez --- core/fpdfapi/parser/cpdf_stream_acc.cpp | 98 ++++++++++++++++++++++----------- core/fpdfapi/parser/cpdf_stream_acc.h | 6 ++ 2 files changed, 71 insertions(+), 33 deletions(-) diff --git a/core/fpdfapi/parser/cpdf_stream_acc.cpp b/core/fpdfapi/parser/cpdf_stream_acc.cpp index dc6b1806dc..1b097b58d5 100644 --- a/core/fpdfapi/parser/cpdf_stream_acc.cpp +++ b/core/fpdfapi/parser/cpdf_stream_acc.cpp @@ -27,40 +27,11 @@ void CPDF_StreamAcc::LoadAllData(bool bRawAccess, if (!m_pStream) return; - uint32_t dwSrcSize = m_pStream->GetRawSize(); - if (dwSrcSize == 0) - return; - bool bProcessRawData = bRawAccess || !m_pStream->HasFilter(); - if (bProcessRawData && m_pStream->IsMemoryBased()) { - m_pData = m_pStream->GetInMemoryRawData(); - m_dwSize = dwSrcSize; - return; - } - - uint8_t* pSrcData; - if (m_pStream->IsMemoryBased()) { - pSrcData = m_pStream->GetInMemoryRawData(); - } else { - std::unique_ptr pTempSrcData( - FX_Alloc(uint8_t, dwSrcSize)); - if (!m_pStream->ReadRawData(0, pTempSrcData.get(), dwSrcSize)) - return; - - pSrcData = pTempSrcData.release(); - } - if (bProcessRawData) { - m_pData = pSrcData; - m_dwSize = dwSrcSize; - } else if (!PDF_DataDecode({pSrcData, dwSrcSize}, m_pStream->GetDict(), - estimated_size, bImageAcc, &m_pData, &m_dwSize, - &m_ImageDecoder, &m_pImageParam)) { - m_pData = pSrcData; - m_dwSize = dwSrcSize; - } - if (pSrcData != m_pStream->GetInMemoryRawData() && pSrcData != m_pData) - FX_Free(pSrcData); - m_bNewBuf = m_pData != m_pStream->GetInMemoryRawData(); + if (bProcessRawData) + ProcessRawData(); + else + ProcessFilteredData(estimated_size, bImageAcc); } void CPDF_StreamAcc::LoadAllDataFiltered() { @@ -108,3 +79,64 @@ std::unique_ptr CPDF_StreamAcc::DetachData() { memcpy(p.get(), m_pData, m_dwSize); return p; } + +void CPDF_StreamAcc::ProcessRawData() { + uint32_t dwSrcSize = m_pStream->GetRawSize(); + if (dwSrcSize == 0) + return; + + if (m_pStream->IsMemoryBased()) { + m_pData = m_pStream->GetInMemoryRawData(); + m_dwSize = dwSrcSize; + return; + } + + std::unique_ptr pData = ReadRawStream(); + if (!pData) + return; + + m_pData = pData.release(); + m_dwSize = dwSrcSize; + m_bNewBuf = true; +} + +void CPDF_StreamAcc::ProcessFilteredData(uint32_t estimated_size, + bool bImageAcc) { + uint32_t dwSrcSize = m_pStream->GetRawSize(); + if (dwSrcSize == 0) + return; + + uint8_t* pSrcData; + if (m_pStream->IsMemoryBased()) { + pSrcData = m_pStream->GetInMemoryRawData(); + } else { + std::unique_ptr pTempSrcData = ReadRawStream(); + if (!pTempSrcData) + return; + + pSrcData = pTempSrcData.release(); + } + + if (!PDF_DataDecode({pSrcData, dwSrcSize}, m_pStream->GetDict(), + estimated_size, bImageAcc, &m_pData, &m_dwSize, + &m_ImageDecoder, &m_pImageParam)) { + m_pData = pSrcData; + m_dwSize = dwSrcSize; + } + if (pSrcData != m_pStream->GetInMemoryRawData() && pSrcData != m_pData) + FX_Free(pSrcData); + m_bNewBuf = m_pData != m_pStream->GetInMemoryRawData(); +} + +std::unique_ptr CPDF_StreamAcc::ReadRawStream() const { + ASSERT(m_pStream); + ASSERT(!m_pStream->IsMemoryBased()); + + uint32_t dwSrcSize = m_pStream->GetRawSize(); + ASSERT(dwSrcSize); + std::unique_ptr pSrcData( + FX_Alloc(uint8_t, dwSrcSize)); + if (!m_pStream->ReadRawData(0, pSrcData.get(), dwSrcSize)) + return nullptr; + return pSrcData; +} diff --git a/core/fpdfapi/parser/cpdf_stream_acc.h b/core/fpdfapi/parser/cpdf_stream_acc.h index 6ecfece5ab..611c78d0f6 100644 --- a/core/fpdfapi/parser/cpdf_stream_acc.h +++ b/core/fpdfapi/parser/cpdf_stream_acc.h @@ -47,6 +47,12 @@ class CPDF_StreamAcc final : public Retainable { void LoadAllData(bool bRawAccess, uint32_t estimated_size, bool bImageAcc); + void ProcessRawData(); + void ProcessFilteredData(uint32_t estimated_size, bool bImageAcc); + + // Reads the raw data from |m_pStream|, or return nullptr on failure. + std::unique_ptr ReadRawStream() const; + uint8_t* m_pData = nullptr; uint32_t m_dwSize = 0; bool m_bNewBuf = false; -- cgit v1.2.3