blob: 1996a942c282d259c553cc2fbdab21e0e6581dc2 [file] [log] [blame]
Jim Van Verth91af7272017-01-27 14:15:54 -05001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "effects/GrBlurredEdgeFragmentProcessor.h"
Jim Van Verth91af7272017-01-27 14:15:54 -05009
10#include "glsl/GrGLSLFragmentProcessor.h"
11#include "glsl/GrGLSLFragmentShaderBuilder.h"
12
13class GLSLBlurredEdgeFP : public GrGLSLFragmentProcessor {
14public:
15 GLSLBlurredEdgeFP() {}
16
17 void emitCode(EmitArgs& args) override {
18
19 GrBlurredEdgeFP::Mode mode = args.fFp.cast<GrBlurredEdgeFP>().mode();
20
21 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
22
23 fragBuilder->codeAppendf("vec4 color = %s;", args.fInputColor);
Brian Salomone23bffd2017-06-02 11:01:10 -040024 fragBuilder->codeAppendf("// assuming interpolant is set in vertex colors\n");
25 fragBuilder->codeAppendf("float factor = 1.0 - color.a;");
Jim Van Verth91af7272017-01-27 14:15:54 -050026 switch (mode) {
27 case GrBlurredEdgeFP::kGaussian_Mode:
28 fragBuilder->codeAppend("factor = exp(-factor * factor * 4.0) - 0.018;");
29 break;
30 case GrBlurredEdgeFP::kSmoothstep_Mode:
Jim Van Verth060d9822017-05-04 09:58:17 -040031 fragBuilder->codeAppend("factor = smoothstep(1.0, 0.0, factor);");
Jim Van Verth91af7272017-01-27 14:15:54 -050032 break;
33 }
Jim Van Verth060d9822017-05-04 09:58:17 -040034 fragBuilder->codeAppendf("%s = vec4(factor);", args.fOutputColor);
Jim Van Verth91af7272017-01-27 14:15:54 -050035 }
36
37protected:
Brian Salomonab015ef2017-04-04 10:15:51 -040038 void onSetData(const GrGLSLProgramDataManager& pdman,
39 const GrFragmentProcessor& proc) override {}
Jim Van Verth91af7272017-01-27 14:15:54 -050040
41 GrBlurredEdgeFP::Mode fMode;
42};
43
44GrGLSLFragmentProcessor* GrBlurredEdgeFP::onCreateGLSLInstance() const {
45 return new GLSLBlurredEdgeFP();
46}
47
48void GrBlurredEdgeFP::onGetGLSLProcessorKey(const GrShaderCaps& caps,
49 GrProcessorKeyBuilder* b) const {
50 b->add32(fMode);
51}
52
53bool GrBlurredEdgeFP::onIsEqual(const GrFragmentProcessor& other) const {
54 const GrBlurredEdgeFP& that = other.cast<GrBlurredEdgeFP>();
55 return that.fMode == fMode;
56}
57
Jim Van Verth91af7272017-01-27 14:15:54 -050058