switch maskfilters to sk_sp

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

Review URL: https://codereview.chromium.org/1852113003
diff --git a/bench/BlurBench.cpp b/bench/BlurBench.cpp
index 58f9e89..20afd4a 100644
--- a/bench/BlurBench.cpp
+++ b/bench/BlurBench.cpp
@@ -65,10 +65,9 @@
             r.offset(fRadius, fRadius);
 
             if (fRadius > 0) {
-                SkMaskFilter* mf = SkBlurMaskFilter::Create(fStyle,
-                                            SkBlurMask::ConvertRadiusToSigma(fRadius),
-                                            fFlags);
-                paint.setMaskFilter(mf)->unref();
+                paint.setMaskFilter(SkBlurMaskFilter::Make(fStyle,
+                                                          SkBlurMask::ConvertRadiusToSigma(fRadius),
+                                                          fFlags));
             }
             canvas->drawOval(r, paint);
         }
diff --git a/bench/BlurRectsBench.cpp b/bench/BlurRectsBench.cpp
index 6bfde8e..fc04d02 100644
--- a/bench/BlurRectsBench.cpp
+++ b/bench/BlurRectsBench.cpp
@@ -31,7 +31,7 @@
 
     void onDraw(int loops, SkCanvas* canvas) override {
         SkPaint paint;
-        paint.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle, fRadius))->unref();
+        paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, fRadius));
 
         SkPath path;
         path.addRect(fOuter, SkPath::kCW_Direction);
diff --git a/bench/BlurRoundRectBench.cpp b/bench/BlurRoundRectBench.cpp
index 46f410d..ef88422 100644
--- a/bench/BlurRoundRectBench.cpp
+++ b/bench/BlurRoundRectBench.cpp
@@ -49,11 +49,9 @@
             info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
             info.fPostTranslate = false;
             SkPaint* paint = looperBuilder.addLayerOnTop(info);
-            SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(
-                    kNormal_SkBlurStyle,
-                    SkBlurMask::ConvertRadiusToSigma(SK_ScalarHalf),
-                    SkBlurMaskFilter::kHighQuality_BlurFlag);
-            paint->setMaskFilter(maskFilter)->unref();
+            paint->setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                                        SkBlurMask::ConvertRadiusToSigma(0.5),
+                                                        SkBlurMaskFilter::kHighQuality_BlurFlag));
             paint->setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorLTGRAY,
                                                                 SkXfermode::kSrcIn_Mode));
             paint->setColor(SK_ColorGRAY);
diff --git a/bench/RectoriBench.cpp b/bench/RectoriBench.cpp
index e2a44e3..ad3d4c2 100644
--- a/bench/RectoriBench.cpp
+++ b/bench/RectoriBench.cpp
@@ -86,10 +86,8 @@
 
         SkPaint* paint = looperBuilder.addLayer(info);
 
-        SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                                    sigma,
-                                                    SkBlurMaskFilter::kHighQuality_BlurFlag);
-        paint->setMaskFilter(mf)->unref();
+        paint->setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, sigma,
+                                                    SkBlurMaskFilter::kHighQuality_BlurFlag));
 
         //-----------------------------------------------
         info.fPaintBits = 0;
diff --git a/gm/bigblurs.cpp b/gm/bigblurs.cpp
index d68b2ca..5c09ab9 100644
--- a/gm/bigblurs.cpp
+++ b/gm/bigblurs.cpp
@@ -70,8 +70,7 @@
 
         for (int i = 0; i < 2; ++i) {
             for (int j = 0; j <= kLastEnum_SkBlurStyle; ++j) {
-                SkMaskFilter* mf = SkBlurMaskFilter::Create((SkBlurStyle)j, kSigma);
-                blurPaint.setMaskFilter(mf)->unref();
+                blurPaint.setMaskFilter(SkBlurMaskFilter::Make((SkBlurStyle)j, kSigma));
 
                 for (int k = 0; k < (int)SK_ARRAY_COUNT(origins); ++k) {
                     canvas->save();
diff --git a/gm/bleed.cpp b/gm/bleed.cpp
index bd1a282..5a27b39 100644
--- a/gm/bleed.cpp
+++ b/gm/bleed.cpp
@@ -410,9 +410,8 @@
 
         SkPaint paint;
         paint.setFilterQuality(filter);
-        SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                         SkBlurMask::ConvertRadiusToSigma(3));
-        paint.setMaskFilter(mf)->unref();
+        paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                                   SkBlurMask::ConvertRadiusToSigma(3)));
         paint.setShader(fShader);
         paint.setColor(SK_ColorBLUE);
         paint.setAntiAlias(aa);
@@ -429,9 +428,8 @@
 
         SkPaint paint;
         paint.setFilterQuality(filter);
-        SkMaskFilter* mf = SkBlurMaskFilter::Create(kOuter_SkBlurStyle,
-                                                    SkBlurMask::ConvertRadiusToSigma(7));
-        paint.setMaskFilter(mf)->unref();
+        paint.setMaskFilter(SkBlurMaskFilter::Make(kOuter_SkBlurStyle,
+                                                   SkBlurMask::ConvertRadiusToSigma(7)));
         paint.setShader(fShader);
         paint.setColor(SK_ColorBLUE);
         paint.setAntiAlias(aa);
diff --git a/gm/blurcircles.cpp b/gm/blurcircles.cpp
index 74490ce..b15901b 100644
--- a/gm/blurcircles.cpp
+++ b/gm/blurcircles.cpp
@@ -31,10 +31,10 @@
         const float blurRadii[kNumBlurs] = { 1,5,10,20 };
 
         for (int i = 0; i < kNumBlurs; ++i) {
-            fBlurFilters[i].reset(SkBlurMaskFilter::Create(
+            fBlurFilters[i] = SkBlurMaskFilter::Make(
                                     kNormal_SkBlurStyle,
                                     SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(blurRadii[i])),
-                                    SkBlurMaskFilter::kHighQuality_BlurFlag));
+                                    SkBlurMaskFilter::kHighQuality_BlurFlag);
         }
     }
 
@@ -60,7 +60,7 @@
 private:
     static const int kNumBlurs = 4;
 
-    SkAutoTUnref<SkMaskFilter> fBlurFilters[kNumBlurs];
+    sk_sp<SkMaskFilter> fBlurFilters[kNumBlurs];
 
     typedef         skiagm::GM INHERITED;
 };
diff --git a/gm/blurquickreject.cpp b/gm/blurquickreject.cpp
index 11697fc..c970458 100644
--- a/gm/blurquickreject.cpp
+++ b/gm/blurquickreject.cpp
@@ -56,9 +56,8 @@
 
         SkPaint blurPaint;
         blurPaint.setFilterQuality(kLow_SkFilterQuality);
-        SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                                    SkBlurMask::ConvertRadiusToSigma(kBlurRadius));
-        blurPaint.setMaskFilter(mf)->unref();
+        blurPaint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                                    SkBlurMask::ConvertRadiusToSigma(kBlurRadius)));
 
         canvas->clear(SK_ColorBLACK);
         canvas->save();
