Fix bounds computations for SkDisplacementMapEffect with negative scale.
authorStephen White <senorblanco@chromium.org>
Sun, 24 Jan 2016 22:46:10 +0000 (17:46 -0500)
committerStephen White <senorblanco@chromium.org>
Sun, 24 Jan 2016 22:46:10 +0000 (17:46 -0500)
[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
src/effects/SkDisplacementMapEffect.cpp

index bebc276..c5f1837 100644 (file)
@@ -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(
index 9c640e3..30f980a 100644 (file)
@@ -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,