Remove SK_SUPPORT_LEGACY_GRADIENT_DITHERING from Skia proper

Migrating the flag to embedder defines (Chromium already guarded).

Also augment gradient-focused GMs to generate both dithered/undithered
results.

BUG=skia:4436
R=reed@google.com,robertphillips@google.com

Review URL: https://codereview.chromium.org/1400813006
diff --git a/gm/gradients.cpp b/gm/gradients.cpp
index ee6380c..b0a8a5a 100644
--- a/gm/gradients.cpp
+++ b/gm/gradients.cpp
@@ -100,14 +100,14 @@
 
 class GradientsGM : public GM {
 public:
-    GradientsGM() {
+    GradientsGM(bool dither) : fDither(dither) {
         this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
     }
 
 protected:
 
     SkString onShortName() {
-        return SkString("gradients");
+        return SkString(fDither ? "gradients" : "gradients_nodither");
     }
 
     virtual SkISize onISize() { return SkISize::Make(840, 815); }
@@ -122,6 +122,7 @@
         SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
         SkPaint paint;
         paint.setAntiAlias(true);
+        paint.setDither(fDither);
 
         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
         for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
@@ -146,23 +147,28 @@
         }
     }
 
+protected:
+    bool fDither;
+
 private:
     typedef GM INHERITED;
 };
-DEF_GM( return new GradientsGM; )
+DEF_GM( return new GradientsGM(true); )
+DEF_GM( return new GradientsGM(false); )
 
 // Based on the original gradient slide, but with perspective applied to the
 // gradient shaders' local matrices
 class GradientsLocalPerspectiveGM : public GM {
 public:
-    GradientsLocalPerspectiveGM() {
+    GradientsLocalPerspectiveGM(bool dither) : fDither(dither) {
         this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
     }
 
 protected:
 
     SkString onShortName() {
-        return SkString("gradients_local_perspective");
+        return SkString(fDither ? "gradients_local_perspective" :
+                                  "gradients_local_perspective_nodither");
     }
 
     virtual SkISize onISize() { return SkISize::Make(840, 815); }
@@ -177,6 +183,7 @@
         SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
         SkPaint paint;
         paint.setAntiAlias(true);
+        paint.setDither(fDither);
 
         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
         for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
@@ -201,16 +208,23 @@
     }
 
 private:
+    bool fDither;
+
     typedef GM INHERITED;
 };
-DEF_GM( return new GradientsLocalPerspectiveGM; )
+DEF_GM( return new GradientsLocalPerspectiveGM(true); )
+DEF_GM( return new GradientsLocalPerspectiveGM(false); )
 
 // Based on the original gradient slide, but with perspective applied to
 // the view matrix
 class GradientsViewPerspectiveGM : public GradientsGM {
+public:
+    GradientsViewPerspectiveGM(bool dither) : INHERITED(dither) { }
+
 protected:
     SkString onShortName() {
-        return SkString("gradients_view_perspective");
+        return SkString(fDither ? "gradients_view_perspective" :
+                                  "gradients_view_perspective_nodither");
     }
 
     virtual SkISize onISize() { return SkISize::Make(840, 500); }
@@ -227,7 +241,8 @@
 private:
     typedef GradientsGM INHERITED;
 };
-DEF_GM( return new GradientsViewPerspectiveGM; )
+DEF_GM( return new GradientsViewPerspectiveGM(true); )
+DEF_GM( return new GradientsViewPerspectiveGM(false); )
 
 /*
  Inspired by this <canvas> javascript, where we need to detect that we are not
@@ -247,11 +262,11 @@
  */
 class GradientsDegenrate2PointGM : public GM {
 public:
-    GradientsDegenrate2PointGM() {}
+    GradientsDegenrate2PointGM(bool dither) : fDither(dither) {}
 
 protected:
     SkString onShortName() {
-        return SkString("gradients_degenerate_2pt");
+        return SkString(fDither ? "gradients_degenerate_2pt" : "gradients_degenerate_2pt_nodither");
     }
 
     virtual SkISize onISize() { return SkISize::Make(320, 320); }
@@ -275,23 +290,29 @@
                                                               pos, SK_ARRAY_COUNT(pos),
                                                               SkShader::kClamp_TileMode);
         SkPaint paint;
+        paint.setDither(fDither);
         paint.setShader(s)->unref();
         canvas->drawPaint(paint);
     }
 
 private:
+    bool fDither;
+
     typedef GM INHERITED;
 };