diff --git a/gm/blurrect.cpp b/gm/blurrect.cpp
index 0fe866f..8aae04a 100644
--- a/gm/blurrect.cpp
+++ b/gm/blurrect.cpp
@@ -83,7 +83,7 @@
 typedef void (*PaintProc)(SkPaint*, SkScalar width);
 
 class BlurRectGM : public skiagm::GM {
-      SkAutoTUnref<SkMaskFilter> fMaskFilters[kLastEnum_SkBlurStyle + 1];
+      sk_sp<SkMaskFilter> fMaskFilters[kLastEnum_SkBlurStyle + 1];
       SkString  fName;
       SkAlpha   fAlpha;
 public:
@@ -95,9 +95,9 @@
 protected:
     void onOnceBeforeDraw() override {
         for (int i = 0; i <= kLastEnum_SkBlurStyle; ++i) {
-            fMaskFilters[i].reset(SkBlurMaskFilter::Create((SkBlurStyle)i,
+            fMaskFilters[i] = SkBlurMaskFilter::Make((SkBlurStyle)i,
                                   SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(STROKE_WIDTH/2)),
-                                  SkBlurMaskFilter::kHighQuality_BlurFlag));
+                                  SkBlurMaskFilter::kHighQuality_BlurFlag);
         }
     }
 
diff --git a/gm/blurredclippedcircle.cpp b/gm/blurredclippedcircle.cpp
index d162ac1..495d16a 100644
--- a/gm/blurredclippedcircle.cpp
+++ b/gm/blurredclippedcircle.cpp
@@ -63,10 +63,10 @@
 
                     SkPaint paint;
 
-                    paint.setMaskFilter(SkBlurMaskFilter::Create(
+                    paint.setMaskFilter(SkBlurMaskFilter::Make(
                                             kNormal_SkBlurStyle,
                                             1.366025f,
-                                            SkBlurMaskFilter::kHighQuality_BlurFlag))->unref();
+                                            SkBlurMaskFilter::kHighQuality_BlurFlag));
                     paint.setColorFilter(SkColorFilter::MakeModeFilter(
                                              SK_ColorRED,
                                              SkXfermode::kSrcIn_Mode));
diff --git a/gm/blurroundrect.cpp b/gm/blurroundrect.cpp
index 9135ba0..5982d06 100644
--- a/gm/blurroundrect.cpp
+++ b/gm/blurroundrect.cpp
@@ -55,11 +55,10 @@
             info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
             info.fPostTranslate = false;
             SkPaint* paint = looperBuilder.addLayerOnTop(info);
-            SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(
+            paint->setMaskFilter(SkBlurMaskFilter::Make(
                     kNormal_SkBlurStyle,
                     SkBlurMask::ConvertRadiusToSigma(SK_ScalarHalf),
-                    SkBlurMaskFilter::kHighQuality_BlurFlag);
-            paint->setMaskFilter(maskFilter)->unref();
+                    SkBlurMaskFilter::kHighQuality_BlurFlag));
             paint->setColorFilter(SkColorFilter::MakeModeFilter(
                     sk_tool_utils::color_to_565(SK_ColorLTGRAY),
                     SkXfermode::kSrcIn_Mode));
@@ -142,13 +141,11 @@
             canvas->translate(0, (r.height() + SkIntToScalar(50)) * i);
             for (size_t j = 0; j < SK_ARRAY_COUNT(cornerRadii); ++j) {
                 for (int k = 0; k <= 1; k++) {
-                    SkMaskFilter* filter = SkBlurMaskFilter::Create(
-                        kNormal_SkBlurStyle,
-                        SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(blurRadii[i])),
-                        SkBlurMaskFilter::kHighQuality_BlurFlag);
                     SkPaint paint;
                     paint.setColor(SK_ColorBLACK);
-                    paint.setMaskFilter(filter)->unref();
+                    paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                   SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(blurRadii[i])),
+                                   SkBlurMaskFilter::kHighQuality_BlurFlag));
 
                     bool useRadial = SkToBool(k);
                     if (useRadial) {
diff --git a/gm/blurs.cpp b/gm/blurs.cpp
index 8f2137e..8fa97b8 100644
--- a/gm/blurs.cpp
+++ b/gm/blurs.cpp
@@ -35,10 +35,9 @@
             paint.setColor(SK_ColorBLUE);
             for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
                 if (gRecs[i].fStyle != NONE) {
-                    SkMaskFilter* mf = SkBlurMaskFilter::Create(gRecs[i].fStyle,
+                    paint.setMaskFilter(SkBlurMaskFilter::Make(gRecs[i].fStyle,
                                            SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)),
-                                           flags);
-                    paint.setMaskFilter(mf)->unref();
+                                           flags));
                 } else {
                     paint.setMaskFilter(nullptr);
                 }
@@ -49,10 +48,9 @@
             }
             // draw text
             {
-                SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
+                paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
                                            SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4)),
-                                           flags);
-                paint.setMaskFilter(mf)->unref();
+                                           flags));
                 SkScalar x = SkIntToScalar(70);
                 SkScalar y = SkIntToScalar(400);
                 paint.setColor(SK_ColorBLACK);
@@ -82,8 +80,7 @@
 DEF_SIMPLE_GM(blur2rects, canvas, 700, 500) {
         SkPaint paint;
 
-        paint.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                                     2.3f))->unref();
+        paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, 2.3f));
 
         SkRect outer = SkRect::MakeXYWH(10.125f, 10.125f, 100.125f, 100);
         SkRect inner = SkRect::MakeXYWH(20.25f, 20.125f, 80, 80);
@@ -101,8 +98,7 @@
 
 DEF_SIMPLE_GM(blur2rectsnonninepatch, canvas, 700, 500) {
         SkPaint paint;
-        paint.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                                     4.3f))->unref();
+        paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, 4.3f));
 
         SkRect outer = SkRect::MakeXYWH(10, 110, 100, 100);
         SkRect inner = SkRect::MakeXYWH(50, 150, 10, 10);
diff --git a/gm/circles.cpp b/gm/circles.cpp
index dd37a61..2c2542b 100644
--- a/gm/circles.cpp
+++ b/gm/circles.cpp
@@ -51,11 +51,10 @@
         // AA with mask filter
         SkPaint p;
         p.setAntiAlias(true);
-        SkMaskFilter* mf = SkBlurMaskFilter::Create(
+        p.setMaskFilter(SkBlurMaskFilter::Make(
                                kNormal_SkBlurStyle,
                                SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
-                               SkBlurMaskFilter::kHighQuality_BlurFlag);
-        p.setMaskFilter(mf)->unref();
+                               SkBlurMaskFilter::kHighQuality_BlurFlag));
         fPaints.push_back(p);
         }
 
diff --git a/gm/drawbitmaprect.cpp b/gm/drawbitmaprect.cpp
index 7d83047..bd6fffe 100644
--- a/gm/drawbitmaprect.cpp
+++ b/gm/drawbitmaprect.cpp
@@ -211,12 +211,11 @@
             paint.setFilterQuality(kLow_SkFilterQuality);
 
             srcRect.setXYWH(1, 1, 3, 3);
-            SkMaskFilter* mf = SkBlurMaskFilter::Create(
+            paint.setMaskFilter(SkBlurMaskFilter::Make(
                 kNormal_SkBlurStyle,
                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
                 SkBlurMaskFilter::kHighQuality_BlurFlag |
-                SkBlurMaskFilter::kIgnoreTransform_BlurFlag);
-            paint.setMaskFilter(mf)->unref();
+                SkBlurMaskFilter::kIgnoreTransform_BlurFlag));
             canvas->drawBitmapRect(bm, srcRect, dstRect, &paint);
         }
     }
