OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "SkTwoPointConicalGradient_gpu.h" | 9 #include "SkTwoPointConicalGradient_gpu.h" |
10 | 10 |
11 #include "SkTwoPointConicalGradient.h" | 11 #include "SkTwoPointConicalGradient.h" |
12 | 12 |
13 #if SK_SUPPORT_GPU | 13 #if SK_SUPPORT_GPU |
| 14 #include "GrCoordTransform.h" |
| 15 #include "GrInvariantOutput.h" |
14 #include "GrPaint.h" | 16 #include "GrPaint.h" |
15 #include "glsl/GrGLSLFragmentShaderBuilder.h" | 17 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
16 #include "glsl/GrGLSLProgramBuilder.h" | |
17 #include "glsl/GrGLSLProgramDataManager.h" | 18 #include "glsl/GrGLSLProgramDataManager.h" |
| 19 #include "glsl/GrGLSLUniformHandler.h" |
18 // For brevity | 20 // For brevity |
19 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; | 21 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
20 | 22 |
21 static const SkScalar kErrorTol = 0.00001f; | 23 static const SkScalar kErrorTol = 0.00001f; |
22 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol; | 24 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol; |
23 | 25 |
24 /** | 26 /** |
25 * We have three general cases for 2pt conical gradients. First we always assume
that | 27 * We have three general cases for 2pt conical gradients. First we always assume
that |
26 * the start radius <= end radius. Our first case (kInside_) is when the start c
ircle | 28 * the start radius <= end radius. Our first case (kInside_) is when the start c
ircle |
27 * is completely enclosed by the end circle. The second case (kOutside_) is the
case | 29 * is completely enclosed by the end circle. The second case (kOutside_) is the
case |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 } | 218 } |
217 | 219 |
218 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&) | 220 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&) |
219 : fVSVaryingName(nullptr) | 221 : fVSVaryingName(nullptr) |
220 , fFSVaryingName(nullptr) | 222 , fFSVaryingName(nullptr) |
221 , fCachedRadius(-SK_ScalarMax) | 223 , fCachedRadius(-SK_ScalarMax) |
222 , fCachedDiffRadius(-SK_ScalarMax) {} | 224 , fCachedDiffRadius(-SK_ScalarMax) {} |
223 | 225 |
224 void GLEdge2PtConicalEffect::emitCode(EmitArgs& args) { | 226 void GLEdge2PtConicalEffect::emitCode(EmitArgs& args) { |
225 const Edge2PtConicalEffect& ge = args.fFp.cast<Edge2PtConicalEffect>(); | 227 const Edge2PtConicalEffect& ge = args.fFp.cast<Edge2PtConicalEffect>(); |
226 this->emitUniforms(args.fBuilder, ge); | 228 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
227 fParamUni = args.fBuilder->addUniformArray(GrGLSLProgramBuilder::kFragment_V
isibility, | 229 this->emitUniforms(uniformHandler, ge); |
228 kFloat_GrSLType, kDefault_GrSLPrecision
, | 230 fParamUni = uniformHandler->addUniformArray(GrGLSLUniformHandler::kFragment_
Visibility, |
229 "Conical2FSParams", 3); | 231 kFloat_GrSLType, kDefault_GrSLPr
ecision, |
| 232 "Conical2FSParams", 3); |
230 | 233 |
231 SkString cName("c"); | 234 SkString cName("c"); |
232 SkString tName("t"); | 235 SkString tName("t"); |
233 SkString p0; // start radius | 236 SkString p0; // start radius |
234 SkString p1; // start radius squared | 237 SkString p1; // start radius squared |
235 SkString p2; // difference in radii (r1 - r0) | 238 SkString p2; // difference in radii (r1 - r0) |
236 | 239 |
237 args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); | 240 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); |
238 args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); | 241 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); |
239 args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(2, &p2); | 242 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(2, &p2); |
240 | 243 |
241 // We interpolate the linear component in coords[1]. | 244 // We interpolate the linear component in coords[1]. |
242 SkASSERT(args.fCoords[0].getType() == args.fCoords[1].getType()); | 245 SkASSERT(args.fCoords[0].getType() == args.fCoords[1].getType()); |
243 const char* coords2D; | 246 const char* coords2D; |
244 SkString bVar; | 247 SkString bVar; |
245 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 248 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
246 if (kVec3f_GrSLType == args.fCoords[0].getType()) { | 249 if (kVec3f_GrSLType == args.fCoords[0].getType()) { |
247 fragBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x
/ %s.z);\n", | 250 fragBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x
/ %s.z);\n", |
248 args.fCoords[0].c_str(), args.fCoords[0].c_str(), | 251 args.fCoords[0].c_str(), args.fCoords[0].c_str(), |
249 args.fCoords[1].c_str(), args.fCoords[1].c_str())
; | 252 args.fCoords[1].c_str(), args.fCoords[1].c_str())
; |
(...skipping 13 matching lines...) Expand all Loading... |
263 cName.c_str(), coords2D, coords2D, p1.c_str()); | 266 cName.c_str(), coords2D, coords2D, p1.c_str()); |
264 | 267 |
265 // linear case: t = -c/b | 268 // linear case: t = -c/b |
266 fragBuilder->codeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(), | 269 fragBuilder->codeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(), |
267 cName.c_str(), bVar.c_str()); | 270 cName.c_str(), bVar.c_str()); |
268 | 271 |
269 // if r(t) > 0, then t will be the x coordinate | 272 // if r(t) > 0, then t will be the x coordinate |
270 fragBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(), | 273 fragBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(), |
271 p2.c_str(), p0.c_str()); | 274 p2.c_str(), p0.c_str()); |
272 fragBuilder->codeAppend("\t"); | 275 fragBuilder->codeAppend("\t"); |
273 this->emitColor(args.fBuilder, | 276 this->emitColor(fragBuilder, |
274 fragBuilder, | 277 uniformHandler, |
275 args.fGLSLCaps, | 278 args.fGLSLCaps, |
276 ge, | 279 ge, |
277 tName.c_str(), | 280 tName.c_str(), |
278 args.fOutputColor, | 281 args.fOutputColor, |
279 args.fInputColor, | 282 args.fInputColor, |
280 args.fSamplers); | 283 args.fSamplers); |
281 fragBuilder->codeAppend("\t}\n"); | 284 fragBuilder->codeAppend("\t}\n"); |
282 } | 285 } |
283 | 286 |
284 void GLEdge2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman, | 287 void GLEdge2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor
& processor) | 501 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor
& processor) |
499 : fVSVaryingName(nullptr) | 502 : fVSVaryingName(nullptr) |
500 , fFSVaryingName(nullptr) | 503 , fFSVaryingName(nullptr) |
501 , fCachedFocal(SK_ScalarMax) { | 504 , fCachedFocal(SK_ScalarMax) { |
502 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon
icalEffect>(); | 505 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon
icalEffect>(); |
503 fIsFlipped = data.isFlipped(); | 506 fIsFlipped = data.isFlipped(); |
504 } | 507 } |
505 | 508 |
506 void GLFocalOutside2PtConicalEffect::emitCode(EmitArgs& args) { | 509 void GLFocalOutside2PtConicalEffect::emitCode(EmitArgs& args) { |
507 const FocalOutside2PtConicalEffect& ge = args.fFp.cast<FocalOutside2PtConica
lEffect>(); | 510 const FocalOutside2PtConicalEffect& ge = args.fFp.cast<FocalOutside2PtConica
lEffect>(); |
508 this->emitUniforms(args.fBuilder, ge); | 511 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
509 fParamUni = args.fBuilder->addUniformArray(GrGLSLProgramBuilder::kFragment_V
isibility, | 512 this->emitUniforms(uniformHandler, ge); |
510 kFloat_GrSLType, kDefault_GrSLPrecision
, | 513 fParamUni = uniformHandler->addUniformArray(GrGLSLUniformHandler::kFragment_
Visibility, |
511 "Conical2FSParams", 2); | 514 kFloat_GrSLType, kDefault_GrSLPr
ecision, |
| 515 "Conical2FSParams", 2); |
512 SkString tName("t"); | 516 SkString tName("t"); |
513 SkString p0; // focalX | 517 SkString p0; // focalX |
514 SkString p1; // 1 - focalX * focalX | 518 SkString p1; // 1 - focalX * focalX |
515 | 519 |
516 args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); | 520 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); |
517 args.fBuilder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); | 521 uniformHandler->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); |
518 | 522 |
519 // if we have a vec3 from being in perspective, convert it to a vec2 first | 523 // if we have a vec3 from being in perspective, convert it to a vec2 first |
520 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 524 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
521 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); | 525 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); |
522 const char* coords2D = coords2DString.c_str(); | 526 const char* coords2D = coords2DString.c_str(); |
523 | 527 |
524 // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2) | 528 // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2) |
525 | 529 |
526 // output will default to transparent black (we simply won't write anything | 530 // output will default to transparent black (we simply won't write anything |
527 // else to it if invalid, instead of discarding or returning prematurely) | 531 // else to it if invalid, instead of discarding or returning prematurely) |
528 fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColo
r); | 532 fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColo
r); |
529 | 533 |
530 fragBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D); | 534 fragBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D); |
531 fragBuilder->codeAppendf("\tfloat ys = %s.y * %s.y;\n", coords2D, coords2D); | 535 fragBuilder->codeAppendf("\tfloat ys = %s.y * %s.y;\n", coords2D, coords2D); |
532 fragBuilder->codeAppendf("\tfloat d = xs + %s * ys;\n", p1.c_str()); | 536 fragBuilder->codeAppendf("\tfloat d = xs + %s * ys;\n", p1.c_str()); |
533 | 537 |
534 // Must check to see if we flipped the circle order (to make sure start radi
us < end radius) | 538 // Must check to see if we flipped the circle order (to make sure start radi
us < end radius) |
535 // If so we must also flip sign on sqrt | 539 // If so we must also flip sign on sqrt |
536 if (!fIsFlipped) { | 540 if (!fIsFlipped) { |
537 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + sqrt(d);\n", tName.c
_str(), | 541 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + sqrt(d);\n", tName.c
_str(), |
538 coords2D, p0.c_str()); | 542 coords2D, p0.c_str()); |
539 } else { | 543 } else { |
540 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s - sqrt(d);\n", tName.c
_str(), | 544 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s - sqrt(d);\n", tName.c
_str(), |
541 coords2D, p0.c_str()); | 545 coords2D, p0.c_str()); |
542 } | 546 } |
543 | 547 |
544 fragBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str()); | 548 fragBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str()); |
545 fragBuilder->codeAppend("\t\t"); | 549 fragBuilder->codeAppend("\t\t"); |
546 this->emitColor(args.fBuilder, | 550 this->emitColor(fragBuilder, |
547 fragBuilder, | 551 uniformHandler, |
548 args.fGLSLCaps, | 552 args.fGLSLCaps, |
549 ge, | 553 ge, |
550 tName.c_str(), | 554 tName.c_str(), |
551 args.fOutputColor, | 555 args.fOutputColor, |
552 args.fInputColor, | 556 args.fInputColor, |
553 args.fSamplers); | 557 args.fSamplers); |
554 fragBuilder->codeAppend("\t}\n"); | 558 fragBuilder->codeAppend("\t}\n"); |
555 } | 559 } |
556 | 560 |
557 void GLFocalOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p
dman, | 561 void GLFocalOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p
dman, |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 return fp; | 711 return fp; |
708 } | 712 } |
709 | 713 |
710 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&) | 714 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&) |
711 : fVSVaryingName(nullptr) | 715 : fVSVaryingName(nullptr) |
712 , fFSVaryingName(nullptr) | 716 , fFSVaryingName(nullptr) |
713 , fCachedFocal(SK_ScalarMax) {} | 717 , fCachedFocal(SK_ScalarMax) {} |
714 | 718 |
715 void GLFocalInside2PtConicalEffect::emitCode(EmitArgs& args) { | 719 void GLFocalInside2PtConicalEffect::emitCode(EmitArgs& args) { |
716 const FocalInside2PtConicalEffect& ge = args.fFp.cast<FocalInside2PtConicalE
ffect>(); | 720 const FocalInside2PtConicalEffect& ge = args.fFp.cast<FocalInside2PtConicalE
ffect>(); |
717 this->emitUniforms(args.fBuilder, ge); | 721 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
718 fFocalUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibi
lity, | 722 this->emitUniforms(uniformHandler, ge); |
719 kFloat_GrSLType, kDefault_GrSLPrecisio
n, | 723 fFocalUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visib
ility, |
720 "Conical2FSParams"); | 724 kFloat_GrSLType, kDefault_GrSLPrecisi
on, |
| 725 "Conical2FSParams"); |
721 SkString tName("t"); | 726 SkString tName("t"); |
722 | 727 |
723 // this is the distance along x-axis from the end center to focal point in | 728 // this is the distance along x-axis from the end center to focal point in |
724 // transformed coordinates | 729 // transformed coordinates |
725 GrGLSLShaderVar focal = args.fBuilder->getUniformVariable(fFocalUni); | 730 GrGLSLShaderVar focal = uniformHandler->getUniformVariable(fFocalUni); |
726 | 731 |
727 // if we have a vec3 from being in perspective, convert it to a vec2 first | 732 // if we have a vec3 from being in perspective, convert it to a vec2 first |
728 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 733 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
729 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); | 734 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); |
730 const char* coords2D = coords2DString.c_str(); | 735 const char* coords2D = coords2DString.c_str(); |
731 | 736 |
732 // t = p.x * focalX + length(p) | 737 // t = p.x * focalX + length(p) |
733 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_
str(), | 738 fragBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_
str(), |
734 coords2D, focal.c_str(), coords2D); | 739 coords2D, focal.c_str(), coords2D); |
735 | 740 |
736 this->emitColor(args.fBuilder, | 741 this->emitColor(fragBuilder, |
737 fragBuilder, | 742 uniformHandler, |
738 args.fGLSLCaps, | 743 args.fGLSLCaps, |
739 ge, | 744 ge, |
740 tName.c_str(), | 745 tName.c_str(), |
741 args.fOutputColor, | 746 args.fOutputColor, |
742 args.fInputColor, | 747 args.fInputColor, |
743 args.fSamplers); | 748 args.fSamplers); |
744 } | 749 } |
745 | 750 |
746 void GLFocalInside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pd
man, | 751 void GLFocalInside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pd
man, |
747 const GrProcessor& processor) { | 752 const GrProcessor& processor) { |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
958 : fVSVaryingName(nullptr) | 963 : fVSVaryingName(nullptr) |
959 , fFSVaryingName(nullptr) | 964 , fFSVaryingName(nullptr) |
960 , fCachedCenterX(SK_ScalarMax) | 965 , fCachedCenterX(SK_ScalarMax) |
961 , fCachedCenterY(SK_ScalarMax) | 966 , fCachedCenterY(SK_ScalarMax) |
962 , fCachedA(SK_ScalarMax) | 967 , fCachedA(SK_ScalarMax) |
963 , fCachedB(SK_ScalarMax) | 968 , fCachedB(SK_ScalarMax) |
964 , fCachedC(SK_ScalarMax) {} | 969 , fCachedC(SK_ScalarMax) {} |
965 | 970 |
966 void GLCircleInside2PtConicalEffect::emitCode(EmitArgs& args) { | 971 void GLCircleInside2PtConicalEffect::emitCode(EmitArgs& args) { |
967 const CircleInside2PtConicalEffect& ge = args.fFp.cast<CircleInside2PtConica
lEffect>(); | 972 const CircleInside2PtConicalEffect& ge = args.fFp.cast<CircleInside2PtConica
lEffect>(); |
968 this->emitUniforms(args.fBuilder, ge); | 973 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
969 fCenterUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visib
ility, | 974 this->emitUniforms(uniformHandler, ge); |
970 kVec2f_GrSLType, kDefault_GrSLPrecisi
on, | 975 fCenterUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visi
bility, |
971 "Conical2FSCenter"); | 976 kVec2f_GrSLType, kDefault_GrSLPrecis
ion, |
972 fParamUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibi
lity, | 977 "Conical2FSCenter"); |
973 kVec3f_GrSLType, kDefault_GrSLPrecisio
n, | 978 fParamUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visib
ility, |
974 "Conical2FSParams"); | 979 kVec3f_GrSLType, kDefault_GrSLPrecisi
on, |
| 980 "Conical2FSParams"); |
975 SkString tName("t"); | 981 SkString tName("t"); |
976 | 982 |
977 GrGLSLShaderVar center = args.fBuilder->getUniformVariable(fCenterUni); | 983 GrGLSLShaderVar center = uniformHandler->getUniformVariable(fCenterUni); |
978 // params.x = A | 984 // params.x = A |
979 // params.y = B | 985 // params.y = B |
980 // params.z = C | 986 // params.z = C |
981 GrGLSLShaderVar params = args.fBuilder->getUniformVariable(fParamUni); | 987 GrGLSLShaderVar params = uniformHandler->getUniformVariable(fParamUni); |
982 | 988 |
983 // if we have a vec3 from being in perspective, convert it to a vec2 first | 989 // if we have a vec3 from being in perspective, convert it to a vec2 first |
984 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 990 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
985 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); | 991 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); |
986 const char* coords2D = coords2DString.c_str(); | 992 const char* coords2D = coords2DString.c_str(); |
987 | 993 |
988 // p = coords2D | 994 // p = coords2D |
989 // e = center end | 995 // e = center end |
990 // r = radius end | 996 // r = radius end |
991 // A = dot(e, e) - r^2 + 2 * r - 1 | 997 // A = dot(e, e) - r^2 + 2 * r - 1 |
992 // B = (r -1) / A | 998 // B = (r -1) / A |
993 // C = 1 / A | 999 // C = 1 / A |
994 // d = dot(e, p) + B | 1000 // d = dot(e, p) + B |
995 // t = d +/- sqrt(d^2 - A * dot(p, p) + C) | 1001 // t = d +/- sqrt(d^2 - A * dot(p, p) + C) |
996 fragBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords
2D); | 1002 fragBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords
2D); |
997 fragBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cen
ter.c_str(), | 1003 fragBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cen
ter.c_str(), |
998 params.c_str()); | 1004 params.c_str()); |
999 fragBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z)
;\n", | 1005 fragBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z)
;\n", |
1000 tName.c_str(), params.c_str(), params.c_str()); | 1006 tName.c_str(), params.c_str(), params.c_str()); |
1001 | 1007 |
1002 this->emitColor(args.fBuilder, | 1008 this->emitColor(fragBuilder, |
1003 fragBuilder, | 1009 uniformHandler, |
1004 args.fGLSLCaps, | 1010 args.fGLSLCaps, |
1005 ge, | 1011 ge, |
1006 tName.c_str(), | 1012 tName.c_str(), |
1007 args.fOutputColor, | 1013 args.fOutputColor, |
1008 args.fInputColor, | 1014 args.fInputColor, |
1009 args.fSamplers); | 1015 args.fSamplers); |
1010 } | 1016 } |
1011 | 1017 |
1012 void GLCircleInside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p
dman, | 1018 void GLCircleInside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p
dman, |
1013 const GrProcessor& processor) { | 1019 const GrProcessor& processor) { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1194 , fCachedA(SK_ScalarMax) | 1200 , fCachedA(SK_ScalarMax) |
1195 , fCachedB(SK_ScalarMax) | 1201 , fCachedB(SK_ScalarMax) |
1196 , fCachedC(SK_ScalarMax) | 1202 , fCachedC(SK_ScalarMax) |
1197 , fCachedTLimit(SK_ScalarMax) { | 1203 , fCachedTLimit(SK_ScalarMax) { |
1198 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC
onicalEffect>(); | 1204 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC
onicalEffect>(); |
1199 fIsFlipped = data.isFlipped(); | 1205 fIsFlipped = data.isFlipped(); |
1200 } | 1206 } |
1201 | 1207 |
1202 void GLCircleOutside2PtConicalEffect::emitCode(EmitArgs& args) { | 1208 void GLCircleOutside2PtConicalEffect::emitCode(EmitArgs& args) { |
1203 const CircleOutside2PtConicalEffect& ge = args.fFp.cast<CircleOutside2PtConi
calEffect>(); | 1209 const CircleOutside2PtConicalEffect& ge = args.fFp.cast<CircleOutside2PtConi
calEffect>(); |
1204 this->emitUniforms(args.fBuilder, ge); | 1210 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
1205 fCenterUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visib
ility, | 1211 this->emitUniforms(uniformHandler, ge); |
1206 kVec2f_GrSLType, kDefault_GrSLPrecisi
on, | 1212 fCenterUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visi
bility, |
1207 "Conical2FSCenter"); | 1213 kVec2f_GrSLType, kDefault_GrSLPrecis
ion, |
1208 fParamUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibi
lity, | 1214 "Conical2FSCenter"); |
1209 kVec4f_GrSLType, kDefault_GrSLPrecisio
n, | 1215 fParamUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visib
ility, |
1210 "Conical2FSParams"); | 1216 kVec4f_GrSLType, kDefault_GrSLPrecisi
on, |
| 1217 "Conical2FSParams"); |
1211 SkString tName("t"); | 1218 SkString tName("t"); |
1212 | 1219 |
1213 GrGLSLShaderVar center = args.fBuilder->getUniformVariable(fCenterUni); | 1220 GrGLSLShaderVar center = uniformHandler->getUniformVariable(fCenterUni); |
1214 // params.x = A | 1221 // params.x = A |
1215 // params.y = B | 1222 // params.y = B |
1216 // params.z = C | 1223 // params.z = C |
1217 GrGLSLShaderVar params = args.fBuilder->getUniformVariable(fParamUni); | 1224 GrGLSLShaderVar params = uniformHandler->getUniformVariable(fParamUni); |
1218 | 1225 |
1219 // if we have a vec3 from being in perspective, convert it to a vec2 first | 1226 // if we have a vec3 from being in perspective, convert it to a vec2 first |
1220 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 1227 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
1221 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); | 1228 SkString coords2DString = fragBuilder->ensureFSCoords2D(args.fCoords, 0); |
1222 const char* coords2D = coords2DString.c_str(); | 1229 const char* coords2D = coords2DString.c_str(); |
1223 | 1230 |
1224 // output will default to transparent black (we simply won't write anything | 1231 // output will default to transparent black (we simply won't write anything |
1225 // else to it if invalid, instead of discarding or returning prematurely) | 1232 // else to it if invalid, instead of discarding or returning prematurely) |
1226 fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColo
r); | 1233 fragBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", args.fOutputColo
r); |
1227 | 1234 |
(...skipping 13 matching lines...) Expand all Loading... |
1241 params.c_str()); | 1248 params.c_str()); |
1242 | 1249 |
1243 // Must check to see if we flipped the circle order (to make sure start radi
us < end radius) | 1250 // Must check to see if we flipped the circle order (to make sure start radi
us < end radius) |
1244 // If so we must also flip sign on sqrt | 1251 // If so we must also flip sign on sqrt |
1245 if (!fIsFlipped) { | 1252 if (!fIsFlipped) { |
1246 fragBuilder->codeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str(
)); | 1253 fragBuilder->codeAppendf("\tfloat %s = d + sqrt(deter);\n", tName.c_str(
)); |
1247 } else { | 1254 } else { |
1248 fragBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str(
)); | 1255 fragBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str(
)); |
1249 } | 1256 } |
1250 | 1257 |
1251 fragBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_st
r(), params.c_str()); | 1258 fragBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", |
| 1259 tName.c_str(), params.c_str()); |
1252 fragBuilder->codeAppend("\t\t"); | 1260 fragBuilder->codeAppend("\t\t"); |
1253 this->emitColor(args.fBuilder, | 1261 this->emitColor(fragBuilder, |
1254 fragBuilder, | 1262 uniformHandler, |
1255 args.fGLSLCaps, | 1263 args.fGLSLCaps, |
1256 ge, | 1264 ge, |
1257 tName.c_str(), | 1265 tName.c_str(), |
1258 args.fOutputColor, | 1266 args.fOutputColor, |
1259 args.fInputColor, | 1267 args.fInputColor, |
1260 args.fSamplers); | 1268 args.fSamplers); |
1261 fragBuilder->codeAppend("\t}\n"); | 1269 fragBuilder->codeAppend("\t}\n"); |
1262 } | 1270 } |
1263 | 1271 |
1264 void GLCircleOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager&
pdman, | 1272 void GLCircleOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager&
pdman, |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1334 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf
o); | 1342 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf
o); |
1335 } else if (type == kEdge_ConicalType) { | 1343 } else if (type == kEdge_ConicalType) { |
1336 set_matrix_edge_conical(shader, &matrix); | 1344 set_matrix_edge_conical(shader, &matrix); |
1337 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); | 1345 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); |
1338 } else { | 1346 } else { |
1339 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); | 1347 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); |
1340 } | 1348 } |
1341 } | 1349 } |
1342 | 1350 |
1343 #endif | 1351 #endif |
OLD | NEW |