Remove some testing-only image filter subclasses

The "fail" cases were all equivalent to ::Empty(). The identity case
is just a (0,0) offset. The "fixed-bounds" cases are handled with a
crop image filter and adjustments to the test arguments.

Bug: b/40040586
Change-Id: I9dd8d251b9a85313254cb81b2173fe78d9e2f34b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/743658
Auto-Submit: Michael Ludwig <michaelludwig@google.com>
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/gm/imagefiltersbase.cpp b/gm/imagefiltersbase.cpp
index b452088..9f40d00 100644
--- a/gm/imagefiltersbase.cpp
+++ b/gm/imagefiltersbase.cpp
@@ -35,67 +35,6 @@
 
 class SkReadBuffer;
 
-class FailImageFilter : public SkImageFilter_Base {
-public:
-    static sk_sp<SkImageFilter> Make() {
-        return sk_sp<SkImageFilter>(new FailImageFilter);
-    }
-
-    SK_FLATTENABLE_HOOKS(FailImageFilter)
-protected:
-    FailImageFilter() : INHERITED(nullptr, 0, nullptr) {}
-
-    sk_sp<SkSpecialImage> onFilterImage(const skif::Context&, SkIPoint* offset) const override {
-        return nullptr;
-    }
-
-private:
-
-    using INHERITED = SkImageFilter_Base;
-};
-
-sk_sp<SkFlattenable> FailImageFilter::CreateProc(SkReadBuffer& buffer) {
-    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0);
-    return FailImageFilter::Make();
-}
-
-class IdentityImageFilter : public SkImageFilter_Base {
-public:
-    static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> input) {
-        return sk_sp<SkImageFilter>(new IdentityImageFilter(std::move(input)));
-    }
-
-
-    SK_FLATTENABLE_HOOKS(IdentityImageFilter)
-protected:
-    sk_sp<SkSpecialImage> onFilterImage(const skif::Context& ctx, SkIPoint* offset) const override {
-        offset->set(0, 0);
-        return sk_ref_sp<SkSpecialImage>(ctx.sourceImage());
-    }
-
-private:
-    IdentityImageFilter(sk_sp<SkImageFilter> input) : INHERITED(&input, 1, nullptr) {}
-
-    using INHERITED = SkImageFilter_Base;
-};
-
-// Register these image filters as deserializable before main().
-namespace {
-    static struct Initializer {
-        Initializer() {
-            SK_REGISTER_FLATTENABLE(IdentityImageFilter);
-            SK_REGISTER_FLATTENABLE(FailImageFilter);
-        }
-    } initializer;
-}  // namespace
-
-sk_sp<SkFlattenable> IdentityImageFilter::CreateProc(SkReadBuffer& buffer) {
-    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
-    return IdentityImageFilter::Make(common.getInput(0));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
 static void draw_paint(SkCanvas* canvas, SkImage*, const SkRect& r, sk_sp<SkImageFilter> imf) {
     SkPaint paint;
     paint.setImageFilter(std::move(imf));
@@ -227,8 +166,8 @@
         auto cf = SkColorFilters::Blend(SK_ColorRED, SkBlendMode::kSrcIn);
         sk_sp<SkImageFilter> filters[] = {
             nullptr,
-            IdentityImageFilter::Make(nullptr),
-            FailImageFilter::Make(),
+            SkImageFilters::Offset(0.f, 0.f, nullptr), // "identity"
+            SkImageFilters::Empty(),
             SkImageFilters::ColorFilter(std::move(cf), nullptr),
             // The strange 0.29 value tickles an edge case where crop rect calculates
             // a small border, but the blur really needs no border. This tickles
diff --git a/tests/CanvasTest.cpp b/tests/CanvasTest.cpp
index 13a2557..238ca96 100644
--- a/tests/CanvasTest.cpp
+++ b/tests/CanvasTest.cpp
@@ -12,7 +12,6 @@
 #include "include/core/SkColor.h"
 #include "include/core/SkColorType.h"
 #include "include/core/SkDocument.h"
-#include "include/core/SkFlattenable.h"
 #include "include/core/SkImageFilter.h"
 #include "include/core/SkImageInfo.h"
 #include "include/core/SkMatrix.h"
@@ -38,10 +37,8 @@
 #include "include/utils/SkNWayCanvas.h"
 #include "include/utils/SkPaintFilterCanvas.h"
 #include "src/core/SkBigPicture.h"
-#include "src/core/SkImageFilter_Base.h"
 #include "src/core/SkRecord.h"
 #include "src/core/SkRecords.h"
-#include "src/core/SkSpecialImage.h"
 #include "src/utils/SkCanvasStack.h"
 #include "tests/Test.h"
 
@@ -53,11 +50,6 @@
 using namespace skia_private;
 
 class SkPicture;
-class SkReadBuffer;
-
-namespace skif {
-class Context;
-}
 
 #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
 #include "include/core/SkColorSpace.h"
@@ -620,40 +612,10 @@
 }
 #endif
 
-namespace {
-
-class ZeroBoundsImageFilter : public SkImageFilter_Base {
-public:
-    static sk_sp<SkImageFilter> Make() { return sk_sp<SkImageFilter>(new ZeroBoundsImageFilter); }
-
-protected:
-    sk_sp<SkSpecialImage> onFilterImage(const skif::Context&, SkIPoint*) const override {
-        return nullptr;
-    }
-    SkIRect onFilterNodeBounds(const SkIRect&, const SkMatrix&,
-                               MapDirection, const SkIRect* inputRect) const override {
-        return SkIRect::MakeEmpty();
-    }
-
-private:
-    SK_FLATTENABLE_HOOKS(ZeroBoundsImageFilter)
-
-    ZeroBoundsImageFilter() : INHERITED(nullptr, 0, nullptr) {}
-
-    using INHERITED = SkImageFilter_Base;
-};
-
-sk_sp<SkFlattenable> ZeroBoundsImageFilter::CreateProc(SkReadBuffer& buffer) {
-    SkDEBUGFAIL("Should never get here");
-    return nullptr;
-}
-
-}  // anonymous namespace
-
 DEF_TEST(Canvas_SaveLayerWithNullBoundsAndZeroBoundsImageFilter, r) {
     SkCanvas canvas(10, 10);
     SkPaint p;
-    p.setImageFilter(ZeroBoundsImageFilter::Make());
+    p.setImageFilter(SkImageFilters::Empty());
     // This should not fail any assert.
     canvas.saveLayer(nullptr, &p);
     REPORTER_ASSERT(r, canvas.getDeviceClipBounds().isEmpty());
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 5847bbd..0546cd1 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -51,6 +51,7 @@
 #include "src/core/SkSpecialImage.h"
 #include "src/core/SkSpecialSurface.h"
 #include "src/effects/colorfilters/SkColorFilterBase.h"
+#include "src/effects/imagefilters/SkCropImageFilter.h"
 #include "src/gpu/ganesh/GrCaps.h"
 #include "src/gpu/ganesh/GrRecordingContextPriv.h"
 #include "src/gpu/ganesh/image/GrImageUtils.h"
@@ -111,25 +112,6 @@
     using INHERITED = SkImageFilter_Base;
 };
 
-class FailImageFilter : public SkImageFilter_Base {
-public:
-    FailImageFilter() : INHERITED(nullptr, 0, nullptr) { }
-
-    sk_sp<SkSpecialImage> onFilterImage(const skif::Context& ctx, SkIPoint* offset) const override {
-        return nullptr;
-    }
-
-    SK_FLATTENABLE_HOOKS(FailImageFilter)
-
-private:
-    using INHERITED = SkImageFilter_Base;
-};
-
-sk_sp<SkFlattenable> FailImageFilter::CreateProc(SkReadBuffer& buffer) {
-    SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0);
-    return sk_sp<SkFlattenable>(new FailImageFilter());
-}
-
 void draw_gradient_circle(SkCanvas* canvas, int width, int height) {
     SkScalar x = SkIntToScalar(width / 2);
     SkScalar y = SkIntToScalar(height / 2);
@@ -288,28 +270,6 @@
     TArray<Filter> fFilters;
 };
 
-class FixedBoundsImageFilter : public SkImageFilter_Base {
-public:
-    FixedBoundsImageFilter(const SkIRect& bounds)
-            : INHERITED(nullptr, 0, nullptr), fBounds(bounds) {}
-
-private:
-    Factory getFactory() const override { return nullptr; }
-    const char* getTypeName() const override { return nullptr; }
-
-    sk_sp<SkSpecialImage> onFilterImage(const skif::Context&, SkIPoint* offset) const override {
-        return nullptr;
-    }
-
-    SkIRect onFilterBounds(const SkIRect&, const SkMatrix&,
-                           MapDirection, const SkIRect*) const override {
-        return fBounds;
-    }
-
-    SkIRect fBounds;
-
-    using INHERITED = SkImageFilter_Base;
-};
 }  // namespace
 
 sk_sp<SkFlattenable> MatrixTestImageFilter::CreateProc(SkReadBuffer& buffer) {
@@ -781,7 +741,7 @@
 // downstream filter that affects transparent black still does so even with a nullptr input.
 static void test_fail_affects_transparent_black(skiatest::Reporter* reporter,
                                                 GrDirectContext* dContext) {
-    sk_sp<FailImageFilter> failFilter(new FailImageFilter());
+    sk_sp<SkImageFilter> failFilter = SkImageFilters::Empty();
     sk_sp<SkSpecialImage> source(create_empty_special_image(dContext, 5));
     skif::Context ctx = make_context(1, 1, source.get());
 
@@ -1925,8 +1885,8 @@
 DEF_TEST(XfermodeImageFilterBounds, reporter) {
     SkIRect background_rect = SkIRect::MakeXYWH(0, 0, 100, 100);
     SkIRect foreground_rect = SkIRect::MakeXYWH(50, 50, 100, 100);
-    sk_sp<SkImageFilter> background(new FixedBoundsImageFilter(background_rect));
-    sk_sp<SkImageFilter> foreground(new FixedBoundsImageFilter(foreground_rect));
+    sk_sp<SkImageFilter> background = SkMakeCropImageFilter(SkRect::Make(background_rect), nullptr);
+    sk_sp<SkImageFilter> foreground = SkMakeCropImageFilter(SkRect::Make(foreground_rect), nullptr);
 
     SkIRect expectedBounds[kSkBlendModeCount];
     // Expect union of input rects by default.
@@ -1948,8 +1908,9 @@
     expectedBounds[static_cast<int>(SkBlendMode::kDstATop)] = foreground_rect;
     expectedBounds[static_cast<int>(SkBlendMode::kModulate)] = intersection;
 
-    // The value of this variable doesn't matter because we use inputs with fixed bounds.
-    SkIRect src = SkIRect::MakeXYWH(11, 22, 33, 44);
+    // Use a very large input bounds so that the crop rects stored in 'background' and 'foreground'
+    // aren't restricted.
+    SkIRect src = SkRectPriv::MakeILarge();
     for (int i = 0; i < kSkBlendModeCount; ++i) {
         sk_sp<SkImageFilter> xfermode(SkImageFilters::Blend(static_cast<SkBlendMode>(i),
                                                             background, foreground, nullptr));
@@ -1959,8 +1920,10 @@
     }
 
     // Test empty intersection.
-    sk_sp<SkImageFilter> background2(new FixedBoundsImageFilter(SkIRect::MakeXYWH(0, 0, 20, 20)));
-    sk_sp<SkImageFilter> foreground2(new FixedBoundsImageFilter(SkIRect::MakeXYWH(40, 40, 50, 50)));
+    sk_sp<SkImageFilter> background2 =
+            SkMakeCropImageFilter(SkRect::MakeXYWH(0, 0, 20, 20), nullptr);
+    sk_sp<SkImageFilter> foreground2 =
+            SkMakeCropImageFilter(SkRect::MakeXYWH(40, 40, 50, 50), nullptr);
     sk_sp<SkImageFilter> xfermode(SkImageFilters::Blend(
             SkBlendMode::kSrcIn, std::move(background2), std::move(foreground2), nullptr));
     auto bounds = xfermode->filterBounds(src, SkMatrix::I(),
@@ -2021,8 +1984,10 @@
                                    const SkIRect* crop, const SkIRect& expected) {
     sk_sp<SkImageFilter> arithmetic(
             SkImageFilters::Arithmetic(k1, k2, k3, k4, false, background, foreground, crop));
-    // The value of the input rect doesn't matter because we use inputs with fixed bounds.
-    SkIRect bounds = arithmetic->filterBounds(SkIRect::MakeXYWH(11, 22, 33, 44), SkMatrix::I(),
+    // Use a very large input bounds so that the crop rects stored in 'background' and 'foreground'
+    // aren't restricted.
+    SkIRect src = SkRectPriv::MakeILarge();
+    SkIRect bounds = arithmetic->filterBounds(src, SkMatrix::I(),
                                               SkImageFilter::kForward_MapDirection, nullptr);
     REPORTER_ASSERT(reporter, expected == bounds);
 }
@@ -2030,8 +1995,8 @@
 static void test_arithmetic_combinations(skiatest::Reporter* reporter, float v) {
     SkIRect bgRect = SkIRect::MakeXYWH(0, 0, 100, 100);
     SkIRect fgRect = SkIRect::MakeXYWH(50, 50, 100, 100);
-    sk_sp<SkImageFilter> background(new FixedBoundsImageFilter(bgRect));
-    sk_sp<SkImageFilter> foreground(new FixedBoundsImageFilter(fgRect));
+    sk_sp<SkImageFilter> background = SkMakeCropImageFilter(SkRect::Make(bgRect), nullptr);
+    sk_sp<SkImageFilter> foreground = SkMakeCropImageFilter(SkRect::Make(fgRect), nullptr);
 
     SkIRect unionRect = bgRect;
     unionRect.join(fgRect);