diff options
Diffstat (limited to 'core/fpdfapi/edit/cpdf_flateencoder.cpp')
-rw-r--r-- | core/fpdfapi/edit/cpdf_flateencoder.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/core/fpdfapi/edit/cpdf_flateencoder.cpp b/core/fpdfapi/edit/cpdf_flateencoder.cpp new file mode 100644 index 0000000000..55d436f573 --- /dev/null +++ b/core/fpdfapi/edit/cpdf_flateencoder.cpp @@ -0,0 +1,77 @@ +// Copyright 2017 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "core/fpdfapi/edit/cpdf_flateencoder.h" + +#include <memory> + +#include "core/fpdfapi/parser/cpdf_name.h" +#include "core/fpdfapi/parser/cpdf_number.h" +#include "core/fpdfapi/parser/fpdf_parser_decode.h" + +CPDF_FlateEncoder::CPDF_FlateEncoder(CPDF_Stream* pStream, bool bFlateEncode) + : m_dwSize(0), m_pAcc(pdfium::MakeRetain<CPDF_StreamAcc>(pStream)) { + m_pAcc->LoadAllData(true); + + bool bHasFilter = pStream && pStream->HasFilter(); + if (bHasFilter && !bFlateEncode) { + auto pDestAcc = pdfium::MakeRetain<CPDF_StreamAcc>(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<uint8_t*>(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_pAcc->GetData(), m_pAcc->GetSize(), &buffer, &m_dwSize); + + m_pData = std::unique_ptr<uint8_t, FxFreeDeleter>(buffer); + m_pDict = ToDictionary(pStream->GetDict()->Clone()); + m_pDict->SetNewFor<CPDF_Number>("Length", static_cast<int>(m_dwSize)); + m_pDict->SetNewFor<CPDF_Name>("Filter", "FlateDecode"); + m_pDict->RemoveFor("DecodeParms"); +} + +CPDF_FlateEncoder::CPDF_FlateEncoder(const uint8_t* pBuffer, + uint32_t size, + bool bFlateEncode, + bool bXRefStream) + : m_dwSize(0) { + if (!bFlateEncode) { + m_pData = const_cast<uint8_t*>(pBuffer); + m_dwSize = size; + return; + } + + uint8_t* buffer = nullptr; + // TODO(thestig): Move to Init() and check return value. + if (bXRefStream) + ::PngEncode(pBuffer, size, &buffer, &m_dwSize); + else + ::FlateEncode(pBuffer, size, &buffer, &m_dwSize); + + m_pData = std::unique_ptr<uint8_t, FxFreeDeleter>(buffer); +} + +CPDF_FlateEncoder::~CPDF_FlateEncoder() {} + +void CPDF_FlateEncoder::CloneDict() { + if (m_pDict.IsOwned()) + return; + + m_pDict = ToDictionary(m_pDict->Clone()); + ASSERT(m_pDict.IsOwned()); +} |