-DEF_GM( return new GradientsDegenrate2PointGM; )
+DEF_GM( return new GradientsDegenrate2PointGM(true); )
+DEF_GM( return new GradientsDegenrate2PointGM(false); )
 
 /// Tests correctness of *optimized* codepaths in gradients.
 
 class ClampedGradientsGM : public GM {
 public:
-    ClampedGradientsGM() {}
+    ClampedGradientsGM(bool dither) : fDither(dither) {}
 
 protected:
-    SkString onShortName() { return SkString("clamped_gradients"); }
+    SkString onShortName() {
+        return SkString(fDither ? "clamped_gradients" : "clamped_gradients_nodither");
+    }
 
     virtual SkISize onISize() { return SkISize::Make(640, 510); }
 
@@ -304,6 +325,7 @@
 
         SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(300) };
         SkPaint paint;
+        paint.setDither(fDither);
         paint.setAntiAlias(true);
 
         SkPoint center;
@@ -319,9 +341,12 @@
     }
 
 private:
+    bool fDither;
+
     typedef GM INHERITED;
 };
-DEF_GM( return new ClampedGradientsGM; )
+DEF_GM( return new ClampedGradientsGM(true); )
+DEF_GM( return new ClampedGradientsGM(false); )
 
 /// Checks quality of large radial gradients, which may display
 /// some banding.
@@ -368,11 +393,14 @@
 
 class RadialGradient2GM : public GM {
 public:
-    RadialGradient2GM() {}
+    RadialGradient2GM(bool dither) : fDither(dither) {}
 
 protected:
 
-    SkString onShortName() override { return SkString("radial_gradient2"); }
+    SkString onShortName() override {
+        return SkString(fDither ? "radial_gradient2" : "radial_gradient2_nodither");
+    }
+
     SkISize onISize() override { return SkISize::Make(800, 400); }
     void drawBG(SkCanvas* canvas) {
         canvas->drawColor(0xFF000000);
@@ -414,8 +442,11 @@
                                                    SkShader::kClamp_TileMode,
                                                    flags[i], nullptr));
             paint1.setShader(sweep);
+            paint1.setDither(fDither);
             paint2.setShader(radial1);
+            paint2.setDither(fDither);
             paint3.setShader(radial2);
+            paint3.setDither(fDither);
 
             canvas->drawCircle(cx, cy, radius, paint1);
             canvas->drawCircle(cx, cy, radius, paint3);
@@ -426,16 +457,22 @@
     }
 
 private:
+    bool fDither;
+
     typedef GM INHERITED;
 };
-DEF_GM( return new RadialGradient2GM; )
+DEF_GM( return new RadialGradient2GM(true); )
+DEF_GM( return new RadialGradient2GM(false); )
 
 // Shallow radial (shows banding on raster)
 class RadialGradient3GM : public GM {
-    SkAutoTUnref<SkShader> fShader;
+public:
+    RadialGradient3GM(bool dither) : fDither(dither) { }
 
 protected:
-    SkString onShortName() override { return SkString("radial_gradient3"); }
+    SkString onShortName() override {
+        return SkString(fDither ? "radial_gradient3" : "radial_gradient3_nodither");
+    }
 
     SkISize onISize() override { return SkISize::Make(500, 500); }
 
@@ -452,19 +489,27 @@
     void onDraw(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setShader(fShader);
+        paint.setDither(fDither);
         canvas->drawRect(SkRect::MakeWH(500, 500), paint);
     }
     
 private:
+    SkAutoTUnref<SkShader> fShader;
+    bool fDither;
+
     typedef GM INHERITED;
 };
-DEF_GM( return new RadialGradient3GM; )
+DEF_GM( return new RadialGradient3GM(true); )
+DEF_GM( return new RadialGradient3GM(false); )
 
 class RadialGradient4GM : public GM {
-    SkAutoTUnref<SkShader> fShader;
+public:
+    RadialGradient4GM(bool dither) : fDither(dither) { }
 
 protected:
-    SkString onShortName() override { return SkString("radial_gradient4"); }
+    SkString onShortName() override {
+        return SkString(fDither ? "radial_gradient4" : "radial_gradient4_nodither");
+    }
 
     SkISize onISize() override { return SkISize::Make(500, 500); }
 
@@ -481,20 +526,29 @@
     void onDraw(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(true);
+        paint.setDither(fDither);
         paint.setShader(fShader);
         canvas->drawRect(SkRect::MakeWH(500, 500), paint);
     }
     
 private:
+    SkAutoTUnref<SkShader> fShader;
+    bool fDither;
+
     typedef GM INHERITED;
 };
