Update SkMergeImageFilter to sk_sp

TBR=reed@google.com

GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1847583002

Review URL: https://codereview.chromium.org/1847583002
diff --git a/bench/ImageFilterDAGBench.cpp b/bench/ImageFilterDAGBench.cpp
index d66d287..5fdf95b 100644
--- a/bench/ImageFilterDAGBench.cpp
+++ b/bench/ImageFilterDAGBench.cpp
@@ -11,12 +11,10 @@
 #include "SkCanvas.h"
 #include "SkMergeImageFilter.h"
 
-enum { kNumInputs = 5 };
 
 // Exercise a blur filter connected to 5 inputs of the same merge filter.
 // This bench shows an improvement in performance once cacheing of re-used
 // nodes is implemented, since the DAG is no longer flattened to a tree.
-
 class ImageFilterDAGBench : public Benchmark {
 public:
     ImageFilterDAGBench() {}
@@ -27,21 +25,23 @@
     }
 
     void onDraw(int loops, SkCanvas* canvas) override {
+        const SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400));
+
         for (int j = 0; j < loops; j++) {
-            SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(20.0f, 20.0f));
-            SkImageFilter* inputs[kNumInputs];
+            sk_sp<SkImageFilter> blur(SkBlurImageFilter::Create(20.0f, 20.0f));
+            sk_sp<SkImageFilter> inputs[kNumInputs];
             for (int i = 0; i < kNumInputs; ++i) {
-                inputs[i] = blur.get();
+                inputs[i] = blur;
             }
-            SkAutoTUnref<SkImageFilter> merge(SkMergeImageFilter::Create(inputs, kNumInputs));
             SkPaint paint;
-            paint.setImageFilter(merge);
-            SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400));
+            paint.setImageFilter(SkMergeImageFilter::Make(inputs, kNumInputs));
             canvas->drawRect(rect, paint);
         }
     }
 
 private:
+    static const int kNumInputs = 5;
+
     typedef Benchmark INHERITED;
 };
 
diff --git a/bench/MergeBench.cpp b/bench/MergeBench.cpp
index e1f7d97..061a4d3 100644
--- a/bench/MergeBench.cpp
+++ b/bench/MergeBench.cpp
@@ -16,6 +16,41 @@
 #define FILTER_WIDTH_LARGE  SkIntToScalar(256)
 #define FILTER_HEIGHT_LARGE SkIntToScalar(256)
 
+static sk_sp<SkImage> make_bitmap() {
+    sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(80, 80));
+    surface->getCanvas()->clear(0x00000000);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setColor(0xFF884422);
+    paint.setTextSize(SkIntToScalar(96));
+    const char* str = "g";
+    surface->getCanvas()->drawText(str, strlen(str), 15, 55, paint);
+    return surface->makeImageSnapshot();
+}
+
+static sk_sp<SkImage> make_checkerboard() {
+    sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(80, 80));
+    SkCanvas* canvas = surface->getCanvas();
+    canvas->clear(0x00000000);
+    SkPaint darkPaint;
+    darkPaint.setColor(0xFF804020);
+    SkPaint lightPaint;
+    lightPaint.setColor(0xFF244484);
+    for (int y = 0; y < 80; y += 16) {
+        for (int x = 0; x < 80; x += 16) {
+            canvas->save();
+            canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
+            canvas->drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
+            canvas->drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
+            canvas->drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
+            canvas->drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
+            canvas->restore();
+        }
+    }
+
+    return surface->makeImageSnapshot();
+}
+
 class MergeBench : public Benchmark {
 public:
     MergeBench(bool small) : fIsSmall(small), fInitialized(false) { }
@@ -27,8 +62,8 @@
 
     void onDelayedSetup() override {
         if (!fInitialized) {
-            make_bitmap();
-            make_checkerboard();
+            fImage = make_bitmap();
+            fCheckerboard = make_checkerboard();
             fInitialized = true;
         }
     }
@@ -37,52 +72,17 @@
         SkRect r = fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) :
                               SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE);
         SkPaint paint;
-        paint.setImageFilter(mergeBitmaps())->unref();
+        paint.setImageFilter(this->mergeBitmaps());
         for (int i = 0; i < loops; i++) {
             canvas->drawRect(r, paint);
         }
     }
 
 private:
