diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2017-05-09 12:36:08 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-05-09 17:48:44 +0000 |
commit | a0b1954794b7a8a279ba00787628cc7f8d1419d9 (patch) | |
tree | 4556b78b9550dbb80baa52e0eee016395f223c4e /core/fpdfapi/edit/cpdf_flateencoder.cpp | |
parent | e02b2bc896b0872ce1a9d0997946b07dc76b9f7b (diff) | |
download | pdfium-a0b1954794b7a8a279ba00787628cc7f8d1419d9.tar.xz |
Rename fpdf_edit_create.cpp to cpdf_creator.cpp
This Cl renames the fpdf_edit_create file to better match the
cpdf_creator content. The CPDF_ObjectStream and CPDF_XRefStream code is
moved out to their own .cpp files. Needed anonymous classes are split
out as well.
Change-Id: Ic83fb319ce28c816db82a4286e22032dc68811bc
Reviewed-on: https://pdfium-review.googlesource.com/5171
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Nicolás Peña <npm@chromium.org>
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()); +} |