diff --git a/gm/drawfilter.cpp b/gm/drawfilter.cpp
index d17eb4f..33e1d00 100644
--- a/gm/drawfilter.cpp
+++ b/gm/drawfilter.cpp
@@ -33,7 +33,7 @@
 }
 
 class DrawFilterGM : public skiagm::GM {
-    SkAutoTUnref<SkMaskFilter> fBlur;
+    sk_sp<SkMaskFilter> fBlur;
 
 protected:
     SkISize onISize() override {
@@ -45,15 +45,15 @@
     }
 
     void onOnceBeforeDraw() override {
-        fBlur.reset(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
+        fBlur = SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
                     SkBlurMask::ConvertRadiusToSigma(10.0f),
-                    kLow_SkBlurQuality));
+                    kLow_SkBlurQuality);
     }
 
     void onDraw(SkCanvas* canvas) override {
         SkPaint p;
         p.setColor(SK_ColorBLUE);
-        p.setMaskFilter(fBlur.get());
+        p.setMaskFilter(fBlur);
         SkRect r = { 20, 20, 100, 100 };
         canvas->setDrawFilter(nullptr);
         canvas->drawRect(r, p);
diff --git a/gm/drawlooper.cpp b/gm/drawlooper.cpp
index 7ee7747..019566e 100644
--- a/gm/drawlooper.cpp
+++ b/gm/drawlooper.cpp
@@ -82,9 +82,8 @@
             paint->setStyle(gParams[i].fStyle);
             paint->setStrokeWidth(gParams[i].fWidth);
             if (gParams[i].fBlur > 0) {
-                SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                         SkBlurMask::ConvertRadiusToSigma(gParams[i].fBlur));
-                paint->setMaskFilter(mf)->unref();
+                paint->setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                         SkBlurMask::ConvertRadiusToSigma(gParams[i].fBlur)));
             }
         }
         fLooper = looperBuilder.detach();
diff --git a/gm/emboss.cpp b/gm/emboss.cpp
index 5773577..e7c5800 100644
--- a/gm/emboss.cpp
+++ b/gm/emboss.cpp
@@ -43,7 +43,7 @@
         canvas->drawBitmap(bm, 10, 10, &paint);
 
         const SkScalar dir[] = { 1, 1, 1 };
-        paint.setMaskFilter(SkBlurMaskFilter::CreateEmboss(3, dir, 0.3f, 0.1f))->unref();
+        paint.setMaskFilter(SkBlurMaskFilter::MakeEmboss(3, dir, 0.3f, 0.1f));
         canvas->translate(bm.width() + SkIntToScalar(10), 0);
         canvas->drawBitmap(bm, 10, 10, &paint);
 
diff --git a/gm/largeglyphblur.cpp b/gm/largeglyphblur.cpp
index a4c1123..6ffe953 100644
--- a/gm/largeglyphblur.cpp
+++ b/gm/largeglyphblur.cpp
@@ -26,8 +26,7 @@
         static const SkScalar kSigma = SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(40));
 
         SkPaint blurPaint(paint);
-        SkAutoTUnref<SkMaskFilter> mf(SkBlurMaskFilter::Create(kNormal_SkBlurStyle, kSigma));
-        blurPaint.setMaskFilter(mf);
+        blurPaint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, kSigma));
 
         SkTextBlobBuilder builder;
 
diff --git a/gm/megalooper.cpp b/gm/megalooper.cpp
index 6f56402..385c60e 100644
--- a/gm/megalooper.cpp
+++ b/gm/megalooper.cpp
@@ -96,7 +96,7 @@
 
         SkPaint paint;
         paint.setAntiAlias(true);
-        paint.setMaskFilter(createBlur())->unref();
+        paint.setMaskFilter(MakeBlur());
 
         for (int i = 0; i < 4; ++i) {
             paint.setColor(gColors[i]);
@@ -110,11 +110,11 @@
         canvas->restore();
     }
 
-    SkMaskFilter* createBlur() {
+    static sk_sp<SkMaskFilter> MakeBlur() {
         static const SkScalar kBlurSigma = SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(25));
 
-        return SkBlurMaskFilter::Create(kNormal_SkBlurStyle, kBlurSigma,
-                                        SkBlurMaskFilter::kHighQuality_BlurFlag);
+        return SkBlurMaskFilter::Make(kNormal_SkBlurStyle, kBlurSigma,
+                                      SkBlurMaskFilter::kHighQuality_BlurFlag);
     }
 
     // This draws 4 blurred shadows around a single square (centered at x, y).
@@ -173,7 +173,7 @@
 
         SkPaint* paint = looperBuilder.addLayer(info);
 
-        paint->setMaskFilter(this->createBlur())->unref();
+        paint->setMaskFilter(MakeBlur());
 
         paint->setColorFilter(SkColorFilter::MakeModeFilter(color, SkXfermode::kSrcIn_Mode));
 
@@ -219,7 +219,7 @@
             info.fOffset.set(xOff+gBlurOffsets[i].fX, yOff+gBlurOffsets[i].fY);
             paint = looperBuilder.addLayer(info);
 
-            paint->setMaskFilter(this->createBlur())->unref();
+            paint->setMaskFilter(MakeBlur());
 
             paint->setColorFilter(SkColorFilter::MakeModeFilter(gColors[i],
                                                                 SkXfermode::kSrcIn_Mode));
diff --git a/gm/rects.cpp b/gm/rects.cpp
index 51eeff0..9ec7881 100644
--- a/gm/rects.cpp
+++ b/gm/rects.cpp
@@ -64,11 +64,10 @@
             SkPaint p;
             p.setColor(SK_ColorWHITE);
             p.setAntiAlias(true);
-            SkMaskFilter* mf = SkBlurMaskFilter::Create(
+            p.setMaskFilter(SkBlurMaskFilter::Make(
                                    kNormal_SkBlurStyle,
                                    SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
-                                   SkBlurMaskFilter::kHighQuality_BlurFlag);
-            p.setMaskFilter(mf)->unref();
+                                   SkBlurMaskFilter::kHighQuality_BlurFlag));
             fPaints.push_back(p);
         }
 
diff --git a/gm/samplerstress.cpp b/gm/samplerstress.cpp
index 10e3cac..ee87f09 100644
--- a/gm/samplerstress.cpp
+++ b/gm/samplerstress.cpp
@@ -76,12 +76,12 @@
     }
 
     void createMaskFilter() {
-        if (fMaskFilter.get()) {
+        if (fMaskFilter) {
             return;
         }
 
         const SkScalar sigma = 1;
-        fMaskFilter.reset(SkBlurMaskFilter::Create(kNormal_SkBlurStyle, sigma));
+        fMaskFilter = SkBlurMaskFilter::Make(kNormal_SkBlurStyle, sigma);
     }
 
     void onDraw(SkCanvas* canvas) override {
@@ -96,7 +96,7 @@
         paint.setAntiAlias(true);
         paint.setTextSize(72);
         paint.setShader(fShader);
-        paint.setMaskFilter(fMaskFilter.get());
+        paint.setMaskFilter(fMaskFilter);
         sk_tool_utils::set_portable_typeface(&paint);
 
         SkRect temp;
@@ -138,7 +138,7 @@
     SkBitmap        fTexture;
     bool            fTextureCreated;
     sk_sp<SkShader> fShader;
-    SkAutoTUnref<SkMaskFilter> fMaskFilter;
+    sk_sp<SkMaskFilter> fMaskFilter;
 
     typedef GM INHERITED;
 };
diff --git a/gm/skbug1719.cpp b/gm/skbug1719.cpp
index 3358de5..ec7818c 100644
--- a/gm/skbug1719.cpp
+++ b/gm/skbug1719.cpp
@@ -61,9 +61,8 @@
         paint.setAntiAlias(true);
         paint.setColor(0xFF000000);
         paint.setMaskFilter(
-            SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                     0.78867501f,
-                                     SkBlurMaskFilter::kHighQuality_BlurFlag))->unref();
+            SkBlurMaskFilter::Make(kNormal_SkBlurStyle, 0.78867501f,
+                                   SkBlurMaskFilter::kHighQuality_BlurFlag));
         paint.setColorFilter(SkColorFilter::MakeModeFilter(0xBFFFFFFF, SkXfermode::kSrcIn_Mode));
 
         canvas->clipPath(clipPath, SkRegion::kIntersect_Op, true);
