OLD | NEW |
| (Empty) |
1 // Copyright 2016 PDFium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
6 | |
7 #include "core/fpdfapi/fpdf_parser/cpdf_stream_acc.h" | |
8 | |
9 #include "core/fpdfapi/fpdf_parser/fpdf_parser_decode.h" | |
10 | |
11 CPDF_StreamAcc::CPDF_StreamAcc() | |
12 : m_pData(nullptr), | |
13 m_dwSize(0), | |
14 m_bNewBuf(FALSE), | |
15 m_pImageParam(nullptr), | |
16 m_pStream(nullptr), | |
17 m_pSrcData(nullptr) {} | |
18 | |
19 void CPDF_StreamAcc::LoadAllData(const CPDF_Stream* pStream, | |
20 FX_BOOL bRawAccess, | |
21 uint32_t estimated_size, | |
22 FX_BOOL bImageAcc) { | |
23 if (!pStream) | |
24 return; | |
25 | |
26 m_pStream = pStream; | |
27 if (pStream->IsMemoryBased() && | |
28 (!pStream->GetDict()->KeyExist("Filter") || bRawAccess)) { | |
29 m_dwSize = pStream->GetRawSize(); | |
30 m_pData = pStream->GetRawData(); | |
31 return; | |
32 } | |
33 uint8_t* pSrcData; | |
34 uint32_t dwSrcSize = pStream->GetRawSize(); | |
35 if (dwSrcSize == 0) | |
36 return; | |
37 | |
38 if (!pStream->IsMemoryBased()) { | |
39 pSrcData = m_pSrcData = FX_Alloc(uint8_t, dwSrcSize); | |
40 if (!pStream->ReadRawData(0, pSrcData, dwSrcSize)) | |
41 return; | |
42 } else { | |
43 pSrcData = pStream->GetRawData(); | |
44 } | |
45 if (!pStream->GetDict()->KeyExist("Filter") || bRawAccess) { | |
46 m_pData = pSrcData; | |
47 m_dwSize = dwSrcSize; | |
48 } else { | |
49 FX_BOOL bRet = PDF_DataDecode(pSrcData, dwSrcSize, m_pStream->GetDict(), | |
50 m_pData, m_dwSize, m_ImageDecoder, | |
51 m_pImageParam, estimated_size, bImageAcc); | |
52 if (!bRet) { | |
53 m_pData = pSrcData; | |
54 m_dwSize = dwSrcSize; | |
55 } | |
56 } | |
57 if (pSrcData != pStream->GetRawData() && pSrcData != m_pData) | |
58 FX_Free(pSrcData); | |
59 m_pSrcData = nullptr; | |
60 m_bNewBuf = m_pData != pStream->GetRawData(); | |
61 } | |
62 | |
63 CPDF_StreamAcc::~CPDF_StreamAcc() { | |
64 if (m_bNewBuf) | |
65 FX_Free(m_pData); | |
66 FX_Free(m_pSrcData); | |
67 } | |
68 | |
69 const uint8_t* CPDF_StreamAcc::GetData() const { | |
70 if (m_bNewBuf) | |
71 return m_pData; | |
72 return m_pStream ? m_pStream->GetRawData() : nullptr; | |
73 } | |
74 | |
75 uint32_t CPDF_StreamAcc::GetSize() const { | |
76 if (m_bNewBuf) | |
77 return m_dwSize; | |
78 return m_pStream ? m_pStream->GetRawSize() : 0; | |
79 } | |
80 | |
81 uint8_t* CPDF_StreamAcc::DetachData() { | |
82 if (m_bNewBuf) { | |
83 uint8_t* p = m_pData; | |
84 m_pData = nullptr; | |
85 m_dwSize = 0; | |
86 return p; | |
87 } | |
88 uint8_t* p = FX_Alloc(uint8_t, m_dwSize); | |
89 FXSYS_memcpy(p, m_pData, m_dwSize); | |
90 return p; | |
91 } | |
OLD | NEW |