Chromium Code Reviews| Index: tests/ImageFilterTest.cpp |
| diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp |
| index c2230b7cdb8733c9edae75a6cd983e8086a4abfa..506ad71783bbbf8c939630c909be0088ad7780d3 100644 |
| --- a/tests/ImageFilterTest.cpp |
| +++ b/tests/ImageFilterTest.cpp |
| @@ -79,6 +79,129 @@ private: |
| 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() { |
| + 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 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)); |
| + |
|
robertphillips
2016/03/23 19:48:48
all these become "this->addFilter" ?
Stephen White
2016/03/23 20:03:00
Done.
|
| + AddFilter("color filter", SkColorFilterImageFilter::Create(cf.get())); |
| + AddFilter("displacement map", SkDisplacementMapEffect::Create( |
| + SkDisplacementMapEffect::kR_ChannelSelectorType, |
| + SkDisplacementMapEffect::kB_ChannelSelectorType, |
| + 20.0f, gradientSource.get())); |
| + AddFilter("blur", SkBlurImageFilter::Create(SK_Scalar1, SK_Scalar1)); |
| + AddFilter("drop shadow", SkDropShadowImageFilter::Create( |
| + SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_ColorGREEN, |
| + SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode)); |
| + AddFilter("diffuse lighting", SkLightingImageFilter::CreatePointLitDiffuse( |
| + location, SK_ColorGREEN, 0, 0)); |
| + AddFilter("specular lighting", |
| + SkLightingImageFilter::CreatePointLitSpecular(location, SK_ColorGREEN, 0, 0, 0)); |
| + AddFilter("matrix convolution", |
| + SkMatrixConvolutionImageFilter::Create( |
| + kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1), |
| + SkMatrixConvolutionImageFilter::kRepeat_TileMode, false)); |
| + AddFilter("merge", SkMergeImageFilter::Create(nullptr, nullptr, SkXfermode::kSrcOver_Mode)); |
| + AddFilter("merge with disjoint inputs", SkMergeImageFilter::Create( |
| + paintFilterLeft, paintFilterRight, SkXfermode::kSrcOver_Mode)); |
| + AddFilter("offset", SkOffsetImageFilter::Create(SK_Scalar1, SK_Scalar1)); |
| + AddFilter("dilate", SkDilateImageFilter::Create(3, 2)); |
| + AddFilter("erode", SkErodeImageFilter::Create(2, 3)); |
| + AddFilter("tile", SkTileImageFilter::Create(SkRect::MakeXYWH(0, 0, 50, 50), |
| + SkRect::MakeXYWH(0, 0, 100, 100), nullptr)); |
| + AddFilter("matrix", SkImageFilter::CreateMatrixFilter(matrix, kLow_SkFilterQuality)); |
| + AddFilter("blur and offset", SkOffsetImageFilter::Create(five, five, blur.get())); |
| + AddFilter("picture and blur", SkBlurImageFilter::Create(five, five, pictureFilter.get())); |
| + AddFilter("rect shader and blur", SkBlurImageFilter::Create(five, five, paintFilter.get())); |
| + AddFilter("xfermode", SkXfermodeImageFilter::Create(SkXfermode::Create(SkXfermode::kSrc_Mode), nullptr)); |
| + } |
| + ~FilterList() { |
| + for (int i = 0; i < count(); ++i) { |
| + getFilter(i)->unref(); |
| + } |
| + } |
| + int count() const { return fFilters.count(); } |
| + SkImageFilter* getFilter(int index) const { return fFilters[index].fFilter; } |
| + 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; |
|
robertphillips
2016/03/23 19:48:48
Could we make these SkAutoTUnrefs and remove the a
Stephen White
2016/03/23 20:03:00
Done.
|
| + SkImageFilter* fFilter; |
| + }; |
|
robertphillips
2016/03/23 19:48:48
addFilter ?
Stephen White
2016/03/23 20:03:00
Done.
|
| + void AddFilter(const char* name, SkImageFilter* filter) { |
| + fFilters.push_back() = Filter(name, filter); |
| + } |
| + |
| + SkTArray<Filter> fFilters; |
| +}; |
| + |
| } |
| SkFlattenable* MatrixTestImageFilter::CreateProc(SkReadBuffer& buffer) { |
| @@ -366,26 +489,6 @@ static void test_crop_rects(SkImageFilter::Proxy* proxy, |
| } |
| } |
| -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 +666,7 @@ DEF_TEST(ImageFilterDrawTiled, reporter) { |
| // 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 +677,11 @@ DEF_TEST(ImageFilterDrawTiled, reporter) { |
| 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 +704,13 @@ DEF_TEST(ImageFilterDrawTiled, reporter) { |
| 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, |