diff --git a/gm/textbloblooper.cpp b/gm/textbloblooper.cpp
index ac8b7c9..066546e 100644
--- a/gm/textbloblooper.cpp
+++ b/gm/textbloblooper.cpp
@@ -61,9 +61,8 @@
 };
 
 static void mask_filter(SkPaint* paint) {
-    SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                        SkBlurMask::ConvertRadiusToSigma(3.f));
-    paint->setMaskFilter(mf)->unref();
+    paint->setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                                SkBlurMask::ConvertRadiusToSigma(3.f)));
 }
 
 static sk_sp<SkPathEffect> make_tile_effect() {
diff --git a/gm/textblobmixedsizes.cpp b/gm/textblobmixedsizes.cpp
index b2697a8..82a0dbb 100644
--- a/gm/textblobmixedsizes.cpp
+++ b/gm/textblobmixedsizes.cpp
@@ -135,9 +135,8 @@
         // setup blur paint
         SkPaint blurPaint(paint);
         blurPaint.setColor(sk_tool_utils::color_to_565(SK_ColorBLACK));
-        SkAutoTUnref<SkMaskFilter> mf(SkBlurMaskFilter::Create(kNormal_SkBlurStyle, kSigma));
-        blurPaint.setMaskFilter(mf);
-
+        blurPaint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, kSigma));
+        
         for (int i = 0; i < 4; i++) {
             canvas->save();
             switch (i % 2) {
diff --git a/gm/texteffects.cpp b/gm/texteffects.cpp
index 5962cd7..a398ae2 100644
--- a/gm/texteffects.cpp
+++ b/gm/texteffects.cpp
@@ -13,8 +13,8 @@
 #include "SkLayerRasterizer.h"
 
 static void r0(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
-    p.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                              SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3))))->unref();
+    p.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                           SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3))));
     rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
 
     p.setMaskFilter(nullptr);
diff --git a/gyp/skia_for_android_framework_defines.gypi b/gyp/skia_for_android_framework_defines.gypi
index a06931c..9f6b9ea 100644
--- a/gyp/skia_for_android_framework_defines.gypi
+++ b/gyp/skia_for_android_framework_defines.gypi
@@ -25,6 +25,7 @@
       'SK_SUPPORT_LEGACY_PATHEFFECT_PTR',
       'SK_SUPPORT_LEGACY_NEW_SURFACE_API',
       'SK_SUPPORT_LEGACY_PICTURE_PTR',
+      'SK_SUPPORT_LEGACY_MASKFILTER_PTR',
       'SK_SUPPORT_LEGACY_XFERMODE_PTR',
     ],
   },
diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h
index 1a80ce3..5712255 100644
--- a/include/core/SkPaint.h
+++ b/include/core/SkPaint.h
@@ -41,7 +41,6 @@
     The SkPaint class holds the style and color information about how to draw
     geometries, text and bitmaps.
 */
-
 class SK_API SkPaint {
 public:
     SkPaint();
@@ -589,7 +588,9 @@
                             the paint
         @return             maskfilter
     */
+#ifdef SK_SUPPORT_LEGACY_MASKFILTER_PTR
     SkMaskFilter* setMaskFilter(SkMaskFilter* maskfilter);
+#endif
     void setMaskFilter(sk_sp<SkMaskFilter>);
 
     // These attributes are for text/fonts
diff --git a/include/effects/SkBlurDrawLooper.h b/include/effects/SkBlurDrawLooper.h
index 49b0c51..9b87683 100644
--- a/include/effects/SkBlurDrawLooper.h
+++ b/include/effects/SkBlurDrawLooper.h
@@ -46,8 +46,6 @@
     }
 #endif
 
-    virtual ~SkBlurDrawLooper();
-
     SkDrawLooper::Context* createContext(SkCanvas*, void* storage) const override;
 
     size_t contextSize() const override { return sizeof(BlurDrawLooperContext); }
@@ -64,7 +62,7 @@
     bool asABlurShadow(BlurShadowRec*) const override;
 
 private:
-    SkMaskFilter*   fBlur;
+    sk_sp<SkMaskFilter>  fBlur;
     sk_sp<SkColorFilter> fColorFilter;
     SkScalar        fDx, fDy, fSigma;
     SkColor         fBlurColor;
diff --git a/include/effects/SkBlurMaskFilter.h b/include/effects/SkBlurMaskFilter.h
index 356475e..3ba9177 100644
--- a/include/effects/SkBlurMaskFilter.h
+++ b/include/effects/SkBlurMaskFilter.h
@@ -37,7 +37,8 @@
      *  @param flags    Flags to use - defaults to none
      *  @return The new blur maskfilter
      */
-    static SkMaskFilter* Create(SkBlurStyle style, SkScalar sigma, uint32_t flags = kNone_BlurFlag);
+    static sk_sp<SkMaskFilter> Make(SkBlurStyle style, SkScalar sigma,
+                                    uint32_t flags = kNone_BlurFlag);
 
     /** Create an emboss maskfilter
         @param blurSigma    standard deviation of the Gaussian blur to apply
@@ -47,13 +48,22 @@
         @param specular     coefficient for specular highlights (e.g. 8)
         @return the emboss maskfilter
     */
-    static SkMaskFilter* CreateEmboss(SkScalar blurSigma, const SkScalar direction[3],
-                                      SkScalar ambient, SkScalar specular);
+    static sk_sp<SkMaskFilter> MakeEmboss(SkScalar blurSigma, const SkScalar direction[3],
+                                          SkScalar ambient, SkScalar specular);
 
+#ifdef SK_SUPPORT_LEGACY_MASKFILTER_PTR
+    static SkMaskFilter* Create(SkBlurStyle style, SkScalar sigma, uint32_t flags = kNone_BlurFlag){
+        return Make(style, sigma, flags).release();
+    }
+    static SkMaskFilter* CreateEmboss(SkScalar blurSigma, const SkScalar direction[3],
+                                      SkScalar ambient, SkScalar specular) {
+        return MakeEmboss(blurSigma, direction, ambient, specular).release();
+    }
     SK_ATTR_DEPRECATED("use sigma version")
     static SkMaskFilter* CreateEmboss(const SkScalar direction[3],
                                       SkScalar ambient, SkScalar specular,
                                       SkScalar blurRadius);
+#endif
 
     SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
 
diff --git a/include/effects/SkEmbossMaskFilter.h b/include/effects/SkEmbossMaskFilter.h
index 72020bf..8a34282 100644
--- a/include/effects/SkEmbossMaskFilter.h
+++ b/include/effects/SkEmbossMaskFilter.h
@@ -23,7 +23,13 @@
         uint8_t     fSpecular;      // exponent, 4.4 right now
     };
 
-    static SkMaskFilter* Create(SkScalar blurSigma, const Light& light);
+    static sk_sp<SkMaskFilter> Make(SkScalar blurSigma, const Light& light);
+    
+#ifdef SK_SUPPORT_LEGACY_MASKFILTER_PTR
+    static SkMaskFilter* Create(SkScalar blurSigma, const Light& light) {
+        return Make(blurSigma, light).release();
+    }
+#endif
 
     // overrides from SkMaskFilter
     //  This method is not exported to java.
diff --git a/public.bzl b/public.bzl
index bf163d0..889585c 100644
--- a/public.bzl
+++ b/public.bzl
@@ -544,6 +544,7 @@
     "SK_SUPPORT_LEGACY_NEW_SURFACE_API",
     "SK_SUPPORT_LEGACY_PATHEFFECT_PTR",
     "SK_SUPPORT_LEGACY_PICTURE_PTR",
