summaryrefslogtreecommitdiff
path: root/fpdfsdk/fpdf_flatten.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk/fpdf_flatten.cpp')
-rw-r--r--fpdfsdk/fpdf_flatten.cpp57
1 files changed, 27 insertions, 30 deletions
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 <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);