aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/ImageFilterTest.cpp
diff options
context:
space:
mode:
authorGravatar senorblanco <senorblanco@chromium.org>2014-08-25 12:46:58 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-08-25 12:46:58 -0700
commit1150a6d151571fb6ee816dadec844ae7ab53948a (patch)
tree76ad93e09377fc5a4dcb93e63992fcf55c21634f /tests/ImageFilterTest.cpp
parent5387c83f819ab9c138e8669ae60811b9b5967d0f (diff)
Fix recursive computation of filter bounds for drop shadow,
morphology, blur. [Reland with fixed tests.] 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/ImageFilterTest.cpp')
-rw-r--r--tests/ImageFilterTest.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index f87f99ce98..778cc3f434 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::I(), &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::I(), &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::I(), &bounds);
+
+ REPORTER_ASSERT(reporter, bounds == expectedBounds);
+}
+
static void drawBlurredRect(SkCanvas* canvas) {
SkAutoTUnref<SkImageFilter> filter(SkBlurImageFilter::Create(SkIntToScalar(8), 0));
SkPaint filterPaint;