+    "SK_SUPPORT_LEGACY_MASKFILTER_PTR",
     "SK_SUPPORT_LEGACY_XFERMODE_PTR",
 ]
 
diff --git a/samplecode/SampleAll.cpp b/samplecode/SampleAll.cpp
index aa08261..357a437 100644
--- a/samplecode/SampleAll.cpp
+++ b/samplecode/SampleAll.cpp
@@ -77,9 +77,9 @@
 ///////////////////////////////////////////////////////////
 
 static void r0(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
-    p.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                             SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3)),
-                                             SkBlurMaskFilter::kNone_BlurFlag))->unref();
+    p.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                           SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3)),
+                                           SkBlurMaskFilter::kNone_BlurFlag));
     rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
 
     p.setMaskFilter(nullptr);
@@ -250,9 +250,9 @@
 
 #if 1
     SkScalar dir[] = { SK_Scalar1, SK_Scalar1, SK_Scalar1 };
-    paint->setMaskFilter(SkBlurMaskFilter::CreateEmboss(
+    paint->setMaskFilter(SkBlurMaskFilter::MakeEmboss(
                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3)), dir,
-                SK_Scalar1/4, SkIntToScalar(4)))->unref();
+                SK_Scalar1/4, SkIntToScalar(4)));
     paint->setColor(SK_ColorBLUE);
 #endif
 }
@@ -379,8 +379,6 @@
         light.fDirection[2] = SK_Scalar1/3;
         light.fAmbient        = 0x48;
         light.fSpecular        = 0x80;
-        SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(12)/5);
-        SkMaskFilter* embossFilter = SkEmbossMaskFilter::Create(sigma, light);
 
         auto lightingFilter = SkColorMatrixFilter::MakeLightingFilter(
             0xff89bc45, 0xff112233);
@@ -420,7 +418,8 @@
 
         // circle w/ emboss & transparent (exercises 3dshader)
         canvas->translate(SkIntToScalar(50), 0);
-        paint.setMaskFilter(embossFilter)->unref();
+        paint.setMaskFilter(SkEmbossMaskFilter::Make(
+                                     SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(12)/5), light));
         canvas->drawOval(rect, paint);
         canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
 //        paint.setShader(transparentShader)->unref();
diff --git a/samplecode/SampleAnimBlur.cpp b/samplecode/SampleAnimBlur.cpp
index 98a3560..5330fdf 100644
--- a/samplecode/SampleAnimBlur.cpp
+++ b/samplecode/SampleAnimBlur.cpp
@@ -46,12 +46,10 @@
         SkRandom random;
 
         for (size_t i = 0; i < SK_ARRAY_COUNT(gStyles); ++i) {
-            SkMaskFilter* mf = SkBlurMaskFilter::Create(
-                                       gStyles[i],
-                                       fBlurSigma,
-                                       SkBlurMaskFilter::kHighQuality_BlurFlag);
             SkPaint paint;
-            SkSafeUnref(paint.setMaskFilter(mf));
+            paint.setMaskFilter(SkBlurMaskFilter::Make(gStyles[i],
+                                                       fBlurSigma,
+                                                       SkBlurMaskFilter::kHighQuality_BlurFlag));
             paint.setColor(random.nextU() | 0xff000000);
             canvas->drawCircle(200 * SK_Scalar1 + 400 * (i % 2) * SK_Scalar1,
                                200 * SK_Scalar1 + i / 2 * 400 * SK_Scalar1,
diff --git a/samplecode/SampleBigBlur.cpp b/samplecode/SampleBigBlur.cpp
index 800ae24..cb7a419 100644
--- a/samplecode/SampleBigBlur.cpp
+++ b/samplecode/SampleBigBlur.cpp
@@ -29,11 +29,10 @@
         SkPaint paint;
         canvas->save();
         paint.setColor(SK_ColorBLUE);
-        SkMaskFilter* mf = SkBlurMaskFilter::Create(
+        paint.setMaskFilter(SkBlurMaskFilter::Make(
             kNormal_SkBlurStyle,
             SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(128)),
-            SkBlurMaskFilter::kHighQuality_BlurFlag);
-        paint.setMaskFilter(mf)->unref();
+            SkBlurMaskFilter::kHighQuality_BlurFlag));
         canvas->translate(200, 200);
         canvas->drawCircle(100, 100, 200, paint);
         canvas->restore();
diff --git a/samplecode/SampleBlur.cpp b/samplecode/SampleBlur.cpp
index b617691..7e6a325 100644
--- a/samplecode/SampleBlur.cpp
+++ b/samplecode/SampleBlur.cpp
@@ -98,10 +98,9 @@
             paint.setColor(SK_ColorBLUE);
             for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
                 if (gRecs[i].fStyle != NONE) {
-                    SkMaskFilter* mf = SkBlurMaskFilter::Create(gRecs[i].fStyle,
+                    paint.setMaskFilter(SkBlurMaskFilter::Make(gRecs[i].fStyle,
                                       SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)),
-                                      flags);
-                    paint.setMaskFilter(mf)->unref();
+                                      flags));
                 } else {
                     paint.setMaskFilter(nullptr);
                 }
@@ -110,10 +109,9 @@
             }
             // draw text
             {
-                SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4)),
-                                      flags);
-                paint.setMaskFilter(mf)->unref();
+                paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                                           SkBlurMask::ConvertRadiusToSigma(4),
+                                                           flags));
                 SkScalar x = SkIntToScalar(70);
                 SkScalar y = SkIntToScalar(400);
                 paint.setColor(SK_ColorBLACK);
diff --git a/samplecode/SampleEffects.cpp b/samplecode/SampleEffects.cpp
index a8f793c..c998052 100644
--- a/samplecode/SampleEffects.cpp
+++ b/samplecode/SampleEffects.cpp
@@ -22,18 +22,15 @@
 }
 
 static void paint_proc1(SkPaint* paint) {
-    paint->setMaskFilter(SkBlurMaskFilter::Create(
+    paint->setMaskFilter(SkBlurMaskFilter::Make(
                                 kNormal_SkBlurStyle,
-                                SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(2))))->unref();
+                                SkBlurMask::ConvertRadiusToSigma(2)));
 }
 
 static void paint_proc2(SkPaint* paint) {
     SkScalar dir[3] = { 1, 1, 1};
     paint->setMaskFilter(
-            SkBlurMaskFilter::CreateEmboss(SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(1)),
-                                           dir,
-                                           0.1f,
-                                           0.05f))->unref();
+            SkBlurMaskFilter::MakeEmboss(SkBlurMask::ConvertRadiusToSigma(1), dir, 0.1f, 0.05f));
 }
 
 static void paint_proc3(SkPaint* paint) {
diff --git a/samplecode/SampleEmboss.cpp b/samplecode/SampleEmboss.cpp
index 215a1e0..f1ea1fe 100644
--- a/samplecode/SampleEmboss.cpp
+++ b/samplecode/SampleEmboss.cpp
@@ -50,8 +50,7 @@
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
         paint.setStrokeWidth(SkIntToScalar(10));
-        paint.setMaskFilter(SkEmbossMaskFilter::Create(
-            SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4)), fLight))->unref();
+        paint.setMaskFilter(SkEmbossMaskFilter::Make(SkBlurMask::ConvertRadiusToSigma(4), fLight));
         paint.setShader(SkShader::MakeColorShader(SK_ColorBLUE));
         paint.setDither(true);
 
diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp
index 6413aa1..1b7d30b 100644
--- a/samplecode/SampleFilterFuzz.cpp
+++ b/samplecode/SampleFilterFuzz.cpp
@@ -461,13 +461,12 @@
     return pathEffect;
 }
 
-static SkMaskFilter* make_mask_filter() {
-    SkMaskFilter* maskFilter;
+static sk_sp<SkMaskFilter> make_mask_filter() {
+    sk_sp<SkMaskFilter> maskFilter;
     switch (R(3)) {
         case 0:
-            maskFilter = SkBlurMaskFilter::Create(make_blur_style(),
-                                                  make_scalar(),
-                                                  make_blur_mask_filter_flag());
+            maskFilter = SkBlurMaskFilter::Make(make_blur_style(), make_scalar(),
+                                                make_blur_mask_filter_flag());
         case 1: {
             SkEmbossMaskFilter::Light light;
             for (int i = 0; i < 3; ++i) {
@@ -476,12 +475,10 @@
             light.fPad = R(65536);
             light.fAmbient = R(256);
             light.fSpecular = R(256);
-            maskFilter = SkEmbossMaskFilter::Create(make_scalar(),
-                                                    light);
+            maskFilter = SkEmbossMaskFilter::Make(make_scalar(), light);
         }
         case 2:
         default:
-            maskFilter = nullptr;
             break;
     }
     return maskFilter;
diff --git a/samplecode/SampleFuzz.cpp b/samplecode/SampleFuzz.cpp
index b8c800a..76420f0 100644
--- a/samplecode/SampleFuzz.cpp
+++ b/samplecode/SampleFuzz.cpp
@@ -189,8 +189,7 @@
 
     case 7:
       if (quick == true) break;
-          SkSafeUnref(paint.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                                                   make_number())));
+      paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, make_number()));
       break;
 
     case 8:
diff --git a/samplecode/SampleSlides.cpp b/samplecode/SampleSlides.cpp
index b4ebb3c..4748a76 100644
--- a/samplecode/SampleSlides.cpp
+++ b/samplecode/SampleSlides.cpp
@@ -462,8 +462,8 @@
 
 static void r0(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
 {
-    p.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                             SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3))))->unref();
+    p.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                           SkBlurMask::ConvertRadiusToSigma(3)));
     rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
 
     p.setMaskFilter(nullptr);
diff --git a/samplecode/SampleStrokePath.cpp b/samplecode/SampleStrokePath.cpp
index f3cdee3..e69625e 100644
--- a/samplecode/SampleStrokePath.cpp
+++ b/samplecode/SampleStrokePath.cpp
@@ -165,12 +165,10 @@
                 kSolid_SkBlurStyle,
             };
             for (int x = 0; x < 5; x++) {
-                SkMaskFilter* mf;
                 SkScalar sigma = SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4));
                 for (int y = 0; y < 10; y++) {
                     if (x) {
-                        mf = SkBlurMaskFilter::Create(gStyle[x - 1], sigma);
-                        paint.setMaskFilter(mf)->unref();
+                        paint.setMaskFilter(SkBlurMaskFilter::Make(gStyle[x - 1], sigma));
                     }
                     canvas->drawText("Title Bar", 9, x*SkIntToScalar(100), y*SkIntToScalar(30), paint);
                     sigma *= 0.75f;
diff --git a/samplecode/SampleTextAlpha.cpp b/samplecode/SampleTextAlpha.cpp
index a57c016..cb07e92 100644
--- a/samplecode/SampleTextAlpha.cpp
+++ b/samplecode/SampleTextAlpha.cpp
@@ -52,9 +52,8 @@
 
         paint.setARGB(fByte, 0xFF, 0xFF, 0xFF);
 
-        paint.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                    SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3))));
-        paint.getMaskFilter()->unref();
+        paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                                   SkBlurMask::ConvertRadiusToSigma(3)));
 
         SkRandom rand;
 
diff --git a/samplecode/SampleTextureDomain.cpp b/samplecode/SampleTextureDomain.cpp
index 59d0822..e615235 100644
--- a/samplecode/SampleTextureDomain.cpp
+++ b/samplecode/SampleTextureDomain.cpp
@@ -77,12 +77,11 @@
         // renders correctly
         srcRect.setXYWH(1, 1, 3, 3);
         dstRect.setXYWH(5, 405, 305, 305);
-        SkMaskFilter* mf = SkBlurMaskFilter::Create(
+        paint.setMaskFilter(SkBlurMaskFilter::Make(
             kNormal_SkBlurStyle,
             SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
             SkBlurMaskFilter::kHighQuality_BlurFlag |
-            SkBlurMaskFilter::kIgnoreTransform_BlurFlag);
-        paint.setMaskFilter(mf)->unref();
+            SkBlurMaskFilter::kIgnoreTransform_BlurFlag));
         canvas->drawImageRect(image, srcRect, dstRect, &paint);
 
         // Blur and a rotation + nullptr src rect
@@ -90,10 +89,9 @@
         // but it will test a code path in SkGpuDevice::drawBitmap
         // that handles blurs with rects transformed to non-
         // orthogonal rects. It also tests the nullptr src rect handling
-        mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                      SkBlurMask::ConvertRadiusToSigma(5),
-                                      SkBlurMaskFilter::kHighQuality_BlurFlag);
-        paint.setMaskFilter(mf)->unref();
+        paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                                   SkBlurMask::ConvertRadiusToSigma(5),
+                                                   SkBlurMaskFilter::kHighQuality_BlurFlag));
 
         dstRect.setXYWH(-150, -150, 300, 300);
         canvas->translate(550, 550);
diff --git a/samplecode/SampleXfermodesBlur.cpp b/samplecode/SampleXfermodesBlur.cpp
index cab1339..af75f89 100644
--- a/samplecode/SampleXfermodesBlur.cpp
+++ b/samplecode/SampleXfermodesBlur.cpp
@@ -42,10 +42,9 @@
     void draw_mode(SkCanvas* canvas, sk_sp<SkXfermode> mode, int alpha,
                    SkScalar x, SkScalar y) {
         SkPaint p;
-        SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                       SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
-                                       SkBlurMaskFilter::kNone_BlurFlag);
-        p.setMaskFilter(mf)->unref();
+        p.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                               SkBlurMask::ConvertRadiusToSigma(5),
+                                               SkBlurMaskFilter::kNone_BlurFlag));
 
         SkScalar ww = SkIntToScalar(W);
         SkScalar hh = SkIntToScalar(H);
diff --git a/src/animator/SkDrawBlur.cpp b/src/animator/SkDrawBlur.cpp
index 14f34ac..0acb13e 100644
--- a/src/animator/SkDrawBlur.cpp
+++ b/src/animator/SkDrawBlur.cpp
@@ -29,5 +29,5 @@
     if (fSigma <= 0) {
         return nullptr;
     }
-    return SkBlurMaskFilter::Create((SkBlurStyle)fBlurStyle, fSigma);
+    return SkBlurMaskFilter::Make((SkBlurStyle)fBlurStyle, fSigma).release();
 }
diff --git a/src/animator/SkDrawEmboss.cpp b/src/animator/SkDrawEmboss.cpp
index a1cd4dc..9f50f24 100644
--- a/src/animator/SkDrawEmboss.cpp
+++ b/src/animator/SkDrawEmboss.cpp
@@ -29,6 +29,6 @@
 SkMaskFilter* SkDrawEmboss::getMaskFilter() {
     if (fSigma < 0 || fDirection.count() !=3)
         return nullptr;
-    return SkBlurMaskFilter::CreateEmboss(fSigma, fDirection.begin(),
-                                          fAmbient, fSpecular);
+    return SkBlurMaskFilter::MakeEmboss(fSigma, fDirection.begin(),
+                                        fAmbient, fSpecular).release();
 }
