Do not cache unowned dictionary in CPDF_ShadingPattern.
It may change unexpectedly. We would like to reduce the unowned
ptrs to parser objects over time ...
Change-Id: I394d558a20bb1054c75fccbac4d1b9c57e360966
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/53671
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_shadingpattern.cpp b/core/fpdfapi/page/cpdf_shadingpattern.cpp
index bb0291d..0a6f4c6 100644
--- a/core/fpdfapi/page/cpdf_shadingpattern.cpp
+++ b/core/fpdfapi/page/cpdf_shadingpattern.cpp
@@ -30,14 +30,10 @@
CPDF_Object* pPatternObj,
bool bShading,
const CFX_Matrix& parentMatrix)
- : CPDF_Pattern(pDoc, bShading ? nullptr : pPatternObj, parentMatrix),
- m_bShadingObj(bShading),
- m_pShadingObj(pPatternObj) {
+ : CPDF_Pattern(pDoc, pPatternObj, parentMatrix), m_bShading(bShading) {
ASSERT(document());
- if (!bShading) {
- m_pShadingObj = pattern_obj()->GetDict()->GetDirectObjectFor("Shading");
+ if (!bShading)
SetPatternToFormMatrix();
- }
}
CPDF_ShadingPattern::~CPDF_ShadingPattern() {
@@ -63,8 +59,9 @@
if (m_ShadingType != kInvalidShading)
return true;
+ const CPDF_Object* pShadingObj = GetShadingObject();
const CPDF_Dictionary* pShadingDict =
- m_pShadingObj ? m_pShadingObj->GetDict() : nullptr;
+ pShadingObj ? pShadingObj->GetDict() : nullptr;
if (!pShadingDict)
return false;
@@ -96,12 +93,17 @@
return Validate();
}
+const CPDF_Object* CPDF_ShadingPattern::GetShadingObject() const {
+ return m_bShading ? pattern_obj()
+ : pattern_obj()->GetDict()->GetDirectObjectFor("Shading");
+}
+
bool CPDF_ShadingPattern::Validate() const {
if (m_ShadingType == kInvalidShading)
return false;
// We expect to have a stream if our shading type is a mesh.
- if (IsMeshShading() && !ToStream(m_pShadingObj.Get()))
+ if (IsMeshShading() && !ToStream(GetShadingObject()))
return false;
// Validate color space
diff --git a/core/fpdfapi/page/cpdf_shadingpattern.h b/core/fpdfapi/page/cpdf_shadingpattern.h
index dbf8087..a59ee51 100644
--- a/core/fpdfapi/page/cpdf_shadingpattern.h
+++ b/core/fpdfapi/page/cpdf_shadingpattern.h
@@ -53,8 +53,8 @@
bool Load();
ShadingType GetShadingType() const { return m_ShadingType; }
- bool IsShadingObject() const { return m_bShadingObj; }
- const CPDF_Object* GetShadingObject() const { return m_pShadingObj.Get(); }
+ bool IsShadingObject() const { return m_bShading; }
+ const CPDF_Object* GetShadingObject() const;
const CPDF_ColorSpace* GetCS() const { return m_pCS.Get(); }
const std::vector<std::unique_ptr<CPDF_Function>>& GetFuncs() const {
return m_pFunctions;
@@ -68,8 +68,7 @@
uint32_t nExpectedNumOutputs) const;
ShadingType m_ShadingType = kInvalidShading;
- const bool m_bShadingObj;
- UnownedPtr<const CPDF_Object> m_pShadingObj;
+ const bool m_bShading;
// Still keep |m_pCS| as some CPDF_ColorSpace (name object) are not managed
// as counted objects. Refer to CPDF_DocPageData::GetColorSpace.