hide setImageFilter(ptr)

BUG=skia:

GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=4184

Change-Id: Iad792cfdf54087ad4c424fd268559c162a9a5f5c
Reviewed-on: https://skia-review.googlesource.com/4184
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/fuzz/FilterFuzz.cpp b/fuzz/FilterFuzz.cpp
index ed47d06..1b9f8a1 100644
--- a/fuzz/FilterFuzz.cpp
+++ b/fuzz/FilterFuzz.cpp
@@ -732,7 +732,7 @@
     return (filter || canBeNull) ? filter : make_image_filter(canBeNull);
 }
 
-static SkImageFilter* make_serialized_image_filter() {
+static sk_sp<SkImageFilter> make_serialized_image_filter() {
     sk_sp<SkImageFilter> filter(make_image_filter(false));
     sk_sp<SkData> data(SkValidatingSerializeFlattenable(filter.get()));
     const unsigned char* ptr = static_cast<const unsigned char*>(data->data());
@@ -759,9 +759,7 @@
         }
     }
 #endif // SK_ADD_RANDOM_BIT_FLIPS
-    SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(ptr, len,
-                                    SkImageFilter::GetFlattenableType());
-    return static_cast<SkImageFilter*>(flattenable);
+    return SkValidatingDeserializeImageFilter(ptr, len);
 }
 
 static void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) {
@@ -774,10 +772,9 @@
 
 DEF_FUZZ(SerializedImageFilter, f) {
     fuzz = f;
-    SkImageFilter* filter = make_serialized_image_filter();
 
     SkPaint paint;
-    SkSafeUnref(paint.setImageFilter(filter));
+    paint.setImageFilter(make_serialized_image_filter());
     SkBitmap bitmap;
     SkCanvas canvas(bitmap);
     drawClippedBitmap(&canvas, 0, 0, paint);
diff --git a/gn/android_framework_defines.gni b/gn/android_framework_defines.gni
index 7e87131..7422382 100644
--- a/gn/android_framework_defines.gni
+++ b/gn/android_framework_defines.gni
@@ -16,4 +16,5 @@
   "SK_SUPPORT_LEGACY_SHADER_ISABITMAP",
   "SK_SUPPORT_LEGACY_COLOR_SPACE_FACTORIES",
   "SK_SUPPORT_LEGACY_SHADER_ASALOCALMATRIXSHADER",
+  "SK_SUPPORT_LEGACY_SETIMAGEFILTER_PTR",
 ]
diff --git a/include/core/SkFlattenableSerialization.h b/include/core/SkFlattenableSerialization.h
index ffb1b5a..c6fd53d 100644
--- a/include/core/SkFlattenableSerialization.h
+++ b/include/core/SkFlattenableSerialization.h
@@ -11,9 +11,12 @@
 #include "SkFlattenable.h"
 
 class SkData;
+class SkImageFilter;
 
 SK_API SkData* SkValidatingSerializeFlattenable(SkFlattenable*);
 SK_API SkFlattenable* SkValidatingDeserializeFlattenable(const void* data, size_t size,
                                                          SkFlattenable::Type type);
 
+SK_API sk_sp<SkImageFilter> SkValidatingDeserializeImageFilter(const void* data, size_t size);
+
 #endif
diff --git a/include/core/SkPaint.h b/include/core/SkPaint.h
index 353c147..5bb1686 100644
--- a/include/core/SkPaint.h
+++ b/include/core/SkPaint.h
@@ -603,8 +603,10 @@
     void setRasterizer(sk_sp<SkRasterizer>);
 
     SkImageFilter* getImageFilter() const { return fImageFilter.get(); }
-    SkImageFilter* setImageFilter(SkImageFilter*);
     void setImageFilter(sk_sp<SkImageFilter>);
+#ifdef SK_SUPPORT_LEGACY_SETIMAGEFILTER_PTR
+    SkImageFilter* setImageFilter(SkImageFilter*);
+#endif
 
     /**
      *  Return the paint's SkDrawLooper (if any). Does not affect the looper's
diff --git a/public.bzl b/public.bzl
index 7c54ee7..5a166f3 100644
--- a/public.bzl
+++ b/public.bzl
@@ -602,6 +602,7 @@
     "SK_SUPPORT_LEGACY_ACCESSBITMAP",
     "SK_SUPPORT_LEGACY_CLIP_REGIONOPS",
     "SK_SUPPORT_LEGACY_COLOR_SPACE_FACTORIES",
+    "SK_SUPPORT_LEGACY_SETIMAGEFILTER_PTR",
     "SK_SUPPORT_LEGACY_SHADER_ASALOCALMATRIXSHADER",
     "SK_SUPPORT_LEGACY_XFERMODE_PARAM",
 ]
diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp
index 139166f..5f65c9f 100644
--- a/samplecode/SampleFilterFuzz.cpp
+++ b/samplecode/SampleFilterFuzz.cpp
@@ -736,7 +736,7 @@
     return (filter || canBeNull) ? filter : make_image_filter(canBeNull);
 }
 
-static SkImageFilter* make_serialized_image_filter() {
+static sk_sp<SkImageFilter> make_serialized_image_filter() {
     sk_sp<SkImageFilter> filter(make_image_filter(false));
     sk_sp<SkData> data(SkValidatingSerializeFlattenable(filter.get()));
     const unsigned char* ptr = static_cast<const unsigned char*>(data->data());
@@ -763,9 +763,7 @@
         }
     }
 #endif // SK_ADD_RANDOM_BIT_FLIPS
-    SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(ptr, len,
-                                    SkImageFilter::GetFlattenableType());
-    return static_cast<SkImageFilter*>(flattenable);
+    return SkValidatingDeserializeImageFilter(ptr, len);
 }
 
 static void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) {
@@ -777,7 +775,7 @@
 }
 
 static void do_fuzz(SkCanvas* canvas) {
-    SkImageFilter* filter = make_serialized_image_filter();
+    sk_sp<SkImageFilter> filter = make_serialized_image_filter();
 
 #ifdef SK_FUZZER_IS_VERBOSE
     static uint32_t numFilters = 0;
@@ -794,7 +792,7 @@
 #endif
 
     SkPaint paint;
-    SkSafeUnref(paint.setImageFilter(filter));
+    paint.setImageFilter(filter);
     drawClippedBitmap(canvas, 0, 0, paint);
 }
 
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 9bebb5c..d3876b1 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -481,7 +481,7 @@
              *      draw onto the previous layer using the xfermode from the original paint.
              */
             SkPaint tmp;
-            tmp.setImageFilter(fPaint->getImageFilter());
+            tmp.setImageFilter(sk_ref_sp(fPaint->getImageFilter()));
             tmp.setBlendMode(fPaint->getBlendMode());
             SkRect storage;
             if (rawBounds) {
diff --git a/src/core/SkFlattenableSerialization.cpp b/src/core/SkFlattenableSerialization.cpp
index 7045266..e72b4c5 100644
--- a/src/core/SkFlattenableSerialization.cpp
+++ b/src/core/SkFlattenableSerialization.cpp
@@ -25,3 +25,8 @@
     SkValidatingReadBuffer buffer(data, size);
     return buffer.readFlattenable(type);
 }
+
+sk_sp<SkImageFilter> SkValidatingDeserializeImageFilter(const void* data, size_t size) {
+    return sk_sp<SkImageFilter>((SkImageFilter*)SkValidatingDeserializeFlattenable(
+                                data, size, SkImageFilter::GetFlattenableType()));
+}
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index f01df49..04f1251 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -367,11 +367,12 @@
 #undef MOVE_FIELD
 void SkPaint::setLooper(sk_sp<SkDrawLooper> looper) { fDrawLooper = std::move(looper); }
 
-// TODO: remove this variant
+#ifdef SK_SUPPORT_LEGACY_SETIMAGEFILTER_PTR
 SkImageFilter* SkPaint::setImageFilter(SkImageFilter* imf) {
     this->setImageFilter(sk_ref_sp(imf));
     return imf;
 }
+#endif
 
 ///////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp
index 8b8ee23..2a11a32 100644
--- a/src/core/SkPictureRecord.cpp
+++ b/src/core/SkPictureRecord.cpp
@@ -108,7 +108,7 @@
     if (flatFlags & SAVELAYERREC_HAS_BACKDROP) {
         // overkill, but we didn't already track single flattenables, so using a paint for that
         SkPaint paint;
-        paint.setImageFilter(const_cast<SkImageFilter*>(rec.fBackdrop));
+        paint.setImageFilter(sk_ref_sp(const_cast<SkImageFilter*>(rec.fBackdrop)));
         this->addPaint(paint);
     }
     if (flatFlags & SAVELAYERREC_HAS_FLAGS) {
diff --git a/src/utils/SkLua.cpp b/src/utils/SkLua.cpp
index 14f074c..a223456 100644
--- a/src/utils/SkLua.cpp
+++ b/src/utils/SkLua.cpp
@@ -1102,7 +1102,7 @@
 
 static int lpaint_setImageFilter(lua_State* L) {
     SkPaint* paint = get_obj<SkPaint>(L, 1);
-    paint->setImageFilter(get_ref<SkImageFilter>(L, 2));
+    paint->setImageFilter(sk_ref_sp(get_ref<SkImageFilter>(L, 2)));
     return 0;
 }
 
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 42ffd38..a6961ff 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -731,7 +731,7 @@
             tiledCanvas.clear(0);
             untiledCanvas.clear(0);
             SkPaint paint;
-            paint.setImageFilter(filters.getFilter(i));
+            paint.setImageFilter(sk_ref_sp(filters.getFilter(i)));
             paint.setTextSize(SkIntToScalar(height));
             paint.setColor(SK_ColorWHITE);
             SkString str;
@@ -1231,9 +1231,8 @@
     // deserialize its contained picture when the filter is serialized
     // cross-process. Do this by "laundering" it through SkValidatingReadBuffer.
     sk_sp<SkData> data(SkValidatingSerializeFlattenable(imageFilter.get()));
-    sk_sp<SkFlattenable> flattenable(SkValidatingDeserializeFlattenable(
-        data->data(), data->size(), SkImageFilter::GetFlattenableType()));
-    SkImageFilter* unflattenedFilter = static_cast<SkImageFilter*>(flattenable.get());
+    sk_sp<SkImageFilter> unflattenedFilter = SkValidatingDeserializeImageFilter(data->data(),
+                                                                                data->size());
 
     redPaintWithFilter.setImageFilter(unflattenedFilter);
     SkPictureRecorder crossProcessRecorder;
@@ -1686,9 +1685,8 @@
     sk_sp<SkImageFilter> filter(SkImageSource::Make(std::move(image)));
 
     sk_sp<SkData> data(SkValidatingSerializeFlattenable(filter.get()));
-    sk_sp<SkFlattenable> flattenable(SkValidatingDeserializeFlattenable(
-        data->data(), data->size(), SkImageFilter::GetFlattenableType()));
-    SkImageFilter* unflattenedFilter = static_cast<SkImageFilter*>(flattenable.get());
+    sk_sp<SkImageFilter> unflattenedFilter = SkValidatingDeserializeImageFilter(data->data(),
+                                                                                data->size());
     REPORTER_ASSERT(reporter, unflattenedFilter);
 
     SkBitmap bm;
diff --git a/tests/PDFPrimitivesTest.cpp b/tests/PDFPrimitivesTest.cpp
index 2d9468e..81b33ba 100644
--- a/tests/PDFPrimitivesTest.cpp
+++ b/tests/PDFPrimitivesTest.cpp
@@ -400,7 +400,7 @@
     // Filter just created; should be unvisited.
     REPORTER_ASSERT(reporter, !filter->visited());
     SkPaint paint;
-    paint.setImageFilter(filter.get());
+    paint.setImageFilter(filter);
     canvas->drawRect(SkRect::MakeWH(100, 100), paint);
     doc->close();
 
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index 26a2da4..82db03e 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -264,7 +264,7 @@
                                     std::move(invalidBitmapSource),
                                     std::move(validBitmapSource), nullptr));
 