-    SkImageFilter* mergeBitmaps() {
-        SkAutoTUnref<SkImageFilter> first(SkImageSource::Create(fCheckerboard.get()));
-        SkAutoTUnref<SkImageFilter> second(SkImageSource::Create(fImage.get()));
-        return SkMergeImageFilter::Create(first, second);
-    }
-
-    void make_bitmap() {
-        auto surface(SkSurface::MakeRasterN32Premul(80, 80));
-        surface->getCanvas()->clear(0x00000000);
-        SkPaint paint;
-        paint.setAntiAlias(true);
-        paint.setColor(0xFF884422);
-        paint.setTextSize(SkIntToScalar(96));
-        const char* str = "g";
-        surface->getCanvas()->drawText(str, strlen(str), 15, 55, paint);
-        fImage = surface->makeImageSnapshot();
-    }
-
-    void make_checkerboard() {
-        auto surface(SkSurface::MakeRasterN32Premul(80, 80));
-        SkCanvas* canvas = surface->getCanvas();
-        canvas->clear(0x00000000);
-        SkPaint darkPaint;
-        darkPaint.setColor(0xFF804020);
-        SkPaint lightPaint;
-        lightPaint.setColor(0xFF244484);
-        for (int y = 0; y < 80; y += 16) {
-            for (int x = 0; x < 80; x += 16) {
-                canvas->save();
-                canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
-                canvas->drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint);
-                canvas->drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint);
-                canvas->drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint);
-                canvas->drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint);
-                canvas->restore();
-            }
-        }
-
-        fCheckerboard = surface->makeImageSnapshot();
+    sk_sp<SkImageFilter> mergeBitmaps() {
+        sk_sp<SkImageFilter> first(SkImageSource::Create(fCheckerboard.get()));
+        sk_sp<SkImageFilter> second(SkImageSource::Create(fImage.get()));
+        return SkMergeImageFilter::Make(std::move(first), std::move(second));
     }
 
     bool fIsSmall;
diff --git a/gm/imagefiltersbase.cpp b/gm/imagefiltersbase.cpp
index d580243..4a5f5e5 100644
--- a/gm/imagefiltersbase.cpp
+++ b/gm/imagefiltersbase.cpp
@@ -91,7 +91,7 @@
 
 SkFlattenable* IdentityImageFilter::CreateProc(SkReadBuffer& buffer) {
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
-    return IdentityImageFilter::Create(common.getInput(0));
+    return IdentityImageFilter::Create(common.getInput(0).get());
 }
 
 #ifndef SK_IGNORE_TO_STRING
diff --git a/gm/imagefilterscropped.cpp b/gm/imagefilterscropped.cpp
index b06761d..6129909 100644
--- a/gm/imagefilterscropped.cpp
+++ b/gm/imagefilterscropped.cpp
@@ -122,7 +122,7 @@
         SkAutoTUnref<SkImageFilter> offset(SkOffsetImageFilter::Create(
             SkIntToScalar(-10), SkIntToScalar(-10)));
 
-        SkAutoTUnref<SkImageFilter> cfOffset(SkColorFilterImageFilter::Create(cf.get(), offset.get()));
+        sk_sp<SkImageFilter> cfOffset(SkColorFilterImageFilter::Create(cf.get(), offset.get()));
 
         SkAutoTUnref<SkImageFilter> erodeX(SkErodeImageFilter::Create(8, 0, nullptr, &cropRect));
         SkAutoTUnref<SkImageFilter> erodeY(SkErodeImageFilter::Create(0, 8, nullptr, &cropRect));
@@ -139,7 +139,8 @@
             SkErodeImageFilter::Create(8, 0, erodeY, &cropRect),
             SkErodeImageFilter::Create(0, 8, erodeX, &cropRect),
             SkErodeImageFilter::Create(8, 8, nullptr, &cropRect),
-            SkMergeImageFilter::Create(nullptr, cfOffset.get(), SkXfermode::kSrcOver_Mode, &cropRect),
+            SkMergeImageFilter::Make(nullptr, std::move(cfOffset),
+                                     SkXfermode::kSrcOver_Mode, &cropRect).release(),
             SkBlurImageFilter::Create(8.0f, 8.0f, nullptr, &bogusRect),
             SkColorFilterImageFilter::Create(cf.get(), nullptr, &bogusRect),
         };
diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp
index 53343bc..e7abdcf 100644
--- a/gm/imagefiltersgraph.cpp
+++ b/gm/imagefiltersgraph.cpp
@@ -88,7 +88,7 @@
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
     SkScalar dx = buffer.readScalar();
     SkScalar dy = buffer.readScalar();
-    return Create(dx, dy, common.getInput(0));
+    return Create(dx, dy, common.getInput(0).get());
 }
 
 #ifndef SK_IGNORE_TO_STRING
@@ -118,15 +118,16 @@
     void onDraw(SkCanvas* canvas) override {
         canvas->clear(SK_ColorBLACK);
         {
-            SkAutoTUnref<SkImageFilter> bitmapSource(SkImageSource::Create(fImage.get()));
-            auto cf(SkColorFilter::MakeModeFilter(SK_ColorRED, SkXfermode::kSrcIn_Mode));
-            SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(4.0f, 4.0f, bitmapSource));
-            SkAutoTUnref<SkImageFilter> erode(SkErodeImageFilter::Create(4, 4, blur));
-            SkAutoTUnref<SkImageFilter> color(SkColorFilterImageFilter::Create(cf.get(), erode));
-            SkAutoTUnref<SkImageFilter> merge(SkMergeImageFilter::Create(blur, color));
+            sk_sp<SkImageFilter> bitmapSource(SkImageSource::Create(fImage.get()));
+            sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorRED,
+                                                                  SkXfermode::kSrcIn_Mode));
+            sk_sp<SkImageFilter> blur(SkBlurImageFilter::Create(4.0f, 4.0f, bitmapSource.get()));
+            sk_sp<SkImageFilter> erode(SkErodeImageFilter::Create(4, 4, blur.get()));
+            sk_sp<SkImageFilter> color(SkColorFilterImageFilter::Create(cf.get(), erode.get()));
+            sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(blur, color));
 
             SkPaint paint;
-            paint.setImageFilter(merge);
+            paint.setImageFilter(std::move(merge));
             canvas->drawPaint(paint);
             canvas->translate(SkIntToScalar(100), 0);
         }
diff --git a/gm/testimagefilters.cpp b/gm/testimagefilters.cpp
index 2380b34..c4bddbf 100644
--- a/gm/testimagefilters.cpp
+++ b/gm/testimagefilters.cpp
@@ -47,7 +47,7 @@
 static SkImageFilter* make5() {
     sk_sp<SkImageFilter> first(SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16)));
     sk_sp<SkImageFilter> second(SkDownSampleImageFilter::Create(SK_Scalar1 / 5));
-    return SkMergeImageFilter::Create(first.get(), second.get());
+    return SkMergeImageFilter::Make(std::move(first), std::move(second)).release();
 }
 
 static SkImageFilter* make6() {
@@ -58,7 +58,7 @@
     sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(0x880000FF, SkXfermode::kSrcIn_Mode));
     sk_sp<SkImageFilter> blue(SkColorFilterImageFilter::Create(cf.get()));
 
-    return SkMergeImageFilter::Create(compose.get(), blue.get());
+    return SkMergeImageFilter::Make(std::move(compose), std::move(blue)).release();
 }
 
 static SkImageFilter* make7() {
@@ -69,7 +69,7 @@
     sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(0x880000FF, SkXfermode::kSrcIn_Mode));
     sk_sp<SkImageFilter> blue(SkColorFilterImageFilter::Create(cf.get()));
 
