diff options
author | Ethan Nicholas <ethannicholas@google.com> | 2017-11-17 13:44:05 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-11-17 20:11:36 +0000 |
commit | be0a042dcfbc05a10d592521cae9e2ad253c2f78 (patch) | |
tree | 4551e7ac5ffb508a601a7f063bc413a396fe7aef /src/gpu/GrFragmentProcessor.cpp | |
parent | b092cea5b17420926557d0e8b8d2df6db894725c (diff) |
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>
Diffstat (limited to 'src/gpu/GrFragmentProcessor.cpp')
-rw-r--r-- | src/gpu/GrFragmentProcessor.cpp | 97 |
1 files changed, 5 insertions, 92 deletions
diff --git a/src/gpu/GrFragmentProcessor.cpp b/src/gpu/GrFragmentProcessor.cpp index 90bbb33e60..a50be79872 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 @@ std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::MulOutputByInputAlpha( 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 @@ std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::PremulOutput( return nullptr; } std::unique_ptr<GrFragmentProcessor> fpPipeline[] = { std::move(fp), - PremulInputFragmentProcessor::Make() }; + GrPremulInputFragmentProcessor::Make() }; return GrFragmentProcessor::RunInSeries(fpPipeline, 2); } @@ -224,7 +137,7 @@ std::unique_ptr<GrFragmentProcessor> GrFragmentProcessor::UnpremulOutput( return nullptr; } std::unique_ptr<GrFragmentProcessor> fpPipeline[] = { std::move(fp), - UnpremulInputFragmentProcessor::Make() }; + GrUnpremulInputFragmentProcessor::Make() }; return GrFragmentProcessor::RunInSeries(fpPipeline, 2); } |