aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Xianzhu Wang <wangxianzhu@chromium.org>2017-09-25 10:26:40 -0700
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-09-25 19:05:20 +0000
commitb449666fa230728fd67b76c990bf49ff726f7134 (patch)
treef6a51a9aba8e28d53048d0e103631ce0500e0c17
parent477e9d432abd157f52d40ee1aa10263793489d53 (diff)
Reland "Fix SkImageSource::filterBounds()" again
This relands commit cb4d58766668b003fea67798027fc25d84acd059 which was reverted by commit b6d2be1330f16fe05f1eed5abda927c0fbb50055 because the original CL broke some blink layout tests, and the first reland was reverted by commit because it broke filterfastbounds gm. This reland let SkImageSource::onFilterNodeBounds() return the dst rect with ctm applied when mapping forward or otherwise the default value. Original description: > Previously SkImageSource::filterBounds() uses the default > SkImageFilter::onFilterNodeBounds() which returns the input rect. > > Now override onFilterNodeBounds() in SkImageSource to return src > or dst rect (with transform applied). Change-Id: I4548981142b9a96beda8339d394cf9943c9f4c0f Reviewed-on: https://skia-review.googlesource.com/50420 Commit-Queue: Mike Reed <reed@google.com> Reviewed-by: Mike Reed <reed@google.com>
-rw-r--r--include/effects/SkImageSource.h2
-rw-r--r--src/effects/SkImageSource.cpp11
-rw-r--r--tests/ImageFilterTest.cpp46
3 files changed, 57 insertions, 2 deletions
diff --git a/include/effects/SkImageSource.h b/include/effects/SkImageSource.h
index 04348c68e8..f2c1274f29 100644
--- a/include/effects/SkImageSource.h
+++ b/include/effects/SkImageSource.h
@@ -31,6 +31,8 @@ protected:
SkIPoint* offset) const override;
sk_sp<SkImageFilter> onMakeColorSpace(SkColorSpaceXformer*) const override;
+ SkIRect onFilterNodeBounds(const SkIRect&, const SkMatrix&, MapDirection) const override;
+
private:
explicit SkImageSource(sk_sp<SkImage>);
SkImageSource(sk_sp<SkImage>,
diff --git a/src/effects/SkImageSource.cpp b/src/effects/SkImageSource.cpp
index cd2fb51e94..e016c9825d 100644
--- a/src/effects/SkImageSource.cpp
+++ b/src/effects/SkImageSource.cpp
@@ -146,6 +146,17 @@ SkRect SkImageSource::computeFastBounds(const SkRect& src) const {
return fDstRect;
}
+SkIRect SkImageSource::onFilterNodeBounds(const SkIRect& src, const SkMatrix& ctm,
+ MapDirection direction) const {
+ if (kReverse_MapDirection == direction) {
+ return SkImageFilter::onFilterNodeBounds(src, ctm, direction);
+ }
+
+ SkRect dstRect = fDstRect;
+ ctm.mapRect(&dstRect);
+ return dstRect.roundOut();
+}
+
#ifndef SK_IGNORE_TO_STRING
void SkImageSource::toString(SkString* str) const {
str->appendf("SkImageSource: (");
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index 05c0bffbea..db269f00e8 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -1941,7 +1941,7 @@ DEF_TEST(ImageFilterColorSpaceDAG, reporter) {
REPORTER_ASSERT(reporter, filter->cloneCount() == 1u);
}
-// Test XfermodeimageFilter::onFilterBounds with different blending modes.
+// Test SkXfermodeImageFilter::filterBounds with different blending modes.
DEF_TEST(XfermodeImageFilterBounds, reporter) {
SkIRect background_rect = SkIRect::MakeXYWH(0, 0, 100, 100);
SkIRect foreground_rect = SkIRect::MakeXYWH(50, 50, 100, 100);
@@ -2049,8 +2049,50 @@ static void test_arithmetic_combinations(skiatest::Reporter* reporter, float v)
test_arithmetic_bounds(reporter, v, v, v, v, background, foreground, &crop, crop_rect);
}
-// Test ArithmeticImageFilter::onFilterBounds with different blending modes.
+// Test SkArithmeticImageFilter::filterBounds with different blending modes.
DEF_TEST(ArithmeticImageFilterBounds, reporter) {
test_arithmetic_combinations(reporter, 1);
test_arithmetic_combinations(reporter, 0.5);
}
+
+// Test SkImageSource::filterBounds.
+DEF_TEST(ImageSourceBounds, reporter) {
+ sk_sp<SkImage> image(SkImage::MakeFromBitmap(make_gradient_circle(64, 64)));
+ // Default src and dst rects.
+ sk_sp<SkImageFilter> source1(SkImageSource::Make(image));
+ SkIRect imageBounds = SkIRect::MakeWH(64, 64);
+ SkIRect input(SkIRect::MakeXYWH(10, 20, 30, 40));
+ REPORTER_ASSERT(reporter,
+ imageBounds == source1->filterBounds(input, SkMatrix::I(),
+ SkImageFilter::kForward_MapDirection));
+ REPORTER_ASSERT(reporter,
+ input == source1->filterBounds(input, SkMatrix::I(),
+ SkImageFilter::kReverse_MapDirection));
+ SkMatrix scale(SkMatrix::MakeScale(2));
+ SkIRect scaledBounds = SkIRect::MakeWH(128, 128);
+ REPORTER_ASSERT(reporter,
+ scaledBounds == source1->filterBounds(input, scale,
+ SkImageFilter::kForward_MapDirection));
+ REPORTER_ASSERT(
+ reporter,
+ input == source1->filterBounds(input, scale, SkImageFilter::kReverse_MapDirection));
+
+ // Specified src and dst rects.
+ SkRect src(SkRect::MakeXYWH(0.5, 0.5, 100.5, 100.5));
+ SkRect dst(SkRect::MakeXYWH(-10.5, -10.5, 120.5, 120.5));
+ sk_sp<SkImageFilter> source2(SkImageSource::Make(image, src, dst, kMedium_SkFilterQuality));
+ REPORTER_ASSERT(reporter,
+ dst.roundOut() == source2->filterBounds(input, SkMatrix::I(),
+ SkImageFilter::kForward_MapDirection));
+ REPORTER_ASSERT(reporter,
+ input == source2->filterBounds(input, SkMatrix::I(),
+ SkImageFilter::kReverse_MapDirection));
+ scale.mapRect(&dst);
+ scale.mapRect(&src);
+ REPORTER_ASSERT(reporter,
+ dst.roundOut() == source2->filterBounds(input, scale,
+ SkImageFilter::kForward_MapDirection));
+ REPORTER_ASSERT(
+ reporter,
+ input == source2->filterBounds(input, scale, SkImageFilter::kReverse_MapDirection));
+}