Make a generic list of filters for use in ImageFilterTests.

Factor list of image filters out of one test for re-use elsewhere.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1829913002

Review URL: https://codereview.chromium.org/1829913002
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index c2230b7..3350b4a 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -79,6 +79,140 @@
     typedef SkImageFilter INHERITED;
 };
 
+void draw_gradient_circle(SkCanvas* canvas, int width, int height) {
+    SkScalar x = SkIntToScalar(width / 2);
+    SkScalar y = SkIntToScalar(height / 2);
+    SkScalar radius = SkMinScalar(x, y) * 0.8f;
+    canvas->clear(0x00000000);
+    SkColor colors[2];
+    colors[0] = SK_ColorWHITE;
+    colors[1] = SK_ColorBLACK;
+    sk_sp<SkShader> shader(
+        SkGradientShader::MakeRadial(SkPoint::Make(x, y), radius, colors, nullptr, 2,
+                                       SkShader::kClamp_TileMode)
+    );
+    SkPaint paint;
+    paint.setShader(shader);
+    canvas->drawCircle(x, y, radius, paint);
+}
+
+SkBitmap make_gradient_circle(int width, int height) {
+    SkBitmap bitmap;
+    bitmap.allocN32Pixels(width, height);
+    SkCanvas canvas(bitmap);
+    draw_gradient_circle(&canvas, width, height);
+    return bitmap;
+}
+
+class FilterList {
+public:
+    FilterList(SkImageFilter* input = nullptr, const SkImageFilter::CropRect* cropRect = nullptr) {
+        auto cf(SkColorFilter::MakeModeFilter(SK_ColorRED, SkXfermode::kSrcIn_Mode));
+        SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1);
+        SkScalar kernel[9] = {
+            SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
+            SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1),
+            SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
+        };
+        const SkISize kernelSize = SkISize::Make(3, 3);
+        const SkScalar gain = SK_Scalar1, bias = 0;
+        const SkScalar five = SkIntToScalar(5);
+
+        sk_sp<SkImage> gradientImage(SkImage::MakeFromBitmap(make_gradient_circle(64, 64)));
+        SkAutoTUnref<SkImageFilter> gradientSource(SkImageSource::Create(gradientImage.get()));
+        SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(five, five, input));
+        SkMatrix matrix;
+
+        matrix.setTranslate(SK_Scalar1, SK_Scalar1);
+        matrix.postRotate(SkIntToScalar(45), SK_Scalar1, SK_Scalar1);
+
+        SkRTreeFactory factory;
+        SkPictureRecorder recorder;
+        SkCanvas* recordingCanvas = recorder.beginRecording(64, 64, &factory, 0);
+
+        SkPaint greenPaint;
+        greenPaint.setColor(SK_ColorGREEN);
+        recordingCanvas->drawRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 30, 20)), greenPaint);
+        sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
+        SkAutoTUnref<SkImageFilter> pictureFilter(SkPictureImageFilter::Create(picture.get()));
+        SkAutoTUnref<SkShader> shader(SkPerlinNoiseShader::CreateTurbulence(
+            SK_Scalar1, SK_Scalar1, 1, 0));
+
+        SkPaint paint;
+        paint.setShader(shader);
+        SkAutoTUnref<SkImageFilter> paintFilter(SkPaintImageFilter::Create(paint));
+
+        sk_sp<SkShader> greenColorShader(SkShader::MakeColorShader(SK_ColorGREEN));
+        SkPaint greenColorShaderPaint;
+        greenColorShaderPaint.setShader(greenColorShader);
+        SkImageFilter::CropRect leftSideCropRect(SkRect::MakeXYWH(0, 0, 32, 64));
+        SkAutoTUnref<SkImageFilter> paintFilterLeft(SkPaintImageFilter::Create(
+            greenColorShaderPaint, &leftSideCropRect));
+        SkImageFilter::CropRect rightSideCropRect(SkRect::MakeXYWH(32, 0, 32, 64));
+        SkAutoTUnref<SkImageFilter> paintFilterRight(SkPaintImageFilter::Create(
+            greenColorShaderPaint, &rightSideCropRect));
+
+        this->addFilter("color filter",
+            SkColorFilterImageFilter::Create(cf.get(), input, cropRect));
+        this->addFilter("displacement map", SkDisplacementMapEffect::Create(
+            SkDisplacementMapEffect::kR_ChannelSelectorType,
+            SkDisplacementMapEffect::kB_ChannelSelectorType,
+            20.0f, gradientSource.get(), input, cropRect));
+        this->addFilter("blur", SkBlurImageFilter::Create(SK_Scalar1, SK_Scalar1, input, cropRect));
+        this->addFilter("drop shadow", SkDropShadowImageFilter::Create(
+                  SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_ColorGREEN,
+                  SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, input, cropRect));
+        this->addFilter("diffuse lighting", SkLightingImageFilter::CreatePointLitDiffuse(
+                  location, SK_ColorGREEN, 0, 0, input, cropRect));
+        this->addFilter("specular lighting",
+                  SkLightingImageFilter::CreatePointLitSpecular(location, SK_ColorGREEN, 0, 0, 0,
+                                                                input, cropRect));
+        this->addFilter("matrix convolution",
+                  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, paintFilterRight, SkXfermode::kSrcOver_Mode, cropRect));
+        this->addFilter("offset",
+                        SkOffsetImageFilter::Create(SK_Scalar1, SK_Scalar1, input, cropRect));
+        this->addFilter("dilate", SkDilateImageFilter::Create(3, 2, input, cropRect));
+        this->addFilter("erode", SkErodeImageFilter::Create(2, 3, input, cropRect));
+        this->addFilter("tile", SkTileImageFilter::Create(
+            SkRect::MakeXYWH(0, 0, 50, 50),
+            cropRect ? cropRect->rect() : SkRect::MakeXYWH(0, 0, 100, 100),
+            input));
+        if (!cropRect) {
+            this->addFilter("matrix", SkImageFilter::CreateMatrixFilter(
+                matrix, kLow_SkFilterQuality, input));
+        }
+        this->addFilter("blur and offset", SkOffsetImageFilter::Create(
+            five, five, blur.get(), cropRect));
+        this->addFilter("picture and blur", SkBlurImageFilter::Create(
+            five, five, pictureFilter.get(), cropRect));
+        this->addFilter("paint and blur", SkBlurImageFilter::Create(
+            five, five, paintFilter.get(), cropRect));
+        this->addFilter("xfermode", SkXfermodeImageFilter::Create(
+            SkXfermode::Create(SkXfermode::kSrc_Mode), input, input, cropRect));
+    }
+    int count() const { return fFilters.count(); }
+    SkImageFilter* getFilter(int index) const { return fFilters[index].fFilter.get(); }
+    const char* getName(int index) const { return fFilters[index].fName; }
+private:
+    struct Filter {
+        Filter() : fName(nullptr), fFilter(nullptr) {}
+        Filter(const char* name, SkImageFilter* filter) : fName(name), fFilter(filter) {}
+        const char*                 fName;
+        sk_sp<SkImageFilter>        fFilter;
+    };
+    void addFilter(const char* name, SkImageFilter* filter) {
+        fFilters.push_back(Filter(name, filter));
+    }
+
+    SkTArray<Filter> fFilters;
+};
+
 }
 
 SkFlattenable* MatrixTestImageFilter::CreateProc(SkReadBuffer& buffer) {
@@ -319,73 +453,18 @@
     SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(20, 30, 60, 60));
     SkAutoTUnref<SkImageFilter> input(make_grayscale(nullptr, &inputCropRect));
 
