Line data Source code
1 : /*
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"
9 :
10 : #include "glsl/GrGLSLFragmentProcessor.h"
11 : #include "glsl/GrGLSLFragmentShaderBuilder.h"
12 :
13 0 : class GLSLBlurredEdgeFP : public GrGLSLFragmentProcessor {
14 : public:
15 0 : GLSLBlurredEdgeFP() {}
16 :
17 0 : void emitCode(EmitArgs& args) override {
18 :
19 0 : GrBlurredEdgeFP::Mode mode = args.fFp.cast<GrBlurredEdgeFP>().mode();
20 :
21 0 : GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
22 :
23 0 : fragBuilder->codeAppendf("vec4 color = %s;", args.fInputColor);
24 0 : if (!args.fGpImplementsDistanceVector) {
25 0 : fragBuilder->codeAppendf("// assuming interpolant is set in vertex colors\n");
26 0 : fragBuilder->codeAppendf("float factor = 1.0 - color.b;");
27 : } else {
28 0 : fragBuilder->codeAppendf("// using distance to edge to compute interpolant\n");
29 0 : fragBuilder->codeAppend("float radius = color.r*256.0*64.0 + color.g*64.0;");
30 0 : fragBuilder->codeAppend("float pad = color.b*64.0;");
31 :
32 0 : fragBuilder->codeAppendf("float factor = 1.0 - clamp((%s.z - pad)/radius, 0.0, 1.0);",
33 0 : fragBuilder->distanceVectorName());
34 : }
35 0 : switch (mode) {
36 : case GrBlurredEdgeFP::kGaussian_Mode:
37 0 : fragBuilder->codeAppend("factor = exp(-factor * factor * 4.0) - 0.018;");
38 0 : break;
39 : case GrBlurredEdgeFP::kSmoothstep_Mode:
40 0 : fragBuilder->codeAppend("factor = smoothstep(factor, 0.0, 1.0);");
41 0 : break;
42 : }
43 0 : if (!args.fGpImplementsDistanceVector) {
44 0 : fragBuilder->codeAppendf("%s = vec4(factor*color.g);", args.fOutputColor);
45 : } else {
46 0 : fragBuilder->codeAppendf("%s = vec4(factor*color.a);", args.fOutputColor);
47 : }
48 0 : }
49 :
50 : protected:
51 0 : void onSetData(const GrGLSLProgramDataManager& pdman,
52 0 : const GrFragmentProcessor& proc) override {}
53 :
54 : GrBlurredEdgeFP::Mode fMode;
55 : };
56 :
57 0 : GrGLSLFragmentProcessor* GrBlurredEdgeFP::onCreateGLSLInstance() const {
58 0 : return new GLSLBlurredEdgeFP();
59 : }
60 :
61 0 : void GrBlurredEdgeFP::onGetGLSLProcessorKey(const GrShaderCaps& caps,
62 : GrProcessorKeyBuilder* b) const {
63 0 : b->add32(fMode);
64 0 : }
65 :
66 0 : bool GrBlurredEdgeFP::onIsEqual(const GrFragmentProcessor& other) const {
67 0 : const GrBlurredEdgeFP& that = other.cast<GrBlurredEdgeFP>();
68 0 : return that.fMode == fMode;
69 : }
70 :
71 :
|