| Index: core/fpdfdoc/cpvt_generateap.cpp
|
| diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
|
| index 31d22422356697839f2132f77d2e7f1a1010e164..4bb244f29e65bfe7f07d04655f8d54ed9f628205 100644
|
| --- a/core/fpdfdoc/cpvt_generateap.cpp
|
| +++ b/core/fpdfdoc/cpvt_generateap.cpp
|
| @@ -11,10 +11,15 @@
|
| #include <utility>
|
|
|
| #include "core/fpdfapi/font/cpdf_font.h"
|
| +#include "core/fpdfapi/parser/cpdf_boolean.h"
|
| #include "core/fpdfapi/parser/cpdf_dictionary.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_simple_parser.h"
|
| #include "core/fpdfapi/parser/cpdf_stream.h"
|
| +#include "core/fpdfapi/parser/cpdf_string.h"
|
| #include "core/fpdfapi/parser/fpdf_parser_decode.h"
|
| #include "core/fpdfdoc/cpdf_annot.h"
|
| #include "core/fpdfdoc/cpdf_formfield.h"
|
| @@ -62,11 +67,12 @@ bool GenerateWidgetAP(CPDF_Document* pDoc,
|
| CPDF_Dictionary* pFontDict = pDRFontDict->GetDictFor(sFontName.Mid(1));
|
| if (!pFontDict) {
|
| pFontDict = pDoc->NewIndirect<CPDF_Dictionary>();
|
| - pFontDict->SetNameFor("Type", "Font");
|
| - pFontDict->SetNameFor("Subtype", "Type1");
|
| - pFontDict->SetNameFor("BaseFont", "Helvetica");
|
| - pFontDict->SetNameFor("Encoding", "WinAnsiEncoding");
|
| - pDRFontDict->SetReferenceFor(sFontName.Mid(1), pDoc, pFontDict);
|
| + pFontDict->SetNewFor<CPDF_Name>("Type", "Font");
|
| + pFontDict->SetNewFor<CPDF_Name>("Subtype", "Type1");
|
| + pFontDict->SetNewFor<CPDF_Name>("BaseFont", "Helvetica");
|
| + pFontDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding");
|
| + pDRFontDict->SetNewFor<CPDF_Reference>(sFontName.Mid(1), pDoc,
|
| + pFontDict->GetObjNum());
|
| }
|
| CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);
|
| if (!pDefFont)
|
| @@ -163,18 +169,15 @@ bool GenerateWidgetAP(CPDF_Document* pDoc,
|
| CFX_FloatRect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,
|
| rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);
|
| rcBody.Normalize();
|
| +
|
| CPDF_Dictionary* pAPDict = pAnnotDict->GetDictFor("AP");
|
| - if (!pAPDict) {
|
| - auto pNewAPDict =
|
| - pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
|
| - // Ownership passes to |pAnnotDict|.
|
| - pAPDict = pNewAPDict.release();
|
| - pAnnotDict->SetFor("AP", pAPDict);
|
| - }
|
| + if (!pAPDict)
|
| + pAPDict = pAnnotDict->SetNewFor<CPDF_Dictionary>("AP");
|
| +
|
| CPDF_Stream* pNormalStream = pAPDict->GetStreamFor("N");
|
| if (!pNormalStream) {
|
| pNormalStream = pDoc->NewIndirect<CPDF_Stream>();
|
| - pAPDict->SetReferenceFor("N", pDoc, pNormalStream);
|
| + pAPDict->SetNewFor<CPDF_Reference>("N", pDoc, pNormalStream->GetObjNum());
|
| }
|
| CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
|
| if (pStreamDict) {
|
| @@ -183,18 +186,14 @@ bool GenerateWidgetAP(CPDF_Document* pDoc,
|
| CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources");
|
| if (pStreamResList) {
|
| CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font");
|
| - if (!pStreamResFontList) {
|
| - auto pNewStreamResFontList =
|
| - pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
|
| - // Ownership passes to |pStreamResList|.
|
| - pStreamResFontList = pNewStreamResFontList.release();
|
| - pStreamResList->SetFor("Font", pStreamResFontList);
|
| + if (!pStreamResFontList)
|
| + pStreamResFontList = pStreamResList->SetNewFor<CPDF_Dictionary>("Font");
|
| + if (!pStreamResFontList->KeyExist(sFontName)) {
|
| + pStreamResFontList->SetNewFor<CPDF_Reference>(sFontName, pDoc,
|
| + pFontDict->GetObjNum());
|
| }
|
| - if (!pStreamResFontList->KeyExist(sFontName))
|
| - pStreamResFontList->SetReferenceFor(sFontName, pDoc, pFontDict);
|
| } else {
|
| - pStreamDict->SetFor("Resources",
|
| - pFormDict->GetDictFor("DR")->Clone().release());
|
| + pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
|
| pStreamResList = pStreamDict->GetDictFor("Resources");
|
| }
|
| }
|
| @@ -438,17 +437,15 @@ bool GenerateWidgetAP(CPDF_Document* pDoc,
|
| CPDF_Dictionary* pStreamResFontList =
|
| pStreamResList->GetDictFor("Font");
|
| if (!pStreamResFontList) {
|
| - auto pNewStreamResFontList =
|
| - pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
|
| - // Ownership passes to |pStreamResList|.
|
| - pStreamResFontList = pNewStreamResFontList.release();
|
| - pStreamResList->SetFor("Font", pStreamResFontList);
|
| + pStreamResFontList =
|
| + pStreamResList->SetNewFor<CPDF_Dictionary>("Font");
|
| + }
|
| + if (!pStreamResFontList->KeyExist(sFontName)) {
|
| + pStreamResFontList->SetNewFor<CPDF_Reference>(sFontName, pDoc,
|
| + pFontDict->GetObjNum());
|
| }
|
| - if (!pStreamResFontList->KeyExist(sFontName))
|
| - pStreamResFontList->SetReferenceFor(sFontName, pDoc, pFontDict);
|
| } else {
|
| - pStreamDict->SetFor("Resources",
|
| - pFormDict->GetDictFor("DR")->Clone().release());
|
| + pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
|
| pStreamResList = pStreamDict->GetDictFor("Resources");
|
| }
|
| }
|
| @@ -554,18 +551,18 @@ std::unique_ptr<CPDF_Dictionary> GenerateExtGStateDict(
|
| const CFX_ByteString& sBlendMode) {
|
| auto pGSDict =
|
| pdfium::MakeUnique<CPDF_Dictionary>(pAnnotDict.GetByteStringPool());
|
| - pGSDict->SetStringFor("Type", "ExtGState");
|
| + pGSDict->SetNewFor<CPDF_String>("Type", "ExtGState", false);
|
|
|
| FX_FLOAT fOpacity =
|
| pAnnotDict.KeyExist("CA") ? pAnnotDict.GetNumberFor("CA") : 1;
|
| - pGSDict->SetNumberFor("CA", fOpacity);
|
| - pGSDict->SetNumberFor("ca", fOpacity);
|
| - pGSDict->SetBooleanFor("AIS", false);
|
| - pGSDict->SetStringFor("BM", sBlendMode);
|
| + pGSDict->SetNewFor<CPDF_Number>("CA", fOpacity);
|
| + pGSDict->SetNewFor<CPDF_Number>("ca", fOpacity);
|
| + pGSDict->SetNewFor<CPDF_Boolean>("AIS", false);
|
| + pGSDict->SetNewFor<CPDF_String>("BM", sBlendMode, false);
|
|
|
| auto pExtGStateDict =
|
| pdfium::MakeUnique<CPDF_Dictionary>(pAnnotDict.GetByteStringPool());
|
| - pExtGStateDict->SetFor(sExtGSDictName, pGSDict.release());
|
| + pExtGStateDict->SetFor(sExtGSDictName, std::move(pGSDict));
|
| return pExtGStateDict;
|
| }
|
|
|
| @@ -573,14 +570,15 @@ std::unique_ptr<CPDF_Dictionary> GenerateResourceFontDict(
|
| CPDF_Document* pDoc,
|
| const CFX_ByteString& sFontDictName) {
|
| CPDF_Dictionary* pFontDict = pDoc->NewIndirect<CPDF_Dictionary>();
|
| - pFontDict->SetNameFor("Type", "Font");
|
| - pFontDict->SetNameFor("Subtype", "Type1");
|
| - pFontDict->SetNameFor("BaseFont", "Helvetica");
|
| - pFontDict->SetNameFor("Encoding", "WinAnsiEncoding");
|
| + pFontDict->SetNewFor<CPDF_Name>("Type", "Font");
|
| + pFontDict->SetNewFor<CPDF_Name>("Subtype", "Type1");
|
| + pFontDict->SetNewFor<CPDF_Name>("BaseFont", "Helvetica");
|
| + pFontDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding");
|
|
|
| auto pResourceFontDict =
|
| pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
|
| - pResourceFontDict->SetReferenceFor(sFontDictName, pDoc, pFontDict);
|
| + pResourceFontDict->SetNewFor<CPDF_Reference>(sFontDictName, pDoc,
|
| + pFontDict->GetObjNum());
|
| return pResourceFontDict;
|
| }
|
|
|
| @@ -591,9 +589,9 @@ std::unique_ptr<CPDF_Dictionary> GenerateResourceDict(
|
| auto pResourceDict =
|
| pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
|
| if (pExtGStateDict)
|
| - pResourceDict->SetFor("ExtGState", pExtGStateDict.release());
|
| + pResourceDict->SetFor("ExtGState", std::move(pExtGStateDict));
|
| if (pResourceFontDict)
|
| - pResourceDict->SetFor("Font", pResourceFontDict.release());
|
| + pResourceDict->SetFor("Font", std::move(pResourceFontDict));
|
| return pResourceDict;
|
| }
|
|
|
| @@ -605,20 +603,19 @@ void GenerateAndSetAPDict(CPDF_Document* pDoc,
|
| CPDF_Stream* pNormalStream = pDoc->NewIndirect<CPDF_Stream>();
|
| pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize());
|
|
|
| - auto pAPDict = pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
|
| - pAPDict->SetReferenceFor("N", pDoc, pNormalStream);
|
| - pAnnotDict->SetFor("AP", pAPDict.release());
|
| + CPDF_Dictionary* pAPDict = pAnnotDict->SetNewFor<CPDF_Dictionary>("AP");
|
| + pAPDict->SetNewFor<CPDF_Reference>("N", pDoc, pNormalStream->GetObjNum());
|
|
|
| CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
|
| - pStreamDict->SetIntegerFor("FormType", 1);
|
| - pStreamDict->SetStringFor("Subtype", "Form");
|
| + pStreamDict->SetNewFor<CPDF_Number>("FormType", 1);
|
| + pStreamDict->SetNewFor<CPDF_String>("Subtype", "Form", false);
|
| pStreamDict->SetMatrixFor("Matrix", CFX_Matrix());
|
|
|
| CFX_FloatRect rect = bIsTextMarkupAnnotation
|
| ? CPDF_Annot::RectFromQuadPoints(pAnnotDict)
|
| : pAnnotDict->GetRectFor("Rect");
|
| pStreamDict->SetRectFor("BBox", rect);
|
| - pStreamDict->SetFor("Resources", pResourceDict.release());
|
| + pStreamDict->SetFor("Resources", std::move(pResourceDict));
|
| }
|
|
|
| CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) {
|
| @@ -693,7 +690,6 @@ bool FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) {
|
|
|
| CPDF_Object* pFieldFlagsObj = FPDF_GetFieldAttr(pAnnotDict, "Ff");
|
| uint32_t flags = pFieldFlagsObj ? pFieldFlagsObj->GetInteger() : 0;
|
| -
|
| if (field_type == "Ch") {
|
| return (flags & (1 << 17))
|
| ? CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict)
|
| @@ -705,7 +701,8 @@ bool FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) {
|
| if (!pAnnotDict->KeyExist("AS")) {
|
| if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDictFor("Parent")) {
|
| if (pParentDict->KeyExist("AS")) {
|
| - pAnnotDict->SetStringFor("AS", pParentDict->GetStringFor("AS"));
|
| + pAnnotDict->SetNewFor<CPDF_String>(
|
| + "AS", pParentDict->GetStringFor("AS"), false);
|
| }
|
| }
|
| }
|
|
|