Index: tests/ImageFilterTest.cpp |
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp |
index 7d465c15e625683ef7b0e11a62da19d57668a12d..cfba1fa87df55fcde08f13dbc47f538dd3241159 100644 |
--- a/tests/ImageFilterTest.cpp |
+++ b/tests/ImageFilterTest.cpp |
@@ -317,6 +317,58 @@ DEF_TEST(HugeBlurImageFilter, reporter) { |
test_huge_blur(&device, reporter); |
} |
+static void test_xfermode_cropped_input(SkBaseDevice* device, skiatest::Reporter* reporter) { |
+ SkCanvas canvas(device); |
+ canvas.clear(0); |
+ |
+ SkBitmap bitmap; |
+ bitmap.allocN32Pixels(1, 1); |
+ bitmap.eraseARGB(255, 255, 255, 255); |
+ |
+ SkAutoTUnref<SkColorFilter> green( |
+ SkColorFilter::CreateModeFilter(SK_ColorGREEN, SkXfermode::kSrcIn_Mode)); |
+ SkAutoTUnref<SkColorFilterImageFilter> greenFilter( |
+ SkColorFilterImageFilter::Create(green.get())); |
+ SkImageFilter::CropRect cropRect(SkRect::MakeEmpty()); |
+ SkAutoTUnref<SkColorFilterImageFilter> croppedOut( |
+ SkColorFilterImageFilter::Create(green.get(), NULL, &cropRect)); |
+ |
+ // Check that an xfermode image filter whose input has been cropped out still draws the other |
+ // input. Also check that drawing with both inputs cropped out doesn't cause a GPU warning. |
+ SkXfermode* mode = SkXfermode::Create(SkXfermode::kSrcOver_Mode); |
+ SkAutoTUnref<SkImageFilter> xfermodeNoFg( |
+ SkXfermodeImageFilter::Create(mode, greenFilter, croppedOut)); |
+ SkAutoTUnref<SkImageFilter> xfermodeNoBg( |
+ SkXfermodeImageFilter::Create(mode, croppedOut, greenFilter)); |
+ SkAutoTUnref<SkImageFilter> xfermodeNoFgNoBg( |
+ SkXfermodeImageFilter::Create(mode, croppedOut, croppedOut)); |
+ |
+ SkPaint paint; |
+ paint.setImageFilter(xfermodeNoFg); |
+ canvas.drawSprite(bitmap, 0, 0, &paint); |
+ |
+ uint32_t pixel; |
+ SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1); |
+ canvas.readPixels(info, &pixel, 4, 0, 0); |
+ REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); |
+ |
+ paint.setImageFilter(xfermodeNoBg); |
+ canvas.drawSprite(bitmap, 0, 0, &paint); |
+ canvas.readPixels(info, &pixel, 4, 0, 0); |
+ REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); |
+ |
+ paint.setImageFilter(xfermodeNoFgNoBg); |
+ canvas.drawSprite(bitmap, 0, 0, &paint); |
+ canvas.readPixels(info, &pixel, 4, 0, 0); |
+ REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); |
+} |
+ |
+DEF_TEST(XfermodeImageFilterCroppedInput, reporter) { |
+ SkBitmap temp; |
+ temp.allocN32Pixels(100, 100); |
+ SkBitmapDevice device(temp); |
+ test_xfermode_cropped_input(&device, reporter); |
+} |
#if SK_SUPPORT_GPU |
DEF_GPUTEST(ImageFilterCropRectGPU, reporter, factory) { |
@@ -334,4 +386,12 @@ DEF_GPUTEST(HugeBlurImageFilterGPU, reporter, factory) { |
0)); |
test_huge_blur(device, reporter); |
} |
+ |
+DEF_GPUTEST(XfermodeImageFilterCroppedInputGPU, reporter, factory) { |
+ GrContext* context = factory->get(static_cast<GrContextFactory::GLContextType>(0)); |
+ SkAutoTUnref<SkGpuDevice> device(SkGpuDevice::Create(context, |
+ SkImageInfo::MakeN32Premul(1, 1), |
+ 0)); |
+ test_xfermode_cropped_input(device, reporter); |
+} |
#endif |