converted Premul / Unpremul to SkSL

Bug: skia:
Change-Id: I4944badbb530e17b9ff7cca389f943e0b5982e01
Reviewed-on: https://skia-review.googlesource.com/72983
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
diff --git a/src/gpu/GrFragmentProcessor.cpp b/src/gpu/GrFragmentProcessor.cpp
index 90bbb33..a50be79 100644
--- a/src/gpu/GrFragmentProcessor.cpp
+++ b/src/gpu/GrFragmentProcessor.cpp
@@ -10,7 +10,9 @@
 #include "GrPipeline.h"
 #include "GrProcessorAnalysis.h"
 #include "effects/GrConstColorProcessor.h"
+#include "effects/GrPremulInputFragmentProcessor.h"
 #include "effects/GrXfermodeFragmentProcessor.h"
+#include "effects/GrUnpremulInputFragmentProcessor.h"
 #include "glsl/GrGLSLFragmentProcessor.h"
 #include "glsl/GrGLSLFragmentShaderBuilder.h"
 #include "glsl/GrGLSLProgramDataManager.h"
@@ -109,101 +111,12 @@
     return GrXfermodeFragmentProcessor::MakeFromDstProcessor(std::move(fp), SkBlendMode::kDstIn);
 }
 
-namespace {
-
-class PremulInputFragmentProcessor : public GrFragmentProcessor {
-public:
-    static std::unique_ptr<GrFragmentProcessor> Make() {
-        return std::unique_ptr<GrFragmentProcessor>(new PremulInputFragmentProcessor);
-    }
-
-    const char* name() const override { return "PremultiplyInput"; }
-
-    std::unique_ptr<GrFragmentProcessor> clone() const override { return Make(); }
-
-private:
-    PremulInputFragmentProcessor()
-            : INHERITED(kPremulInputFragmentProcessor_ClassID,
-                        kPreservesOpaqueInput_OptimizationFlag |
-                        kConstantOutputForConstantInput_OptimizationFlag) {
-    }
-
-    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
-        class GLFP : public GrGLSLFragmentProcessor {
-        public:
-            void emitCode(EmitArgs& args) override {
-                GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
-
-                fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, args.fInputColor);
-                fragBuilder->codeAppendf("%s.rgb *= %s.a;",
-                                            args.fOutputColor, args.fInputColor);
-            }
-        };
-        return new GLFP;
-    }
-
-    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {}
-
-    bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
-
-    GrColor4f constantOutputForConstantInput(GrColor4f input) const override {
-        return input.premul();
-    }
-
-    typedef GrFragmentProcessor INHERITED;
-};
-
-class UnpremulInputFragmentProcessor : public GrFragmentProcessor {
-public:
-    static std::unique_ptr<GrFragmentProcessor> Make() {
-        return std::unique_ptr<GrFragmentProcessor>(new UnpremulInputFragmentProcessor);
-    }
-
-    const char* name() const override { return "UnpremultiplyInput"; }
-
-    std::unique_ptr<GrFragmentProcessor> clone() const override { return Make(); }
-
-private:
-    UnpremulInputFragmentProcessor()
-            : INHERITED(kUnpremulInputFragmentProcessor_ClassID,
-                        kPreservesOpaqueInput_OptimizationFlag |
-                        kConstantOutputForConstantInput_OptimizationFlag) {
-    }
-
-    GrGLSLFragmentProcessor* onCreateGLSLInstance() const override {
-        class GLFP : public GrGLSLFragmentProcessor {
-        public:
-            void emitCode(EmitArgs& args) override {
-                GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
-
-                fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, args.fInputColor);
-                fragBuilder->codeAppendf("half invAlpha = %s.a <= 0.0 ? 0.0 : 1.0 / %s.a;",
-                                         args.fInputColor, args.fInputColor);
-                fragBuilder->codeAppendf("%s.rgb *= invAlpha;", args.fOutputColor);
-            }
-        };
-        return new GLFP;
-    }
-
-    void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {}
-
-    bool onIsEqual(const GrFragmentProcessor&) const override { return true; }
-
-    GrColor4f constantOutputForConstantInput(GrColor4f input) const override {
-        return input.unpremul();
-    }
-
-    typedef GrFragmentProcessor INHERITED;
-};
-
-}
-
 std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::PremulInput(
         std::unique_ptr<GrFragmentProcessor> fp) {
     if (!fp) {
         return nullptr;
     }
-    std::unique_ptr<GrFragmentProcessor> fpPipeline[] = { PremulInputFragmentProcessor::Make(),
+    std::unique_ptr<GrFragmentProcessor> fpPipeline[] = { GrPremulInputFragmentProcessor::Make(),
                                                           std::move(fp) };
     return GrFragmentProcessor::RunInSeries(fpPipeline, 2);
 }
@@ -214,7 +127,7 @@
         return nullptr;
     }
     std::unique_ptr<GrFragmentProcessor> fpPipeline[] = { std::move(fp),
-                                                          PremulInputFragmentProcessor::Make() };
+                                                          GrPremulInputFragmentProcessor::Make() };
     return GrFragmentProcessor::RunInSeries(fpPipeline, 2);
 }
 
@@ -224,7 +137,7 @@
         return nullptr;
     }
     std::unique_ptr<GrFragmentProcessor> fpPipeline[] = { std::move(fp),
-                                                          UnpremulInputFragmentProcessor::Make() };
+                                                          GrUnpremulInputFragmentProcessor::Make() };
     return GrFragmentProcessor::RunInSeries(fpPipeline, 2);
 }