| Index: src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
|
| diff --git a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
|
| index 653aa016a30c363c1a9449fda585690e29a74d63..4633bc25e1817f370913ee1c73c9a0c89e8924a7 100644
|
| --- a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
|
| +++ b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp
|
| @@ -242,9 +242,9 @@ void GLEdge2PtConicalEffect::emitCode(EmitArgs& args) {
|
| SkASSERT(args.fCoords[0].getType() == args.fCoords[1].getType());
|
| const char* coords2D;
|
| SkString bVar;
|
| - GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| + GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
|
| if (kVec3f_GrSLType == args.fCoords[0].getType()) {
|
| - fsBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n",
|
| + fragBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x / %s.z);\n",
|
| args.fCoords[0].c_str(), args.fCoords[0].c_str(),
|
| args.fCoords[1].c_str(), args.fCoords[1].c_str());
|
| coords2D = "interpolants.xy";
|
| @@ -256,23 +256,28 @@ void GLEdge2PtConicalEffect::emitCode(EmitArgs& args) {
|
|
|
| // output will default to transparent black (we simply won't write anything
|
| // else to it if invalid, instead of discarding or returning prematurely)
|
| - fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColor);
|
| + fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColor);
|
|
|
| // c = (x^2)+(y^2) - params[1]
|
| - fsBuilder->codeAppendf("\tfloat %s = dot(%s, %s) - %s;\n",
|
| + fragBuilder->codeAppendf("\tfloat %s = dot(%s, %s) - %s;\n",
|
| cName.c_str(), coords2D, coords2D, p1.c_str());
|
|
|
| // linear case: t = -c/b
|
| - fsBuilder->codeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(),
|
| + fragBuilder->codeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(),
|
| cName.c_str(), bVar.c_str());
|
|
|
| // if r(t) > 0, then t will be the x coordinate
|
| - fsBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(),
|
| + fragBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(),
|
| p2.c_str(), p0.c_str());
|
| - fsBuilder->codeAppend("\t");
|
| - this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fInputColor,
|
| + fragBuilder->codeAppend("\t");
|
| + this->emitColor(args.fBuilder,
|
| + fragBuilder,
|
| + ge,
|
| + tName.c_str(),
|
| + args.fOutputColor,
|
| + args.fInputColor,
|
| args.fSamplers);
|
| - fsBuilder->codeAppend("\t}\n");
|
| + fragBuilder->codeAppend("\t}\n");
|
| }
|
|
|
| void GLEdge2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman,
|
| @@ -511,35 +516,40 @@ void GLFocalOutside2PtConicalEffect::emitCode(EmitArgs& args) {
|
| args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1);
|
|
|
| // if we have a vec3 from being in perspective, convert it to a vec2 first
|
| - GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| - SkString coords2DString = fsBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| + GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
|
| + SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| const char* coords2D = coords2DString.c_str();
|
|
|
| // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2)
|
|
|
| // output will default to transparent black (we simply won't write anything
|
| // else to it if invalid, instead of discarding or returning prematurely)
|
| - fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColor);
|
| + fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColor);
|
|
|
| - fsBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D);
|
| - fsBuilder->codeAppendf("\tfloat ys = %s.y * %s.y;\n", coords2D, coords2D);
|
| - fsBuilder->codeAppendf("\tfloat d = xs + %s * ys;\n", p1.c_str());
|
| + fragBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D);
|
| + fragBuilder->codeAppendf("\tfloat ys = %s.y * %s.y;\n", coords2D, coords2D);
|
| + fragBuilder->codeAppendf("\tfloat d = xs + %s * ys;\n", p1.c_str());
|
|
|
| // Must check to see if we flipped the circle order (to make sure start radius < end radius)
|
| // If so we must also flip sign on sqrt
|
| if (!fIsFlipped) {
|
| - fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + sqrt(d);\n", tName.c_str(),
|
| - coords2D, p0.c_str());
|
| + fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + sqrt(d);\n", tName.c_str(),
|
| + coords2D, p0.c_str());
|
| } else {
|
| - fsBuilder->codeAppendf("\tfloat %s = %s.x * %s - sqrt(d);\n", tName.c_str(),
|
| - coords2D, p0.c_str());
|
| + fragBuilder->codeAppendf("\tfloat %s = %s.x * %s - sqrt(d);\n", tName.c_str(),
|
| + coords2D, p0.c_str());
|
| }
|
|
|
| - fsBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str());
|
| - fsBuilder->codeAppend("\t\t");
|
| - this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fInputColor,
|
| + fragBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str());
|
| + fragBuilder->codeAppend("\t\t");
|
| + this->emitColor(args.fBuilder,
|
| + fragBuilder,
|
| + ge,
|
| + tName.c_str(),
|
| + args.fOutputColor,
|
| + args.fInputColor,
|
| args.fSamplers);
|
| - fsBuilder->codeAppend("\t}\n");
|
| + fragBuilder->codeAppend("\t}\n");
|
| }
|
|
|
| void GLFocalOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman,
|
| @@ -713,15 +723,20 @@ void GLFocalInside2PtConicalEffect::emitCode(EmitArgs& args) {
|
| GrGLSLShaderVar focal = args.fBuilder->getUniformVariable(fFocalUni);
|
|
|
| // if we have a vec3 from being in perspective, convert it to a vec2 first
|
| - GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| - SkString coords2DString = fsBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| + GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
|
| + SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| const char* coords2D = coords2DString.c_str();
|
|
|
| // t = p.x * focalX + length(p)
|
| - fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_str(),
|
| + fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_str(),
|
| coords2D, focal.c_str(), coords2D);
|
|
|
| - this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fInputColor,
|
| + this->emitColor(args.fBuilder,
|
| + fragBuilder,
|
| + ge,
|
| + tName.c_str(),
|
| + args.fOutputColor,
|
| + args.fInputColor,
|
| args.fSamplers);
|
| }
|
|
|
| @@ -963,8 +978,8 @@ void GLCircleInside2PtConicalEffect::emitCode(EmitArgs& args) {
|
| GrGLSLShaderVar params = args.fBuilder->getUniformVariable(fParamUni);
|
|
|
| // if we have a vec3 from being in perspective, convert it to a vec2 first
|
| - GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| - SkString coords2DString = fsBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| + GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
|
| + SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| const char* coords2D = coords2DString.c_str();
|
|
|
| // p = coords2D
|
| @@ -975,13 +990,18 @@ void GLCircleInside2PtConicalEffect::emitCode(EmitArgs& args) {
|
| // C = 1 / A
|
| // d = dot(e, p) + B
|
| // t = d +/- sqrt(d^2 - A * dot(p, p) + C)
|
| - fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D);
|
| - fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, center.c_str(),
|
| - params.c_str());
|
| - fsBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\n",
|
| - tName.c_str(), params.c_str(), params.c_str());
|
| -
|
| - this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fInputColor,
|
| + fragBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D);
|
| + fragBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, center.c_str(),
|
| + params.c_str());
|
| + fragBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\n",
|
| + tName.c_str(), params.c_str(), params.c_str());
|
| +
|
| + this->emitColor(args.fBuilder,
|
| + fragBuilder,
|
| + ge,
|
| + tName.c_str(),
|
| + args.fOutputColor,
|
| + args.fInputColor,
|
| args.fSamplers);
|
| }
|
|
|
| @@ -1193,13 +1213,13 @@ void GLCircleOutside2PtConicalEffect::emitCode(EmitArgs& args) {
|
| GrGLSLShaderVar params = args.fBuilder->getUniformVariable(fParamUni);
|
|
|
| // if we have a vec3 from being in perspective, convert it to a vec2 first
|
| - GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder();
|
| - SkString coords2DString = fsBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| + GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder;
|
| + SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0);
|
| const char* coords2D = coords2DString.c_str();
|
|
|
| // output will default to transparent black (we simply won't write anything
|
| // else to it if invalid, instead of discarding or returning prematurely)
|
| - fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColor);
|
| + fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColor);
|
|
|
| // p = coords2D
|
| // e = center end
|
| @@ -1210,25 +1230,30 @@ void GLCircleOutside2PtConicalEffect::emitCode(EmitArgs& args) {
|
| // d = dot(e, p) + B
|
| // t = d +/- sqrt(d^2 - A * dot(p, p) + C)
|
|
|
| - fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D);
|
| - fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, center.c_str(),
|
| - params.c_str());
|
| - fsBuilder->codeAppendf("\tfloat deter = d * d - %s.x * pDotp + %s.z;\n", params.c_str(),
|
| - params.c_str());
|
| + fragBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D);
|
| + fragBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, center.c_str(),
|
| + params.c_str());
|
| + fragBuilder->codeAppendf("\tfloat deter = d * d - %s.x * pDotp + %s.z;\n", params.c_str(),
|
| + params.c_str());
|
|
|
| // Must check to see if we flipped the circle order (to make sure start radius < end radius)
|
| // If so we must also flip sign on sqrt
|
| if (!fIsFlipped) {
|
| - fsBuilder->codeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str());
|
| + fragBuilder->codeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str());
|
| } else {
|
| - fsBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str());
|
| + fragBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str());
|
| }
|
|
|
| - fsBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str(), params.c_str());
|
| - fsBuilder->codeAppend("\t\t");
|
| - this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fInputColor,
|
| + fragBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str(), params.c_str());
|
| + fragBuilder->codeAppend("\t\t");
|
| + this->emitColor(args.fBuilder,
|
| + fragBuilder,
|
| + ge,
|
| + tName.c_str(),
|
| + args.fOutputColor,
|
| + args.fInputColor,
|
| args.fSamplers);
|
| - fsBuilder->codeAppend("\t}\n");
|
| + fragBuilder->codeAppend("\t}\n");
|
| }
|
|
|
| void GLCircleOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman,
|
|
|