diff --git a/src/animator/SkDrawPaint.cpp b/src/animator/SkDrawPaint.cpp
index fc1a413..1336ea2 100644
--- a/src/animator/SkDrawPaint.cpp
+++ b/src/animator/SkDrawPaint.cpp
@@ -229,7 +229,7 @@
     if (maskFilter == nullptr)
         paint->setMaskFilter(nullptr);
     else if (maskFilter != (SkDrawMaskFilter*) -1)
-        SkSafeUnref(paint->setMaskFilter(maskFilter->getMaskFilter()));
+        paint->setMaskFilter(sk_sp<SkMaskFilter>(maskFilter->getMaskFilter()));
     if (pathEffect == nullptr)
         paint->setPathEffect(nullptr);
     else if (pathEffect != (SkDrawPathEffect*) -1)
diff --git a/src/c/sk_paint.cpp b/src/c/sk_paint.cpp
index b48e28f..f82cd81 100644
--- a/src/c/sk_paint.cpp
+++ b/src/c/sk_paint.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "SkMaskFilter.h"
 #include "SkPaint.h"
 #include "SkShader.h"
 
@@ -68,7 +69,7 @@
 }
 
 void sk_paint_set_maskfilter(sk_paint_t* cpaint, sk_maskfilter_t* cfilter) {
-    AsPaint(cpaint)->setMaskFilter(AsMaskFilter(cfilter));
+    AsPaint(cpaint)->setMaskFilter(sk_ref_sp(AsMaskFilter(cfilter)));
 }
 
 bool sk_paint_is_stroke(const sk_paint_t* cpaint) {
diff --git a/src/c/sk_surface.cpp b/src/c/sk_surface.cpp
index fcc2246..c9b2567 100644
--- a/src/c/sk_surface.cpp
+++ b/src/c/sk_surface.cpp
@@ -671,7 +671,7 @@
     if (!find_blurstyle(cstyle, &style)) {
         return NULL;
     }
-    return ToMaskFilter(SkBlurMaskFilter::Create(style, sigma));
+    return ToMaskFilter(SkBlurMaskFilter::Make(style, sigma).release());
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index d5e4c08..8bd386a 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -386,7 +386,9 @@
 #ifdef SK_SUPPORT_LEGACY_PATHEFFECT_PTR
 SET_PTR(PathEffect)
 #endif
+#ifdef SK_SUPPORT_LEGACY_MASKFILTER_PTR
 SET_PTR(MaskFilter)
+#endif
 #undef SET_PTR
 
 #ifdef SK_SUPPORT_LEGACY_MINOR_EFFECT_PTR
@@ -2255,7 +2257,7 @@
     }
     fPaint.setStyle(style);
     fPaint.setPathEffect(pe);
-    fPaint.setMaskFilter(paint.getMaskFilter());    // restore
+    fPaint.setMaskFilter(sk_ref_sp(paint.getMaskFilter()));    // restore
 
     // now compute fXOffset if needed
 
diff --git a/src/effects/SkBlurDrawLooper.cpp b/src/effects/SkBlurDrawLooper.cpp
index 2578d09..3058374 100644
--- a/src/effects/SkBlurDrawLooper.cpp
+++ b/src/effects/SkBlurDrawLooper.cpp
@@ -34,7 +34,7 @@
                     SkBlurMaskFilter::kHighQuality_BlurFlag :
                     SkBlurMaskFilter::kNone_BlurFlag;
 
-        fBlur = SkBlurMaskFilter::Create(kNormal_SkBlurStyle, fSigma, flags);
+        fBlur = SkBlurMaskFilter::Make(kNormal_SkBlurStyle, fSigma, flags);
     } else {
         fBlur = nullptr;
     }
@@ -78,10 +78,6 @@
     buffer.write32(fBlurFlags);
 }
 
