Index: tests/ImageFilterTest.cpp |
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp |
index 6a2f94265882269bb1a4e1fa4e38307df073124d..b9b0028f2d731c4bf7377e283a91740d42facd87 100644 |
--- a/tests/ImageFilterTest.cpp |
+++ b/tests/ImageFilterTest.cpp |
@@ -1369,6 +1369,51 @@ DEF_GPUTEST_FOR_NATIVE_CONTEXT(ComposedImageFilterOffset_Gpu, reporter, context) |
} |
#endif |
+static void test_composed_imagefilter_bounds(SkImageFilter::Proxy* proxy, |
+ skiatest::Reporter* reporter, |
+ GrContext* context) { |
+ // The bounds passed to the inner filter must be filtered by the outer |
+ // filter, so that the inner filter produces the pixels that the outer |
+ // filter requires as input. This matters if the outer filter moves pixels. |
+ // Here, accounting for the outer offset is necessary so that the green |
+ // pixels of the picture are not clipped. |
+ |
+ SkPictureRecorder recorder; |
+ SkCanvas* recordingCanvas = recorder.beginRecording(SkRect::MakeWH(200, 100)); |
+ recordingCanvas->clipRect(SkRect::MakeXYWH(100, 0, 100, 100)); |
+ recordingCanvas->clear(SK_ColorGREEN); |
+ sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture(); |
+ sk_sp<SkImageFilter> pictureFilter( |
+ SkPictureImageFilter::Create(picture.get())); |
+ SkImageFilter::CropRect cropRect(SkRect::MakeWH(100, 100)); |
+ sk_sp<SkImageFilter> offsetFilter(SkOffsetImageFilter::Create(-100, 0, nullptr, &cropRect)); |
+ sk_sp<SkImageFilter> composedFilter( |
+ SkComposeImageFilter::Create(offsetFilter.get(), pictureFilter.get())); |
+ |
+ sk_sp<SkSpecialImage> sourceImage(create_empty_special_image(context, proxy, 100)); |
+ SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr); |
+ SkIPoint offset; |
+ sk_sp<SkSpecialImage> result(composedFilter->filterImage(sourceImage.get(), ctx, &offset)); |
+ REPORTER_ASSERT(reporter, offset.isZero()); |
+ REPORTER_ASSERT(reporter, result); |
+ REPORTER_ASSERT(reporter, result->subset().size() == SkISize::Make(100, 100)); |
+ |
+ SkBitmap resultBM; |
+ TestingSpecialImageAccess::GetROPixels(result.get(), &resultBM); |
+ SkAutoLockPixels lock(resultBM); |
+ REPORTER_ASSERT(reporter, resultBM.getColor(50, 50) == SK_ColorGREEN); |
+} |
+ |
+DEF_TEST(ComposedImageFilterBounds, reporter) { |
+ run_raster_test(reporter, 100, test_composed_imagefilter_bounds); |
+} |
+ |
+#if SK_SUPPORT_GPU |
+DEF_GPUTEST_FOR_NATIVE_CONTEXT(ComposedImageFilterBounds_Gpu, reporter, context) { |
+ run_gpu_test(reporter, context, 100, test_composed_imagefilter_bounds); |
+} |
+#endif |
+ |
static void test_partial_crop_rect(SkImageFilter::Proxy* proxy, |
skiatest::Reporter* reporter, |
GrContext* context) { |