aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
authorGravatar jbroman <jbroman@chromium.org>2016-03-21 08:38:58 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-21 08:38:58 -0700
commit17a652017a0243c57c954662e08a7976b9990fee (patch)
tree39aa17436414079663806e184cc496c4a26ef3bc /tests
parentb95f55510bd3be15324ddf16bdc92b5fc4da0136 (diff)
Make SkComposeImageFilter::onFilterImage filter the bounds given to the inner filter.
Previously, the bounds requested by the caller would be passed to both the inner and outer filter, but since the outer filter may move pixels, this is not necessarily sufficient to supply the pixels required by the outer filter to fill the bounds. Unit test included. GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1813373002 Review URL: https://codereview.chromium.org/1813373002
Diffstat (limited to 'tests')
-rw-r--r--tests/ImageFilterTest.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 6a2f942658..b9b0028f2d 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) {