-    SkAutoTUnref<SkImageFilter> deserializedFilter(
+    sk_sp<SkImageFilter> deserializedFilter(
         TestFlattenableSerialization<SkImageFilter>(
             xfermodeImageFilter.get(), shouldSucceed, reporter));
 
diff --git a/tools/chrome_fuzz.cpp b/tools/chrome_fuzz.cpp
index c59c741..9447966 100644
--- a/tools/chrome_fuzz.cpp
+++ b/tools/chrome_fuzz.cpp
@@ -27,18 +27,18 @@
 }
 
 static void run_test_case(const SkString& testdata, const SkBitmap& bitmap,
-                 SkCanvas* canvas) {
+                          SkCanvas* canvas) {
   // This call shouldn't crash or cause ASAN to flag any memory issues
   // If nothing bad happens within this call, everything is fine
-  SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(
-        testdata.c_str(), testdata.size(), SkImageFilter::GetFlattenableType());
+  sk_sp<SkImageFilter> flattenable = SkValidatingDeserializeImageFilter(testdata.c_str(),
+                                                                        testdata.size());
 
   // Adding some info, but the test passed if we got here without any trouble
   if (flattenable != nullptr) {
     SkDebugf("Valid stream detected.\n");
     // Let's see if using the filters can cause any trouble...
     SkPaint paint;
-    paint.setImageFilter(static_cast<SkImageFilter*>(flattenable))->unref();
+    paint.setImageFilter(flattenable);
     canvas->save();
     canvas->clipRect(SkRect::MakeXYWH(
         0, 0, SkIntToScalar(kBitmapSize), SkIntToScalar(kBitmapSize)));
diff --git a/tools/debugger/SkDrawCommand.cpp b/tools/debugger/SkDrawCommand.cpp
index 1f0fdf7..4c34b87 100644
--- a/tools/debugger/SkDrawCommand.cpp
+++ b/tools/debugger/SkDrawCommand.cpp
@@ -1252,11 +1252,10 @@
                                            SkPaint* target) {
     if (jsonPaint.isMember(SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER)) {
         Json::Value jsonImageFilter = jsonPaint[SKDEBUGCANVAS_ATTRIBUTE_IMAGEFILTER];
-        SkImageFilter* imageFilter = (SkImageFilter*) load_flattenable(jsonImageFilter,
-                                                                       urlDataManager);
+        sk_sp<SkImageFilter> imageFilter((SkImageFilter*) load_flattenable(jsonImageFilter,
+                                                                           urlDataManager));
         if (imageFilter != nullptr) {
             target->setImageFilter(imageFilter);
-            imageFilter->unref();
         }
     }
 }