Return retained result from GetShadingObject()

Resolve a TODO() from the previous CL.

Change-Id: I12e5ad56fd681322b2782568ddb4cbe8be16f2b4
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/98771
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_pattern.h b/core/fpdfapi/page/cpdf_pattern.h
index 36d64ad..118e840 100644
--- a/core/fpdfapi/page/cpdf_pattern.h
+++ b/core/fpdfapi/page/cpdf_pattern.h
@@ -7,13 +7,13 @@
 #ifndef CORE_FPDFAPI_PAGE_CPDF_PATTERN_H_
 #define CORE_FPDFAPI_PAGE_CPDF_PATTERN_H_
 
+#include "core/fpdfapi/parser/cpdf_object.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/observed_ptr.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/unowned_ptr.h"
 
 class CPDF_Document;
-class CPDF_Object;
 class CPDF_ShadingPattern;
 class CPDF_TilingPattern;
 
@@ -29,7 +29,7 @@
 
   // All the getters that return pointers return non-NULL pointers.
   CPDF_Document* document() const { return m_pDocument.Get(); }
-  CPDF_Object* pattern_obj() const { return m_pPatternObj.Get(); }
+  RetainPtr<CPDF_Object> pattern_obj() const { return m_pPatternObj; }
   const CFX_Matrix& pattern_to_form() const { return m_Pattern2Form; }
   const CFX_Matrix& parent_matrix() const { return m_ParentMatrix; }
 
diff --git a/core/fpdfapi/page/cpdf_shadingpattern.cpp b/core/fpdfapi/page/cpdf_shadingpattern.cpp
index db51f4c..00f50b0 100644
--- a/core/fpdfapi/page/cpdf_shadingpattern.cpp
+++ b/core/fpdfapi/page/cpdf_shadingpattern.cpp
@@ -51,7 +51,7 @@
   if (m_ShadingType != kInvalidShading)
     return true;
 
-  const CPDF_Object* pShadingObj = GetShadingObject();
+  RetainPtr<const CPDF_Object> pShadingObj = GetShadingObject();
   RetainPtr<const CPDF_Dictionary> pShadingDict =
       pShadingObj ? pShadingObj->GetDict() : nullptr;
   if (!pShadingDict)
@@ -87,10 +87,9 @@
   return Validate();
 }
 
-const CPDF_Object* CPDF_ShadingPattern::GetShadingObject() const {
-  return m_bShading
-             ? pattern_obj()
-             : pattern_obj()->GetDict()->GetDirectObjectFor("Shading").Get();
+RetainPtr<const CPDF_Object> CPDF_ShadingPattern::GetShadingObject() const {
+  return m_bShading ? pattern_obj()
+                    : pattern_obj()->GetDict()->GetDirectObjectFor("Shading");
 }
 
 bool CPDF_ShadingPattern::Validate() const {
diff --git a/core/fpdfapi/page/cpdf_shadingpattern.h b/core/fpdfapi/page/cpdf_shadingpattern.h
index 2a99d4e..7f741a0 100644
--- a/core/fpdfapi/page/cpdf_shadingpattern.h
+++ b/core/fpdfapi/page/cpdf_shadingpattern.h
@@ -54,7 +54,7 @@
 
   ShadingType GetShadingType() const { return m_ShadingType; }
   bool IsShadingObject() const { return m_bShading; }
-  const CPDF_Object* GetShadingObject() const;
+  RetainPtr<const CPDF_Object> GetShadingObject() const;
   RetainPtr<CPDF_ColorSpace> GetCS() const { return m_pCS; }
   const std::vector<std::unique_ptr<CPDF_Function>>& GetFuncs() const {
     return m_pFunctions;
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 347a7aa..794935b 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -66,7 +66,7 @@
 CFX_FloatRect GetShadingBBox(CPDF_ShadingPattern* pShading,
                              const CFX_Matrix& matrix) {
   ShadingType type = pShading->GetShadingType();
-  RetainPtr<const CPDF_Stream> pStream(ToStream(pShading->GetShadingObject()));
+  RetainPtr<const CPDF_Stream> pStream = ToStream(pShading->GetShadingObject());
   RetainPtr<CPDF_ColorSpace> pCS = pShading->GetCS();
   if (!pStream || !pCS)
     return CFX_FloatRect();
diff --git a/core/fpdfapi/render/cpdf_rendershading.cpp b/core/fpdfapi/render/cpdf_rendershading.cpp
index fa098c8..df6e23d 100644
--- a/core/fpdfapi/render/cpdf_rendershading.cpp
+++ b/core/fpdfapi/render/cpdf_rendershading.cpp
@@ -941,8 +941,8 @@
     case kFreeFormGouraudTriangleMeshShading: {
       // The shading object can be a stream or a dictionary. We do not handle
       // the case of dictionary at the moment.
-      RetainPtr<const CPDF_Stream> pStream(
-          ToStream(pPattern->GetShadingObject()));
+      RetainPtr<const CPDF_Stream> pStream =
+          ToStream(pPattern->GetShadingObject());
       if (pStream) {
         DrawFreeGouraudShading(pBitmap, final_matrix, std::move(pStream), funcs,
                                pColorSpace, alpha);
@@ -952,8 +952,8 @@
     case kLatticeFormGouraudTriangleMeshShading: {
       // The shading object can be a stream or a dictionary. We do not handle
       // the case of dictionary at the moment.
-      RetainPtr<const CPDF_Stream> pStream(
-          ToStream(pPattern->GetShadingObject()));
+      RetainPtr<const CPDF_Stream> pStream =
+          ToStream(pPattern->GetShadingObject());
       if (pStream) {
         DrawLatticeGouraudShading(pBitmap, final_matrix, std::move(pStream),
                                   funcs, pColorSpace, alpha);
@@ -964,9 +964,8 @@
     case kTensorProductPatchMeshShading: {
       // The shading object can be a stream or a dictionary. We do not handle
       // the case of dictionary at the moment.
-      // TODO(tsepez): GetShadinObject() should return retained object.
-      RetainPtr<const CPDF_Stream> pStream(
-          ToStream(pPattern->GetShadingObject()));
+      RetainPtr<const CPDF_Stream> pStream =
+          ToStream(pPattern->GetShadingObject());
       if (pStream) {
         DrawCoonPatchMeshes(pPattern->GetShadingType(), pBitmap, final_matrix,
                             std::move(pStream), funcs, pColorSpace,
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 38638ed..0511086 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -2348,12 +2348,12 @@
     skPath.transform(inverse);
   } else {
     DCHECK_EQ(kCoonsPatchMeshShading, shadingType);
-    RetainPtr<const CPDF_Stream> pStream(
-        ToStream(pPattern->GetShadingObject()));
+    RetainPtr<const CPDF_Stream> pStream =
+        ToStream(pPattern->GetShadingObject());
     if (!pStream)
       return false;
-    CPDF_MeshStream stream(shadingType, pPattern->GetFuncs(), pStream,
-                           pPattern->GetCS());
+    CPDF_MeshStream stream(shadingType, pPattern->GetFuncs(),
+                           std::move(pStream), pPattern->GetCS());
     if (!stream.Load())
       return false;
     SkPoint cubics[12];