Index: core/fpdfapi/parser/cpdf_document.cpp |
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp |
index bafeefe6fc044b4a555d80e00a68436f4115c1b1..97f55f872d9a598ef37c6a12fb2f0e2ebd31370b 100644 |
--- a/core/fpdfapi/parser/cpdf_document.cpp |
+++ b/core/fpdfapi/parser/cpdf_document.cpp |
@@ -8,6 +8,7 @@ |
#include <memory> |
#include <set> |
+#include <utility> |
#include <vector> |
#include "core/fpdfapi/cpdf_modulemgr.h" |
@@ -22,6 +23,7 @@ |
#include "core/fpdfapi/parser/cpdf_number.h" |
#include "core/fpdfapi/parser/cpdf_parser.h" |
#include "core/fpdfapi/parser/cpdf_reference.h" |
+#include "core/fpdfapi/parser/cpdf_string.h" |
#include "core/fpdfapi/parser/cpdf_stream.h" |
#include "core/fpdfapi/render/cpdf_docrenderdata.h" |
#include "core/fpdfapi/render/render_int.h" |
@@ -265,7 +267,7 @@ int CountPages(CPDF_Dictionary* pPages, |
count++; |
} |
} |
- pPages->SetIntegerFor("Count", count); |
+ pPages->SetNewFor<CPDF_Number>("Count", count); |
return count; |
} |
@@ -304,11 +306,11 @@ void ProcessNonbCJK(CPDF_Dictionary* pBaseDict, |
basefont += ",Bold"; |
else if (italic) |
basefont += ",Italic"; |
- pBaseDict->SetNameFor("Subtype", "TrueType"); |
- pBaseDict->SetNameFor("BaseFont", basefont); |
- pBaseDict->SetNumberFor("FirstChar", 32); |
- pBaseDict->SetNumberFor("LastChar", 255); |
- pBaseDict->SetFor("Widths", pWidths); |
+ pBaseDict->SetNewFor<CPDF_Name>("Subtype", "TrueType"); |
+ pBaseDict->SetNewFor<CPDF_Name>("BaseFont", basefont); |
+ pBaseDict->SetNewFor<CPDF_Number>("FirstChar", 32); |
+ pBaseDict->SetNewFor<CPDF_Number>("LastChar", 255); |
+ pBaseDict->SetFor("Widths", pdfium::WrapUnique(pWidths)); |
} |
std::unique_ptr<CPDF_Dictionary> CalculateFontDesc(CPDF_Document* pDoc, |
@@ -321,14 +323,14 @@ std::unique_ptr<CPDF_Dictionary> CalculateFontDesc(CPDF_Document* pDoc, |
int32_t stemV) { |
auto pFontDesc = |
pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); |
- pFontDesc->SetNameFor("Type", "FontDescriptor"); |
- pFontDesc->SetNameFor("FontName", basefont); |
- pFontDesc->SetIntegerFor("Flags", flags); |
- pFontDesc->SetFor("FontBBox", bbox); |
- pFontDesc->SetIntegerFor("ItalicAngle", italicangle); |
- pFontDesc->SetIntegerFor("Ascent", ascend); |
- pFontDesc->SetIntegerFor("Descent", descend); |
- pFontDesc->SetIntegerFor("StemV", stemV); |
+ pFontDesc->SetNewFor<CPDF_Name>("Type", "FontDescriptor"); |
+ pFontDesc->SetNewFor<CPDF_Name>("FontName", basefont); |
+ pFontDesc->SetNewFor<CPDF_Number>("Flags", flags); |
+ pFontDesc->SetFor("FontBBox", pdfium::WrapUnique(bbox)); |
+ pFontDesc->SetNewFor<CPDF_Number>("ItalicAngle", italicangle); |
+ pFontDesc->SetNewFor<CPDF_Number>("Ascent", ascend); |
+ pFontDesc->SetNewFor<CPDF_Number>("Descent", descend); |
+ pFontDesc->SetNewFor<CPDF_Number>("StemV", stemV); |
return pFontDesc; |
} |
@@ -649,19 +651,19 @@ CPDF_Image* CPDF_Document::LoadImageFromPageData(uint32_t dwStreamObjNum) { |
void CPDF_Document::CreateNewDoc() { |
ASSERT(!m_pRootDict && !m_pInfoDict); |
m_pRootDict = NewIndirect<CPDF_Dictionary>(); |
- m_pRootDict->SetNameFor("Type", "Catalog"); |
+ m_pRootDict->SetNewFor<CPDF_Name>("Type", "Catalog"); |
CPDF_Dictionary* pPages = NewIndirect<CPDF_Dictionary>(); |
- pPages->SetNameFor("Type", "Pages"); |
- pPages->SetNumberFor("Count", 0); |
- pPages->SetFor("Kids", new CPDF_Array); |
- m_pRootDict->SetReferenceFor("Pages", this, pPages); |
+ pPages->SetNewFor<CPDF_Name>("Type", "Pages"); |
+ pPages->SetNewFor<CPDF_Number>("Count", 0); |
+ pPages->SetNewFor<CPDF_Array>("Kids"); |
+ m_pRootDict->SetNewFor<CPDF_Reference>("Pages", this, pPages->GetObjNum()); |
m_pInfoDict = NewIndirect<CPDF_Dictionary>(); |
} |
CPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage) { |
CPDF_Dictionary* pDict = NewIndirect<CPDF_Dictionary>(); |
- pDict->SetNameFor("Type", "Page"); |
+ pDict->SetNewFor<CPDF_Name>("Type", "Page"); |
uint32_t dwObjNum = pDict->GetObjNum(); |
if (!InsertNewPage(iPage, pDict)) { |
DeleteIndirectObject(dwObjNum); |
@@ -688,11 +690,12 @@ bool CPDF_Document::InsertDeletePDFPage(CPDF_Dictionary* pPages, |
} |
if (bInsert) { |
pKidList->InsertNewAt<CPDF_Reference>(i, this, pPageDict->GetObjNum()); |
- pPageDict->SetReferenceFor("Parent", this, pPages->GetObjNum()); |
+ pPageDict->SetNewFor<CPDF_Reference>("Parent", this, |
+ pPages->GetObjNum()); |
} else { |
pKidList->RemoveAt(i); |
} |
- pPages->SetIntegerFor( |
+ pPages->SetNewFor<CPDF_Number>( |
"Count", pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1)); |
ResetTraversal(); |
break; |
@@ -709,8 +712,8 @@ bool CPDF_Document::InsertDeletePDFPage(CPDF_Dictionary* pPages, |
if (!InsertDeletePDFPage(pKid, nPagesToGo, pPageDict, bInsert, pVisited)) |
return false; |
- pPages->SetIntegerFor("Count", |
- pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1)); |
+ pPages->SetNewFor<CPDF_Number>( |
+ "Count", pPages->GetIntegerFor("Count") + (bInsert ? 1 : -1)); |
break; |
} |
return true; |
@@ -728,13 +731,11 @@ bool CPDF_Document::InsertNewPage(int iPage, CPDF_Dictionary* pPageDict) { |
if (iPage == nPages) { |
CPDF_Array* pPagesList = pPages->GetArrayFor("Kids"); |
- if (!pPagesList) { |
- pPagesList = new CPDF_Array; |
- pPages->SetFor("Kids", pPagesList); |
- } |
+ if (!pPagesList) |
+ pPagesList = pPages->SetNewFor<CPDF_Array>("Kids"); |
pPagesList->AddNew<CPDF_Reference>(this, pPageDict->GetObjNum()); |
- pPages->SetIntegerFor("Count", nPages + 1); |
- pPageDict->SetReferenceFor("Parent", this, pPages->GetObjNum()); |
+ pPages->SetNewFor<CPDF_Number>("Count", nPages + 1); |
+ pPageDict->SetNewFor<CPDF_Reference>("Parent", this, pPages->GetObjNum()); |
ResetTraversal(); |
} else { |
std::set<CPDF_Dictionary*> stack = {pPages}; |
@@ -780,9 +781,9 @@ size_t CPDF_Document::CalculateEncodingDict(int charset, |
return i; |
CPDF_Dictionary* pEncodingDict = NewIndirect<CPDF_Dictionary>(); |
- pEncodingDict->SetNameFor("BaseEncoding", "WinAnsiEncoding"); |
+ pEncodingDict->SetNewFor<CPDF_Name>("BaseEncoding", "WinAnsiEncoding"); |
- CPDF_Array* pArray = new CPDF_Array; |
+ CPDF_Array* pArray = pEncodingDict->SetNewFor<CPDF_Array>("Differences"); |
pArray->AddNew<CPDF_Number>(128); |
const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; |
@@ -790,8 +791,8 @@ size_t CPDF_Document::CalculateEncodingDict(int charset, |
CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]); |
pArray->AddNew<CPDF_Name>(name.IsEmpty() ? ".notdef" : name); |
} |
- pEncodingDict->SetFor("Differences", pArray); |
- pBaseDict->SetReferenceFor("Encoding", this, pEncodingDict); |
+ pBaseDict->SetNewFor<CPDF_Reference>("Encoding", this, |
+ pEncodingDict->GetObjNum()); |
return i; |
} |
@@ -805,7 +806,7 @@ CPDF_Dictionary* CPDF_Document::ProcessbCJK( |
CFX_ByteString cmap; |
CFX_ByteString ordering; |
int supplement = 0; |
- CPDF_Array* pWidthArray = new CPDF_Array; |
+ CPDF_Array* pWidthArray = pFontDict->SetNewFor<CPDF_Array>("W"); |
switch (charset) { |
case FXFONT_CHINESEBIG5_CHARSET: |
cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; |
@@ -844,20 +845,20 @@ CPDF_Dictionary* CPDF_Document::ProcessbCJK( |
Insert(0x7e, 0x7e, pWidthArray); |
break; |
} |
- pBaseDict->SetNameFor("Subtype", "Type0"); |
- pBaseDict->SetNameFor("BaseFont", basefont); |
- pBaseDict->SetNameFor("Encoding", cmap); |
- pFontDict->SetFor("W", pWidthArray); |
- pFontDict->SetNameFor("Type", "Font"); |
- pFontDict->SetNameFor("Subtype", "CIDFontType2"); |
- pFontDict->SetNameFor("BaseFont", basefont); |
- CPDF_Dictionary* pCIDSysInfo = new CPDF_Dictionary(GetByteStringPool()); |
- pCIDSysInfo->SetStringFor("Registry", "Adobe"); |
- pCIDSysInfo->SetStringFor("Ordering", ordering); |
- pCIDSysInfo->SetIntegerFor("Supplement", supplement); |
- pFontDict->SetFor("CIDSystemInfo", pCIDSysInfo); |
- CPDF_Array* pArray = new CPDF_Array; |
- pBaseDict->SetFor("DescendantFonts", pArray); |
+ pBaseDict->SetNewFor<CPDF_Name>("Subtype", "Type0"); |
+ pBaseDict->SetNewFor<CPDF_Name>("BaseFont", basefont); |
+ pBaseDict->SetNewFor<CPDF_Name>("Encoding", cmap); |
+ pFontDict->SetNewFor<CPDF_Name>("Type", "Font"); |
+ pFontDict->SetNewFor<CPDF_Name>("Subtype", "CIDFontType2"); |
+ pFontDict->SetNewFor<CPDF_Name>("BaseFont", basefont); |
+ |
+ CPDF_Dictionary* pCIDSysInfo = |
+ pFontDict->SetNewFor<CPDF_Dictionary>("CIDSystemInfo"); |
+ pCIDSysInfo->SetNewFor<CPDF_String>("Registry", "Adobe", false); |
+ pCIDSysInfo->SetNewFor<CPDF_String>("Ordering", ordering, false); |
+ pCIDSysInfo->SetNewFor<CPDF_Number>("Supplement", supplement); |
+ |
+ CPDF_Array* pArray = pBaseDict->SetNewFor<CPDF_Array>("DescendantFonts"); |
pArray->AddNew<CPDF_Reference>(this, pFontDict->GetObjNum()); |
return pFontDict; |
} |
@@ -877,7 +878,7 @@ CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, bool bVert) { |
false, false, charset == FXFONT_SYMBOL_CHARSET); |
CPDF_Dictionary* pBaseDict = NewIndirect<CPDF_Dictionary>(); |
- pBaseDict->SetNameFor("Type", "Font"); |
+ pBaseDict->SetNewFor<CPDF_Name>("Type", "Font"); |
std::unique_ptr<CFX_UnicodeEncoding> pEncoding( |
new CFX_UnicodeEncoding(pFont)); |
CPDF_Dictionary* pFontDict = pBaseDict; |
@@ -890,7 +891,7 @@ CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, bool bVert) { |
} |
if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_DEFAULT_CHARSET || |
charset == FXFONT_SYMBOL_CHARSET) { |
- pBaseDict->SetNameFor("Encoding", "WinAnsiEncoding"); |
+ pBaseDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding"); |
for (int charcode = 128; charcode <= 255; charcode++) { |
int glyph_index = pEncoding->GlyphFromCharCode(charcode); |
int char_width = pFont->GetGlyphWidth(glyph_index); |
@@ -944,7 +945,8 @@ CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, bool bVert) { |
CPDF_Dictionary* pFontDesc = ToDictionary(AddIndirectObject( |
CalculateFontDesc(this, basefont, flags, italicangle, pFont->GetAscent(), |
pFont->GetDescent(), pBBox, nStemV))); |
- pFontDict->SetReferenceFor("FontDescriptor", this, pFontDesc); |
+ pFontDict->SetNewFor<CPDF_Reference>("FontDescriptor", this, |
+ pFontDesc->GetObjNum()); |
return LoadFont(pBaseDict); |
} |
@@ -1007,13 +1009,13 @@ CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTA* pLogFont, |
FX_Free(tm_buf); |
basefont.Replace(" ", ""); |
CPDF_Dictionary* pBaseDict = NewIndirect<CPDF_Dictionary>(); |
- pBaseDict->SetNameFor("Type", "Font"); |
+ pBaseDict->SetNewFor<CPDF_Name>("Type", "Font"); |
CPDF_Dictionary* pFontDict = pBaseDict; |
if (!bCJK) { |
if (pLogFont->lfCharSet == FXFONT_ANSI_CHARSET || |
pLogFont->lfCharSet == FXFONT_DEFAULT_CHARSET || |
pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET) { |
- pBaseDict->SetNameFor("Encoding", "WinAnsiEncoding"); |
+ pBaseDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding"); |
} else { |
CalculateEncodingDict(pLogFont->lfCharSet, pBaseDict); |
} |
@@ -1037,9 +1039,10 @@ CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTA* pLogFont, |
std::unique_ptr<CPDF_Dictionary> pFontDesc = |
CalculateFontDesc(this, basefont, flags, italicangle, ascend, descend, |
pBBox, pLogFont->lfWeight / 5); |
- pFontDesc->SetIntegerFor("CapHeight", capheight); |
- pFontDict->SetReferenceFor("FontDescriptor", this, |
- AddIndirectObject(std::move(pFontDesc))); |
+ pFontDesc->SetNewFor<CPDF_Number>("CapHeight", capheight); |
+ pFontDict->SetNewFor<CPDF_Reference>( |
+ "FontDescriptor", this, |
+ AddIndirectObject(std::move(pFontDesc))->GetObjNum()); |
hFont = SelectObject(hDC, hFont); |
DeleteObject(hFont); |
DeleteDC(hDC); |