From 0e606b5ecd6e45f74391f110cc1fe0cce0e80c64 Mon Sep 17 00:00:00 2001 From: tsepez Date: Fri, 18 Nov 2016 16:22:41 -0800 Subject: Make CPDF_Dictionary use unique pointers. Some changes were required to match underlying ctors as invoked by the templated methods. Many release() calls go away, a few WrapUniques() are introduced to avoid going deeper into other code. Review-Url: https://codereview.chromium.org/2510223002 --- fpdfsdk/fpdf_flatten.cpp | 57 +++++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 30 deletions(-) (limited to 'fpdfsdk/fpdf_flatten.cpp') diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp index cb0a625e23..ccbb7b8765 100644 --- a/fpdfsdk/fpdf_flatten.cpp +++ b/fpdfsdk/fpdf_flatten.cpp @@ -7,11 +7,15 @@ #include "public/fpdf_flatten.h" #include +#include +#include +#include #include "core/fpdfapi/page/cpdf_page.h" #include "core/fpdfapi/page/cpdf_pageobject.h" #include "core/fpdfapi/parser/cpdf_array.h" #include "core/fpdfapi/parser/cpdf_document.h" +#include "core/fpdfapi/parser/cpdf_name.h" #include "core/fpdfapi/parser/cpdf_number.h" #include "core/fpdfapi/parser/cpdf_reference.h" #include "core/fpdfapi/parser/cpdf_stream.h" @@ -190,8 +194,8 @@ void SetPageContents(const CFX_ByteString& key, pContentsArray = pPage->GetArrayFor("Contents"); if (!pContentsArray) { if (!key.IsEmpty()) { - pPage->SetReferenceFor("Contents", pDocument, - NewIndirectContentsStream(key, pDocument)); + pPage->SetNewFor( + "Contents", pDocument, NewIndirectContentsStream(key, pDocument)); } return; } @@ -208,7 +212,8 @@ void SetPageContents(const CFX_ByteString& key, pContentsStream->SetData(sStream.raw_str(), sStream.GetLength()); pContentsArray->AddNew(pDocument, pContentsStream->GetObjNum()); - pPage->SetReferenceFor("Contents", pDocument, pContentsArray); + pPage->SetNewFor("Contents", pDocument, + pContentsArray->GetObjNum()); } if (!key.IsEmpty()) { pContentsArray->AddNew( @@ -271,38 +276,32 @@ DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) { rcOriginalCB = rcOriginalMB; if (!rcOriginalMB.IsEmpty()) { - CPDF_Array* pMediaBox = new CPDF_Array(); + CPDF_Array* pMediaBox = pPageDict->SetNewFor("MediaBox"); pMediaBox->AddNew(rcOriginalMB.left); pMediaBox->AddNew(rcOriginalMB.bottom); pMediaBox->AddNew(rcOriginalMB.right); pMediaBox->AddNew(rcOriginalMB.top); - pPageDict->SetFor("MediaBox", pMediaBox); } if (!rcOriginalCB.IsEmpty()) { - CPDF_Array* pCropBox = new CPDF_Array(); + CPDF_Array* pCropBox = pPageDict->SetNewFor("ArtBox"); pCropBox->AddNew(rcOriginalCB.left); pCropBox->AddNew(rcOriginalCB.bottom); pCropBox->AddNew(rcOriginalCB.right); pCropBox->AddNew(rcOriginalCB.top); - pPageDict->SetFor("ArtBox", pCropBox); } CPDF_Dictionary* pRes = pPageDict->GetDictFor("Resources"); - if (!pRes) { - pRes = new CPDF_Dictionary(pDocument->GetByteStringPool()); - pPageDict->SetFor("Resources", pRes); - } + if (!pRes) + pRes = pPageDict->SetNewFor("Resources"); CPDF_Stream* pNewXObject = pDocument->NewIndirect( nullptr, 0, new CPDF_Dictionary(pDocument->GetByteStringPool())); uint32_t dwObjNum = pNewXObject->GetObjNum(); CPDF_Dictionary* pPageXObject = pRes->GetDictFor("XObject"); - if (!pPageXObject) { - pPageXObject = new CPDF_Dictionary(pDocument->GetByteStringPool()); - pRes->SetFor("XObject", pPageXObject); - } + if (!pPageXObject) + pPageXObject = pRes->SetNewFor("XObject"); CFX_ByteString key = ""; int nStreams = pdfium::CollectionSize(ObjectArray); @@ -320,14 +319,13 @@ DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) { CPDF_Dictionary* pNewXORes = nullptr; if (!key.IsEmpty()) { - pPageXObject->SetReferenceFor(key, pDocument, dwObjNum); + pPageXObject->SetNewFor(key, pDocument, dwObjNum); CPDF_Dictionary* pNewOXbjectDic = pNewXObject->GetDict(); - pNewXORes = new CPDF_Dictionary(pDocument->GetByteStringPool()); - pNewOXbjectDic->SetFor("Resources", pNewXORes); - pNewOXbjectDic->SetNameFor("Type", "XObject"); - pNewOXbjectDic->SetNameFor("Subtype", "Form"); - pNewOXbjectDic->SetIntegerFor("FormType", 1); - pNewOXbjectDic->SetNameFor("Name", "FRM"); + pNewXORes = pNewOXbjectDic->SetNewFor("Resources"); + pNewOXbjectDic->SetNewFor("Type", "XObject"); + pNewOXbjectDic->SetNewFor("Subtype", "Form"); + pNewOXbjectDic->SetNewFor("FormType", 1); + pNewOXbjectDic->SetNewFor("Name", "FRM"); CFX_FloatRect rcBBox = pPageDict->GetRectFor("ArtBox"); pNewOXbjectDic->SetRectFor("BBox", rcBBox); } @@ -356,7 +354,7 @@ DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) { } else { auto it = pAPDic->begin(); if (it != pAPDic->end()) { - CPDF_Object* pFirstObj = it->second; + CPDF_Object* pFirstObj = it->second.get(); if (pFirstObj) { if (pFirstObj->IsReference()) pFirstObj = pFirstObj->GetDirect(); @@ -389,19 +387,18 @@ DLLEXPORT int STDCALL FPDFPage_Flatten(FPDF_PAGE page, int nFlag) { CPDF_Dictionary* pObjDic = pObj->GetDict(); if (pObjDic) { - pObjDic->SetNameFor("Type", "XObject"); - pObjDic->SetNameFor("Subtype", "Form"); + pObjDic->SetNewFor("Type", "XObject"); + pObjDic->SetNewFor("Subtype", "Form"); } CPDF_Dictionary* pXObject = pNewXORes->GetDictFor("XObject"); - if (!pXObject) { - pXObject = new CPDF_Dictionary(pDocument->GetByteStringPool()); - pNewXORes->SetFor("XObject", pXObject); - } + if (!pXObject) + pXObject = pNewXORes->SetNewFor("XObject"); CFX_ByteString sFormName; sFormName.Format("F%d", i); - pXObject->SetReferenceFor(sFormName, pDocument, pObj->GetObjNum()); + pXObject->SetNewFor(sFormName, pDocument, + pObj->GetObjNum()); CPDF_StreamAcc acc; acc.LoadAllData(pNewXObject); -- cgit v1.2.3