summaryrefslogtreecommitdiff
path: root/core/fpdfdoc/cpvt_generateap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/fpdfdoc/cpvt_generateap.cpp')
-rw-r--r--core/fpdfdoc/cpvt_generateap.cpp185
1 files changed, 101 insertions, 84 deletions
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index 93ef9dc366..0802e907fd 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -7,6 +7,8 @@
#include "core/fpdfdoc/cpvt_generateap.h"
#include <algorithm>
+#include <memory>
+#include <utility>
#include "core/fpdfapi/font/cpdf_font.h"
#include "core/fpdfapi/parser/cpdf_dictionary.h"
@@ -19,6 +21,7 @@
#include "core/fpdfdoc/cpvt_color.h"
#include "core/fpdfdoc/cpvt_fontmap.h"
#include "core/fpdfdoc/cpvt_word.h"
+#include "third_party/base/ptr_util.h"
namespace {
@@ -58,11 +61,14 @@ bool GenerateWidgetAP(CPDF_Document* pDoc,
CPDF_Dictionary* pFontDict = pDRFontDict->GetDictFor(sFontName.Mid(1));
if (!pFontDict) {
- pFontDict = new CPDF_Dictionary(pDoc->GetByteStringPool());
- pFontDict->SetNameFor("Type", "Font");
- pFontDict->SetNameFor("Subtype", "Type1");
- pFontDict->SetNameFor("BaseFont", "Helvetica");
- pFontDict->SetNameFor("Encoding", "WinAnsiEncoding");
+ auto pNewFontDict =
+ pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
+ pNewFontDict->SetNameFor("Type", "Font");
+ pNewFontDict->SetNameFor("Subtype", "Type1");
+ pNewFontDict->SetNameFor("BaseFont", "Helvetica");
+ pNewFontDict->SetNameFor("Encoding", "WinAnsiEncoding");
+ // Ownership passes to AddIndirectObject().
+ pFontDict = pNewFontDict.release();
pDRFontDict->SetReferenceFor(sFontName.Mid(1), pDoc,
pDoc->AddIndirectObject(pFontDict));
}
@@ -163,12 +169,17 @@ bool GenerateWidgetAP(CPDF_Document* pDoc,
rcBody.Normalize();
CPDF_Dictionary* pAPDict = pAnnotDict->GetDictFor("AP");
if (!pAPDict) {
- pAPDict = new CPDF_Dictionary(pDoc->GetByteStringPool());
+ auto pNewAPDict =
+ pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
+ // Ownership passes to |pAnnotDict|.
+ pAPDict = pNewAPDict.release();
pAnnotDict->SetFor("AP", pAPDict);
}
CPDF_Stream* pNormalStream = pAPDict->GetStreamFor("N");
if (!pNormalStream) {
- pNormalStream = new CPDF_Stream;
+ auto pNewNormalStream = pdfium::MakeUnique<CPDF_Stream>();
+ // Ownership passes to AddIndirectObject().
+ pNormalStream = pNewNormalStream.release();
pAPDict->SetReferenceFor("N", pDoc, pDoc->AddIndirectObject(pNormalStream));
}
CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
@@ -179,7 +190,10 @@ bool GenerateWidgetAP(CPDF_Document* pDoc,
if (pStreamResList) {
CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font");
if (!pStreamResFontList) {
- pStreamResFontList = new CPDF_Dictionary(pDoc->GetByteStringPool());
+ auto pNewStreamResFontList =
+ pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
+ // Ownership passes to |pStreamResList|.
+ pStreamResFontList = pNewStreamResFontList.release();
pStreamResList->SetFor("Font", pStreamResFontList);
}
if (!pStreamResFontList->KeyExist(sFontName))
@@ -431,7 +445,10 @@ bool GenerateWidgetAP(CPDF_Document* pDoc,
CPDF_Dictionary* pStreamResFontList =
pStreamResList->GetDictFor("Font");
if (!pStreamResFontList) {
- pStreamResFontList = new CPDF_Dictionary(pDoc->GetByteStringPool());
+ auto pNewStreamResFontList =
+ pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
+ // Ownership passes to |pStreamResList|.
+ pStreamResFontList = pNewStreamResFontList.release();
pStreamResList->SetFor("Font", pStreamResFontList);
}
if (!pStreamResFontList->KeyExist(sFontName))
@@ -539,11 +556,12 @@ CFX_ByteString GetPopupContentsString(CPDF_Document* pDoc,
return sAppStream.MakeString();
}
-CPDF_Dictionary* GenerateExtGStateDict(const CPDF_Dictionary& pAnnotDict,
- const CFX_ByteString& sExtGSDictName,
- const CFX_ByteString& sBlendMode) {
- CPDF_Dictionary* pGSDict =
- new CPDF_Dictionary(pAnnotDict.GetByteStringPool());
+std::unique_ptr<CPDF_Dictionary> GenerateExtGStateDict(
+ const CPDF_Dictionary& pAnnotDict,
+ const CFX_ByteString& sExtGSDictName,
+ const CFX_ByteString& sBlendMode) {
+ auto pGSDict =
+ pdfium::MakeUnique<CPDF_Dictionary>(pAnnotDict.GetByteStringPool());
pGSDict->SetStringFor("Type", "ExtGState");
FX_FLOAT fOpacity =
@@ -553,56 +571,56 @@ CPDF_Dictionary* GenerateExtGStateDict(const CPDF_Dictionary& pAnnotDict,
pGSDict->SetBooleanFor("AIS", false);
pGSDict->SetStringFor("BM", sBlendMode);
- CPDF_Dictionary* pExtGStateDict =
- new CPDF_Dictionary(pAnnotDict.GetByteStringPool());
- pExtGStateDict->SetFor(sExtGSDictName, pGSDict);
+ auto pExtGStateDict =
+ pdfium::MakeUnique<CPDF_Dictionary>(pAnnotDict.GetByteStringPool());
+ pExtGStateDict->SetFor(sExtGSDictName, pGSDict.release());
return pExtGStateDict;
}
-CPDF_Dictionary* GenerateResourceFontDict(CPDF_Document* pDoc,
- const CFX_ByteString& sFontDictName) {
- CPDF_Dictionary* pFontDict = new CPDF_Dictionary(pDoc->GetByteStringPool());
+std::unique_ptr<CPDF_Dictionary> GenerateResourceFontDict(
+ CPDF_Document* pDoc,
+ const CFX_ByteString& sFontDictName) {
+ auto pFontDict =
+ pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
pFontDict->SetNameFor("Type", "Font");
pFontDict->SetNameFor("Subtype", "Type1");
pFontDict->SetNameFor("BaseFont", "Helvetica");
pFontDict->SetNameFor("Encoding", "WinAnsiEncoding");
- CPDF_Dictionary* pResourceFontDict =
- new CPDF_Dictionary(pDoc->GetByteStringPool());
- pResourceFontDict->SetReferenceFor(sFontDictName, pDoc,
- pDoc->AddIndirectObject(pFontDict));
+ auto pResourceFontDict =
+ pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
+ pResourceFontDict->SetReferenceFor(
+ sFontDictName, pDoc, pDoc->AddIndirectObject(pFontDict.release()));
return pResourceFontDict;
}
-// Takes ownership of |pExtGStateDict| and |pResourceFontDict|.
-CPDF_Dictionary* GenerateResourceDict(CPDF_Document* pDoc,
- CPDF_Dictionary* pExtGStateDict,
- CPDF_Dictionary* pResourceFontDict) {
- CPDF_Dictionary* pResourceDict =
- new CPDF_Dictionary(pDoc->GetByteStringPool());
+std::unique_ptr<CPDF_Dictionary> GenerateResourceDict(
+ CPDF_Document* pDoc,
+ std::unique_ptr<CPDF_Dictionary> pExtGStateDict,
+ std::unique_ptr<CPDF_Dictionary> pResourceFontDict) {
+ auto pResourceDict =
+ pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
if (pExtGStateDict)
- pResourceDict->SetFor("ExtGState", pExtGStateDict);
-
+ pResourceDict->SetFor("ExtGState", pExtGStateDict.release());
if (pResourceFontDict)
- pResourceDict->SetFor("Font", pResourceFontDict);
-
+ pResourceDict->SetFor("Font", pResourceFontDict.release());
return pResourceDict;
}
-// Takes ownership of |pResourceDict|.
void GenerateAndSetAPDict(CPDF_Document* pDoc,
CPDF_Dictionary* pAnnotDict,
const CFX_ByteTextBuf& sAppStream,
- CPDF_Dictionary* pResourceDict,
+ std::unique_ptr<CPDF_Dictionary> pResourceDict,
bool bIsTextMarkupAnnotation) {
- CPDF_Dictionary* pAPDict = new CPDF_Dictionary(pDoc->GetByteStringPool());
- pAnnotDict->SetFor("AP", pAPDict);
-
- CPDF_Stream* pNormalStream = new CPDF_Stream;
+ auto pNormalStream = pdfium::MakeUnique<CPDF_Stream>();
pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize());
- pAPDict->SetReferenceFor("N", pDoc, pDoc->AddIndirectObject(pNormalStream));
-
CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
+
+ auto pAPDict = pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
+ pAPDict->SetReferenceFor("N", pDoc,
+ pDoc->AddIndirectObject(pNormalStream.release()));
+ pAnnotDict->SetFor("AP", pAPDict.release());
+
pStreamDict->SetIntegerFor("FormType", 1);
pStreamDict->SetStringFor("Subtype", "Form");
pStreamDict->SetMatrixFor("Matrix", CFX_Matrix());
@@ -611,7 +629,7 @@ void GenerateAndSetAPDict(CPDF_Document* pDoc,
? CPDF_Annot::RectFromQuadPoints(pAnnotDict)
: pAnnotDict->GetRectFor("Rect");
pStreamDict->SetRectFor("BBox", rect);
- pStreamDict->SetFor("Resources", pResourceDict);
+ pStreamDict->SetFor("Resources", pResourceDict.release());
}
CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) {
@@ -791,11 +809,11 @@ bool CPVT_GenerateAP::GenerateCircleAP(CPDF_Document* pDoc,
bool bIsFillRect = pInteriorColor && !pInteriorColor->IsEmpty();
sAppStream << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n";
- CPDF_Dictionary* pExtGStateDict =
+ auto pExtGStateDict =
GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
- CPDF_Dictionary* pResourceDict =
- GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
- GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
+ auto pResourceDict =
+ GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
+ GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
false /*IsTextMarkupAnnotation*/);
return true;
}
@@ -818,11 +836,11 @@ bool CPVT_GenerateAP::GenerateHighlightAP(CPDF_Document* pDoc,
<< rect.left << " " << rect.bottom << " l "
<< "h f\n";
- CPDF_Dictionary* pExtGStateDict =
+ auto pExtGStateDict =
GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply");
- CPDF_Dictionary* pResourceDict =
- GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
- GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
+ auto pResourceDict =
+ GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
+ GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
true /*IsTextMarkupAnnotation*/);
return true;
@@ -873,11 +891,11 @@ bool CPVT_GenerateAP::GenerateInkAP(CPDF_Document* pDoc,
sAppStream << "S\n";
}
- CPDF_Dictionary* pExtGStateDict =
+ auto pExtGStateDict =
GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
- CPDF_Dictionary* pResourceDict =
- GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
- GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
+ auto pResourceDict =
+ GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
+ GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
false /*IsTextMarkupAnnotation*/);
return true;
}
@@ -896,11 +914,11 @@ bool CPVT_GenerateAP::GenerateTextAP(CPDF_Document* pDoc,
sAppStream << GenerateTextSymbolAP(noteRect);
- CPDF_Dictionary* pExtGStateDict =
+ auto pExtGStateDict =
GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
- CPDF_Dictionary* pResourceDict =
- GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
- GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
+ auto pResourceDict =
+ GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
+ GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
false /*IsTextMarkupAnnotation*/);
return true;
}
@@ -923,11 +941,11 @@ bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc,
<< rect.bottom + fLineWidth << " m " << rect.right << " "
<< rect.bottom + fLineWidth << " l S\n";
- CPDF_Dictionary* pExtGStateDict =
+ auto pExtGStateDict =
GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
- CPDF_Dictionary* pResourceDict =
- GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
- GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
+ auto pResourceDict =
+ GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
+ GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
true /*IsTextMarkupAnnotation*/);
return true;
}
@@ -954,19 +972,18 @@ bool CPVT_GenerateAP::GeneratePopupAP(CPDF_Document* pDoc,
<< rect.Height() << " re b\n";
CFX_ByteString sFontName = "FONT";
- CPDF_Dictionary* pExtGStateDict =
- GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
- CPDF_Dictionary* pResourceFontDict =
- GenerateResourceFontDict(pDoc, sFontName);
- CPDF_Dictionary* pResourceDict =
- GenerateResourceDict(pDoc, pResourceFontDict, pExtGStateDict);
-
- CPDF_Font* pDefFont = pDoc->LoadFont(pResourceFontDict);
+ auto pResourceFontDict = GenerateResourceFontDict(pDoc, sFontName);
+ CPDF_Font* pDefFont = pDoc->LoadFont(pResourceFontDict.get());
if (!pDefFont)
return false;
+ auto pExtGStateDict =
+ GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
+ auto pResourceDict = GenerateResourceDict(pDoc, std::move(pResourceFontDict),
+ std::move(pExtGStateDict));
+
sAppStream << GetPopupContentsString(pDoc, *pAnnotDict, pDefFont, sFontName);
- GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
+ GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
false /*IsTextMarkupAnnotation*/);
return true;
}
@@ -1010,11 +1027,11 @@ bool CPVT_GenerateAP::GenerateSquareAP(CPDF_Document* pDoc,
<< rect.Height() << " re "
<< GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n";
- CPDF_Dictionary* pExtGStateDict =
+ auto pExtGStateDict =
GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
- CPDF_Dictionary* pResourceDict =
- GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
- GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
+ auto pResourceDict =
+ GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
+ GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
false /*IsTextMarkupAnnotation*/);
return true;
}
@@ -1059,11 +1076,11 @@ bool CPVT_GenerateAP::GenerateSquigglyAP(CPDF_Document* pDoc,
sAppStream << "S\n";
- CPDF_Dictionary* pExtGStateDict =
+ auto pExtGStateDict =
GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
- CPDF_Dictionary* pResourceDict =
- GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
- GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
+ auto pResourceDict =
+ GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
+ GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
true /*IsTextMarkupAnnotation*/);
return true;
}
@@ -1086,11 +1103,11 @@ bool CPVT_GenerateAP::GenerateStrikeOutAP(CPDF_Document* pDoc,
sAppStream << fLineWidth << " w " << rect.left << " " << fY << " m "
<< rect.right << " " << fY << " l S\n";
- CPDF_Dictionary* pExtGStateDict =
+ auto pExtGStateDict =
GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
- CPDF_Dictionary* pResourceDict =
- GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
- GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
+ auto pResourceDict =
+ GenerateResourceDict(pDoc, std::move(pExtGStateDict), nullptr);
+ GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, std::move(pResourceDict),
true /*IsTextMarkupAnnotation*/);
return true;
}