Reland "Fix SkImageSource::filterBounds()"
This relands commitcb4d587666
which was reverted by commitb6d2be1330
because the original CL broke some blink layout tests. This reland let SkImageSource::filterBounds() return the dst rect with ctm applied regardless of direction. 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: I915b7889ff59829ddbc4479cd66d75a0bb581e54 Reviewed-on: https://skia-review.googlesource.com/47501 Commit-Queue: Stephen White <senorblanco@chromium.org> Reviewed-by: Stephen White <senorblanco@chromium.org>
This commit is contained in:
parent
b8a7c8cd1c
commit
bf12c07970
@ -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>,
|
||||
|
@ -146,6 +146,13 @@ SkRect SkImageSource::computeFastBounds(const SkRect& src) const {
|
||||
return fDstRect;
|
||||
}
|
||||
|
||||
SkIRect SkImageSource::onFilterNodeBounds(const SkIRect& src, const SkMatrix& ctm,
|
||||
MapDirection direction) const {
|
||||
SkRect dstRect = fDstRect;
|
||||
ctm.mapRect(&dstRect);
|
||||
return dstRect.roundOut();
|
||||
}
|
||||
|
||||
#ifndef SK_IGNORE_TO_STRING
|
||||
void SkImageSource::toString(SkString* str) const {
|
||||
str->appendf("SkImageSource: (");
|
||||
|
@ -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)); // The values don't matter.
|
||||
REPORTER_ASSERT(reporter,
|
||||
imageBounds == source1->filterBounds(input, SkMatrix::I(),
|
||||
SkImageFilter::kForward_MapDirection));
|
||||
REPORTER_ASSERT(reporter,
|
||||
imageBounds == 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,
|
||||
scaledBounds == 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,
|
||||
dst.roundOut() == 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,
|
||||
dst.roundOut() == source2->filterBounds(input, scale,
|
||||
SkImageFilter::kReverse_MapDirection));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user