Update GrPaint APIs to reflect lack of multiple color processors.

Change-Id: Ic7799b3c5f4294cba9ff72f8c11a2ad285ab189f
Bug: skia:10217
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/304738
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/gm/fp_sample_chaining.cpp b/gm/fp_sample_chaining.cpp
index 461c45c..b2cb7a5 100644
--- a/gm/fp_sample_chaining.cpp
+++ b/gm/fp_sample_chaining.cpp
@@ -235,7 +235,7 @@
             fp = wrap(std::move(fp), effectType);
         }
         GrPaint paint;
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
         rtCtx->drawRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::Translate(x, y),
                         SkRect::MakeIWH(64, 64));
         nextCol();
diff --git a/gm/gpu_blur_utils.cpp b/gm/gpu_blur_utils.cpp
index c0f308b..6ab6ed1 100644
--- a/gm/gpu_blur_utils.cpp
+++ b/gm/gpu_blur_utils.cpp
@@ -160,7 +160,7 @@
                 fp = GrFragmentProcessor::ModulateRGBA(std::move(fp),
                                                        {kAlpha, kAlpha, kAlpha, kAlpha});
                 GrPaint paint;
-                paint.addColorFragmentProcessor(std::move(fp));
+                paint.setColorFragmentProcessor(std::move(fp));
                 rtc->drawRect(nullptr, std::move(paint), GrAA::kNo, m, SkRect::Make(testArea));
             }
             // If we're in ref mode we will create a temp image that has the original image
@@ -181,7 +181,7 @@
                 auto fp = GrTextureEffect::MakeSubset(src, kPremul_SkAlphaType, tm, sampler,
                                                       SkRect::Make(srcRect), caps);
                 GrPaint paint;
-                paint.addColorFragmentProcessor(std::move(fp));
+                paint.setColorFragmentProcessor(std::move(fp));
                 refSrc->drawRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
                                  SkRect::Make(refRect.size()));
             }
@@ -215,7 +215,7 @@
                     // (SkBlendMode::kSrc).
                     fp = GrXfermodeFragmentProcessor::Make(std::move(fp), /*dst=*/nullptr,
                                                            SkBlendMode::kSrcOver);
-                    paint.addColorFragmentProcessor(std::move(fp));
+                    paint.setColorFragmentProcessor(std::move(fp));
                     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
                     rtc->fillRectToRect(nullptr, std::move(paint), GrAA::kNo, m,
                                         SkRect::Make(dstRect), SkRect::Make(blurView.dimensions()));
diff --git a/gm/sample_matrix_constant.cpp b/gm/sample_matrix_constant.cpp
index f87b3a4..409ff1d 100644
--- a/gm/sample_matrix_constant.cpp
+++ b/gm/sample_matrix_constant.cpp
@@ -63,14 +63,14 @@
     auto draw = [rtCtx, &wrap](std::unique_ptr<GrFragmentProcessor> baseFP, int tx, int ty) {
         auto fp = wrap(std::move(baseFP));
         GrPaint paint;
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
         rtCtx->drawRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::Translate(tx, ty),
                         SkRect::MakeIWH(256, 256));
     };
     auto draw2 = [rtCtx, &wrap](std::unique_ptr<GrFragmentProcessor> baseFP, int tx, int ty) {
       auto fp = wrap(wrap(std::move(baseFP)));
       GrPaint paint;
-      paint.addColorFragmentProcessor(std::move(fp));
+      paint.setColorFragmentProcessor(std::move(fp));
       rtCtx->drawRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::Translate(tx, ty),
                       SkRect::MakeIWH(256, 256));
     };
diff --git a/gm/sample_matrix_variable.cpp b/gm/sample_matrix_variable.cpp
index 84a34ab..9f2ab18 100644
--- a/gm/sample_matrix_variable.cpp
+++ b/gm/sample_matrix_variable.cpp
@@ -73,7 +73,7 @@
         auto fp = std::unique_ptr<GrFragmentProcessor>(
                 new SampleMatrixVariableEffect(std::move(baseFP), ofsX, ofsY));
         GrPaint paint;
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
         rtCtx->drawRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::Translate(tx, ty),
                         SkRect::MakeIWH(256, 256));
     };
diff --git a/gm/swizzle.cpp b/gm/swizzle.cpp
index 62cb0a5..0dae779 100644
--- a/gm/swizzle.cpp
+++ b/gm/swizzle.cpp
@@ -35,7 +35,7 @@
     auto fp = GrFragmentProcessor::SwizzleOutput(std::move(imgFP), GrSwizzle("grb1"));
 
     GrPaint grPaint;
-    grPaint.addColorFragmentProcessor(std::move(fp));
+    grPaint.setColorFragmentProcessor(std::move(fp));
 
     rtCtx->priv().testingOnly_addDrawOp(
         GrFillRectOp::MakeNonAARect(ctx, std::move(grPaint), SkMatrix(), bounds));
