Index: tests/ImageFilterTest.cpp |
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp |
index c2230b7cdb8733c9edae75a6cd983e8086a4abfa..3350b4a25f78d22e8a7c4055887c3f9ee34194db 100644 |
--- a/tests/ImageFilterTest.cpp |
+++ b/tests/ImageFilterTest.cpp |
@@ -79,6 +79,140 @@ 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(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 @@ static void test_crop_rects(SkImageFilter::Proxy* proxy, |
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 @@ 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 +653,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 +680,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, |