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.