Fix bounds computations for SkDisplacementMapEffect with negative scale.

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
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 @@
     }
 
     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 @@
             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 @@
     } 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 @@
     *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,