diff --git a/gm/yuvtorgbeffect.cpp b/gm/yuvtorgbeffect.cpp
index 24ed674..7f5c81d 100644
--- a/gm/yuvtorgbeffect.cpp
+++ b/gm/yuvtorgbeffect.cpp
@@ -129,7 +129,7 @@
                 if (fp) {
                     GrPaint grPaint;
                     grPaint.setXPFactory(GrPorterDuffXPFactory::Get(SkBlendMode::kSrc));
-                    grPaint.addColorFragmentProcessor(std::move(fp));
+                    grPaint.setColorFragmentProcessor(std::move(fp));
                     SkMatrix viewMatrix;
                     viewMatrix.setTranslate(x, y);
                     renderTargetContext->priv().testingOnly_addDrawOp(
@@ -244,7 +244,7 @@
             if (fp) {
                 SkMatrix viewMatrix;
                 viewMatrix.setTranslate(x, y);
-                grPaint.addColorFragmentProcessor(std::move(fp));
+                grPaint.setColorFragmentProcessor(std::move(fp));
                 std::unique_ptr<GrDrawOp> op(GrFillRectOp::MakeNonAARect(
                         context, std::move(grPaint), viewMatrix, renderRect));
                 renderTargetContext->priv().testingOnly_addDrawOp(std::move(op));
@@ -362,7 +362,7 @@
                                                samplerState, caps, SkMatrix::I(), subset));
                 if (fp) {
                     GrPaint grPaint;
-                    grPaint.addColorFragmentProcessor(std::move(fp));
+                    grPaint.setColorFragmentProcessor(std::move(fp));
                     renderTargetContext->drawRect(
                             nullptr, std::move(grPaint), GrAA::kYes, ctm, rect);
                 }
diff --git a/samplecode/SampleCCPRGeometry.cpp b/samplecode/SampleCCPRGeometry.cpp
index d87c6a9..0aa8100 100644
--- a/samplecode/SampleCCPRGeometry.cpp
+++ b/samplecode/SampleCCPRGeometry.cpp
@@ -217,7 +217,7 @@
 
         // Visualize coverage count in main canvas.
         GrPaint paint;
-        paint.addColorFragmentProcessor(VisualizeCoverageCountFP::Make(
+        paint.setColorFragmentProcessor(VisualizeCoverageCountFP::Make(
                 GrTextureEffect::Make(ccbuff->readSurfaceView(), ccbuff->colorInfo().alphaType())));
         paint.setPorterDuffXPFactory(SkBlendMode::kSrcOver);
         rtc->drawRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
diff --git a/src/core/SkGpuBlurUtils.cpp b/src/core/SkGpuBlurUtils.cpp
index 10fa9ff..50ffe23 100644
--- a/src/core/SkGpuBlurUtils.cpp
+++ b/src/core/SkGpuBlurUtils.cpp
@@ -49,7 +49,7 @@
     std::unique_ptr<GrFragmentProcessor> conv(GrGaussianConvolutionFragmentProcessor::Make(
             std::move(srcView), srcAlphaType, direction, radius, sigma, wm, srcSubset, &srcRect,
             *renderTargetContext->caps()));
-    paint.addColorFragmentProcessor(std::move(conv));
+    paint.setColorFragmentProcessor(std::move(conv));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
     renderTargetContext->fillRectToRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
                                         SkRect::Make(rtcRect), SkRect::Make(srcRect));
@@ -82,7 +82,7 @@
                                                         size, 1.0, 0.0, kernelOffset, wm, true,
                                                         sigmaX, sigmaY,
                                                         *renderTargetContext->caps());
-    paint.addColorFragmentProcessor(std::move(conv));
+    paint.setColorFragmentProcessor(std::move(conv));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
 
     // 'dstBounds' is actually in 'srcView' proxy space. It represents the blurred area from src
@@ -268,7 +268,7 @@
     auto fp = GrTextureEffect::MakeSubset(std::move(srcView), srcAlphaType, SkMatrix::I(),
                                           GrSamplerState::Filter::kLinear, srcBounds, srcBounds,
                                           *context->priv().caps());
-    paint.addColorFragmentProcessor(std::move(fp));
+    paint.setColorFragmentProcessor(std::move(fp));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
 
     dstRenderTargetContext->fillRectToRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
@@ -475,7 +475,7 @@
                                               sampler, SkRect::Make(srcBounds),
                                               SkRect::Make(dstBounds), *context->priv().caps());
         GrPaint paint;
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
         result->drawRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
                          SkRect::Make(dstBounds.size()));
         return result;
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
index dc61af0..11bbd36 100644
--- a/src/core/SkImageFilter.cpp
+++ b/src/core/SkImageFilter.cpp
@@ -565,7 +565,7 @@
                                                      const SkColorSpace* colorSpace,
                                                      GrProtected isProtected) {
     GrPaint paint;
-    paint.addColorFragmentProcessor(std::move(fp));
+    paint.setColorFragmentProcessor(std::move(fp));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
 
     auto renderTargetContext = GrRenderTargetContext::Make(
diff --git a/src/core/SkLegacyGpuBlurUtils.cpp b/src/core/SkLegacyGpuBlurUtils.cpp
index 1ce4010..ec1655e 100644
--- a/src/core/SkLegacyGpuBlurUtils.cpp
+++ b/src/core/SkLegacyGpuBlurUtils.cpp
@@ -96,7 +96,7 @@
     std::unique_ptr<GrFragmentProcessor> conv(GrGaussianConvolutionFragmentProcessor::Make(
             std::move(srcView), srcAlphaType, direction, radius, sigma, wm, subset, nullptr,
             *renderTargetContext->caps()));
-    paint.addColorFragmentProcessor(std::move(conv));
+    paint.setColorFragmentProcessor(std::move(conv));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
     auto srcRect = SkRect::Make(rtcRect.makeOffset(rtcToSrcOffset));
     renderTargetContext->fillRectToRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
@@ -130,7 +130,7 @@
                                                         size, 1.0, 0.0, kernelOffset, wm, true,
                                                         sigmaX, sigmaY,
                                                         *renderTargetContext->caps());
-    paint.addColorFragmentProcessor(std::move(conv));
+    paint.setColorFragmentProcessor(std::move(conv));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
 
     // 'dstBounds' is actually in 'srcView' proxy space. It represents the blurred area from src
@@ -313,7 +313,7 @@
             fp = GrTextureEffect::Make(std::move(srcView), srcAlphaType, SkMatrix::I(),
                                        GrSamplerState::Filter::kLinear);
         }
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
         paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
 
         dstRenderTargetContext->fillRectToRect(nullptr, std::move(paint), GrAA::kNo,
@@ -370,7 +370,7 @@
     auto fp = GrTextureEffect::MakeSubset(std::move(srcView), srcAlphaType, SkMatrix::I(),
                                           GrSamplerState::Filter::kLinear, SkRect::Make(srcBounds),
                                           caps);
-    paint.addColorFragmentProcessor(std::move(fp));
+    paint.setColorFragmentProcessor(std::move(fp));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
 
     // TODO: using dstII as dstRect results in some image diffs - why?
diff --git a/src/effects/imagefilters/SkArithmeticImageFilter.cpp b/src/effects/imagefilters/SkArithmeticImageFilter.cpp
index 067519f..f8af270 100644
--- a/src/effects/imagefilters/SkArithmeticImageFilter.cpp
+++ b/src/effects/imagefilters/SkArithmeticImageFilter.cpp
@@ -361,10 +361,10 @@
         fgFP = GrColorSpaceXformEffect::Make(std::move(fgFP),
                                              foreground->getColorSpace(), foreground->alphaType(),
                                              ctx.colorSpace(), kPremul_SkAlphaType);
-        paint.addColorFragmentProcessor(
+        paint.setColorFragmentProcessor(
                 GrArithmeticProcessor::Make(std::move(fgFP), std::move(bgFP), fInputs));
     } else {
-        paint.addColorFragmentProcessor(std::move(bgFP));
+        paint.setColorFragmentProcessor(std::move(bgFP));
     }
 
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
diff --git a/src/effects/imagefilters/SkDisplacementMapEffect.cpp b/src/effects/imagefilters/SkDisplacementMapEffect.cpp
index bef906e..b33a0d4 100644
--- a/src/effects/imagefilters/SkDisplacementMapEffect.cpp
+++ b/src/effects/imagefilters/SkDisplacementMapEffect.cpp
@@ -342,7 +342,7 @@
                                            ctx.colorSpace(), kPremul_SkAlphaType);
 
         GrPaint paint;
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
         paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
         SkMatrix matrix;
         matrix.setTranslate(-SkIntToScalar(colorBounds.x()), -SkIntToScalar(colorBounds.y()));
