Implement clone for 4 additional GrFragmentProcessors.

GrConfigConversionEffect
GrConstColorProcessor
GrConvexPolyEffect
AARectEffect

Change-Id: I3b103ed045db0825fc193ee7d6e61c8fe8e5c634
Reviewed-on: https://skia-review.googlesource.com/26842
Reviewed-by: Robert Phillips <robertphillips@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/effects/GrConfigConversionEffect.cpp b/src/gpu/effects/GrConfigConversionEffect.cpp
index e8d0477..d83e82d 100644
--- a/src/gpu/effects/GrConfigConversionEffect.cpp
+++ b/src/gpu/effects/GrConfigConversionEffect.cpp
@@ -70,6 +70,10 @@
     this->initClassID<GrConfigConversionEffect>();
 }
 
+sk_sp<GrFragmentProcessor> GrConfigConversionEffect::clone() const {
+    return sk_sp<GrFragmentProcessor>(new GrConfigConversionEffect(fPMConversion));
+}
+
 bool GrConfigConversionEffect::onIsEqual(const GrFragmentProcessor& s) const {
     const GrConfigConversionEffect& other = s.cast<GrConfigConversionEffect>();
     return other.fPMConversion == fPMConversion;
diff --git a/src/gpu/effects/GrConfigConversionEffect.h b/src/gpu/effects/GrConfigConversionEffect.h
index f6bb7b1..fe8f50b 100644
--- a/src/gpu/effects/GrConfigConversionEffect.h
+++ b/src/gpu/effects/GrConfigConversionEffect.h
@@ -33,6 +33,8 @@
 
     const char* name() const override { return "Config Conversion"; }
 
+    sk_sp<GrFragmentProcessor> clone() const override;
+
     PMConversion  pmConversion() const { return fPMConversion; }
 
     // This function determines whether it is possible to choose PM->UPM and UPM->PM conversions
diff --git a/src/gpu/effects/GrConstColorProcessor.cpp b/src/gpu/effects/GrConstColorProcessor.cpp
index 9f46712..d5f4e35 100644
--- a/src/gpu/effects/GrConstColorProcessor.cpp
+++ b/src/gpu/effects/GrConstColorProcessor.cpp
@@ -62,6 +62,8 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
+sk_sp<GrFragmentProcessor> GrConstColorProcessor::clone() const { return Make(fColor, fMode); }
+
 GrColor4f GrConstColorProcessor::constantOutputForConstantInput(GrColor4f input) const {
     switch (fMode) {
         case kIgnore_InputMode:
diff --git a/src/gpu/effects/GrConstColorProcessor.h b/src/gpu/effects/GrConstColorProcessor.h
index 1669f2b..baf405a 100644
--- a/src/gpu/effects/GrConstColorProcessor.h
+++ b/src/gpu/effects/GrConstColorProcessor.h
@@ -38,6 +38,8 @@
         return str;
     }
 
+    sk_sp<GrFragmentProcessor> clone() const override;
+
     GrColor4f color() const { return fColor; }
 
     InputMode inputMode() const { return fMode; }
diff --git a/src/gpu/effects/GrConvexPolyEffect.cpp b/src/gpu/effects/GrConvexPolyEffect.cpp
index fd01798..7dba3de 100644
--- a/src/gpu/effects/GrConvexPolyEffect.cpp
+++ b/src/gpu/effects/GrConvexPolyEffect.cpp
@@ -27,9 +27,11 @@
 
     const char* name() const override { return "AARect"; }
 
-    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
+    sk_sp<GrFragmentProcessor> clone() const override { return Make(fEdgeType, fRect); }
 
 private:
+    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override;
+
     AARectEffect(GrPrimitiveEdgeType edgeType, const SkRect& rect)
             : INHERITED(kCompatibleWithCoverageAsAlpha_OptimizationFlag)
             , fRect(rect)
@@ -338,6 +340,18 @@
     }
 }
 
+GrConvexPolyEffect::GrConvexPolyEffect(const GrConvexPolyEffect& that)
+        : INHERITED(kCompatibleWithCoverageAsAlpha_OptimizationFlag)
+        , fEdgeType(that.fEdgeType)
+        , fEdgeCount(that.fEdgeCount) {
+    this->initClassID<GrConvexPolyEffect>();
+    memcpy(fEdges, that.fEdges, 3 * that.fEdgeCount * sizeof(SkScalar));
+}
+
+sk_sp<GrFragmentProcessor> GrConvexPolyEffect::clone() const {
+    return sk_sp<GrFragmentProcessor>(new GrConvexPolyEffect(*this));
+}
+
 bool GrConvexPolyEffect::onIsEqual(const GrFragmentProcessor& other) const {
     const GrConvexPolyEffect& cpe = other.cast<GrConvexPolyEffect>();
     // ignore the fact that 0 == -0 and just use memcmp.
diff --git a/src/gpu/effects/GrConvexPolyEffect.h b/src/gpu/effects/GrConvexPolyEffect.h
index fa26fb4..f1f6ab0 100644
--- a/src/gpu/effects/GrConvexPolyEffect.h
+++ b/src/gpu/effects/GrConvexPolyEffect.h
@@ -61,6 +61,8 @@
 
     const char* name() const override { return "ConvexPoly"; }
 
+    sk_sp<GrFragmentProcessor> clone() const override;
+
     GrPrimitiveEdgeType getEdgeType() const { return fEdgeType; }
 
     int getEdgeCount() const { return fEdgeCount; }
@@ -69,6 +71,7 @@
 
 private:
     GrConvexPolyEffect(GrPrimitiveEdgeType edgeType, int n, const SkScalar edges[]);
+    GrConvexPolyEffect(const GrConvexPolyEffect&);
 
     GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;