-    return SkMergeImageFilter::Create(compose.get(), blue.get());
+    return SkMergeImageFilter::Make(std::move(compose), std::move(blue)).release();
 }
 
 static void draw0(SkCanvas* canvas) {
diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h
index d39d978..d1b1483 100644
--- a/include/core/SkImageFilter.h
+++ b/include/core/SkImageFilter.h
@@ -293,9 +293,6 @@
 protected:
     class Common {
     public:
-        Common() {}
-        ~Common();
-
         /**
          *  Attempt to unflatten the cropRect and the expected number of input filters.
          *  If any number of input filters is valid, pass -1.
@@ -308,9 +305,9 @@
 
         const CropRect& cropRect() const { return fCropRect; }
         int             inputCount() const { return fInputs.count(); }
-        SkImageFilter** inputs() const { return fInputs.get(); }
+        sk_sp<SkImageFilter>* inputs() const { return fInputs.get(); }
 
-        SkImageFilter*  getInput(int index) const { return fInputs[index]; }
+        sk_sp<SkImageFilter>  getInput(int index) const { return fInputs[index]; }
 
         // If the caller wants a copy of the inputs, call this and it will transfer ownership
         // of the unflattened input filters to the caller. This is just a short-cut for copying
@@ -321,7 +318,7 @@
     private:
         CropRect fCropRect;
         // most filters accept at most 2 input-filters
-        SkAutoSTArray<2, SkImageFilter*> fInputs;
+        SkAutoSTArray<2, sk_sp<SkImageFilter>> fInputs;
 
         void allocInputs(int count);
     };
diff --git a/include/effects/SkMergeImageFilter.h b/include/effects/SkMergeImageFilter.h
index 3bf649d..e85cc1f 100644
--- a/include/effects/SkMergeImageFilter.h
+++ b/include/effects/SkMergeImageFilter.h
@@ -16,30 +16,51 @@
 public:
     ~SkMergeImageFilter() override;
 
-    static SkImageFilter* Create(SkImageFilter* first, SkImageFilter* second,
-                                 SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
-                                 const CropRect* cropRect = NULL) {
-        SkImageFilter* inputs[2] = { first, second };
+    static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> first, sk_sp<SkImageFilter> second,
+                                     SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
+                                     const CropRect* cropRect = nullptr) {
+        sk_sp<SkImageFilter> inputs[2] = { first, second };
         SkXfermode::Mode modes[2] = { mode, mode };
-        return new SkMergeImageFilter(inputs, 2, modes, cropRect);
+        return sk_sp<SkImageFilter>(new SkMergeImageFilter(inputs, 2, modes, cropRect));
     }
 
-    static SkImageFilter* Create(SkImageFilter* filters[], int count,
-                                 const SkXfermode::Mode modes[] = NULL,
-                                const CropRect* cropRect = NULL) {
-        return new SkMergeImageFilter(filters, count, modes, cropRect);
+    static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> filters[],
+                                     int count,
+                                     const SkXfermode::Mode modes[] = nullptr,
+                                     const CropRect* cropRect = nullptr) {
+        return sk_sp<SkImageFilter>(new SkMergeImageFilter(filters, count, modes, cropRect));
     }
 
     SK_TO_STRING_OVERRIDE()
     SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMergeImageFilter)
 
+#ifdef SK_SUPPORT_LEGACY_IMAGEFILTER_PTR
+    static SkImageFilter* Create(SkImageFilter* first, SkImageFilter* second,
+                                 SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
+                                 const CropRect* cropRect = nullptr) {
+        return Make(sk_ref_sp<SkImageFilter>(first),
+                    sk_ref_sp<SkImageFilter>(second),
+                    mode, cropRect).release();
+    }
+
+    static SkImageFilter* Create(SkImageFilter* filters[], int count,
+                                 const SkXfermode::Mode modes[] = nullptr,
+                                 const CropRect* cropRect = nullptr) {
+        SkAutoTDeleteArray<sk_sp<SkImageFilter>> temp(new sk_sp<SkImageFilter>[count]);
+        for (int i = 0; i < count; ++i) {
+            temp[i] = sk_ref_sp<SkImageFilter>(filters[i]);
+        }
+        return Make(temp.get(), count, modes, cropRect).release();
+    }
+#endif
+
 protected:
     void flatten(SkWriteBuffer&) const override;
     sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&,
                                         SkIPoint* offset) const override;
 
 private:
-    SkMergeImageFilter(SkImageFilter* filters[], int count, const SkXfermode::Mode modes[],
+    SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count, const SkXfermode::Mode modes[],
                        const CropRect* cropRect);
 
     uint8_t*    fModes; // SkXfermode::Mode
diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp
index 103d8c4..a1e8c2d 100644
--- a/samplecode/SampleFilterFuzz.cpp
+++ b/samplecode/SampleFilterFuzz.cpp
@@ -559,14 +559,11 @@
                                                                      make_scalar(),
                                                                      make_scalar()));
         break;
-    case MERGE: {
-        sk_sp<SkImageFilter> subFilter1(make_image_filter());
-        sk_sp<SkImageFilter> subFilter2(make_image_filter());
-        filter = sk_sp<SkImageFilter>(SkMergeImageFilter::Create(subFilter1.get(), 
-                                                                 subFilter2.get(),
-                                                                 make_xfermode()));
+    case MERGE:
+        filter = SkMergeImageFilter::Make(make_image_filter(),
+                                          make_image_filter(),
+                                          make_xfermode());
         break;
-    }
     case COLOR: {
         sk_sp<SkColorFilter> cf(make_color_filter());
         sk_sp<SkImageFilter> subFilter(make_image_filter());
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
index e999d3a..3b4ad31 100644
--- a/src/core/SkImageFilter.cpp
+++ b/src/core/SkImageFilter.cpp
@@ -105,22 +105,14 @@
     return id;
 }
 
-SkImageFilter::Common::~Common() {
-    for (int i = 0; i < fInputs.count(); ++i) {
-        SkSafeUnref(fInputs[i]);
-    }
-}
-
 void SkImageFilter::Common::allocInputs(int count) {
-    const size_t size = count * sizeof(SkImageFilter*);
     fInputs.reset(count);
-    sk_bzero(fInputs.get(), size);
 }
 
 void SkImageFilter::Common::detachInputs(SkImageFilter** inputs) {
-    const size_t size = fInputs.count() * sizeof(SkImageFilter*);
-    memcpy(inputs, fInputs.get(), size);
-    sk_bzero(fInputs.get(), size);
+    for (int i = 0; i < fInputs.count(); ++i) {
+        inputs[i] = fInputs[i].release();
+    }
 }
 
 bool SkImageFilter::Common::unflatten(SkReadBuffer& buffer, int expectedCount) {
@@ -135,7 +127,7 @@
     this->allocInputs(count);
     for (int i = 0; i < count; i++) {
         if (buffer.readBool()) {
-            fInputs[i] = buffer.readImageFilter();
+            fInputs[i] = sk_sp<SkImageFilter>(buffer.readImageFilter());
         }
         if (!buffer.isValid()) {
             return false;
diff --git a/src/core/SkLocalMatrixImageFilter.cpp b/src/core/SkLocalMatrixImageFilter.cpp
index d1b5715..bf29bd2 100644
--- a/src/core/SkLocalMatrixImageFilter.cpp
+++ b/src/core/SkLocalMatrixImageFilter.cpp
@@ -20,8 +20,7 @@
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
     SkMatrix lm;
     buffer.readMatrix(&lm);
-    return SkLocalMatrixImageFilter::Make(lm,
-                                          sk_ref_sp<SkImageFilter>(common.getInput(0))).release();
+    return SkLocalMatrixImageFilter::Make(lm, common.getInput(0)).release();
 }
 
 void SkLocalMatrixImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/core/SkMatrixImageFilter.cpp b/src/core/SkMatrixImageFilter.cpp
index ec221fd..b8f510f 100644
--- a/src/core/SkMatrixImageFilter.cpp
+++ b/src/core/SkMatrixImageFilter.cpp
@@ -34,7 +34,7 @@
     SkMatrix matrix;
     buffer.readMatrix(&matrix);
     SkFilterQuality quality = static_cast<SkFilterQuality>(buffer.readInt());
-    return Create(matrix, quality, common.getInput(0));
+    return Create(matrix, quality, common.getInput(0).get());
 }
 
 void SkMatrixImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkAlphaThresholdFilter.cpp b/src/effects/SkAlphaThresholdFilter.cpp
index 55dfe58..177a3ba 100644
--- a/src/effects/SkAlphaThresholdFilter.cpp
+++ b/src/effects/SkAlphaThresholdFilter.cpp
@@ -269,7 +269,7 @@
     SkScalar outer = buffer.readScalar();
     SkRegion rgn;
     buffer.readRegion(&rgn);
-    return SkAlphaThresholdFilter::Create(rgn, inner, outer, common.getInput(0));
+    return SkAlphaThresholdFilter::Create(rgn, inner, outer, common.getInput(0).get());
 }
 
 SkAlphaThresholdFilterImpl::SkAlphaThresholdFilterImpl(const SkRegion& region,
diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp
index 65c0aa8..c7964c3 100644
--- a/src/effects/SkBlurImageFilter.cpp
+++ b/src/effects/SkBlurImageFilter.cpp
@@ -46,7 +46,7 @@
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
     SkScalar sigmaX = buffer.readScalar();
     SkScalar sigmaY = buffer.readScalar();
-    return Create(sigmaX, sigmaY, common.getInput(0), &common.cropRect());
+    return Create(sigmaX, sigmaY, common.getInput(0).get(), &common.cropRect());
 }
 
 void SkBlurImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkColorFilterImageFilter.cpp b/src/effects/SkColorFilterImageFilter.cpp
index 1da8b2c..beb3138 100644
--- a/src/effects/SkColorFilterImageFilter.cpp
+++ b/src/effects/SkColorFilterImageFilter.cpp
@@ -44,7 +44,7 @@
 SkFlattenable* SkColorFilterImageFilter::CreateProc(SkReadBuffer& buffer) {
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
     sk_sp<SkColorFilter> cf(buffer.readColorFilter());
-    return Create(cf.get(), common.getInput(0), &common.cropRect());
+    return Create(cf.get(), common.getInput(0).get(), &common.cropRect());
 }
 
 void SkColorFilterImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkComposeImageFilter.cpp b/src/effects/SkComposeImageFilter.cpp
index 3cd8a9e..e2a27a8 100644
--- a/src/effects/SkComposeImageFilter.cpp
+++ b/src/effects/SkComposeImageFilter.cpp
@@ -60,8 +60,7 @@
 
 SkFlattenable* SkComposeImageFilter::CreateProc(SkReadBuffer& buffer) {
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2);
-    return SkComposeImageFilter::Make(sk_ref_sp<SkImageFilter>(common.getInput(0)),
-                                      sk_ref_sp<SkImageFilter>(common.getInput(1))).release();
+    return SkComposeImageFilter::Make(common.getInput(0), common.getInput(1)).release();
 }
 
 #ifndef SK_IGNORE_TO_STRING
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp
index ec75fd0..d054e58 100644
--- a/src/effects/SkDisplacementMapEffect.cpp
+++ b/src/effects/SkDisplacementMapEffect.cpp
@@ -200,7 +200,8 @@
     ChannelSelectorType xsel = (ChannelSelectorType)buffer.readInt();
     ChannelSelectorType ysel = (ChannelSelectorType)buffer.readInt();
     SkScalar scale = buffer.readScalar();
-    return Create(xsel, ysel, scale, common.getInput(0), common.getInput(1), &common.cropRect());
+    return Create(xsel, ysel, scale,
+                  common.getInput(0).get(), common.getInput(1).get(), &common.cropRect());
 }
 
 void SkDisplacementMapEffect::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkDropShadowImageFilter.cpp b/src/effects/SkDropShadowImageFilter.cpp
index 93c11ca..6e750ca 100644
--- a/src/effects/SkDropShadowImageFilter.cpp
+++ b/src/effects/SkDropShadowImageFilter.cpp
@@ -37,7 +37,7 @@
     ShadowMode shadowMode = buffer.isVersionLT(SkReadBuffer::kDropShadowMode_Version) ?
                             kDrawShadowAndForeground_ShadowMode :
                             static_cast<ShadowMode>(buffer.readInt());
-    return Create(dx, dy, sigmaX, sigmaY, color, shadowMode, common.getInput(0),
+    return Create(dx, dy, sigmaX, sigmaY, color, shadowMode, common.getInput(0).get(),
                   &common.cropRect());
 }
 
diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp
index 9202818..55a1f22 100644
--- a/src/effects/SkLightingImageFilter.cpp
+++ b/src/effects/SkLightingImageFilter.cpp
@@ -1215,7 +1215,7 @@
     SkAutoTUnref<SkImageFilterLight> light(SkImageFilterLight::UnflattenLight(buffer));
     SkScalar surfaceScale = buffer.readScalar();
     SkScalar kd = buffer.readScalar();
-    return Create(light, surfaceScale, kd, common.getInput(0), &common.cropRect());
+    return Create(light, surfaceScale, kd, common.getInput(0).get(), &common.cropRect());
 }
 
 void SkDiffuseLightingImageFilter::flatten(SkWriteBuffer& buffer) const {
@@ -1358,7 +1358,7 @@
     SkScalar surfaceScale = buffer.readScalar();
     SkScalar ks = buffer.readScalar();
     SkScalar shine = buffer.readScalar();
-    return Create(light, surfaceScale, ks, shine, common.getInput(0), &common.cropRect());
+    return Create(light, surfaceScale, ks, shine, common.getInput(0).get(), &common.cropRect());
 }
 
 void SkSpecularLightingImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp
index 7ec2aa2..bfad549 100644
--- a/src/effects/SkMagnifierImageFilter.cpp
+++ b/src/effects/SkMagnifierImageFilter.cpp
@@ -285,7 +285,7 @@
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
     SkRect src;
     buffer.readRect(&src);
-    return Create(src, buffer.readScalar(), common.getInput(0));
+    return Create(src, buffer.readScalar(), common.getInput(0).get());
 }
 
 void SkMagnifierImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp
index 7a25f5f..c8b43bb 100644
--- a/src/effects/SkMatrixConvolutionImageFilter.cpp
+++ b/src/effects/SkMatrixConvolutionImageFilter.cpp
@@ -97,7 +97,7 @@
     TileMode tileMode = (TileMode)buffer.readInt();
     bool convolveAlpha = buffer.readBool();
     return Create(kernelSize, kernel.get(), gain, bias, kernelOffset, tileMode, convolveAlpha,
-                  common.getInput(0), &common.cropRect());
+                  common.getInput(0).get(), &common.cropRect());
 }
 
 void SkMatrixConvolutionImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkMergeImageFilter.cpp b/src/effects/SkMergeImageFilter.cpp
index 47d33df..07b2c1c 100755
--- a/src/effects/SkMergeImageFilter.cpp
+++ b/src/effects/SkMergeImageFilter.cpp
@@ -42,10 +42,10 @@
     }
 }
 
-SkMergeImageFilter::SkMergeImageFilter(SkImageFilter* filters[], int count,
+SkMergeImageFilter::SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count,
                                        const SkXfermode::Mode modes[],
                                        const CropRect* cropRect)
-  : INHERITED(count, filters, cropRect) {
+    : INHERITED(filters, count, cropRect) {
     SkASSERT(count >= 0);
     this->initModes(modes);
 }
@@ -149,9 +149,9 @@
         if (!buffer.isValid()) {
             return nullptr;
         }
-        return Create(common.inputs(), count, modes.get(), &common.cropRect());
+        return Make(common.inputs(), count, modes.get(), &common.cropRect()).release();
     }
-    return Create(common.inputs(), count, nullptr, &common.cropRect());
+    return Make(common.inputs(), count, nullptr, &common.cropRect()).release();
 }
 
 void SkMergeImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp
index 5c36480..dbb116e 100644
--- a/src/effects/SkMorphologyImageFilter.cpp
+++ b/src/effects/SkMorphologyImageFilter.cpp
@@ -76,14 +76,14 @@
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
     const int width = buffer.readInt();
     const int height = buffer.readInt();
-    return Create(width, height, common.getInput(0), &common.cropRect());
+    return Create(width, height, common.getInput(0).get(), &common.cropRect());
 }
 
 SkFlattenable* SkDilateImageFilter::CreateProc(SkReadBuffer& buffer) {
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
     const int width = buffer.readInt();
     const int height = buffer.readInt();
-    return Create(width, height, common.getInput(0), &common.cropRect());
+    return Create(width, height, common.getInput(0).get(), &common.cropRect());
 }
 
 #ifndef SK_IGNORE_TO_STRING
diff --git a/src/effects/SkOffsetImageFilter.cpp b/src/effects/SkOffsetImageFilter.cpp
index 05df229..a2de25e 100644
--- a/src/effects/SkOffsetImageFilter.cpp
+++ b/src/effects/SkOffsetImageFilter.cpp
@@ -86,7 +86,7 @@
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
     SkPoint offset;
     buffer.readPoint(&offset);
-    return Create(offset.x(), offset.y(), common.getInput(0), &common.cropRect());
+    return Create(offset.x(), offset.y(), common.getInput(0).get(), &common.cropRect());
 }
 
 void SkOffsetImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkTestImageFilters.cpp b/src/effects/SkTestImageFilters.cpp
index b8b0e18..a77f519 100755
--- a/src/effects/SkTestImageFilters.cpp
+++ b/src/effects/SkTestImageFilters.cpp
@@ -77,7 +77,7 @@
 
 SkFlattenable* SkDownSampleImageFilter::CreateProc(SkReadBuffer& buffer) {
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
-    return Create(buffer.readScalar(), common.getInput(0));
+    return Create(buffer.readScalar(), common.getInput(0).get());
 }
 
 void SkDownSampleImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkTileImageFilter.cpp b/src/effects/SkTileImageFilter.cpp
index e6b561d..a4129a5 100644
--- a/src/effects/SkTileImageFilter.cpp
+++ b/src/effects/SkTileImageFilter.cpp
@@ -127,7 +127,7 @@
     SkRect src, dst;
     buffer.readRect(&src);
     buffer.readRect(&dst);
-    return Create(src, dst, common.getInput(0));
+    return Create(src, dst, common.getInput(0).get());
 }
 
 void SkTileImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp
index 8cd7512..3b18603 100644
--- a/src/effects/SkXfermodeImageFilter.cpp
+++ b/src/effects/SkXfermodeImageFilter.cpp
@@ -40,8 +40,8 @@
 SkFlattenable* SkXfermodeImageFilter::CreateProc(SkReadBuffer& buffer) {
     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2);
     sk_sp<SkXfermode> mode(buffer.readXfermode());
-    return Make(std::move(mode), common.getInput(0),
-                common.getInput(1), &common.cropRect()).release();
+    return Make(std::move(mode), common.getInput(0).get(),
+                common.getInput(1).get(), &common.cropRect()).release();
 }
 
 void SkXfermodeImageFilter::flatten(SkWriteBuffer& buffer) const {
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 3cf73a8..910ad46 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -169,11 +169,13 @@
                   SkMatrixConvolutionImageFilter::Create(
                       kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1),
                       SkMatrixConvolutionImageFilter::kRepeat_TileMode, false, input, cropRect));
-        this->addFilter("merge", SkMergeImageFilter::Create(input, input, SkXfermode::kSrcOver_Mode,
-                  cropRect));
-        this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Create(
-                  paintFilterLeft.get(), paintFilterRight.get(),
-                  SkXfermode::kSrcOver_Mode, cropRect));
+        this->addFilter("merge", SkMergeImageFilter::Make(sk_ref_sp<SkImageFilter>(input),
+                                                          sk_ref_sp<SkImageFilter>(input),
+                                                          SkXfermode::kSrcOver_Mode,
+                                                          cropRect).release());
+        this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Make(
+                  std::move(paintFilterLeft), std::move(paintFilterRight),
+                  SkXfermode::kSrcOver_Mode, cropRect).release());
         this->addFilter("offset",
                         SkOffsetImageFilter::Create(SK_Scalar1, SK_Scalar1, input, cropRect));
         this->addFilter("dilate", SkDilateImageFilter::Create(3, 2, input, cropRect));
@@ -824,8 +826,8 @@
     greenBM.allocN32Pixels(20, 20);
     greenBM.eraseColor(SK_ColorGREEN);
     sk_sp<SkImage> greenImage(SkImage::MakeFromBitmap(greenBM));
-    SkAutoTUnref<SkImageFilter> source(SkImageSource::Create(greenImage.get()));
-    SkAutoTUnref<SkImageFilter> merge(SkMergeImageFilter::Create(source.get(), source.get()));
+    sk_sp<SkImageFilter> source(SkImageSource::Create(greenImage.get()));
+    sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(source, source));
 
     sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 1));