diff --git a/src/effects/imagefilters/SkLightingImageFilter.cpp b/src/effects/imagefilters/SkLightingImageFilter.cpp
index 31f6848..29c631b 100644
--- a/src/effects/imagefilters/SkLightingImageFilter.cpp
+++ b/src/effects/imagefilters/SkLightingImageFilter.cpp
@@ -467,7 +467,7 @@
     GrPaint paint;
     auto fp = this->makeFragmentProcessor(std::move(srcView), matrix, srcBounds, boundaryMode,
                                           *renderTargetContext->caps());
-    paint.addColorFragmentProcessor(std::move(fp));
+    paint.setColorFragmentProcessor(std::move(fp));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
     renderTargetContext->fillRectToRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
                                         dstRect, srcRect);
diff --git a/src/effects/imagefilters/SkMorphologyImageFilter.cpp b/src/effects/imagefilters/SkMorphologyImageFilter.cpp
index 143bc83..24401f3 100644
--- a/src/effects/imagefilters/SkMorphologyImageFilter.cpp
+++ b/src/effects/imagefilters/SkMorphologyImageFilter.cpp
@@ -372,7 +372,7 @@
                                   const float range[2],
                                   MorphDirection direction) {
     GrPaint paint;
-    paint.addColorFragmentProcessor(GrMorphologyEffect::Make(/*inputFP=*/nullptr, std::move(view),
+    paint.setColorFragmentProcessor(GrMorphologyEffect::Make(/*inputFP=*/nullptr, std::move(view),
                                                              srcAlphaType, direction, radius,
                                                              morphType, range));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
@@ -390,7 +390,7 @@
                                             MorphType morphType,
                                             MorphDirection direction) {
     GrPaint paint;
-    paint.addColorFragmentProcessor(GrMorphologyEffect::Make(
+    paint.setColorFragmentProcessor(GrMorphologyEffect::Make(
             /*inputFP=*/nullptr, std::move(view), srcAlphaType, direction, radius, morphType));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
     renderTargetContext->fillRectToRect(/*clip=*/nullptr, std::move(paint), GrAA::kNo,
diff --git a/src/effects/imagefilters/SkXfermodeImageFilter.cpp b/src/effects/imagefilters/SkXfermodeImageFilter.cpp
index ea282d8..4b7779a 100644
--- a/src/effects/imagefilters/SkXfermodeImageFilter.cpp
+++ b/src/effects/imagefilters/SkXfermodeImageFilter.cpp
@@ -284,7 +284,7 @@
         fp = GrXfermodeFragmentProcessor::Make(std::move(fgFP), std::move(fp), fMode);
     }
 
-    paint.addColorFragmentProcessor(std::move(fp));
+    paint.setColorFragmentProcessor(std::move(fp));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
 
     auto renderTargetContext = GrRenderTargetContext::Make(
diff --git a/src/gpu/GrFragmentProcessor.cpp b/src/gpu/GrFragmentProcessor.cpp
index 6c2ec99..ad071b9 100644
--- a/src/gpu/GrFragmentProcessor.cpp
+++ b/src/gpu/GrFragmentProcessor.cpp
@@ -484,8 +484,8 @@
     for (int i = paint.numCoverageFragmentProcessors() - 1; i >= 0; --i) {
         fFPStack.push_back(paint.getCoverageFragmentProcessor(i));
     }
-    for (int i = paint.numColorFragmentProcessors() - 1; i >= 0; --i) {
-        fFPStack.push_back(paint.getColorFragmentProcessor(i));
+    if (paint.hasColorFragmentProcessor()) {
+        fFPStack.push_back(paint.getColorFragmentProcessor());
     }
 }
 
diff --git a/src/gpu/GrPaint.cpp b/src/gpu/GrPaint.cpp
index 9c02c7e..724c1be 100644
--- a/src/gpu/GrPaint.cpp
+++ b/src/gpu/GrPaint.cpp
@@ -43,7 +43,7 @@
         *constantColor = SK_PMColor4fTRANSPARENT;
         return true;
     }
-    if (this->numColorFragmentProcessors()) {
+    if (this->hasColorFragmentProcessor()) {
         return false;
     }
     if (kSrc == fXPFactory || (!fXPFactory && fColor.isOpaque())) {
diff --git a/src/gpu/GrPaint.h b/src/gpu/GrPaint.h
index fade312..d5cce58 100644
--- a/src/gpu/GrPaint.h
+++ b/src/gpu/GrPaint.h
@@ -60,9 +60,9 @@
     void setCoverageSetOpXPFactory(SkRegion::Op, bool invertCoverage = false);
 
     /**
-     * Appends an additional color processor to the color computation.
+     * Sets a processor for color computation.
      */
-    void addColorFragmentProcessor(std::unique_ptr<GrFragmentProcessor> fp) {
+    void setColorFragmentProcessor(std::unique_ptr<GrFragmentProcessor> fp) {
         SkASSERT(fp);
         SkASSERT(fColorFragmentProcessor == nullptr);
         fColorFragmentProcessor = std::move(fp);
@@ -78,16 +78,15 @@
         fTrivial = false;
     }
 
-    int numColorFragmentProcessors() const { return fColorFragmentProcessor ? 1 : 0; }
+    bool hasColorFragmentProcessor() const { return fColorFragmentProcessor ? true : false; }
     int numCoverageFragmentProcessors() const { return fCoverageFragmentProcessors.count(); }
-    int numTotalFragmentProcessors() const { return this->numColorFragmentProcessors() +
-                                              this->numCoverageFragmentProcessors(); }
+    int numTotalFragmentProcessors() const {
+        return (this->hasColorFragmentProcessor() ? 1 : 0) + this->numCoverageFragmentProcessors();
+    }
 
     const GrXPFactory* getXPFactory() const { return fXPFactory; }
 
-    GrFragmentProcessor* getColorFragmentProcessor(int i) const {
-        SkASSERT(i == 0);
-        SkASSERT(fColorFragmentProcessor != nullptr);
+    GrFragmentProcessor* getColorFragmentProcessor() const {
         return fColorFragmentProcessor.get();
     }
     GrFragmentProcessor* getCoverageFragmentProcessor(int i) const {
diff --git a/src/gpu/GrProcessorSet.cpp b/src/gpu/GrProcessorSet.cpp
index e0c9a3f..8a0f595 100644
--- a/src/gpu/GrProcessorSet.cpp
+++ b/src/gpu/GrProcessorSet.cpp
@@ -24,21 +24,18 @@
 
 GrProcessorSet::GrProcessorSet(GrPaint&& paint) : fXP(paint.getXPFactory()) {
     fFlags = 0;
-    if (paint.numColorFragmentProcessors() <= kMaxColorProcessors) {
-        fColorFragmentProcessorCnt = paint.numColorFragmentProcessors();
-        fFragmentProcessors.reset(paint.numTotalFragmentProcessors());
-        int i = 0;
-        if (paint.fColorFragmentProcessor) {
-            fFragmentProcessors[i++] = std::move(paint.fColorFragmentProcessor);
-        }
-        for (auto& fp : paint.fCoverageFragmentProcessors) {
-            SkASSERT(fp.get());
-            fFragmentProcessors[i++] = std::move(fp);
-        }
-    } else {
-        SkDEBUGFAIL("Multiple color fragment processors in paint. Dropping all processors.");
-        fColorFragmentProcessorCnt = 0;
+    fColorFragmentProcessorCnt = paint.hasColorFragmentProcessor() ? 1 : 0;
+    fFragmentProcessors.reset(paint.numTotalFragmentProcessors());
+
+    int i = 0;
+    if (paint.fColorFragmentProcessor) {
+        fFragmentProcessors[i++] = std::move(paint.fColorFragmentProcessor);
     }
+    for (auto& fp : paint.fCoverageFragmentProcessors) {
+        SkASSERT(fp.get());
+        fFragmentProcessors[i++] = std::move(fp);
+    }
+
     SkDEBUGCODE(paint.fAlive = false;)
 }
 
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp
index f439030..560c0d2 100644
--- a/src/gpu/GrRenderTargetContext.cpp
+++ b/src/gpu/GrRenderTargetContext.cpp
@@ -2119,7 +2119,7 @@
     if (!fp) {
         return false;
     }
-    paint.addColorFragmentProcessor(std::move(fp));
+    paint.setColorFragmentProcessor(std::move(fp));
 
     this->fillRectToRect(
             nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
diff --git a/src/gpu/GrSurfaceContext.cpp b/src/gpu/GrSurfaceContext.cpp
index 25b95b0..e325eef 100644
--- a/src/gpu/GrSurfaceContext.cpp
+++ b/src/gpu/GrSurfaceContext.cpp
@@ -238,7 +238,7 @@
         }
         GrPaint paint;
         paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
 
         tempCtx->asRenderTargetContext()->fillRectToRect(
                 nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
@@ -425,7 +425,7 @@
             }
             GrPaint paint;
             paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
-            paint.addColorFragmentProcessor(std::move(fp));
+            paint.setColorFragmentProcessor(std::move(fp));
             this->asRenderTargetContext()->fillRectToRect(
                     nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
                     SkRect::MakeXYWH(pt.fX, pt.fY, srcInfo.width(), srcInfo.height()),
@@ -849,7 +849,7 @@
                                                        /*unpremulInput=*/false,
                                                        /*clampRGBOutput=*/true,
                                                        /*premulOutput=*/false);
-    yPaint.addColorFragmentProcessor(std::move(yColFP));
+    yPaint.setColorFragmentProcessor(std::move(yColFP));
     yPaint.setPorterDuffXPFactory(SkBlendMode::kSrc);
     yRTC->fillRectToRect(nullptr, std::move(yPaint), GrAA::kNo, SkMatrix::I(), dstRectY, dstRectY);
     if (!doSynchronousRead) {
@@ -873,7 +873,7 @@
                                                        /*unpremulInput=*/false,
                                                        /*clampRGBOutput=*/true,
                                                        /*premulOutput=*/false);
-    uPaint.addColorFragmentProcessor(std::move(uColFP));
+    uPaint.setColorFragmentProcessor(std::move(uColFP));
     uPaint.setPorterDuffXPFactory(SkBlendMode::kSrc);
     uRTC->fillRectToRect(nullptr, std::move(uPaint), GrAA::kNo, SkMatrix::I(), dstRectUV,
                          dstRectUV);
@@ -897,7 +897,7 @@
                                                        /*unpremulInput=*/false,
                                                        /*clampRGBOutput=*/true,
                                                        /*premulOutput=*/false);
-    vPaint.addColorFragmentProcessor(std::move(vColFP));
+    vPaint.setColorFragmentProcessor(std::move(vColFP));
     vPaint.setPorterDuffXPFactory(SkBlendMode::kSrc);
     vRTC->fillRectToRect(nullptr, std::move(vPaint), GrAA::kNo, SkMatrix::I(), dstRectUV,
                          dstRectUV);
@@ -1123,7 +1123,7 @@
                 fp = GrColorSpaceXformEffect::Make(std::move(fp), std::move(xform));
             }
             GrPaint paint;
-            paint.addColorFragmentProcessor(std::move(fp));
+            paint.setColorFragmentProcessor(std::move(fp));
             paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
             tempB->fillRectToRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(), dstRect,
                                     dstRect);
diff --git a/src/gpu/GrYUVProvider.cpp b/src/gpu/GrYUVProvider.cpp
index 14b177c..ca7dc6b 100644
--- a/src/gpu/GrYUVProvider.cpp
+++ b/src/gpu/GrYUVProvider.cpp
@@ -181,7 +181,7 @@
             GrColorSpaceXformEffect::Make(std::move(yuvToRgbProcessor),
                                           srcColorSpace, kOpaque_SkAlphaType,
                                           dstColorSpace, kOpaque_SkAlphaType);
-    paint.addColorFragmentProcessor(std::move(colorConversionProcessor));
+    paint.setColorFragmentProcessor(std::move(colorConversionProcessor));
 
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
     const SkRect r = SkRect::MakeIWH(yuvSizeInfo.fSizes[0].fWidth,
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index c50bc6a..42d9d1a 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -345,7 +345,7 @@
     }
 
     if (paintFP) {
-        grPaint->addColorFragmentProcessor(std::move(paintFP));
+        grPaint->setColorFragmentProcessor(std::move(paintFP));
     }
 
     return true;
diff --git a/src/gpu/effects/GrConfigConversionEffect.fp b/src/gpu/effects/GrConfigConversionEffect.fp
index 0e8624a..aad2fa7 100644
--- a/src/gpu/effects/GrConfigConversionEffect.fp
+++ b/src/gpu/effects/GrConfigConversionEffect.fp
@@ -77,7 +77,7 @@
         // We then verify that two reads produced the same values.
 
         GrPaint paint1;
-        paint1.addColorFragmentProcessor(GrConfigConversionEffect::Make(
+        paint1.setColorFragmentProcessor(GrConfigConversionEffect::Make(
                 GrTextureEffect::Make(std::move(dataView), kPremul_SkAlphaType),
                 PMConversion::kToUnpremul));
         paint1.setPorterDuffXPFactory(SkBlendMode::kSrc);
@@ -92,7 +92,7 @@
         tempRTC->discard();
 
         GrPaint paint2;
-        paint2.addColorFragmentProcessor(GrConfigConversionEffect::Make(
+        paint2.setColorFragmentProcessor(GrConfigConversionEffect::Make(
                 GrTextureEffect::Make(readRTC->readSurfaceView(), kUnpremul_SkAlphaType),
                 PMConversion::kToPremul));
         paint2.setPorterDuffXPFactory(SkBlendMode::kSrc);
@@ -100,7 +100,7 @@
         tempRTC->fillRectToRect(nullptr, std::move(paint2), GrAA::kNo, SkMatrix::I(), kRect, kRect);
 
         GrPaint paint3;
-        paint3.addColorFragmentProcessor(GrConfigConversionEffect::Make(
+        paint3.setColorFragmentProcessor(GrConfigConversionEffect::Make(
                 GrTextureEffect::Make(tempRTC->readSurfaceView(), kPremul_SkAlphaType),
                 PMConversion::kToUnpremul));
         paint3.setPorterDuffXPFactory(SkBlendMode::kSrc);
diff --git a/src/gpu/effects/generated/GrConfigConversionEffect.cpp b/src/gpu/effects/generated/GrConfigConversionEffect.cpp
index 2297f7e..cf5a18e 100644
--- a/src/gpu/effects/generated/GrConfigConversionEffect.cpp
+++ b/src/gpu/effects/generated/GrConfigConversionEffect.cpp
@@ -137,7 +137,7 @@
     // We then verify that two reads produced the same values.
 
     GrPaint paint1;
-    paint1.addColorFragmentProcessor(GrConfigConversionEffect::Make(
+    paint1.setColorFragmentProcessor(GrConfigConversionEffect::Make(
             GrTextureEffect::Make(std::move(dataView), kPremul_SkAlphaType),
             PMConversion::kToUnpremul));
     paint1.setPorterDuffXPFactory(SkBlendMode::kSrc);
@@ -152,7 +152,7 @@
     tempRTC->discard();
 
     GrPaint paint2;
-    paint2.addColorFragmentProcessor(GrConfigConversionEffect::Make(
+    paint2.setColorFragmentProcessor(GrConfigConversionEffect::Make(
             GrTextureEffect::Make(readRTC->readSurfaceView(), kUnpremul_SkAlphaType),
             PMConversion::kToPremul));
     paint2.setPorterDuffXPFactory(SkBlendMode::kSrc);
@@ -160,7 +160,7 @@
     tempRTC->fillRectToRect(nullptr, std::move(paint2), GrAA::kNo, SkMatrix::I(), kRect, kRect);
 
     GrPaint paint3;
-    paint3.addColorFragmentProcessor(GrConfigConversionEffect::Make(
+    paint3.setColorFragmentProcessor(GrConfigConversionEffect::Make(
             GrTextureEffect::Make(tempRTC->readSurfaceView(), kPremul_SkAlphaType),
             PMConversion::kToUnpremul));
     paint3.setPorterDuffXPFactory(SkBlendMode::kSrc);
diff --git a/src/gpu/ops/GrStencilAndCoverPathRenderer.cpp b/src/gpu/ops/GrStencilAndCoverPathRenderer.cpp
index d20a1d3..747be19 100644
--- a/src/gpu/ops/GrStencilAndCoverPathRenderer.cpp
+++ b/src/gpu/ops/GrStencilAndCoverPathRenderer.cpp
@@ -60,11 +60,9 @@
     // The lack of vertex shaders means we can't move transform matrices into the vertex shader. We
     // could do the transform in the fragment processor, but that would be very slow, so instead we
     // just avoid using this path renderer in the face of transformed FPs.
-    if (args.fPaint) {
-        for (int i = args.fPaint->numColorFragmentProcessors() - 1; i >= 0; --i) {
-            if (has_matrix(*args.fPaint->getColorFragmentProcessor(i))) {
-                return CanDrawPath::kNo;
-            }
+    if (args.fPaint && args.fPaint->hasColorFragmentProcessor()) {
+        if (has_matrix(*args.fPaint->getColorFragmentProcessor())) {
+            return CanDrawPath::kNo;
         }
     }
     return CanDrawPath::kYes;
diff --git a/src/gpu/ops/GrTextureOp.cpp b/src/gpu/ops/GrTextureOp.cpp
index 9ec2f26..b3b32b7 100644
--- a/src/gpu/ops/GrTextureOp.cpp
+++ b/src/gpu/ops/GrTextureOp.cpp
@@ -1073,7 +1073,7 @@
         if (saturate == GrTextureOp::Saturate::kYes) {
             fp = GrClampFragmentProcessor::Make(std::move(fp), /*clampToPremul=*/false);
         }
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
         return GrFillRectOp::Make(context, std::move(paint), aaType, quad);
     }
 }
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp
index 7dfc391..3864f86 100644
--- a/src/image/SkImage_Gpu.cpp
+++ b/src/image/SkImage_Gpu.cpp
@@ -102,7 +102,7 @@
 
     GrPaint paint;
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
-    paint.addColorFragmentProcessor(std::move(colorFP));
+    paint.setColorFragmentProcessor(std::move(colorFP));
 
     renderTargetContext->drawRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(),
                                   SkRect::MakeIWH(this->width(), this->height()));
diff --git a/src/image/SkImage_GpuBase.cpp b/src/image/SkImage_GpuBase.cpp
index 51cf6fa..b901574 100644
--- a/src/image/SkImage_GpuBase.cpp
+++ b/src/image/SkImage_GpuBase.cpp
@@ -324,7 +324,7 @@
     if (colorSpaceXform) {
         fp = GrColorSpaceXformEffect::Make(std::move(fp), std::move(colorSpaceXform));
     }
-    paint.addColorFragmentProcessor(std::move(fp));
+    paint.setColorFragmentProcessor(std::move(fp));
 
     renderTargetContext->drawRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(), rect);
     return true;
diff --git a/tests/DefaultPathRendererTest.cpp b/tests/DefaultPathRendererTest.cpp
index f08f56c..cef653b 100644
--- a/tests/DefaultPathRendererTest.cpp
+++ b/tests/DefaultPathRendererTest.cpp
@@ -93,7 +93,7 @@
 
         const SkPMColor4f color = { 1.0f, 0.0f, 0.0f, 1.0f };
         auto fp = GrConstColorProcessor::Make(color);
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
 
         rtc->drawPath(nullptr, std::move(paint), GrAA::kNo,
                       SkMatrix::I(), invPath, style);
@@ -111,7 +111,7 @@
 
         const SkPMColor4f color = { 0.0f, 1.0f, 0.0f, 1.0f };
         auto fp = GrConstColorProcessor::Make(color);
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
 
         rtc->drawPath(nullptr, std::move(paint), GrAA::kNo,
                       SkMatrix::I(), path, style);
diff --git a/tests/OnFlushCallbackTest.cpp b/tests/OnFlushCallbackTest.cpp
index 2088454..43b6549 100644
--- a/tests/OnFlushCallbackTest.cpp
+++ b/tests/OnFlushCallbackTest.cpp
@@ -476,7 +476,7 @@
 
         auto fp = GrTextureEffect::Make(atlasView, atlasAlphaType);
         GrPaint paint;
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
         paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
         std::unique_ptr<AtlasedRectOp> op(AtlasedRectOp::Make(context,
                                                               std::move(paint), r, start + i));
@@ -594,7 +594,7 @@
         GrPaint paint;
         auto fp = GrTextureEffect::Make(std::move(views[i]), kPremul_SkAlphaType, t);
         paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
 
         rtc->drawRect(nullptr, std::move(paint), GrAA::kNo, SkMatrix::I(), r);
     }
diff --git a/tests/ProcessorTest.cpp b/tests/ProcessorTest.cpp
index 9292c12..ff56231 100644
--- a/tests/ProcessorTest.cpp
+++ b/tests/ProcessorTest.cpp
@@ -229,7 +229,7 @@
 void test_draw_op(GrContext* context, GrRenderTargetContext* rtc,
                   std::unique_ptr<GrFragmentProcessor> fp) {
     GrPaint paint;
-    paint.addColorFragmentProcessor(std::move(fp));
+    paint.setColorFragmentProcessor(std::move(fp));
     paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
 
     auto op = GrFillRectOp::MakeNonAARect(context, std::move(paint), SkMatrix::I(),
diff --git a/tests/ProgramsTest.cpp b/tests/ProgramsTest.cpp
index fba33ea..afa3e13 100644
--- a/tests/ProgramsTest.cpp
+++ b/tests/ProgramsTest.cpp
@@ -229,7 +229,7 @@
     if (d->fRandom->nextF() < procTreeProbability) {
         std::unique_ptr<GrFragmentProcessor> fp(create_random_proc_tree(d, 2, maxTreeLevels));
         if (fp) {
-            paint->addColorFragmentProcessor(std::move(fp));
+            paint->setColorFragmentProcessor(std::move(fp));
         }
     } else {
         int numProcs = d->fRandom->nextULessThan(maxStages + 1);
@@ -242,7 +242,7 @@
             }
             // finally add the stage to the correct pipeline in the drawstate
             if (s < numColorProcs) {
-                paint->addColorFragmentProcessor(std::move(fp));
+                paint->setColorFragmentProcessor(std::move(fp));
             } else {
                 paint->addCoverageFragmentProcessor(std::move(fp));
             }
@@ -330,7 +330,7 @@
             paint.setXPFactory(GrPorterDuffXPFactory::Get(SkBlendMode::kSrc));
             auto fp = GrFragmentProcessorTestFactory::MakeIdx(i, &ptd);
             auto blockFP = BlockInputFragmentProcessor::Make(std::move(fp));
-            paint.addColorFragmentProcessor(std::move(blockFP));
+            paint.setColorFragmentProcessor(std::move(blockFP));
             GrDrawRandomOp(&random, renderTargetContext.get(), std::move(paint));
 
             direct->flush(GrFlushInfo());
diff --git a/tests/RectangleTextureTest.cpp b/tests/RectangleTextureTest.cpp
index 0fa91f6..dbdf00a 100644
--- a/tests/RectangleTextureTest.cpp
+++ b/tests/RectangleTextureTest.cpp
@@ -35,7 +35,7 @@
         auto fp = GrTextureEffect::Make(rectView, alphaType, SkMatrix::I(), filter);
         GrPaint paint;
         paint.setPorterDuffXPFactory(SkBlendMode::kSrc);
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
         rtContext->drawPaint(nullptr, std::move(paint), SkMatrix::I());
         TestReadPixels(reporter, rtContext.get(), expectedPixelValues,
                        "RectangleTexture-basic-draw");
diff --git a/tests/TriangulatingPathRendererTests.cpp b/tests/TriangulatingPathRendererTests.cpp
index 6b7ff33..7860e98 100644
--- a/tests/TriangulatingPathRendererTests.cpp
+++ b/tests/TriangulatingPathRendererTests.cpp
@@ -711,7 +711,7 @@
     GrPaint paint;
     paint.setXPFactory(GrPorterDuffXPFactory::Get(SkBlendMode::kSrc));
     if (fp) {
-        paint.addColorFragmentProcessor(std::move(fp));
+        paint.setColorFragmentProcessor(std::move(fp));
     }
 
     SkIRect clipConservativeBounds = SkIRect::MakeWH(renderTargetContext->width(),
diff --git a/tools/gpu/TestOps.cpp b/tools/gpu/TestOps.cpp
index e0a195f..cfd6815 100644
--- a/tools/gpu/TestOps.cpp
+++ b/tools/gpu/TestOps.cpp
@@ -230,7 +230,7 @@
                                    const SkRect& localRect,
                                    const SkMatrix& localM) {
     GrPaint paint;
-    paint.addColorFragmentProcessor(std::move(fp));
+    paint.setColorFragmentProcessor(std::move(fp));
     return TestRectOp::Make(context, std::move(paint), drawRect, localRect, localM);
 }