diff options
author | Lei Zhang <thestig@chromium.org> | 2018-09-19 17:27:44 +0000 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2018-09-19 17:27:44 +0000 |
commit | 41e49ec0259d4b02bf59fe581b9f48d7c2638456 (patch) | |
tree | e6a86ee6a6706d59dacabc6132621355b6da8638 | |
parent | 211e87bcdf7c04895bd6055442a9530dc4d0be8e (diff) | |
download | pdfium-41e49ec0259d4b02bf59fe581b9f48d7c2638456.tar.xz |
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 <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
-rw-r--r-- | core/fpdfapi/parser/cpdf_stream_acc.cpp | 98 | ||||
-rw-r--r-- | 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<uint8_t, FxFreeDeleter> 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<uint8_t, FxFreeDeleter> 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<uint8_t, FxFreeDeleter> 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<uint8_t, FxFreeDeleter> 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<uint8_t, FxFreeDeleter> CPDF_StreamAcc::ReadRawStream() const { + ASSERT(m_pStream); + ASSERT(!m_pStream->IsMemoryBased()); + + uint32_t dwSrcSize = m_pStream->GetRawSize(); + ASSERT(dwSrcSize); + std::unique_ptr<uint8_t, FxFreeDeleter> 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<uint8_t, FxFreeDeleter> ReadRawStream() const; + uint8_t* m_pData = nullptr; uint32_t m_dwSize = 0; bool m_bNewBuf = false; |