Use raster pipeline for repeat/mirror radial gradients

(reland of https://skia-review.googlesource.com/c/24283/)

The legacy clamp specialization is still faster, but for repeat and
mirror RP wins (at low color stop counts).

Change-Id: I97a77188e912239f31e94600021b469ce7c40797
Reviewed-on: https://skia-review.googlesource.com/24742
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/src/shaders/gradients/SkRadialGradient.cpp b/src/shaders/gradients/SkRadialGradient.cpp
index 0a6a940..658ee55 100644
--- a/src/shaders/gradients/SkRadialGradient.cpp
+++ b/src/shaders/gradients/SkRadialGradient.cpp
@@ -48,7 +48,11 @@
 
 SkRadialGradient::RadialGradientContext::RadialGradientContext(
         const SkRadialGradient& shader, const ContextRec& rec)
-    : INHERITED(shader, rec) {}
+    : INHERITED(shader, rec) {
+#ifndef SK_SUPPORT_LEGACY_RADIAL_GRADIENT
+    SkASSERT(shader.getTileMode() == SkShader::kClamp_TileMode);
+#endif
+}
 
 SkShader::GradientType SkRadialGradient::asAGradient(GradientInfo* info) const {
     if (info) {
@@ -359,6 +363,15 @@
                                         &this->getLocalMatrix());
 }
 
+bool SkRadialGradient::onIsRasterPipelineOnly() const {
+#ifdef SK_SUPPORT_LEGACY_RADIAL_GRADIENT
+    return false;
+#else
+    // We have a clamp fast path; everything else -> RP.
+    return fTileMode != SkShader::kClamp_TileMode;
+#endif
+}
+
 bool SkRadialGradient::adjustMatrixAndAppendStages(SkArenaAlloc* alloc,
                                  SkMatrix* matrix,
                                  SkRasterPipeline* p,
diff --git a/src/shaders/gradients/SkRadialGradient.h b/src/shaders/gradients/SkRadialGradient.h
index c0353cf..f85bc8e 100644
--- a/src/shaders/gradients/SkRadialGradient.h
+++ b/src/shaders/gradients/SkRadialGradient.h
@@ -10,7 +10,7 @@
 
 #include "SkGradientShaderPriv.h"
 
-class SkRadialGradient : public SkGradientShaderBase {
+class SkRadialGradient final : public SkGradientShaderBase {
 public:
     SkRadialGradient(const SkPoint& center, SkScalar radius, const Descriptor&);
 
@@ -41,7 +41,9 @@
     bool adjustMatrixAndAppendStages(SkArenaAlloc* alloc,
                                      SkMatrix* matrix,
                                      SkRasterPipeline* tPipeline,
-                                     SkRasterPipeline* postPipeline) const final;
+                                     SkRasterPipeline* postPipeline) const override;
+
+    bool onIsRasterPipelineOnly() const override;
 
 private:
     const SkPoint fCenter;