-DEF_GM( return new RadialGradient4GM; )
+DEF_GM( return new RadialGradient4GM(true); )
+DEF_GM( return new RadialGradient4GM(false); )
 
 class LinearGradientGM : public GM {
-    SkAutoTUnref<SkShader> fShader[100];
+public:
+    LinearGradientGM(bool dither) : fDither(dither) { }
 
 protected:
-    SkString onShortName() override { return SkString("linear_gradient"); }
+    SkString onShortName() override {
+        return SkString(fDither ? "linear_gradient" : "linear_gradient_nodither");
+    }
+
     const SkScalar kWidthBump = 30.f;
     const SkScalar kHeight = 5.f;
     const SkScalar kMinWidth = 540.f;
@@ -521,6 +575,7 @@
     void onDraw(SkCanvas* canvas) override {
         SkPaint paint;
         paint.setAntiAlias(true);
+        paint.setDither(fDither);
         for (int index = 0; index < (int) SK_ARRAY_COUNT(fShader); ++index) {
             paint.setShader(fShader[index]);
             canvas->drawRect(SkRect::MakeLTRB(0, index * kHeight, kMinWidth + index * kWidthBump,
@@ -529,8 +584,12 @@
     }
     
 private:
+    SkAutoTUnref<SkShader> fShader[100];
+    bool fDither;
+
     typedef GM INHERITED;
 };
-DEF_GM( return new LinearGradientGM; )
+DEF_GM( return new LinearGradientGM(true); )
+DEF_GM( return new LinearGradientGM(false); )
 
 }
diff --git a/gm/gradients_2pt_conical.cpp b/gm/gradients_2pt_conical.cpp
index 1e32426..39ebb4a 100644
--- a/gm/gradients_2pt_conical.cpp
+++ b/gm/gradients_2pt_conical.cpp
@@ -305,10 +305,12 @@
 
 class ConicalGradientsGM : public GM {
 public:
-    ConicalGradientsGM(GradCaseType gradCaseType) {
+    ConicalGradientsGM(GradCaseType gradCaseType, bool dither)
+        : fGradCaseType(gradCaseType)
+        , fDither(dither) {
         this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
-        fName.printf("gradients_2pt_conical_%s", gGradCases[gradCaseType].fName);
-        fGradCaseType = gradCaseType;
+        fName.printf("gradients_2pt_conical_%s%s", gGradCases[gradCaseType].fName,
+                     fDither ? "" : "_nodither");
     }
 
 protected:
@@ -328,6 +330,7 @@
         SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
         SkPaint paint;
         paint.setAntiAlias(true);
+        paint.setDither(fDither);
 
         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
 
@@ -360,15 +363,16 @@
 
     GradCaseType fGradCaseType;
     SkString fName;
+    bool fDither;
 };
 ///////////////////////////////////////////////////////////////////////////////
 
-static GM* MyFactory1(void*) { return new ConicalGradientsGM(kInside_GradCaseType); }
-static GMRegistry reg1(MyFactory1);
+DEF_GM( return new ConicalGradientsGM(kInside_GradCaseType, true); )
+DEF_GM( return new ConicalGradientsGM(kOutside_GradCaseType, true); )
+DEF_GM( return new ConicalGradientsGM(kEdge_GradCaseType, true); )
 
-static GM* MyFactory2(void*) { return new ConicalGradientsGM(kOutside_GradCaseType); }
-static GMRegistry reg2(MyFactory2);
+DEF_GM( return new ConicalGradientsGM(kInside_GradCaseType, false); )
+DEF_GM( return new ConicalGradientsGM(kOutside_GradCaseType, false); )
+DEF_GM( return new ConicalGradientsGM(kEdge_GradCaseType, false); )
 
-static GM* MyFactory3(void*) { return new ConicalGradientsGM(kEdge_GradCaseType); }
-static GMRegistry reg3(MyFactory3);
 }
diff --git a/gm/gradients_no_texture.cpp b/gm/gradients_no_texture.cpp
index 3e73d1b..726a14f 100644
--- a/gm/gradients_no_texture.cpp
+++ b/gm/gradients_no_texture.cpp
@@ -80,13 +80,16 @@
 
 class GradientsNoTextureGM : public GM {
 public:
-    GradientsNoTextureGM() {
+    GradientsNoTextureGM(bool dither) : fDither(dither) {
         this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
     }
 
 protected:
 
-    SkString onShortName() override { return SkString("gradients_no_texture"); }
+    SkString onShortName() override {
+        return SkString(fDither ? "gradients_no_texture" : "gradients_no_texture_nodither");
+    }
+
     SkISize onISize() override { return SkISize::Make(640, 615); }
 
     void onDraw(SkCanvas* canvas) override {
@@ -96,6 +99,7 @@
         SkRect kRect = { 0, 0, SkIntToScalar(50), SkIntToScalar(50) };
         SkPaint paint;
         paint.setAntiAlias(true);
+        paint.setDither(fDither);
 
         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
         static const uint8_t kAlphas[] = { 0xff, 0x40 };
@@ -116,6 +120,8 @@
     }
 
 private:
+    bool fDither;
+
     typedef GM INHERITED;
 };
 
@@ -205,11 +211,14 @@
 
     typedef void (*Proc)(ColorPos*);
 public:
-    GradientsManyColorsGM() {}
+    GradientsManyColorsGM(bool dither) : fDither(dither) {}
 
 protected:
 
-    SkString onShortName() override { return SkString("gradients_many"); }
+    SkString onShortName() override {
+        return SkString(fDither ? "gradients_many" : "gradients_many_nodither");
+    }
+
     SkISize onISize() override { return SkISize::Make(850, 100); }
 
     void onDraw(SkCanvas* canvas) override {
@@ -223,6 +232,7 @@
         const SkRect r = SkRect::MakeWH(SkIntToScalar(W), 30);
 
         SkPaint paint;
+        paint.setDither(fDither);
 
         canvas->translate(20, 20);
 
@@ -243,10 +253,14 @@
     }
 
 private:
+    bool fDither;
+
     typedef GM INHERITED;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
 
-DEF_GM(return new GradientsNoTextureGM);
-DEF_GM(return new GradientsManyColorsGM);
+DEF_GM(return new GradientsNoTextureGM(true);)
+DEF_GM(return new GradientsNoTextureGM(false);)
+DEF_GM(return new GradientsManyColorsGM(true);)
+DEF_GM(return new GradientsManyColorsGM(false);)
diff --git a/gm/shallowgradient.cpp b/gm/shallowgradient.cpp
index b2a34f3..764b1a5 100644
--- a/gm/shallowgradient.cpp
+++ b/gm/shallowgradient.cpp
@@ -37,7 +37,9 @@
 
 class ShallowGradientGM : public skiagm::GM {
 public:
-    ShallowGradientGM(MakeShaderProc proc, const char name[]) : fProc(proc) {
+    ShallowGradientGM(MakeShaderProc proc, const char name[], bool dither)
+        : fProc(proc)
+        , fDither(dither) {
         fName.printf("shallow_gradient_%s", name);
     }
 
@@ -61,19 +63,26 @@
 
         SkPaint paint;
         paint.setShader(fProc(colors, colorCount, size))->unref();
+        paint.setDither(fDither);
         canvas->drawRect(r, paint);
     }
 
 private:
     MakeShaderProc fProc;
     SkString fName;
+    bool fDither;
 
     typedef skiagm::GM INHERITED;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
 
-DEF_GM( return new ShallowGradientGM(shader_linear, "linear"); )
-DEF_GM( return new ShallowGradientGM(shader_radial, "radial"); )
-DEF_GM( return new ShallowGradientGM(shader_conical, "conical"); )
-DEF_GM( return new ShallowGradientGM(shader_sweep, "sweep"); )
+DEF_GM( return new ShallowGradientGM(shader_linear, "linear", true); )
+DEF_GM( return new ShallowGradientGM(shader_radial, "radial", true); )
+DEF_GM( return new ShallowGradientGM(shader_conical, "conical", true); )
+DEF_GM( return new ShallowGradientGM(shader_sweep, "sweep", true); )
+
+DEF_GM( return new ShallowGradientGM(shader_linear, "linear_nodither", false); )
+DEF_GM( return new ShallowGradientGM(shader_radial, "radial_nodither", false); )
+DEF_GM( return new ShallowGradientGM(shader_conical, "conical_nodither", false); )
+DEF_GM( return new ShallowGradientGM(shader_sweep, "sweep_nodither", false); )
diff --git a/gyp/skia_for_android_framework_defines.gypi b/gyp/skia_for_android_framework_defines.gypi
index 166bd78..9fb2bab 100644
--- a/gyp/skia_for_android_framework_defines.gypi
+++ b/gyp/skia_for_android_framework_defines.gypi
@@ -17,6 +17,7 @@
       # Needed until we fix skbug.com/2440.
       'SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG',
       'SK_IGNORE_LINEONLY_AA_CONVEX_PATH_OPTS',
+      'SK_SUPPORT_LEGACY_GRADIENT_DITHERING',
     ],
   },
 }
diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp
index a96e09d..a66223d 100644
--- a/src/effects/gradients/SkGradientShader.cpp
+++ b/src/effects/gradients/SkGradientShader.cpp
@@ -290,8 +290,6 @@
     return true;
 }
 
-#define SK_SUPPORT_LEGACY_GRADIENT_DITHERING
-
 SkGradientShaderBase::GradientShaderBaseContext::GradientShaderBaseContext(
         const SkGradientShaderBase& shader, const ContextRec& rec)
     : INHERITED(shader, rec)