-    auto cf(SkColorFilter::MakeModeFilter(SK_ColorRED, SkXfermode::kSrcIn_Mode));
-    SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1);
-    SkScalar kernel[9] = {
-        SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
-        SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1),
-        SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
-    };
-    SkISize kernelSize = SkISize::Make(3, 3);
-    SkScalar gain = SK_Scalar1, bias = 0;
+    FilterList filters(input.get(), &cropRect);
 
-    SkImageFilter* filters[] = {
-        SkColorFilterImageFilter::Create(cf.get(), input.get(), &cropRect),
-        SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType,
-                                        SkDisplacementMapEffect::kB_ChannelSelectorType,
-                                        40.0f, input.get(), input.get(), &cropRect),
-        SkBlurImageFilter::Create(SK_Scalar1, SK_Scalar1, input.get(), &cropRect),
-        SkDropShadowImageFilter::Create(SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1,
-            SK_ColorGREEN, SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
-            input.get(), &cropRect),
-        SkLightingImageFilter::CreatePointLitDiffuse(location, SK_ColorGREEN, 0, 0, input.get(), &cropRect),
-        SkLightingImageFilter::CreatePointLitSpecular(location, SK_ColorGREEN, 0, 0, 0, input.get(), &cropRect),
-        SkMatrixConvolutionImageFilter::Create(kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1), SkMatrixConvolutionImageFilter::kRepeat_TileMode, false, input.get(), &cropRect),
-        SkMergeImageFilter::Create(input.get(), input.get(), SkXfermode::kSrcOver_Mode, &cropRect),
-        SkOffsetImageFilter::Create(SK_Scalar1, SK_Scalar1, input.get(), &cropRect),
-        SkOffsetImageFilter::Create(SK_Scalar1, SK_Scalar1, input.get(), &cropRect),
-        SkDilateImageFilter::Create(3, 2, input.get(), &cropRect),
-        SkErodeImageFilter::Create(2, 3, input.get(), &cropRect),
-        SkTileImageFilter::Create(inputCropRect.rect(), cropRect.rect(), input.get()),
-        SkXfermodeImageFilter::Create(SkXfermode::Create(SkXfermode::kSrcOver_Mode), input.get(), input.get(), &cropRect),
-    };
-
-    for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
-        SkImageFilter* filter = filters[i];
+    for (int i = 0; i < filters.count(); ++i) {
+        SkImageFilter* filter = filters.getFilter(i);
         SkIPoint offset;
-        SkString str;
-        str.printf("filter %d", static_cast<int>(i));
         SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr);
         SkAutoTUnref<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &offset));
