diff options
author | senorblanco <senorblanco@chromium.org> | 2014-08-25 08:06:57 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-08-25 08:06:57 -0700 |
commit | 28648fe4a69b0cee8df42b5966e4e645c3aabefb (patch) | |
tree | ce5260c7621606a1557898b3617863fe3dfb8dfe /tests | |
parent | 76db31a2ca11da4dd45016e964b2e49f39f3dd49 (diff) |
Fix recursive computation of filter bounds for drop shadow,
morphology, blur.
Because we're computing "backwards" from a clip rect of destination
pixels to be filled to the required source pixels, we should use tail
recursion rather than head recursion in onFilterBounds().
This actually only makes a difference for drop-shadow, where
the computation is non-commutative. Blur and morphology commute, but I
moved them to tail recursion anyway for clarity (so all onFilterBounds
use tail recursion).
BUG=skia:
R=bsalomon@google.com
Author: senorblanco@chromium.org
Review URL: https://codereview.chromium.org/481273005
Diffstat (limited to 'tests')
-rw-r--r-- | tests/ImageFilterTest.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp index f87f99ce98..e7e0f84385 100644 --- a/tests/ImageFilterTest.cpp +++ b/tests/ImageFilterTest.cpp @@ -469,6 +469,50 @@ DEF_TEST(ImageFilterDrawMatrixBBH, reporter) { } } +static SkImageFilter* makeBlur(SkImageFilter* input = NULL) { + return SkBlurImageFilter::Create(SK_Scalar1, SK_Scalar1, input); +} + +static SkImageFilter* makeDropShadow(SkImageFilter* input = NULL) { + return SkDropShadowImageFilter::Create( + SkIntToScalar(100), SkIntToScalar(100), + SkIntToScalar(10), SkIntToScalar(10), + SK_ColorBLUE, input); +} + +DEF_TEST(ImageFilterBlurThenShadowBounds, reporter) { + SkAutoTUnref<SkImageFilter> filter1(makeBlur()); + SkAutoTUnref<SkImageFilter> filter2(makeDropShadow(filter1.get())); + + SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); + SkIRect expectedBounds = SkIRect::MakeXYWH(-133, -133, 236, 236); + filter2->filterBounds(bounds, SkMatrix(), &bounds); + + REPORTER_ASSERT(reporter, bounds == expectedBounds); +} + +DEF_TEST(ImageFilterShadowThenBlurBounds, reporter) { + SkAutoTUnref<SkImageFilter> filter1(makeDropShadow()); + SkAutoTUnref<SkImageFilter> filter2(makeBlur(filter1.get())); + + SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); + SkIRect expectedBounds = SkIRect::MakeXYWH(-133, -133, 236, 236); + filter2->filterBounds(bounds, SkMatrix(), &bounds); + + REPORTER_ASSERT(reporter, bounds == expectedBounds); +} + +DEF_TEST(ImageFilterDilateThenBlurBounds, reporter) { + SkAutoTUnref<SkImageFilter> filter1(SkDilateImageFilter::Create(2, 2)); + SkAutoTUnref<SkImageFilter> filter2(makeDropShadow(filter1.get())); + + SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); + SkIRect expectedBounds = SkIRect::MakeXYWH(-132, -132, 234, 234); + filter2->filterBounds(bounds, SkMatrix(), &bounds); + + REPORTER_ASSERT(reporter, bounds == expectedBounds); +} + static void drawBlurredRect(SkCanvas* canvas) { SkAutoTUnref<SkImageFilter> filter(SkBlurImageFilter::Create(SkIntToScalar(8), 0)); SkPaint filterPaint; |