Index: fpdfsdk/fpdf_flatten.cpp |
diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp |
index cb0a625e2362abb7a1c088c3042c05a1d63a31e3..ccbb7b876586ffb59b34a122f71eb9cdfabd0c8e 100644 |
--- a/fpdfsdk/fpdf_flatten.cpp |
+++ b/fpdfsdk/fpdf_flatten.cpp |
@@ -7,11 +7,15 @@ |
#include "public/fpdf_flatten.h" |
#include <algorithm> |
+#include <memory> |
+#include <utility> |
+#include <vector> |
#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<CPDF_Reference>( |
+ "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<CPDF_Reference>(pDocument, |
pContentsStream->GetObjNum()); |
- pPage->SetReferenceFor("Contents", pDocument, pContentsArray); |
+ pPage->SetNewFor<CPDF_Reference>("Contents", pDocument, |
+ pContentsArray->GetObjNum()); |
} |
if (!key.IsEmpty()) { |
pContentsArray->AddNew<CPDF_Reference>( |
@@ -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<CPDF_Array>("MediaBox"); |
pMediaBox->AddNew<CPDF_Number>(rcOriginalMB.left); |
pMediaBox->AddNew<CPDF_Number>(rcOriginalMB.bottom); |
pMediaBox->AddNew<CPDF_Number>(rcOriginalMB.right); |
pMediaBox->AddNew<CPDF_Number>(rcOriginalMB.top); |
- pPageDict->SetFor("MediaBox", pMediaBox); |
} |
if (!rcOriginalCB.IsEmpty()) { |
- CPDF_Array* pCropBox = new CPDF_Array(); |
+ CPDF_Array* pCropBox = pPageDict->SetNewFor<CPDF_Array>("ArtBox"); |
pCropBox->AddNew<CPDF_Number>(rcOriginalCB.left); |
pCropBox->AddNew<CPDF_Number>(rcOriginalCB.bottom); |
pCropBox->AddNew<CPDF_Number>(rcOriginalCB.right); |
pCropBox->AddNew<CPDF_Number>(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<CPDF_Dictionary>("Resources"); |
CPDF_Stream* pNewXObject = pDocument->NewIndirect<CPDF_Stream>( |
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<CPDF_Dictionary>("XObject"); |
CFX_ByteString key = ""; |
int nStreams = pdfium::CollectionSize<int>(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<CPDF_Reference>(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<CPDF_Dictionary>("Resources"); |
+ pNewOXbjectDic->SetNewFor<CPDF_Name>("Type", "XObject"); |
+ pNewOXbjectDic->SetNewFor<CPDF_Name>("Subtype", "Form"); |
+ pNewOXbjectDic->SetNewFor<CPDF_Number>("FormType", 1); |
+ pNewOXbjectDic->SetNewFor<CPDF_Name>("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<CPDF_Name>("Type", "XObject"); |
+ pObjDic->SetNewFor<CPDF_Name>("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<CPDF_Dictionary>("XObject"); |
CFX_ByteString sFormName; |
sFormName.Format("F%d", i); |
- pXObject->SetReferenceFor(sFormName, pDocument, pObj->GetObjNum()); |
+ pXObject->SetNewFor<CPDF_Reference>(sFormName, pDocument, |
+ pObj->GetObjNum()); |
CPDF_StreamAcc acc; |
acc.LoadAllData(pNewXObject); |