Return retained references from CPDF_Dictionary::GetArrayFor().
-- avoid re-assigning to locals where not required.
Change-Id: I683241498459e06276679bbbf698b886071cfee6
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98154
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp
index 3b67b7b..9fa160a 100644
--- a/core/fpdfapi/font/cpdf_cidfont.cpp
+++ b/core/fpdfapi/font/cpdf_cidfont.cpp
@@ -407,7 +407,8 @@
return true;
}
- const CPDF_Array* pFonts = m_pFontDict->GetArrayFor("DescendantFonts");
+ RetainPtr<const CPDF_Array> pFonts =
+ m_pFontDict->GetArrayFor("DescendantFonts");
if (!pFonts || pFonts->size() != 1)
return false;
@@ -471,9 +472,11 @@
FT_UseCIDCharmap(m_Font.GetFaceRec(), m_pCMap->GetCoding());
}
m_DefaultWidth = pCIDFontDict->GetIntegerFor("DW", 1000);
- const CPDF_Array* pWidthArray = pCIDFontDict->GetArrayFor("W");
- if (pWidthArray)
- LoadMetricsArray(pWidthArray, &m_WidthList, 1);
+ RetainPtr<const CPDF_Array> pWidthArray = pCIDFontDict->GetArrayFor("W");
+ if (pWidthArray) {
+ // TODO(tsepez): pass retained argument.
+ LoadMetricsArray(pWidthArray.Get(), &m_WidthList, 1);
+ }
if (!IsEmbedded())
LoadSubstFont();
@@ -492,10 +495,13 @@
CheckFontMetrics();
if (IsVertWriting()) {
- pWidthArray = pCIDFontDict->GetArrayFor("W2");
- if (pWidthArray)
- LoadMetricsArray(pWidthArray, &m_VertMetrics, 3);
- const CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayFor("DW2");
+ RetainPtr<const CPDF_Array> pWidth2Array = pCIDFontDict->GetArrayFor("W2");
+ if (pWidth2Array) {
+ // TODO(tsepez): pass retained argument.
+ LoadMetricsArray(pWidth2Array.Get(), &m_VertMetrics, 3);
+ }
+ RetainPtr<const CPDF_Array> pDefaultArray =
+ pCIDFontDict->GetArrayFor("DW2");
if (pDefaultArray) {
m_DefaultVY = pDefaultArray->GetIntegerAt(0);
m_DefaultW1 = pDefaultArray->GetIntegerAt(1);
diff --git a/core/fpdfapi/font/cpdf_font.cpp b/core/fpdfapi/font/cpdf_font.cpp
index f746e47..0aac03f 100644
--- a/core/fpdfapi/font/cpdf_font.cpp
+++ b/core/fpdfapi/font/cpdf_font.cpp
@@ -194,7 +194,7 @@
}
if (m_Descent > 10)
m_Descent = -m_Descent;
- const CPDF_Array* pBBox = pFontDesc->GetArrayFor("FontBBox");
+ RetainPtr<const CPDF_Array> pBBox = pFontDesc->GetArrayFor("FontBBox");
if (pBBox) {
m_FontBBox.left = pBBox->GetIntegerAt(0);
m_FontBBox.bottom = pBBox->GetIntegerAt(1);
diff --git a/core/fpdfapi/font/cpdf_simplefont.cpp b/core/fpdfapi/font/cpdf_simplefont.cpp
index 9d1939c..af10611 100644
--- a/core/fpdfapi/font/cpdf_simplefont.cpp
+++ b/core/fpdfapi/font/cpdf_simplefont.cpp
@@ -105,7 +105,7 @@
}
void CPDF_SimpleFont::LoadCharWidths(const CPDF_Dictionary* font_desc) {
- const CPDF_Array* width_array = m_pFontDict->GetArrayFor("Widths");
+ RetainPtr<const CPDF_Array> width_array = m_pFontDict->GetArrayFor("Widths");
m_bUseFontWidth = !width_array;
if (!width_array)
return;
@@ -129,7 +129,7 @@
}
void CPDF_SimpleFont::LoadDifferences(const CPDF_Dictionary* encoding) {
- const CPDF_Array* diffs = encoding->GetArrayFor("Differences");
+ RetainPtr<const CPDF_Array> diffs = encoding->GetArrayFor("Differences");
if (!diffs)
return;
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp
index ea7caaf..1d4f76d 100644
--- a/core/fpdfapi/font/cpdf_type3font.cpp
+++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -58,7 +58,7 @@
bool CPDF_Type3Font::Load() {
m_pFontResources = m_pFontDict->GetMutableDictFor("Resources");
- const CPDF_Array* pMatrix = m_pFontDict->GetArrayFor("FontMatrix");
+ RetainPtr<const CPDF_Array> pMatrix = m_pFontDict->GetArrayFor("FontMatrix");
float xscale = 1.0f;
float yscale = 1.0f;
if (pMatrix) {
@@ -67,7 +67,7 @@
yscale = m_FontMatrix.d;
}
- const CPDF_Array* pBBox = m_pFontDict->GetArrayFor("FontBBox");
+ RetainPtr<const CPDF_Array> pBBox = m_pFontDict->GetArrayFor("FontBBox");
if (pBBox) {
CFX_FloatRect box(
pBBox->GetFloatAt(0) * xscale, pBBox->GetFloatAt(1) * yscale,
@@ -79,7 +79,8 @@
static constexpr size_t kCharLimit = std::extent<decltype(m_CharWidthL)>();
int StartChar = m_pFontDict->GetIntegerFor("FirstChar");
if (StartChar >= 0 && static_cast<size_t>(StartChar) < kCharLimit) {
- const CPDF_Array* pWidthArray = m_pFontDict->GetArrayFor("Widths");
+ RetainPtr<const CPDF_Array> pWidthArray =
+ m_pFontDict->GetArrayFor("Widths");
if (pWidthArray) {
size_t count = std::min(pWidthArray->size(), kCharLimit);
count = std::min(count, kCharLimit - StartChar);
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index 34c18cf..e0a56c1 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -89,7 +89,7 @@
}
void GetBlackPoint(const CPDF_Dictionary* pDict, float* pPoints) {
- const CPDF_Array* pParam = pDict->GetArrayFor("BlackPoint");
+ RetainPtr<const CPDF_Array> pParam = pDict->GetArrayFor("BlackPoint");
if (!pParam || pParam->size() != kBlackWhitePointCount) {
GetDefaultBlackPoint(pPoints);
return;
@@ -106,7 +106,7 @@
}
bool GetWhitePoint(const CPDF_Dictionary* pDict, float* pPoints) {
- const CPDF_Array* pParam = pDict->GetArrayFor("WhitePoint");
+ RetainPtr<const CPDF_Array> pParam = pDict->GetArrayFor("WhitePoint");
if (!pParam || pParam->size() != kBlackWhitePointCount)
return false;
@@ -705,18 +705,18 @@
GetBlackPoint(pDict.Get(), m_BlackPoint);
- const CPDF_Array* pParam = pDict->GetArrayFor("Gamma");
- if (pParam) {
+ RetainPtr<const CPDF_Array> pGamma = pDict->GetArrayFor("Gamma");
+ if (pGamma) {
m_bHasGamma = true;
for (size_t i = 0; i < std::size(m_Gamma); ++i)
- m_Gamma[i] = pParam->GetFloatAt(i);
+ m_Gamma[i] = pGamma->GetFloatAt(i);
}
- pParam = pDict->GetArrayFor("Matrix");
- if (pParam) {
+ RetainPtr<const CPDF_Array> pMatrix = pDict->GetArrayFor("Matrix");
+ if (pMatrix) {
m_bHasMatrix = true;
for (size_t i = 0; i < std::size(m_Matrix); ++i)
- m_Matrix[i] = pParam->GetFloatAt(i);
+ m_Matrix[i] = pMatrix->GetFloatAt(i);
}
return 3;
}
@@ -819,7 +819,7 @@
GetBlackPoint(pDict.Get(), m_BlackPoint);
- const CPDF_Array* pParam = pDict->GetArrayFor("Range");
+ RetainPtr<const CPDF_Array> pParam = pDict->GetArrayFor("Range");
static constexpr float kDefaultRanges[kRangesCount] = {-100.0f, 100.0f,
-100.0f, 100.0f};
static_assert(std::size(kDefaultRanges) == std::extent<decltype(m_Ranges)>(),
@@ -1081,9 +1081,9 @@
std::vector<float> CPDF_ICCBasedCS::GetRanges(const CPDF_Dictionary* pDict,
uint32_t nComponents) {
DCHECK(IsValidIccComponents(nComponents));
- const CPDF_Array* pRanges = pDict->GetArrayFor("Range");
+ RetainPtr<const CPDF_Array> pRanges = pDict->GetArrayFor("Range");
if (pRanges && pRanges->size() >= nComponents * 2)
- return ReadArrayElementsToVector(pRanges, nComponents * 2);
+ return ReadArrayElementsToVector(pRanges.Get(), nComponents * 2);
std::vector<float> ranges;
ranges.reserve(nComponents * 2);
diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp
index d830143..282c1e3 100644
--- a/core/fpdfapi/page/cpdf_contentparser.cpp
+++ b/core/fpdfapi/page/cpdf_contentparser.cpp
@@ -76,7 +76,7 @@
if (pGraphicStates)
form_matrix.Concat(pGraphicStates->m_CTM);
- const CPDF_Array* pBBox = pForm->GetDict()->GetArrayFor("BBox");
+ RetainPtr<const CPDF_Array> pBBox = pForm->GetDict()->GetArrayFor("BBox");
CFX_FloatRect form_bbox;
CPDF_Path ClipPath;
if (pBBox) {
@@ -148,7 +148,7 @@
CPDF_ContentParser::Stage CPDF_ContentParser::GetContent() {
DCHECK_EQ(m_CurrentStage, Stage::kGetContent);
DCHECK(m_pObjectHolder->IsPage());
- const CPDF_Array* pContent =
+ RetainPtr<const CPDF_Array> pContent =
m_pObjectHolder->GetDict()->GetArrayFor(pdfium::page_object::kContents);
RetainPtr<const CPDF_Stream> pStreamObj = ToStream(
pContent ? pContent->GetDirectObjectAt(m_CurrentOffset) : nullptr);
diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp
index c890ad4..a11307c 100644
--- a/core/fpdfapi/page/cpdf_dib.cpp
+++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -339,7 +339,7 @@
}
m_bImageMask = true;
m_bpc = m_nComponents = 1;
- const CPDF_Array* pDecode = m_pDict->GetArrayFor("Decode");
+ RetainPtr<const CPDF_Array> pDecode = m_pDict->GetArrayFor("Decode");
m_bDefaultDecode = !pDecode || !pDecode->GetIntegerAt(0);
return true;
}
@@ -389,7 +389,7 @@
m_CompData.resize(m_nComponents);
int max_data = (1 << m_bpc) - 1;
- const CPDF_Array* pDecode = m_pDict->GetArrayFor("Decode");
+ RetainPtr<const CPDF_Array> pDecode = m_pDict->GetArrayFor("Decode");
if (pDecode) {
for (uint32_t i = 0; i < m_nComponents; i++) {
m_CompData[i].m_DecodeMin = pDecode->GetFloatAt(i * 2);
@@ -756,13 +756,13 @@
return mask ? StartLoadMaskDIB(std::move(mask)) : LoadState::kSuccess;
}
- const CPDF_Array* pMatte = mask->GetDict()->GetArrayFor("Matte");
+ RetainPtr<const CPDF_Array> pMatte = mask->GetDict()->GetArrayFor("Matte");
if (pMatte && m_pColorSpace &&
m_Family != CPDF_ColorSpace::Family::kPattern &&
pMatte->size() == m_nComponents &&
m_pColorSpace->CountComponents() <= m_nComponents) {
std::vector<float> colors =
- ReadArrayElementsToVector(pMatte, m_nComponents);
+ ReadArrayElementsToVector(pMatte.Get(), m_nComponents);
float R;
float G;
diff --git a/core/fpdfapi/page/cpdf_expintfunc.cpp b/core/fpdfapi/page/cpdf_expintfunc.cpp
index 798de32..93de2d5 100644
--- a/core/fpdfapi/page/cpdf_expintfunc.cpp
+++ b/core/fpdfapi/page/cpdf_expintfunc.cpp
@@ -33,13 +33,13 @@
m_Exponent = pExponent->GetNumber();
- const CPDF_Array* pArray0 = pDict->GetArrayFor("C0");
+ RetainPtr<const CPDF_Array> pArray0 = pDict->GetArrayFor("C0");
if (pArray0 && m_nOutputs == 0)
m_nOutputs = fxcrt::CollectionSize<uint32_t>(*pArray0);
if (m_nOutputs == 0)
m_nOutputs = 1;
- const CPDF_Array* pArray1 = pDict->GetArrayFor("C1");
+ RetainPtr<const CPDF_Array> pArray1 = pDict->GetArrayFor("C1");
m_BeginValues = DataVector<float>(Fx2DSizeOrDie(m_nOutputs, 2));
m_EndValues = DataVector<float>(m_BeginValues.size());
for (uint32_t i = 0; i < m_nOutputs; i++) {
diff --git a/core/fpdfapi/page/cpdf_function.cpp b/core/fpdfapi/page/cpdf_function.cpp
index f3c3a3f..03e9afc 100644
--- a/core/fpdfapi/page/cpdf_function.cpp
+++ b/core/fpdfapi/page/cpdf_function.cpp
@@ -89,7 +89,7 @@
RetainPtr<const CPDF_Dictionary> pDict =
pStream ? pStream->GetDict() : pdfium::WrapRetain(pObj->AsDictionary());
- const CPDF_Array* pDomains = pDict->GetArrayFor("Domain");
+ RetainPtr<const CPDF_Array> pDomains = pDict->GetArrayFor("Domain");
if (!pDomains)
return false;
@@ -98,9 +98,9 @@
return false;
size_t nInputs = m_nInputs * 2;
- m_Domains = ReadArrayElementsToVector(pDomains, nInputs);
+ m_Domains = ReadArrayElementsToVector(pDomains.Get(), nInputs);
- const CPDF_Array* pRanges = pDict->GetArrayFor("Range");
+ RetainPtr<const CPDF_Array> pRanges = pDict->GetArrayFor("Range");
m_nOutputs = pRanges ? fxcrt::CollectionSize<uint32_t>(*pRanges) / 2 : 0;
// Ranges are required for type 0 and type 4 functions. A non-zero
@@ -112,7 +112,7 @@
if (m_nOutputs > 0) {
size_t nOutputs = m_nOutputs * 2;
- m_Ranges = ReadArrayElementsToVector(pRanges, nOutputs);
+ m_Ranges = ReadArrayElementsToVector(pRanges.Get(), nOutputs);
}
uint32_t old_outputs = m_nOutputs;
diff --git a/core/fpdfapi/page/cpdf_meshstream.cpp b/core/fpdfapi/page/cpdf_meshstream.cpp
index 0f10db6..c3f0135 100644
--- a/core/fpdfapi/page/cpdf_meshstream.cpp
+++ b/core/fpdfapi/page/cpdf_meshstream.cpp
@@ -132,7 +132,7 @@
return false;
m_nComponents = m_funcs.empty() ? nComponents : 1;
- const CPDF_Array* pDecode = pDict->GetArrayFor("Decode");
+ RetainPtr<const CPDF_Array> pDecode = pDict->GetArrayFor("Decode");
if (!pDecode || pDecode->size() != 4 + m_nComponents * 2)
return false;
diff --git a/core/fpdfapi/page/cpdf_occontext.cpp b/core/fpdfapi/page/cpdf_occontext.cpp
index 442bb2d..efcf167 100644
--- a/core/fpdfapi/page/cpdf_occontext.cpp
+++ b/core/fpdfapi/page/cpdf_occontext.cpp
@@ -42,7 +42,7 @@
if (!pOCProperties)
return nullptr;
- const CPDF_Array* pOCGs = pOCProperties->GetArrayFor("OCGs");
+ RetainPtr<const CPDF_Array> pOCGs = pOCProperties->GetArrayFor("OCGs");
if (!pOCGs)
return nullptr;
@@ -50,7 +50,7 @@
return nullptr;
const CPDF_Dictionary* pConfig = pOCProperties->GetDictFor("D");
- const CPDF_Array* pConfigs = pOCProperties->GetArrayFor("Configs");
+ RetainPtr<const CPDF_Array> pConfigs = pOCProperties->GetArrayFor("Configs");
if (!pConfigs)
return pConfig;
@@ -98,7 +98,7 @@
return true;
bool bState = pConfig->GetByteStringFor("BaseState", "ON") != "OFF";
- const CPDF_Array* pArray = pConfig->GetArrayFor("ON");
+ RetainPtr<const CPDF_Array> pArray = pConfig->GetArrayFor("ON");
if (pArray && pArray->Contains(pOCGDict))
bState = true;
@@ -119,7 +119,7 @@
if (pUsage->GetByteStringFor("Event", "View") != csConfig)
continue;
- const CPDF_Array* pOCGs = pUsage->GetArrayFor("OCGs");
+ RetainPtr<const CPDF_Array> pOCGs = pUsage->GetArrayFor("OCGs");
if (!pOCGs)
continue;
@@ -228,9 +228,11 @@
}
bool CPDF_OCContext::LoadOCMDState(const CPDF_Dictionary* pOCMDDict) const {
- const CPDF_Array* pVE = pOCMDDict->GetArrayFor("VE");
- if (pVE)
- return GetOCGVE(pVE, 0);
+ RetainPtr<const CPDF_Array> pVE = pOCMDDict->GetArrayFor("VE");
+ if (pVE) {
+ // TODO(tsepez): pass retained argument.
+ return GetOCGVE(pVE.Get(), 0);
+ }
ByteString csP = pOCMDDict->GetByteStringFor("P", "AnyOn");
RetainPtr<const CPDF_Object> pOCGObj = pOCMDDict->GetDirectObjectFor("OCGs");
diff --git a/core/fpdfapi/page/cpdf_sampledfunc.cpp b/core/fpdfapi/page/cpdf_sampledfunc.cpp
index 0911647..3f57286 100644
--- a/core/fpdfapi/page/cpdf_sampledfunc.cpp
+++ b/core/fpdfapi/page/cpdf_sampledfunc.cpp
@@ -49,7 +49,7 @@
return false;
RetainPtr<const CPDF_Dictionary> pDict = pStream->GetDict();
- const CPDF_Array* pSize = pDict->GetArrayFor("Size");
+ RetainPtr<const CPDF_Array> pSize = pDict->GetArrayFor("Size");
if (!pSize || pSize->IsEmpty())
return false;
@@ -59,7 +59,7 @@
FX_SAFE_UINT32 nTotalSampleBits = m_nBitsPerSample;
nTotalSampleBits *= m_nOutputs;
- const CPDF_Array* pEncode = pDict->GetArrayFor("Encode");
+ RetainPtr<const CPDF_Array> pEncode = pDict->GetArrayFor("Encode");
m_EncodeInfo.resize(m_nInputs);
for (uint32_t i = 0; i < m_nInputs; i++) {
int size = pSize->GetIntegerAt(i);
@@ -87,7 +87,7 @@
if (nTotalSampleBytes.ValueOrDie() > m_pSampleStream->GetSize())
return false;
- const CPDF_Array* pDecode = pDict->GetArrayFor("Decode");
+ RetainPtr<const CPDF_Array> pDecode = pDict->GetArrayFor("Decode");
m_DecodeInfo.resize(m_nOutputs);
for (uint32_t i = 0; i < m_nOutputs; i++) {
if (pDecode) {
diff --git a/core/fpdfapi/page/cpdf_stitchfunc.cpp b/core/fpdfapi/page/cpdf_stitchfunc.cpp
index d2d18f0..d28113e 100644
--- a/core/fpdfapi/page/cpdf_stitchfunc.cpp
+++ b/core/fpdfapi/page/cpdf_stitchfunc.cpp
@@ -33,15 +33,15 @@
if (!pDict)
return false;
- const CPDF_Array* pFunctionsArray = pDict->GetArrayFor("Functions");
+ RetainPtr<const CPDF_Array> pFunctionsArray = pDict->GetArrayFor("Functions");
if (!pFunctionsArray)
return false;
- const CPDF_Array* pBoundsArray = pDict->GetArrayFor("Bounds");
+ RetainPtr<const CPDF_Array> pBoundsArray = pDict->GetArrayFor("Bounds");
if (!pBoundsArray)
return false;
- const CPDF_Array* pEncodeArray = pDict->GetArrayFor("Encode");
+ RetainPtr<const CPDF_Array> pEncodeArray = pDict->GetArrayFor("Encode");
if (!pEncodeArray)
return false;
@@ -103,7 +103,7 @@
m_bounds.push_back(pBoundsArray->GetFloatAt(i));
m_bounds.push_back(m_Domains[1]);
- m_encode = ReadArrayElementsToVector(pEncodeArray, nSubs * 2);
+ m_encode = ReadArrayElementsToVector(pEncodeArray.Get(), nSubs * 2);
return true;
}
diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp
index da58c04..83291b8 100644
--- a/core/fpdfapi/page/cpdf_streamparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamparser.cpp
@@ -145,7 +145,7 @@
const CPDF_Array* pArray = pFilter->AsArray();
if (pArray) {
decoder = pArray->GetByteStringAt(0);
- const CPDF_Array* pParams =
+ RetainPtr<const CPDF_Array> pParams =
pDict->GetArrayFor(pdfium::stream::kDecodeParms);
if (pParams)
pParam = pParams->GetDictAt(0);
diff --git a/core/fpdfapi/parser/cpdf_dictionary.cpp b/core/fpdfapi/parser/cpdf_dictionary.cpp
index 2246d7a..33f814b 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.cpp
+++ b/core/fpdfapi/parser/cpdf_dictionary.cpp
@@ -190,8 +190,9 @@
return ToArray(GetDirectObjectForInternal(key));
}
-const CPDF_Array* CPDF_Dictionary::GetArrayFor(const ByteString& key) const {
- return GetArrayForInternal(key);
+RetainPtr<const CPDF_Array> CPDF_Dictionary::GetArrayFor(
+ const ByteString& key) const {
+ return pdfium::WrapRetain(GetArrayForInternal(key));
}
RetainPtr<CPDF_Array> CPDF_Dictionary::GetMutableArrayFor(
@@ -244,19 +245,17 @@
}
CFX_FloatRect CPDF_Dictionary::GetRectFor(const ByteString& key) const {
- CFX_FloatRect rect;
- const CPDF_Array* pArray = GetArrayFor(key);
+ const CPDF_Array* pArray = GetArrayForInternal(key);
if (pArray)
- rect = pArray->GetRect();
- return rect;
+ return pArray->GetRect();
+ return CFX_FloatRect();
}
CFX_Matrix CPDF_Dictionary::GetMatrixFor(const ByteString& key) const {
- CFX_Matrix matrix;
- const CPDF_Array* pArray = GetArrayFor(key);
+ const CPDF_Array* pArray = GetArrayForInternal(key);
if (pArray)
- matrix = pArray->GetMatrix();
- return matrix;
+ return pArray->GetMatrix();
+ return CFX_Matrix();
}
bool CPDF_Dictionary::KeyExist(const ByteString& key) const {
diff --git a/core/fpdfapi/parser/cpdf_dictionary.h b/core/fpdfapi/parser/cpdf_dictionary.h
index a80dda5..e0e3e5d 100644
--- a/core/fpdfapi/parser/cpdf_dictionary.h
+++ b/core/fpdfapi/parser/cpdf_dictionary.h
@@ -69,7 +69,7 @@
const CPDF_Dictionary* GetDictFor(const ByteString& key) const;
RetainPtr<CPDF_Dictionary> GetMutableDictFor(const ByteString& key);
RetainPtr<CPDF_Dictionary> GetOrCreateDictFor(const ByteString& key);
- const CPDF_Array* GetArrayFor(const ByteString& key) const;
+ RetainPtr<const CPDF_Array> GetArrayFor(const ByteString& key) const;
RetainPtr<CPDF_Array> GetMutableArrayFor(const ByteString& key);
RetainPtr<CPDF_Array> GetOrCreateArrayFor(const ByteString& key);
RetainPtr<const CPDF_Stream> GetStreamFor(const ByteString& key) const;
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp
index c966745..59e6f71 100644
--- a/core/fpdfapi/parser/cpdf_document.cpp
+++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -69,7 +69,7 @@
return -1;
}
- const CPDF_Array* pKidList = pNode->GetArrayFor("Kids");
+ RetainPtr<const CPDF_Array> pKidList = pNode->GetArrayFor("Kids");
if (!pKidList)
return -1;
diff --git a/core/fpdfapi/parser/cpdf_linearized_header.cpp b/core/fpdfapi/parser/cpdf_linearized_header.cpp
index adedf3b..115e2f6 100644
--- a/core/fpdfapi/parser/cpdf_linearized_header.cpp
+++ b/core/fpdfapi/parser/cpdf_linearized_header.cpp
@@ -95,7 +95,7 @@
m_szFirstPageEndOffset(pDict->GetIntegerFor("E")),
m_FirstPageObjNum(pDict->GetIntegerFor("O")),
m_szLastXRefOffset(szLastXRefOffset) {
- const CPDF_Array* pHintStreamRange = pDict->GetArrayFor("H");
+ RetainPtr<const CPDF_Array> pHintStreamRange = pDict->GetArrayFor("H");
const size_t nHintStreamSize =
pHintStreamRange ? pHintStreamRange->size() : 0;
if (nHintStreamSize == 2 || nHintStreamSize == 4) {
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index 3eac803..e7751e3 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -752,9 +752,10 @@
}
std::vector<CrossRefV5IndexEntry> indices =
- GetCrossRefV5Indices(pDict->GetArrayFor("Index"), size);
+ GetCrossRefV5Indices(pDict->GetArrayFor("Index").Get(), size);
- std::vector<uint32_t> field_widths = GetFieldWidths(pDict->GetArrayFor("W"));
+ std::vector<uint32_t> field_widths =
+ GetFieldWidths(pDict->GetArrayFor("W").Get());
if (field_widths.size() < kMinFieldCount)
return false;
@@ -850,8 +851,9 @@
m_CrossRefTable->AddCompressed(obj_num, archive_obj_num, archive_obj_index);
}
+// TODO(tsepez): return retained object.
const CPDF_Array* CPDF_Parser::GetIDArray() const {
- return GetTrailer() ? GetTrailer()->GetArrayFor("ID") : nullptr;
+ return GetTrailer() ? GetTrailer()->GetArrayFor("ID").Get() : nullptr;
}
// TODO(tsepez): return retained object, though not clear if it can change.
diff --git a/core/fpdfapi/render/cpdf_rendershading.cpp b/core/fpdfapi/render/cpdf_rendershading.cpp
index 266e2fa..ba06563 100644
--- a/core/fpdfapi/render/cpdf_rendershading.cpp
+++ b/core/fpdfapi/render/cpdf_rendershading.cpp
@@ -102,7 +102,7 @@
if (total_results == 0)
return;
- const CPDF_Array* pCoords = pDict->GetArrayFor("Coords");
+ RetainPtr<const CPDF_Array> pCoords = pDict->GetArrayFor("Coords");
if (!pCoords)
return;
@@ -112,7 +112,7 @@
float end_y = pCoords->GetFloatAt(3);
float t_min = 0;
float t_max = 1.0f;
- const CPDF_Array* pArray = pDict->GetArrayFor("Domain");
+ RetainPtr<const CPDF_Array> pArray = pDict->GetArrayFor("Domain");
if (pArray) {
t_min = pArray->GetFloatAt(0);
t_max = pArray->GetFloatAt(1);
@@ -169,7 +169,7 @@
if (total_results == 0)
return;
- const CPDF_Array* pCoords = pDict->GetArrayFor("Coords");
+ RetainPtr<const CPDF_Array> pCoords = pDict->GetArrayFor("Coords");
if (!pCoords)
return;
@@ -181,7 +181,7 @@
float end_r = pCoords->GetFloatAt(5);
float t_min = 0;
float t_max = 1.0f;
- const CPDF_Array* pArray = pDict->GetArrayFor("Domain");
+ RetainPtr<const CPDF_Array> pArray = pDict->GetArrayFor("Domain");
if (pArray) {
t_min = pArray->GetFloatAt(0);
t_max = pArray->GetFloatAt(1);
@@ -265,7 +265,7 @@
if (total_results == 0)
return;
- const CPDF_Array* pDomain = pDict->GetArrayFor("Domain");
+ RetainPtr<const CPDF_Array> pDomain = pDict->GetArrayFor("Domain");
float xmin = 0.0f;
float ymin = 0.0f;
float xmax = 1.0f;
@@ -885,10 +885,10 @@
FX_ARGB background = 0;
if (!pPattern->IsShadingObject() && pDict->KeyExist("Background")) {
- const CPDF_Array* pBackColor = pDict->GetArrayFor("Background");
+ RetainPtr<const CPDF_Array> pBackColor = pDict->GetArrayFor("Background");
if (pBackColor && pBackColor->size() >= pColorSpace->CountComponents()) {
- std::vector<float> comps =
- ReadArrayElementsToVector(pBackColor, pColorSpace->CountComponents());
+ std::vector<float> comps = ReadArrayElementsToVector(
+ pBackColor.Get(), pColorSpace->CountComponents());
float R = 0.0f;
float G = 0.0f;
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index c7a3a16..4d8a67c 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1496,7 +1496,8 @@
const CPDF_Dictionary* pGroupDict,
CPDF_ColorSpace::Family* pCSFamily) {
static constexpr FX_ARGB kDefaultColor = ArgbEncode(255, 0, 0, 0);
- const CPDF_Array* pBC = pSMaskDict->GetArrayFor(pdfium::transparency::kBC);
+ RetainPtr<const CPDF_Array> pBC =
+ pSMaskDict->GetArrayFor(pdfium::transparency::kBC);
if (!pBC)
return kDefaultColor;
@@ -1522,7 +1523,7 @@
uint32_t comps = std::max(8u, pCS->CountComponents());
size_t count = std::min<size_t>(8, pBC->size());
- std::vector<float> floats = ReadArrayElementsToVector(pBC, count);
+ std::vector<float> floats = ReadArrayElementsToVector(pBC.Get(), count);
floats.resize(comps);
float R;
diff --git a/core/fpdfdoc/cpdf_action.cpp b/core/fpdfdoc/cpdf_action.cpp
index 769fde7..469243b 100644
--- a/core/fpdfdoc/cpdf_action.cpp
+++ b/core/fpdfdoc/cpdf_action.cpp
@@ -118,14 +118,15 @@
return result;
ByteString csType = m_pDict->GetByteStringFor("S");
- const CPDF_Object* pFields = csType == "Hide"
- ? m_pDict->GetDirectObjectFor("T").Get()
- : m_pDict->GetArrayFor("Fields");
+ RetainPtr<const CPDF_Object> pFields = csType == "Hide"
+ ? m_pDict->GetDirectObjectFor("T")
+ : m_pDict->GetArrayFor("Fields");
if (!pFields)
return result;
if (pFields->IsDictionary() || pFields->IsString()) {
- result.push_back(pFields);
+ // TODO(tsepez): push retained arguments.
+ result.push_back(pFields.Get());
} else if (const CPDF_Array* pArray = pFields->AsArray()) {
for (size_t i = 0; i < pArray->size(); ++i) {
RetainPtr<const CPDF_Object> pObj = pArray->GetDirectObjectAt(i);
diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp
index 0bc8564..472f709 100644
--- a/core/fpdfdoc/cpdf_annot.cpp
+++ b/core/fpdfdoc/cpdf_annot.cpp
@@ -229,14 +229,14 @@
CFX_FloatRect CPDF_Annot::BoundingRectFromQuadPoints(
const CPDF_Dictionary* pAnnotDict) {
CFX_FloatRect ret;
- const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
- size_t nQuadPointCount = pArray ? QuadPointCount(pArray) : 0;
+ RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
+ size_t nQuadPointCount = pArray ? QuadPointCount(pArray.Get()) : 0;
if (nQuadPointCount == 0)
return ret;
- ret = RectFromQuadPointsArray(pArray, 0);
+ ret = RectFromQuadPointsArray(pArray.Get(), 0);
for (size_t i = 1; i < nQuadPointCount; ++i) {
- CFX_FloatRect rect = RectFromQuadPointsArray(pArray, i);
+ CFX_FloatRect rect = RectFromQuadPointsArray(pArray.Get(), i);
ret.Union(rect);
}
return ret;
@@ -245,11 +245,11 @@
// static
CFX_FloatRect CPDF_Annot::RectFromQuadPoints(const CPDF_Dictionary* pAnnotDict,
size_t nIndex) {
- const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
- size_t nQuadPointCount = pArray ? QuadPointCount(pArray) : 0;
+ RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
+ size_t nQuadPointCount = pArray ? QuadPointCount(pArray.Get()) : 0;
if (nIndex >= nQuadPointCount)
return CFX_FloatRect();
- return RectFromQuadPointsArray(pArray, nIndex);
+ return RectFromQuadPointsArray(pArray.Get(), nIndex);
}
// static
@@ -449,9 +449,9 @@
const CPDF_Dictionary* pBS = m_pAnnotDict->GetDictFor("BS");
char style_char;
float width;
- const CPDF_Array* pDashArray = nullptr;
+ RetainPtr<const CPDF_Array> pDashArray;
if (!pBS) {
- const CPDF_Array* pBorderArray =
+ RetainPtr<const CPDF_Array> pBorderArray =
m_pAnnotDict->GetArrayFor(pdfium::annotation::kBorder);
style_char = 'S';
if (pBorderArray) {
@@ -487,7 +487,8 @@
if (width <= 0) {
return;
}
- const CPDF_Array* pColor = m_pAnnotDict->GetArrayFor(pdfium::annotation::kC);
+ RetainPtr<const CPDF_Array> pColor =
+ m_pAnnotDict->GetArrayFor(pdfium::annotation::kC);
uint32_t argb = 0xff000000;
if (pColor) {
int R = static_cast<int32_t>(pColor->GetFloatAt(0) * 255);
@@ -506,7 +507,7 @@
if (style_char == 'D') {
if (pDashArray) {
graph_state.m_DashArray =
- ReadArrayElementsToVector(pDashArray, pDashArray->size());
+ ReadArrayElementsToVector(pDashArray.Get(), pDashArray->size());
if (graph_state.m_DashArray.size() % 2)
graph_state.m_DashArray.push_back(graph_state.m_DashArray.back());
} else {
diff --git a/core/fpdfdoc/cpdf_apsettings.cpp b/core/fpdfdoc/cpdf_apsettings.cpp
index fa45551..039708d 100644
--- a/core/fpdfdoc/cpdf_apsettings.cpp
+++ b/core/fpdfdoc/cpdf_apsettings.cpp
@@ -34,7 +34,7 @@
if (!m_pDict)
return {CFX_Color::Type::kTransparent, 0};
- const CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry);
+ RetainPtr<const CPDF_Array> pEntry = m_pDict->GetArrayFor(csEntry);
if (!pEntry)
return {CFX_Color::Type::kTransparent, 0};
@@ -68,7 +68,7 @@
if (!m_pDict)
return 0;
- const CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry);
+ RetainPtr<const CPDF_Array> pEntry = m_pDict->GetArrayFor(csEntry);
return pEntry ? pEntry->GetFloatAt(index) : 0;
}
@@ -76,7 +76,7 @@
if (!m_pDict)
return CFX_Color();
- const CPDF_Array* pEntry = m_pDict->GetArrayFor(csEntry);
+ RetainPtr<const CPDF_Array> pEntry = m_pDict->GetArrayFor(csEntry);
if (!pEntry)
return CFX_Color();
diff --git a/core/fpdfdoc/cpdf_generateap.cpp b/core/fpdfdoc/cpdf_generateap.cpp
index 442a0ea..afa5973 100644
--- a/core/fpdfdoc/cpdf_generateap.cpp
+++ b/core/fpdfdoc/cpdf_generateap.cpp
@@ -324,8 +324,7 @@
if (pBorderStyleDict && pBorderStyleDict->KeyExist("W"))
return pBorderStyleDict->GetFloatFor("W");
- const CPDF_Array* pBorderArray =
- pDict->GetArrayFor(pdfium::annotation::kBorder);
+ auto pBorderArray = pDict->GetArrayFor(pdfium::annotation::kBorder);
if (pBorderArray && pBorderArray->size() > 2)
return pBorderArray->GetFloatAt(2);
@@ -335,9 +334,9 @@
RetainPtr<const CPDF_Array> GetDashArray(const CPDF_Dictionary* pDict) {
const CPDF_Dictionary* pBorderStyleDict = pDict->GetDictFor("BS");
if (pBorderStyleDict && pBorderStyleDict->GetByteStringFor("S") == "D")
- return pdfium::WrapRetain(pBorderStyleDict->GetArrayFor("D"));
+ return pBorderStyleDict->GetArrayFor("D");
- const CPDF_Array* pBorderArray =
+ RetainPtr<const CPDF_Array> pBorderArray =
pDict->GetArrayFor(pdfium::annotation::kBorder);
if (pBorderArray && pBorderArray->size() == 4)
return pBorderArray->GetArrayAt(3);
@@ -529,13 +528,13 @@
ByteString sExtGSDictName = "GS";
sAppStream << "/" << sExtGSDictName << " gs ";
- const CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC");
+ RetainPtr<const CPDF_Array> pInteriorColor = pAnnotDict->GetArrayFor("IC");
sAppStream << GetColorStringWithDefault(
- pInteriorColor, CFX_Color(CFX_Color::Type::kTransparent),
+ pInteriorColor.Get(), CFX_Color(CFX_Color::Type::kTransparent),
PaintOperation::kFill);
sAppStream << GetColorStringWithDefault(
- pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+ pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
float fBorderWidth = GetBorderWidth(pAnnotDict);
@@ -603,12 +602,12 @@
sAppStream << "/" << sExtGSDictName << " gs ";
sAppStream << GetColorStringWithDefault(
- pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+ pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
CFX_Color(CFX_Color::Type::kRGB, 1, 1, 0), PaintOperation::kFill);
- const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
+ RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
if (pArray) {
- size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray);
+ size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray.Get());
for (size_t i = 0; i < nQuadPointCount; ++i) {
CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict, i);
rect.Normalize();
@@ -630,7 +629,7 @@
}
bool GenerateInkAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) {
- const CPDF_Array* pInkList = pAnnotDict->GetArrayFor("InkList");
+ RetainPtr<const CPDF_Array> pInkList = pAnnotDict->GetArrayFor("InkList");
if (!pInkList || pInkList->IsEmpty())
return false;
@@ -643,7 +642,7 @@
fxcrt::ostringstream sAppStream;
sAppStream << "/" << sExtGSDictName << " gs ";
sAppStream << GetColorStringWithDefault(
- pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+ pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
sAppStream << fBorderWidth << " w ";
@@ -708,14 +707,14 @@
sAppStream << "/" << sExtGSDictName << " gs ";
sAppStream << GetColorStringWithDefault(
- pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+ pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
- const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
+ RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
if (pArray) {
static constexpr float kLineWidth = 1.0f;
sAppStream << kLineWidth << " w ";
- size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray);
+ size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray.Get());
for (size_t i = 0; i < nQuadPointCount; ++i) {
CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict, i);
rect.Normalize();
@@ -779,13 +778,13 @@
fxcrt::ostringstream sAppStream;
sAppStream << "/" << sExtGSDictName << " gs ";
- const CPDF_Array* pInteriorColor = pAnnotDict->GetArrayFor("IC");
+ RetainPtr<const CPDF_Array> pInteriorColor = pAnnotDict->GetArrayFor("IC");
sAppStream << GetColorStringWithDefault(
- pInteriorColor, CFX_Color(CFX_Color::Type::kTransparent),
+ pInteriorColor.Get(), CFX_Color(CFX_Color::Type::kTransparent),
PaintOperation::kFill);
sAppStream << GetColorStringWithDefault(
- pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+ pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
float fBorderWidth = GetBorderWidth(pAnnotDict);
@@ -825,15 +824,15 @@
sAppStream << "/" << sExtGSDictName << " gs ";
sAppStream << GetColorStringWithDefault(
- pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+ pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
- const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
+ RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
if (pArray) {
static constexpr float kLineWidth = 1.0f;
static constexpr float kDelta = 2.0f;
sAppStream << kLineWidth << " w ";
- size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray);
+ size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray.Get());
for (size_t i = 0; i < nQuadPointCount; ++i) {
CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict, i);
rect.Normalize();
@@ -875,13 +874,13 @@
sAppStream << "/" << sExtGSDictName << " gs ";
sAppStream << GetColorStringWithDefault(
- pAnnotDict->GetArrayFor(pdfium::annotation::kC),
+ pAnnotDict->GetArrayFor(pdfium::annotation::kC).Get(),
CFX_Color(CFX_Color::Type::kRGB, 0, 0, 0), PaintOperation::kStroke);
- const CPDF_Array* pArray = pAnnotDict->GetArrayFor("QuadPoints");
+ RetainPtr<const CPDF_Array> pArray = pAnnotDict->GetArrayFor("QuadPoints");
if (pArray) {
static constexpr float kLineWidth = 1.0f;
- size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray);
+ size_t nQuadPointCount = CPDF_Annot::QuadPointCount(pArray.Get());
for (size_t i = 0; i < nQuadPointCount; ++i) {
CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict, i);
rect.Normalize();
@@ -998,7 +997,7 @@
if (pBSDict->KeyExist("W"))
fBorderWidth = pBSDict->GetFloatFor("W");
- if (const CPDF_Array* pArray = pBSDict->GetArrayFor("D")) {
+ if (RetainPtr<const CPDF_Array> pArray = pBSDict->GetArrayFor("D")) {
dsBorder = CPVT_Dash(pArray->GetIntegerAt(0), pArray->GetIntegerAt(1),
pArray->GetIntegerAt(2));
}
@@ -1031,7 +1030,8 @@
CFX_Color crBorder;
CFX_Color crBG;
if (pMKDict) {
- const CPDF_Array* pArray = pMKDict->GetArrayFor(pdfium::appearance::kBC);
+ RetainPtr<const CPDF_Array> pArray =
+ pMKDict->GetArrayFor(pdfium::appearance::kBC);
if (pArray)
crBorder = fpdfdoc::CFXColorFromArray(*pArray);
pArray = pMKDict->GetArrayFor(pdfium::appearance::kBG);
diff --git a/core/fpdfdoc/cpdf_iconfit.cpp b/core/fpdfdoc/cpdf_iconfit.cpp
index cf8202f..d2154ef 100644
--- a/core/fpdfdoc/cpdf_iconfit.cpp
+++ b/core/fpdfdoc/cpdf_iconfit.cpp
@@ -48,7 +48,7 @@
if (!m_pDict)
return {fLeft, fBottom};
- const CPDF_Array* pA = m_pDict->GetArrayFor("A");
+ RetainPtr<const CPDF_Array> pA = m_pDict->GetArrayFor("A");
if (!pA)
return {fLeft, fBottom};
@@ -68,7 +68,7 @@
if (!m_pDict)
return CFX_PointF();
- const CPDF_Array* pA = m_pDict->GetArrayFor("A");
+ RetainPtr<const CPDF_Array> pA = m_pDict->GetArrayFor("A");
if (!pA)
return CFX_PointF();
diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp
index cac1dde..7cbaa9a 100644
--- a/core/fpdfdoc/cpdf_interactiveform.cpp
+++ b/core/fpdfdoc/cpdf_interactiveform.cpp
@@ -621,7 +621,8 @@
const CPDF_Page* pPage,
const CFX_PointF& point,
int* z_order) const {
- const CPDF_Array* pAnnotList = pPage->GetDict()->GetArrayFor("Annots");
+ RetainPtr<const CPDF_Array> pAnnotList =
+ pPage->GetDict()->GetArrayFor("Annots");
if (!pAnnotList)
return nullptr;
@@ -661,7 +662,7 @@
if (!m_pFormDict)
return 0;
- const CPDF_Array* pArray = m_pFormDict->GetArrayFor("CO");
+ RetainPtr<const CPDF_Array> pArray = m_pFormDict->GetArrayFor("CO");
return pArray ? fxcrt::CollectionSize<int>(*pArray) : 0;
}
@@ -669,7 +670,7 @@
if (!m_pFormDict || index < 0)
return nullptr;
- const CPDF_Array* pArray = m_pFormDict->GetArrayFor("CO");
+ RetainPtr<const CPDF_Array> pArray = m_pFormDict->GetArrayFor("CO");
if (!pArray)
return nullptr;
@@ -683,7 +684,7 @@
if (!m_pFormDict)
return -1;
- const CPDF_Array* pArray = m_pFormDict->GetArrayFor("CO");
+ RetainPtr<const CPDF_Array> pArray = m_pFormDict->GetArrayFor("CO");
if (!pArray)
return -1;
diff --git a/core/fpdfdoc/cpdf_nametree.cpp b/core/fpdfdoc/cpdf_nametree.cpp
index e3f314d..a2860b0 100644
--- a/core/fpdfdoc/cpdf_nametree.cpp
+++ b/core/fpdfdoc/cpdf_nametree.cpp
@@ -99,7 +99,7 @@
if (pLimits)
std::tie(csLeft, csRight) = GetNodeLimitsAndSanitize(pLimits.Get());
- const CPDF_Array* pNames = pNode->GetArrayFor("Names");
+ RetainPtr<const CPDF_Array> pNames = pNode->GetArrayFor("Names");
if (pNames) {
if (pNames != pFind)
return false;
@@ -152,7 +152,8 @@
WideString csNewLeft = csRight;
WideString csNewRight = csLeft;
for (size_t j = 0; j < pKids->size(); ++j) {
- const CPDF_Array* pKidLimits = pKids->GetDictAt(j)->GetArrayFor("Limits");
+ RetainPtr<const CPDF_Array> pKidLimits =
+ pKids->GetDictAt(j)->GetArrayFor("Limits");
DCHECK(pKidLimits);
if (pKidLimits->GetUnicodeTextAt(0).Compare(csNewLeft) < 0)
csNewLeft = pKidLimits->GetUnicodeTextAt(0);
@@ -364,11 +365,11 @@
if (!inserted)
return 0;
- const CPDF_Array* pNames = pNode->GetArrayFor("Names");
+ RetainPtr<const CPDF_Array> pNames = pNode->GetArrayFor("Names");
if (pNames)
return pNames->size() / 2;
- const CPDF_Array* pKids = pNode->GetArrayFor("Kids");
+ RetainPtr<const CPDF_Array> pKids = pNode->GetArrayFor("Kids");
if (!pKids)
return 0;
@@ -390,7 +391,7 @@
return array;
RetainPtr<const CPDF_Dictionary> dict = ToDictionary(obj);
if (dict)
- return pdfium::WrapRetain(dict->GetArrayFor("D"));
+ return dict->GetArrayFor("D");
return nullptr;
}
diff --git a/core/fpdfdoc/cpdf_nametree_unittest.cpp b/core/fpdfdoc/cpdf_nametree_unittest.cpp
index afa5d7b..205c213 100644
--- a/core/fpdfdoc/cpdf_nametree_unittest.cpp
+++ b/core/fpdfdoc/cpdf_nametree_unittest.cpp
@@ -38,7 +38,7 @@
const char* least,
const char* greatest) {
ASSERT_TRUE(node);
- const CPDF_Array* limits = node->GetArrayFor("Limits");
+ RetainPtr<const CPDF_Array> limits = node->GetArrayFor("Limits");
ASSERT_TRUE(limits);
EXPECT_EQ(2u, limits->size());
RetainPtr<const CPDF_String> left = limits->GetStringAt(0);
@@ -270,9 +270,9 @@
pKid1->GetArrayFor("Kids")->GetDictAt(1);
ASSERT_TRUE(pGrandKid3);
CheckLimitsArray(pGrandKid3.Get(), "9.txt", "99.txt");
- const CPDF_Array* pNames = pGrandKid3->GetArrayFor("Names");
- CheckNameKeyValue(pNames, 0, "9.txt", 999);
- CheckNameKeyValue(pNames, 1, "99.txt", 99);
+ RetainPtr<const CPDF_Array> pNames = pGrandKid3->GetArrayFor("Names");
+ CheckNameKeyValue(pNames.Get(), 0, "9.txt", 999);
+ CheckNameKeyValue(pNames.Get(), 1, "99.txt", 99);
// Check that the nodes on the third level has the expected limits and names.
RetainPtr<const CPDF_Dictionary> pGreatGrandKid4 =
@@ -280,19 +280,19 @@
ASSERT_TRUE(pGreatGrandKid4);
CheckLimitsArray(pGreatGrandKid4.Get(), "0.txt", "2.txt");
pNames = pGreatGrandKid4->GetArrayFor("Names");
- CheckNameKeyValue(pNames, 0, "0.txt", -5);
- CheckNameKeyValue(pNames, 1, "1.txt", 111);
- CheckNameKeyValue(pNames, 2, "2.txt", 222);
+ CheckNameKeyValue(pNames.Get(), 0, "0.txt", -5);
+ CheckNameKeyValue(pNames.Get(), 1, "1.txt", 111);
+ CheckNameKeyValue(pNames.Get(), 2, "2.txt", 222);
RetainPtr<const CPDF_Dictionary> pGreatGrandKid5 =
pGrandKid2->GetArrayFor("Kids")->GetDictAt(1);
ASSERT_TRUE(pGreatGrandKid5);
CheckLimitsArray(pGreatGrandKid5.Get(), "3.txt", "6.txt");
pNames = pGreatGrandKid5->GetArrayFor("Names");
- CheckNameKeyValue(pNames, 0, "3.txt", 333);
- CheckNameKeyValue(pNames, 1, "4.txt", 444);
- CheckNameKeyValue(pNames, 2, "5.txt", 555);
- CheckNameKeyValue(pNames, 3, "6.txt", 666);
+ CheckNameKeyValue(pNames.Get(), 0, "3.txt", 333);
+ CheckNameKeyValue(pNames.Get(), 1, "4.txt", 444);
+ CheckNameKeyValue(pNames.Get(), 2, "5.txt", 555);
+ CheckNameKeyValue(pNames.Get(), 3, "6.txt", 666);
}
TEST(cpdf_nametree, DeleteFromKids) {
diff --git a/core/fpdfdoc/cpdf_numbertree.cpp b/core/fpdfdoc/cpdf_numbertree.cpp
index a2c09fc..71cb3ef 100644
--- a/core/fpdfdoc/cpdf_numbertree.cpp
+++ b/core/fpdfdoc/cpdf_numbertree.cpp
@@ -13,12 +13,12 @@
// TODO(tsepez): return retained objects.
const CPDF_Object* SearchNumberNode(const CPDF_Dictionary* pNode, int num) {
- const CPDF_Array* pLimits = pNode->GetArrayFor("Limits");
+ RetainPtr<const CPDF_Array> pLimits = pNode->GetArrayFor("Limits");
if (pLimits &&
(num < pLimits->GetIntegerAt(0) || num > pLimits->GetIntegerAt(1))) {
return nullptr;
}
- const CPDF_Array* pNumbers = pNode->GetArrayFor("Nums");
+ RetainPtr<const CPDF_Array> pNumbers = pNode->GetArrayFor("Nums");
if (pNumbers) {
for (size_t i = 0; i < pNumbers->size() / 2; i++) {
int index = pNumbers->GetIntegerAt(i * 2);
@@ -30,7 +30,7 @@
return nullptr;
}
- const CPDF_Array* pKids = pNode->GetArrayFor("Kids");
+ RetainPtr<const CPDF_Array> pKids = pNode->GetArrayFor("Kids");
if (!pKids)
return nullptr;
diff --git a/core/fpdfdoc/cpdf_viewerpreferences.cpp b/core/fpdfdoc/cpdf_viewerpreferences.cpp
index c6ebe97..19d0780 100644
--- a/core/fpdfdoc/cpdf_viewerpreferences.cpp
+++ b/core/fpdfdoc/cpdf_viewerpreferences.cpp
@@ -31,9 +31,10 @@
return pDict ? pDict->GetIntegerFor("NumCopies") : 1;
}
+// TODO(tsepez): return retained references.
const CPDF_Array* CPDF_ViewerPreferences::PrintPageRange() const {
const CPDF_Dictionary* pDict = GetViewerPreferences();
- return pDict ? pDict->GetArrayFor("PrintPageRange") : nullptr;
+ return pDict ? pDict->GetArrayFor("PrintPageRange").Get() : nullptr;
}
ByteString CPDF_ViewerPreferences::Duplex() const {
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 09f233c..90f55c1 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -2196,7 +2196,7 @@
return false;
RetainPtr<const CPDF_Dictionary> pDict =
pPattern->GetShadingObject()->GetDict();
- const CPDF_Array* pCoords = pDict->GetArrayFor("Coords");
+ RetainPtr<const CPDF_Array> pCoords = pDict->GetArrayFor("Coords");
if (!pCoords && kCoonsPatchMeshShading != shadingType)
return false;
// TODO(caryclark) Respect Domain[0], Domain[1]. (Don't know what they do
@@ -2226,7 +2226,7 @@
return false;
}
}
- const CPDF_Array* pArray = pDict->GetArrayFor("Extend");
+ RetainPtr<const CPDF_Array> pArray = pDict->GetArrayFor("Extend");
bool clipStart = !pArray || !pArray->GetIntegerAt(0);
bool clipEnd = !pArray || !pArray->GetIntegerAt(1);
SkPaint paint;
diff --git a/fpdfsdk/cpdfsdk_baannot.cpp b/fpdfsdk/cpdfsdk_baannot.cpp
index 45ac08b..dbc32a4 100644
--- a/fpdfsdk/cpdfsdk_baannot.cpp
+++ b/fpdfsdk/cpdfsdk_baannot.cpp
@@ -132,7 +132,7 @@
}
int CPDFSDK_BAAnnot::GetBorderWidth() const {
- const CPDF_Array* pBorder =
+ RetainPtr<const CPDF_Array> pBorder =
GetAnnotDict()->GetArrayFor(pdfium::annotation::kBorder);
if (pBorder)
return pBorder->GetIntegerAt(2);
@@ -186,7 +186,7 @@
return BorderStyle::kUnderline;
}
- const CPDF_Array* pBorder =
+ RetainPtr<const CPDF_Array> pBorder =
GetAnnotDict()->GetArrayFor(pdfium::annotation::kBorder);
if (pBorder) {
if (pBorder->size() >= 4) {
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
index 3459125..2ab2472 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
@@ -659,7 +659,7 @@
if (!pRoot)
return false;
- const CPDF_Object* pOpenAction = pRoot->GetDictFor("OpenAction");
+ RetainPtr<const CPDF_Object> pOpenAction(pRoot->GetDictFor("OpenAction"));
if (!pOpenAction)
pOpenAction = pRoot->GetArrayFor("OpenAction");
if (!pOpenAction)
diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp
index fef517b..762cfc3 100644
--- a/fpdfsdk/cpdfsdk_helpers.cpp
+++ b/fpdfsdk/cpdfsdk_helpers.cpp
@@ -226,7 +226,8 @@
const CPDF_Array* GetQuadPointsArrayFromDictionary(
const CPDF_Dictionary* dict) {
- return dict->GetArrayFor("QuadPoints");
+ // TODO(tsepez): return retained object.
+ return dict->GetArrayFor("QuadPoints").Get();
}
RetainPtr<CPDF_Array> GetMutableQuadPointsArrayFromDictionary(
@@ -364,7 +365,7 @@
const CPDF_Dictionary* pJSDict = pNameDict->GetDictFor("JavaScript");
if (pJSDict) {
- const CPDF_Array* pArray = pJSDict->GetArrayFor("Names");
+ RetainPtr<const CPDF_Array> pArray = pJSDict->GetArrayFor("Names");
if (pArray) {
for (size_t i = 0; i < pArray->size(); i++) {
ByteString cbStr = pArray->GetByteStringAt(i);
diff --git a/fpdfsdk/cpdfsdk_interactiveform.cpp b/fpdfsdk/cpdfsdk_interactiveform.cpp
index f3709b5..700b352 100644
--- a/fpdfsdk/cpdfsdk_interactiveform.cpp
+++ b/fpdfsdk/cpdfsdk_interactiveform.cpp
@@ -81,7 +81,7 @@
if (!pMainDict)
return ByteString();
- const CPDF_Array* pFields = pMainDict->GetArrayFor("Fields");
+ RetainPtr<const CPDF_Array> pFields = pMainDict->GetArrayFor("Fields");
if (!pFields)
return ByteString();
@@ -180,7 +180,7 @@
if (!pPageDict)
continue;
- const CPDF_Array* pAnnots = pPageDict->GetArrayFor("Annots");
+ RetainPtr<const CPDF_Array> pAnnots = pPageDict->GetArrayFor("Annots");
if (!pAnnots)
continue;
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index 253e25f..bed7b61 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -323,14 +323,16 @@
return pFormControl ? pForm->GetWidget(pFormControl) : nullptr;
}
+// TODO(tsepez): return retained references.
const CPDF_Array* GetInkList(FPDF_ANNOTATION annot) {
FPDF_ANNOTATION_SUBTYPE subtype = FPDFAnnot_GetSubtype(annot);
if (subtype != FPDF_ANNOT_INK)
return nullptr;
const CPDF_Dictionary* annot_dict = GetAnnotDictFromFPDFAnnotation(annot);
- return annot_dict ? annot_dict->GetArrayFor(pdfium::annotation::kInkList)
- : nullptr;
+ return annot_dict
+ ? annot_dict->GetArrayFor(pdfium::annotation::kInkList).Get()
+ : nullptr;
}
} // namespace
@@ -384,7 +386,7 @@
if (!pPage)
return 0;
- const CPDF_Array* pAnnots = pPage->GetDict()->GetArrayFor("Annots");
+ RetainPtr<const CPDF_Array> pAnnots = pPage->GetDict()->GetArrayFor("Annots");
return pAnnots ? fxcrt::CollectionSize<int>(*pAnnots) : 0;
}
@@ -421,7 +423,7 @@
if (!pAnnotDict)
return -1;
- const CPDF_Array* pAnnots = pPage->GetDict()->GetArrayFor("Annots");
+ RetainPtr<const CPDF_Array> pAnnots = pPage->GetDict()->GetArrayFor("Annots");
if (!pAnnots)
return -1;
@@ -709,7 +711,7 @@
if (HasAPStream(pAnnotDict.Get()))
return false;
- const CPDF_Array* pColor = pAnnotDict->GetArrayFor(
+ RetainPtr<const CPDF_Array> pColor = pAnnotDict->GetArrayFor(
type == FPDFANNOT_COLORTYPE_InteriorColor ? "IC" : "C");
*A = (pAnnotDict->KeyExist("CA") ? pAnnotDict->GetFloatFor("CA") : 1) * 255.f;
if (!pColor) {
@@ -878,7 +880,7 @@
if (!annot_dict)
return 0;
- const CPDF_Array* vertices =
+ RetainPtr<const CPDF_Array> vertices =
annot_dict->GetArrayFor(pdfium::annotation::kVertices);
if (!vertices)
return 0;
@@ -940,7 +942,8 @@
if (!annot_dict)
return false;
- const CPDF_Array* line = annot_dict->GetArrayFor(pdfium::annotation::kL);
+ RetainPtr<const CPDF_Array> line =
+ annot_dict->GetArrayFor(pdfium::annotation::kL);
if (!line || line->size() < 4)
return false;
@@ -984,7 +987,7 @@
if (!annot_dict)
return false;
- const CPDF_Array* border =
+ RetainPtr<const CPDF_Array> border =
annot_dict->GetArrayFor(pdfium::annotation::kBorder);
if (!border || border->size() < 3)
return false;
diff --git a/fpdfsdk/fpdf_annot_embeddertest.cpp b/fpdfsdk/fpdf_annot_embeddertest.cpp
index 3d07911..fa7a14a 100644
--- a/fpdfsdk/fpdf_annot_embeddertest.cpp
+++ b/fpdfsdk/fpdf_annot_embeddertest.cpp
@@ -272,7 +272,7 @@
EXPECT_EQ(0, FPDFAnnot_AddInkStroke(ink_annot.get(), kFirstInkStroke,
kFirstStrokePointCount));
- const CPDF_Array* inklist = annot_dict->GetArrayFor("InkList");
+ RetainPtr<const CPDF_Array> inklist = annot_dict->GetArrayFor("InkList");
ASSERT_TRUE(inklist);
EXPECT_EQ(1u, inklist->size());
EXPECT_EQ(kFirstStrokePointCount * 2, inklist->GetArrayAt(0)->size());
@@ -328,7 +328,7 @@
EXPECT_EQ(0,
FPDFAnnot_AddInkStroke(ink_annot.get(), kInkStroke, kPointCount));
- const CPDF_Array* inklist = annot_dict->GetArrayFor("InkList");
+ RetainPtr<const CPDF_Array> inklist = annot_dict->GetArrayFor("InkList");
ASSERT_TRUE(inklist);
ASSERT_EQ(1u, inklist->size());
EXPECT_EQ(kPointCount * 2, inklist->GetArrayAt(0)->size());
diff --git a/fpdfsdk/fpdf_edit_embeddertest.cpp b/fpdfsdk/fpdf_edit_embeddertest.cpp
index 2131afb..7029c38 100644
--- a/fpdfsdk/fpdf_edit_embeddertest.cpp
+++ b/fpdfsdk/fpdf_edit_embeddertest.cpp
@@ -115,7 +115,7 @@
EXPECT_TRUE(FontStyleIsNonSymbolic(font_flags));
ASSERT_TRUE(font_desc->KeyExist("FontBBox"));
- const CPDF_Array* fontBBox = font_desc->GetArrayFor("FontBBox");
+ RetainPtr<const CPDF_Array> fontBBox = font_desc->GetArrayFor("FontBBox");
ASSERT_TRUE(fontBBox);
EXPECT_EQ(4u, fontBBox->size());
// Check that the coordinates are in the preferred order according to spec
@@ -2954,7 +2954,7 @@
EXPECT_EQ(32, font_dict->GetIntegerFor("FirstChar"));
EXPECT_EQ(255, font_dict->GetIntegerFor("LastChar"));
- const CPDF_Array* widths_array = font_dict->GetArrayFor("Widths");
+ RetainPtr<const CPDF_Array> widths_array = font_dict->GetArrayFor("Widths");
ASSERT_TRUE(widths_array);
ASSERT_EQ(224u, widths_array->size());
EXPECT_EQ(250, widths_array->GetFloatAt(0));
@@ -2983,7 +2983,7 @@
EXPECT_EQ(32, font_dict->GetIntegerFor("FirstChar"));
EXPECT_EQ(255, font_dict->GetIntegerFor("LastChar"));
- const CPDF_Array* widths_array = font_dict->GetArrayFor("Widths");
+ RetainPtr<const CPDF_Array> widths_array = font_dict->GetArrayFor("Widths");
ASSERT_TRUE(widths_array);
ASSERT_EQ(224u, widths_array->size());
EXPECT_EQ(600, widths_array->GetFloatAt(33));
@@ -3009,7 +3009,7 @@
EXPECT_EQ("Type0", font_dict->GetNameFor("Subtype"));
EXPECT_EQ("Tinos-Regular-Identity-H", font_dict->GetNameFor("BaseFont"));
EXPECT_EQ("Identity-H", font_dict->GetNameFor("Encoding"));
- const CPDF_Array* descendant_array =
+ RetainPtr<const CPDF_Array> descendant_array =
font_dict->GetArrayFor("DescendantFonts");
ASSERT_TRUE(descendant_array);
EXPECT_EQ(1u, descendant_array->size());
@@ -3037,10 +3037,10 @@
CheckFontDescriptor(cidfont_dict.Get(), FPDF_FONT_TYPE1, false, false, span);
// Check widths
- const CPDF_Array* widths_array = cidfont_dict->GetArrayFor("W");
+ RetainPtr<const CPDF_Array> widths_array = cidfont_dict->GetArrayFor("W");
ASSERT_TRUE(widths_array);
EXPECT_GT(widths_array->size(), 1u);
- CheckCompositeFontWidths(widths_array, typed_font);
+ CheckCompositeFontWidths(widths_array.Get(), typed_font);
}
TEST_F(FPDFEditEmbedderTest, LoadCIDType2Font) {
@@ -3060,7 +3060,7 @@
EXPECT_EQ("Type0", font_dict->GetNameFor("Subtype"));
EXPECT_EQ("Arimo-Italic", font_dict->GetNameFor("BaseFont"));
EXPECT_EQ("Identity-H", font_dict->GetNameFor("Encoding"));
- const CPDF_Array* descendant_array =
+ RetainPtr<const CPDF_Array> descendant_array =
font_dict->GetArrayFor("DescendantFonts");
ASSERT_TRUE(descendant_array);
EXPECT_EQ(1u, descendant_array->size());
@@ -3081,9 +3081,9 @@
span);
// Check widths
- const CPDF_Array* widths_array = cidfont_dict->GetArrayFor("W");
+ RetainPtr<const CPDF_Array> widths_array = cidfont_dict->GetArrayFor("W");
ASSERT_TRUE(widths_array);
- CheckCompositeFontWidths(widths_array, typed_font);
+ CheckCompositeFontWidths(widths_array.Get(), typed_font);
}
TEST_F(FPDFEditEmbedderTest, NormalizeNegativeRotation) {
diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
index 81fdeb2..dd63a6e 100644
--- a/fpdfsdk/fpdf_flatten.cpp
+++ b/fpdfsdk/fpdf_flatten.cpp
@@ -93,7 +93,7 @@
return FLATTEN_FAIL;
GetContentsRect(pSourceDoc, pPageDic, pRectArray);
- const CPDF_Array* pAnnots = pPageDic->GetArrayFor("Annots");
+ RetainPtr<const CPDF_Array> pAnnots = pPageDic->GetArrayFor("Annots");
if (!pAnnots)
return FLATTEN_NOTHINGTODO;
diff --git a/fpdfsdk/fpdf_signature.cpp b/fpdfsdk/fpdf_signature.cpp
index 8fce2f4..aeb7c56 100644
--- a/fpdfsdk/fpdf_signature.cpp
+++ b/fpdfsdk/fpdf_signature.cpp
@@ -26,11 +26,11 @@
if (!acro_form)
return signatures;
- const CPDF_Array* fields = acro_form->GetArrayFor("Fields");
+ RetainPtr<const CPDF_Array> fields = acro_form->GetArrayFor("Fields");
if (!fields)
return signatures;
- CPDF_ArrayLocker locker(fields);
+ CPDF_ArrayLocker locker(std::move(fields));
for (auto& field : locker) {
RetainPtr<CPDF_Dictionary> field_dict = field->GetMutableDict();
if (field_dict && field_dict->GetNameFor("FT") == "Sig")
@@ -97,7 +97,7 @@
if (!value_dict)
return 0;
- const CPDF_Array* byte_range = value_dict->GetArrayFor("ByteRange");
+ RetainPtr<const CPDF_Array> byte_range = value_dict->GetArrayFor("ByteRange");
if (!byte_range)
return 0;
@@ -180,11 +180,11 @@
if (!value_dict)
return permission;
- const CPDF_Array* references = value_dict->GetArrayFor("Reference");
+ RetainPtr<const CPDF_Array> references = value_dict->GetArrayFor("Reference");
if (!references)
return permission;
- CPDF_ArrayLocker locker(references);
+ CPDF_ArrayLocker locker(std::move(references));
for (auto& reference : locker) {
const CPDF_Dictionary* reference_dict = reference->GetDict().Get();
if (!reference_dict)
diff --git a/fpdfsdk/fpdf_structtree.cpp b/fpdfsdk/fpdf_structtree.cpp
index e18bd84..ed408bb 100644
--- a/fpdfsdk/fpdf_structtree.cpp
+++ b/fpdfsdk/fpdf_structtree.cpp
@@ -184,7 +184,7 @@
CPDF_StructElement* elem =
CPDFStructElementFromFPDFStructElement(struct_element);
const CPDF_Dictionary* dict = elem ? elem->GetDict() : nullptr;
- const CPDF_Array* array = dict ? dict->GetArrayFor("A") : nullptr;
+ RetainPtr<const CPDF_Array> array = dict ? dict->GetArrayFor("A") : nullptr;
if (!array)
return 0;
CPDF_ArrayLocker locker(array);
diff --git a/fpdfsdk/fpdf_transformpage.cpp b/fpdfsdk/fpdf_transformpage.cpp
index 4254666..f274512 100644
--- a/fpdfsdk/fpdf_transformpage.cpp
+++ b/fpdfsdk/fpdf_transformpage.cpp
@@ -50,7 +50,7 @@
if (!page || !left || !bottom || !right || !top)
return false;
- const CPDF_Array* pArray = page->GetDict()->GetArrayFor(key);
+ RetainPtr<const CPDF_Array> pArray = page->GetDict()->GetArrayFor(key);
if (!pArray)
return false;
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index 0ba31a1..97a4a03 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -1134,7 +1134,7 @@
auto name_tree = CPDF_NameTree::Create(pDoc, "Dests");
size_t name_tree_count = name_tree ? name_tree->GetCount() : 0;
- const CPDF_Object* pDestObj = nullptr;
+ RetainPtr<const CPDF_Object> pDestObj;
WideString wsName;
if (static_cast<size_t>(index) >= name_tree_count) {
// If |index| is out of bounds, then try to retrieve the Nth old style named