| Index: src/core/SkPathEffect.cpp | 
| diff --git a/src/core/SkPathEffect.cpp b/src/core/SkPathEffect.cpp | 
| index 293bb53b2c416a55ce931b6c727e7d0e686a7047..b2e29bc09d9d30cd0ab2858a62b12fe6039c3055 100644 | 
| --- a/src/core/SkPathEffect.cpp | 
| +++ b/src/core/SkPathEffect.cpp | 
| @@ -1,4 +1,3 @@ | 
| - | 
| /* | 
| * Copyright 2006 The Android Open Source Project | 
| * | 
| @@ -28,25 +27,19 @@ SkPathEffect::DashType SkPathEffect::asADash(DashInfo* info) const { | 
|  | 
| /////////////////////////////////////////////////////////////////////////////// | 
|  | 
| -SkPairPathEffect::SkPairPathEffect(SkPathEffect* pe0, SkPathEffect* pe1) | 
| -        : fPE0(pe0), fPE1(pe1) { | 
| -    SkASSERT(pe0); | 
| -    SkASSERT(pe1); | 
| -    fPE0->ref(); | 
| -    fPE1->ref(); | 
| -} | 
| - | 
| -SkPairPathEffect::~SkPairPathEffect() { | 
| -    SkSafeUnref(fPE0); | 
| -    SkSafeUnref(fPE1); | 
| +SkPairPathEffect::SkPairPathEffect(sk_sp<SkPathEffect> pe0, sk_sp<SkPathEffect> pe1) | 
| +    : fPE0(std::move(pe0)), fPE1(std::move(pe1)) | 
| +{ | 
| +    SkASSERT(fPE0.get()); | 
| +    SkASSERT(fPE1.get()); | 
| } | 
|  | 
| /* | 
| Format: [oe0-factory][pe1-factory][pe0-size][pe0-data][pe1-data] | 
| */ | 
| void SkPairPathEffect::flatten(SkWriteBuffer& buffer) const { | 
| -    buffer.writeFlattenable(fPE0); | 
| -    buffer.writeFlattenable(fPE1); | 
| +    buffer.writeFlattenable(fPE0.get()); | 
| +    buffer.writeFlattenable(fPE1.get()); | 
| } | 
|  | 
| #ifndef SK_IGNORE_TO_STRING | 
| @@ -65,22 +58,13 @@ void SkPairPathEffect::toString(SkString* str) const { | 
| /////////////////////////////////////////////////////////////////////////////// | 
|  | 
| SkFlattenable* SkComposePathEffect::CreateProc(SkReadBuffer& buffer) { | 
| -    SkAutoTUnref<SkPathEffect> pe0(buffer.readPathEffect()); | 
| -    SkAutoTUnref<SkPathEffect> pe1(buffer.readPathEffect()); | 
| -    if (pe0 && pe1) { | 
| -        return SkComposePathEffect::Create(pe0, pe1); | 
| -    } else { | 
| -        return nullptr; | 
| -    } | 
| +    sk_sp<SkPathEffect> pe0(buffer.readPathEffect()); | 
| +    sk_sp<SkPathEffect> pe1(buffer.readPathEffect()); | 
| +    return SkComposePathEffect::Make(std::move(pe0), std::move(pe1)).release(); | 
| } | 
|  | 
| bool SkComposePathEffect::filterPath(SkPath* dst, const SkPath& src, | 
| SkStrokeRec* rec, const SkRect* cullRect) const { | 
| -    // we may have failed to unflatten these, so we have to check | 
| -    if (!fPE0 || !fPE1) { | 
| -        return false; | 
| -    } | 
| - | 
| SkPath          tmp; | 
| const SkPath*   ptr = &src; | 
|  | 
| @@ -102,13 +86,9 @@ void SkComposePathEffect::toString(SkString* str) const { | 
| /////////////////////////////////////////////////////////////////////////////// | 
|  | 
| SkFlattenable* SkSumPathEffect::CreateProc(SkReadBuffer& buffer) { | 
| -    SkAutoTUnref<SkPathEffect> pe0(buffer.readPathEffect()); | 
| -    SkAutoTUnref<SkPathEffect> pe1(buffer.readPathEffect()); | 
| -    if (pe0 && pe1) { | 
| -        return SkSumPathEffect::Create(pe0, pe1); | 
| -    } else { | 
| -        return nullptr; | 
| -    } | 
| +    sk_sp<SkPathEffect> pe0(buffer.readPathEffect()); | 
| +    sk_sp<SkPathEffect> pe1(buffer.readPathEffect()); | 
| +    return SkSumPathEffect::Make(pe0, pe1).release(); | 
| } | 
|  | 
| bool SkSumPathEffect::filterPath(SkPath* dst, const SkPath& src, | 
|  |