-        REPORTER_ASSERT_MESSAGE(reporter, resultImg, str.c_str());
-        REPORTER_ASSERT_MESSAGE(reporter, offset.fX == 20 && offset.fY == 30, str.c_str());
-    }
-
-    for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
-        SkSafeUnref(filters[i]);
+        REPORTER_ASSERT_MESSAGE(reporter, resultImg, filters.getName(i));
+        REPORTER_ASSERT_MESSAGE(reporter, offset.fX == 20 && offset.fY == 30, filters.getName(i));
     }
 }
 
-static SkBitmap make_gradient_circle(int width, int height) {
-    SkBitmap bitmap;
-    SkScalar x = SkIntToScalar(width / 2);
-    SkScalar y = SkIntToScalar(height / 2);
-    SkScalar radius = SkMinScalar(x, y) * 0.8f;
-    bitmap.allocN32Pixels(width, height);
-    SkCanvas canvas(bitmap);
-    canvas.clear(0x00000000);
-    SkColor colors[2];
-    colors[0] = SK_ColorWHITE;
-    colors[1] = SK_ColorBLACK;
-    SkPaint paint;
-    paint.setShader(SkGradientShader::MakeRadial(SkPoint::Make(x, y), radius, colors, nullptr, 2,
-                                                 SkShader::kClamp_TileMode));
-    canvas.drawCircle(x, y, radius, paint);
-    return bitmap;
-}
-
-
-
 static void test_negative_blur_sigma(SkImageFilter::Proxy* proxy,
                                      skiatest::Reporter* reporter,
                                      GrContext* context) {
@@ -563,79 +642,7 @@
     // match the same filters drawn with a single full-canvas bitmap draw.
     // Tests pass by not asserting.
 
-    auto cf(SkColorFilter::MakeModeFilter(SK_ColorRED, SkXfermode::kSrcIn_Mode));
-    SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1);
-    SkScalar kernel[9] = {
-        SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
-        SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1),
-        SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1),
-    };
-    const SkISize kernelSize = SkISize::Make(3, 3);
-    const SkScalar gain = SK_Scalar1, bias = 0;
-    const SkScalar five = SkIntToScalar(5);
-
-    sk_sp<SkImage> gradientImage(SkImage::MakeFromBitmap(make_gradient_circle(64, 64)));
-    SkAutoTUnref<SkImageFilter> gradientSource(SkImageSource::Create(gradientImage.get()));
-    SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(five, five));
-    SkMatrix matrix;
-
-    matrix.setTranslate(SK_Scalar1, SK_Scalar1);
-    matrix.postRotate(SkIntToScalar(45), SK_Scalar1, SK_Scalar1);
-
-    SkRTreeFactory factory;
-    SkPictureRecorder recorder;
-    SkCanvas* recordingCanvas = recorder.beginRecording(64, 64, &factory, 0);
-
-    SkPaint greenPaint;
-    greenPaint.setColor(SK_ColorGREEN);
-    recordingCanvas->drawRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 30, 20)), greenPaint);
-    sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
-    SkAutoTUnref<SkImageFilter> pictureFilter(SkPictureImageFilter::Create(picture.get()));
-    SkAutoTUnref<SkShader> shader(SkPerlinNoiseShader::CreateTurbulence(SK_Scalar1, SK_Scalar1, 1, 0));
-    SkPaint noisePaint;
-    noisePaint.setShader(shader);
-
-    SkAutoTUnref<SkImageFilter> paintFilter(SkPaintImageFilter::Create(noisePaint));
-
-    SkImageFilter::CropRect leftSideCropRect(SkRect::MakeXYWH(0, 0, 32, 64));
-    SkAutoTUnref<SkImageFilter> paintFilterLeft(SkPaintImageFilter::Create(greenPaint, &leftSideCropRect));
-    SkImageFilter::CropRect rightSideCropRect(SkRect::MakeXYWH(32, 0, 32, 64));
-    SkAutoTUnref<SkImageFilter> paintFilterRight(SkPaintImageFilter::Create(greenPaint, &rightSideCropRect));
-
-    struct {
-        const char*    fName;
-        SkImageFilter* fFilter;
-    } filters[] = {
-        { "color filter", SkColorFilterImageFilter::Create(cf.get()) },
-        { "displacement map", SkDisplacementMapEffect::Create(
-              SkDisplacementMapEffect::kR_ChannelSelectorType,
-              SkDisplacementMapEffect::kB_ChannelSelectorType,
-              20.0f, gradientSource.get()) },
-        { "blur", SkBlurImageFilter::Create(SK_Scalar1, SK_Scalar1) },
-        { "drop shadow", SkDropShadowImageFilter::Create(
-              SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_ColorGREEN,
-              SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode) },
-        { "diffuse lighting", SkLightingImageFilter::CreatePointLitDiffuse(
-              location, SK_ColorGREEN, 0, 0) },
-        { "specular lighting",
-              SkLightingImageFilter::CreatePointLitSpecular(location, SK_ColorGREEN, 0, 0, 0) },
-        { "matrix convolution",
-              SkMatrixConvolutionImageFilter::Create(
-                  kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1),
-                  SkMatrixConvolutionImageFilter::kRepeat_TileMode, false) },
-        { "merge", SkMergeImageFilter::Create(nullptr, nullptr, SkXfermode::kSrcOver_Mode) },
-        { "merge with disjoint inputs", SkMergeImageFilter::Create(
-              paintFilterLeft, paintFilterRight, SkXfermode::kSrcOver_Mode) },
-        { "offset", SkOffsetImageFilter::Create(SK_Scalar1, SK_Scalar1) },
-        { "dilate", SkDilateImageFilter::Create(3, 2) },
-        { "erode", SkErodeImageFilter::Create(2, 3) },
-        { "tile", SkTileImageFilter::Create(SkRect::MakeXYWH(0, 0, 50, 50),
-                                            SkRect::MakeXYWH(0, 0, 100, 100), nullptr) },
-        { "matrix", SkImageFilter::CreateMatrixFilter(matrix, kLow_SkFilterQuality) },
-        { "blur and offset", SkOffsetImageFilter::Create(five, five, blur.get()) },
-        { "picture and blur", SkBlurImageFilter::Create(five, five, pictureFilter.get()) },
-        { "paint and blur", SkBlurImageFilter::Create(five, five, paintFilter.get()) },
-    };
+    FilterList filters;
 
     SkBitmap untiledResult, tiledResult;
     const int width = 64, height = 64;
@@ -646,11 +653,11 @@
     int tileSize = 8;
 
     for (int scale = 1; scale <= 2; ++scale) {
-        for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
+        for (int i = 0; i < filters.count(); ++i) {
             tiledCanvas.clear(0);
             untiledCanvas.clear(0);
             SkPaint paint;
-            paint.setImageFilter(filters[i].fFilter);
+            paint.setImageFilter(filters.getFilter(i));
             paint.setTextSize(SkIntToScalar(height));
             paint.setColor(SK_ColorWHITE);
             SkString str;
@@ -673,17 +680,13 @@
             tiledCanvas.flush();
             for (int y = 0; y < height; y++) {
                 int diffs = memcmp(untiledResult.getAddr32(0, y), tiledResult.getAddr32(0, y), untiledResult.rowBytes());
-                REPORTER_ASSERT_MESSAGE(reporter, !diffs, filters[i].fName);
+                REPORTER_ASSERT_MESSAGE(reporter, !diffs, filters.getName(i));
                 if (diffs) {
                     break;
                 }
             }
         }
     }
-
-    for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) {
-        SkSafeUnref(filters[i].fFilter);
-    }
 }
 
 static void draw_saveLayer_picture(int width, int height, int tileSize,