| Index: src/pdf/SkPDFShader.cpp
 | 
| diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp
 | 
| index e30e43d4f876d362dd4d3932066720843e6753e1..2ae3217585856b8dd8cec27da35bf68880a71141 100644
 | 
| --- a/src/pdf/SkPDFShader.cpp
 | 
| +++ b/src/pdf/SkPDFShader.cpp
 | 
| @@ -10,7 +10,6 @@
 | 
|  #include "SkPDFShader.h"
 | 
|  
 | 
|  #include "SkData.h"
 | 
| -#include "SkOncePtr.h"
 | 
|  #include "SkPDFCanon.h"
 | 
|  #include "SkPDFDevice.h"
 | 
|  #include "SkPDFFormXObject.h"
 | 
| @@ -20,7 +19,6 @@
 | 
|  #include "SkScalar.h"
 | 
|  #include "SkStream.h"
 | 
|  #include "SkTemplates.h"
 | 
| -#include "SkTypes.h"
 | 
|  
 | 
|  static bool inverse_transform_bbox(const SkMatrix& matrix, SkRect* bbox) {
 | 
|      SkMatrix inverse;
 | 
| @@ -580,7 +578,7 @@ static SkStream* create_pattern_fill_content(int gsIndex, SkRect& bounds) {
 | 
|   * Creates a ExtGState with the SMask set to the luminosityShader in
 | 
|   * luminosity mode. The shader pattern extends to the bbox.
 | 
|   */
 | 
| -static SkPDFObject* create_smask_graphic_state(
 | 
| +static sk_sp<SkPDFObject> create_smask_graphic_state(
 | 
|          SkPDFCanon* canon, SkScalar dpi, const SkPDFShader::State& state) {
 | 
|      SkRect bbox;
 | 
|      bbox.set(state.fBBox);
 | 
| @@ -600,7 +598,7 @@ static SkPDFObject* create_smask_graphic_state(
 | 
|  
 | 
|      return SkPDFGraphicState::GetSMaskGraphicState(
 | 
|              alphaMask.get(), false,
 | 
| -            SkPDFGraphicState::kLuminosity_SMaskMode);
 | 
| +            SkPDFGraphicState::kLuminosity_SMaskMode, canon);
 | 
|  }
 | 
|  
 | 
|  SkPDFAlphaFunctionShader* SkPDFAlphaFunctionShader::Create(
 | 
| @@ -621,8 +619,7 @@ SkPDFAlphaFunctionShader* SkPDFAlphaFunctionShader::Create(
 | 
|  
 | 
|      // Create resource dict with alpha graphics state as G0 and
 | 
|      // pattern shader as P0, then write content stream.
 | 
| -    sk_sp<SkPDFObject> alphaGs(
 | 
| -            create_smask_graphic_state(canon, dpi, state));
 | 
| +    auto alphaGs = create_smask_graphic_state(canon, dpi, state);
 | 
|  
 | 
|      SkPDFAlphaFunctionShader* alphaFunctionShader =
 | 
|              new SkPDFAlphaFunctionShader(autoState->detach());
 | 
| @@ -678,8 +675,8 @@ static bool split_perspective(const SkMatrix in, SkMatrix* affine,
 | 
|      return true;
 | 
|  }
 | 
|  
 | 
| -static SkPDFObject* create_range_object() {
 | 
| -    SkPDFArray* range = new SkPDFArray;
 | 
| +sk_sp<SkPDFArray> SkPDFShader::MakeRangeObject() {
 | 
| +    auto range = sk_make_sp<SkPDFArray>();
 | 
|      range->reserve(6);
 | 
|      range->appendInt(0);
 | 
|      range->appendInt(1);
 | 
| @@ -689,16 +686,16 @@ static SkPDFObject* create_range_object() {
 | 
|      range->appendInt(1);
 | 
|      return range;
 | 
|  }
 | 
| -SK_DECLARE_STATIC_ONCE_PTR(SkPDFObject, rangeObject);
 | 
|  
 | 
| -static SkPDFStream* make_ps_function(const SkString& psCode,
 | 
| -                                     SkPDFArray* domain) {
 | 
| +static sk_sp<SkPDFStream> make_ps_function(const SkString& psCode,
 | 
| +                                           SkPDFArray* domain,
 | 
| +                                           sk_sp<SkPDFObject> range) {
 | 
|      SkAutoDataUnref funcData(
 | 
|              SkData::NewWithCopy(psCode.c_str(), psCode.size()));
 | 
| -    SkPDFStream* result = new SkPDFStream(funcData.get());
 | 
| +    auto result = sk_make_sp<SkPDFStream>(funcData.get());
 | 
|      result->insertInt("FunctionType", 4);
 | 
|      result->insertObject("Domain", sk_ref_sp(domain));
 | 
| -    result->insertObject("Range", sk_ref_sp(rangeObject.get(create_range_object)));
 | 
| +    result->insertObject("Range", std::move(range));
 | 
|      return result;
 | 
|  }
 | 
|  
 | 
| @@ -804,8 +801,11 @@ SkPDFFunctionShader* SkPDFFunctionShader::Create(
 | 
|      pdfShader->insertName("ColorSpace", "DeviceRGB");
 | 
|      pdfShader->insertObject("Domain", sk_ref_sp(domain.get()));
 | 
|  
 | 
| -    sk_sp<SkPDFStream> function(
 | 
| -            make_ps_function(functionCode, domain.get()));
 | 
| +    // Call canon->makeRangeObject() instead of
 | 
| +    // SkPDFShader::MakeRangeObject() so that the canon can
 | 
| +    // deduplicate.
 | 
| +    auto function = make_ps_function(functionCode, domain.get(),
 | 
| +        canon->makeRangeObject());
 | 
|      pdfShader->insertObjRef("Function", std::move(function));
 | 
|  
 | 
|      sk_sp<SkPDFFunctionShader> pdfFunctionShader(
 | 
| 
 |