-SkBlurDrawLooper::~SkBlurDrawLooper() {
-    SkSafeUnref(fBlur);
-}
-
 bool SkBlurDrawLooper::asABlurShadow(BlurShadowRec* rec) const {
     if (fSigma <= 0 || (fBlurFlags & fBlurFlags & kIgnoreTransform_BlurFlag)) {
         return false;
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
index ec4fd93..bb6a8a5 100644
--- a/src/effects/SkBlurMaskFilter.cpp
+++ b/src/effects/SkBlurMaskFilter.cpp
@@ -123,7 +123,7 @@
 
 const SkScalar SkBlurMaskFilterImpl::kMAX_BLUR_SIGMA = SkIntToScalar(128);
 
-SkMaskFilter* SkBlurMaskFilter::Create(SkBlurStyle style, SkScalar sigma, uint32_t flags) {
+sk_sp<SkMaskFilter> SkBlurMaskFilter::Make(SkBlurStyle style, SkScalar sigma, uint32_t flags) {
     if (!SkScalarIsFinite(sigma) || sigma <= 0) {
         return nullptr;
     }
@@ -133,7 +133,7 @@
     if (flags > SkBlurMaskFilter::kAll_BlurFlag) {
         return nullptr;
     }
-    return new SkBlurMaskFilterImpl(sigma, style, flags);
+    return sk_sp<SkMaskFilter>(new SkBlurMaskFilterImpl(sigma, style, flags));
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -586,7 +586,7 @@
     const unsigned style = buffer.readUInt();
     const unsigned flags = buffer.readUInt();
     if (style <= kLastEnum_SkBlurStyle) {
-        return sk_sp<SkFlattenable>(SkBlurMaskFilter::Create((SkBlurStyle)style, sigma, flags));
+        return SkBlurMaskFilter::Make((SkBlurStyle)style, sigma, flags);
     }
     return nullptr;
 }
diff --git a/src/effects/SkEmbossMaskFilter.cpp b/src/effects/SkEmbossMaskFilter.cpp
index aa93e5a..5f3952d 100644
--- a/src/effects/SkEmbossMaskFilter.cpp
+++ b/src/effects/SkEmbossMaskFilter.cpp
@@ -13,19 +13,21 @@
 #include "SkWriteBuffer.h"
 #include "SkString.h"
 
-SkMaskFilter* SkEmbossMaskFilter::Create(SkScalar blurSigma, const Light& light) {
-    return new SkEmbossMaskFilter(blurSigma, light);
+sk_sp<SkMaskFilter> SkEmbossMaskFilter::Make(SkScalar blurSigma, const Light& light) {
+    return sk_sp<SkMaskFilter>(new SkEmbossMaskFilter(blurSigma, light));
 }
 
+#ifdef SK_SUPPORT_LEGACY_MASKFILTER_PTR
 SkMaskFilter* SkBlurMaskFilter::CreateEmboss(const SkScalar direction[3],
                                              SkScalar ambient, SkScalar specular,
                                              SkScalar blurRadius) {
     return SkBlurMaskFilter::CreateEmboss(SkBlurMask::ConvertRadiusToSigma(blurRadius),
                                           direction, ambient, specular);
 }
+#endif
 
-SkMaskFilter* SkBlurMaskFilter::CreateEmboss(SkScalar blurSigma, const SkScalar direction[3],
-                                             SkScalar ambient, SkScalar specular) {
+sk_sp<SkMaskFilter> SkBlurMaskFilter::MakeEmboss(SkScalar blurSigma, const SkScalar direction[3],
+                                                 SkScalar ambient, SkScalar specular) {
     if (direction == nullptr) {
         return nullptr;
     }
@@ -39,7 +41,7 @@
     static const SkScalar kSpecularMultiplier = SkIntToScalar(255) / 16;
     light.fSpecular = static_cast<U8CPU>(SkScalarPin(specular, 0, 16) * kSpecularMultiplier + 0.5);
 
-    return SkEmbossMaskFilter::Create(blurSigma, light);
+    return SkEmbossMaskFilter::Make(blurSigma, light);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -117,7 +119,7 @@
     if (buffer.readByteArray(&light, sizeof(Light))) {
         light.fPad = 0; // for the font-cache lookup to be clean
         const SkScalar sigma = buffer.readScalar();
-        return sk_sp<SkFlattenable>(Create(sigma, light));
+        return Make(sigma, light);
     }
     return nullptr;
 }
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp
index ffcaa43..d8f7744 100644
--- a/src/effects/SkLayerDrawLooper.cpp
+++ b/src/effects/SkLayerDrawLooper.cpp
@@ -95,7 +95,7 @@
         dst->setPathEffect(sk_ref_sp(src.getPathEffect()));
     }
     if (bits & kMaskFilter_Bit) {
-        dst->setMaskFilter(src.getMaskFilter());
+        dst->setMaskFilter(sk_ref_sp(src.getMaskFilter()));
     }
     if (bits & kShader_Bit) {
         dst->setShader(sk_ref_sp(src.getShader()));
diff --git a/tests/BlurTest.cpp b/tests/BlurTest.cpp
index 8c726e9..679701d 100644
--- a/tests/BlurTest.cpp
+++ b/tests/BlurTest.cpp
@@ -111,11 +111,7 @@
 
         const uint32_t flagPermutations = SkBlurMaskFilter::kAll_BlurFlag;
         for (uint32_t flags = 0; flags < flagPermutations; ++flags) {
-            SkMaskFilter* filter;
-            filter = SkBlurMaskFilter::Create(blurStyle, sigma, flags);
-
-            paint.setMaskFilter(filter);
-            filter->unref();
+            paint.setMaskFilter(SkBlurMaskFilter::Make(blurStyle, sigma, flags));
 
             for (size_t test = 0; test < SK_ARRAY_COUNT(tests); ++test) {
                 SkPath path;
@@ -234,10 +230,8 @@
 
     SkPaint blurPaint;
     blurPaint.setColor(SK_ColorWHITE);
-    SkMaskFilter* filter = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                                    gaussianSigma,
-                                                    SkBlurMaskFilter::kHighQuality_BlurFlag);
-    blurPaint.setMaskFilter(filter)->unref();
+    blurPaint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, gaussianSigma,
+                                                   SkBlurMaskFilter::kHighQuality_BlurFlag));
 
     canvas->drawColor(SK_ColorBLACK);
     canvas->drawPath(path, blurPaint);
@@ -463,17 +457,18 @@
     builder->addLayer(info);
 }
 
-static void make_blur_layer(SkLayerDrawLooper::Builder* builder, SkMaskFilter* mf) {
+static void make_blur_layer(SkLayerDrawLooper::Builder* builder, sk_sp<SkMaskFilter> mf) {
     SkLayerDrawLooper::LayerInfo info;
 
     info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit;
     info.fColorMode = SkXfermode::kSrc_Mode;
     SkPaint* paint = builder->addLayer(info);
-    paint->setMaskFilter(mf);
+    paint->setMaskFilter(std::move(mf));
 }
 
-static void test_layerDrawLooper(skiatest::Reporter* reporter, SkMaskFilter* mf, SkScalar sigma,
-                                 SkBlurStyle style, SkBlurQuality quality, bool expectSuccess) {
+static void test_layerDrawLooper(skiatest::Reporter* reporter, sk_sp<SkMaskFilter> mf,
+                                 SkScalar sigma, SkBlurStyle style, SkBlurQuality quality,
+                                 bool expectSuccess) {
 
     SkLayerDrawLooper::LayerInfo info;
     SkLayerDrawLooper::Builder builder;
@@ -517,7 +512,7 @@
             for (int flags = 0; flags <= SkBlurMaskFilter::kAll_BlurFlag; ++flags) {
                 const SkBlurQuality quality = blurMaskFilterFlags_as_quality(flags);
 
-                SkAutoTUnref<SkMaskFilter> mf(SkBlurMaskFilter::Create(style, sigma, flags));
+                sk_sp<SkMaskFilter> mf(SkBlurMaskFilter::Make(style, sigma, flags));
                 if (nullptr == mf.get()) {
                     REPORTER_ASSERT(reporter, sigma <= 0);
                 } else {
@@ -532,7 +527,7 @@
                         REPORTER_ASSERT(reporter, rec.fStyle == style);
                         REPORTER_ASSERT(reporter, rec.fQuality == quality);
                     }
-                    test_layerDrawLooper(reporter, mf, sigma, style, quality, success);
+                    test_layerDrawLooper(reporter, std::move(mf), sigma, style, quality, success);
                 }
                 test_blurDrawLooper(reporter, sigma, style, flags);
             }
@@ -547,8 +542,8 @@
         };
         for (size_t j = 0; j < SK_ARRAY_COUNT(sigmas); ++j) {
             const SkScalar sigma = sigmas[j];
-            SkAutoTUnref<SkMaskFilter> mf(SkEmbossMaskFilter::Create(sigma, light));
-            if (mf.get()) {
+            auto mf(SkEmbossMaskFilter::Make(sigma, light));
+            if (mf) {
                 SkMaskFilter::BlurRec rec;
                 bool success = mf->asABlur(&rec);
                 REPORTER_ASSERT(reporter, !success);
@@ -571,7 +566,7 @@
     SkRRect rr = SkRRect::MakeRectXY(r, 10, 10);
 
     SkPaint p;
-    p.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle, 0.01f))->unref();
+    p.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, 0.01f));
 
     canvas->drawRRect(rr, p);
 }
diff --git a/tests/PaintTest.cpp b/tests/PaintTest.cpp
index b07c0e4..253ce86 100644
--- a/tests/PaintTest.cpp
+++ b/tests/PaintTest.cpp
@@ -147,9 +147,8 @@
     // set a few pointers
     SkLayerDrawLooper::Builder looperBuilder;
     paint.setLooper(looperBuilder.detach());
-    SkMaskFilter* mask = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
-                                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(1)));
-    paint.setMaskFilter(mask)->unref();
+    paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
+                                               SkBlurMask::ConvertRadiusToSigma(1)));
 
     // copy the paint using the copy constructor and check they are the same
     SkPaint copiedPaint = paint;
diff --git a/tools/debugger/SkDrawCommand.cpp b/tools/debugger/SkDrawCommand.cpp
index d868418..985f7d5 100644
--- a/tools/debugger/SkDrawCommand.cpp
+++ b/tools/debugger/SkDrawCommand.cpp
@@ -1145,10 +1145,10 @@
                                           SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER)) {
         Json::Value jsonMaskFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_MASKFILTER];
-        SkMaskFilter* maskFilter = (SkMaskFilter*) load_flattenable(jsonMaskFilter, urlDataManager);
-        if (maskFilter != nullptr) {
-            target->setMaskFilter(maskFilter);
-            maskFilter->unref();
+        sk_sp<SkMaskFilter> maskFilter((SkMaskFilter*)load_flattenable(jsonMaskFilter,
+                                                                       urlDataManager));
+        if (maskFilter) {
+            target->setMaskFilter(std::move(maskFilter));
         }
     }
 }
@@ -1339,7 +1339,7 @@
             SkASSERT(false);
             flags = SkBlurMaskFilter::BlurFlags::kNone_BlurFlag;
         }
-        target->setMaskFilter(SkBlurMaskFilter::Create(style, sigma, flags));
+        target->setMaskFilter(SkBlurMaskFilter::Make(style, sigma, flags));
     }
 }