From 3dbdb0f2e8d963afa7e6873c03614dac5d862f9f Mon Sep 17 00:00:00 2001 From: Stephen White Date: Sun, 24 Jan 2016 17:46:10 -0500 Subject: [PATCH] Fix bounds computations for SkDisplacementMapEffect with negative scale. [Cherrypick of 00502373c8d38b091fe1b9ba15b8510bcc0375bc to M49 branch.] BUG=skia:4835 GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1616663003 Review URL: https://codereview.chromium.org/1616663003 NOTREECHECKS=true NOTRY=true NOPRESUBMIT=true Review URL: https://codereview.chromium.org/1626093002 . --- gm/displacement.cpp | 9 ++++++++- src/effects/SkDisplacementMapEffect.cpp | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/gm/displacement.cpp b/gm/displacement.cpp index bebc276..c5f1837 100644 --- a/gm/displacement.cpp +++ b/gm/displacement.cpp @@ -43,7 +43,7 @@ protected: } SkISize onISize() override { - return SkISize::Make(500, 500); + return SkISize::Make(600, 500); } void drawClippedBitmap(SkCanvas* canvas, int x, int y, const SkPaint& paint) const { @@ -153,6 +153,13 @@ protected: 40.0f, displ, nullptr, &cropRect))->unref(); drawClippedBitmap(canvas, 400, 300, paint); + // Test for negative scale. + paint.setImageFilter(SkDisplacementMapEffect::Create( + SkDisplacementMapEffect::kG_ChannelSelectorType, + SkDisplacementMapEffect::kA_ChannelSelectorType, + -40.0f, displ))->unref(); + this->drawClippedBitmap(canvas, 500, 0, paint); + // Tests for images of different sizes displ.reset(SkImageSource::Create(fSmall)); paint.setImageFilter(SkDisplacementMapEffect::Create( diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index 9c640e3..30f980a 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -269,7 +269,7 @@ void SkDisplacementMapEffect::computeFastBounds(const SkRect& src, SkRect* dst) } else { *dst = src; } - dst->outset(fScale * SK_ScalarHalf, fScale * SK_ScalarHalf); + dst->outset(SkScalarAbs(fScale) * SK_ScalarHalf, SkScalarAbs(fScale) * SK_ScalarHalf); } void SkDisplacementMapEffect::onFilterNodeBounds(const SkIRect& src, const SkMatrix& ctm, @@ -277,8 +277,8 @@ void SkDisplacementMapEffect::onFilterNodeBounds(const SkIRect& src, const SkMat *dst = src; SkVector scale = SkVector::Make(fScale, fScale); ctm.mapVectors(&scale, 1); - dst->outset(SkScalarCeilToInt(scale.fX * SK_ScalarHalf), - SkScalarCeilToInt(scale.fY * SK_ScalarHalf)); + dst->outset(SkScalarCeilToInt(SkScalarAbs(scale.fX) * SK_ScalarHalf), + SkScalarCeilToInt(SkScalarAbs(scale.fY) * SK_ScalarHalf)); } bool SkDisplacementMapEffect::onFilterBounds(const SkIRect& src, const SkMatrix& ctm, -- 2.7.4