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 |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 SkString p2; // difference in radii (r1 - r0) | 247 SkString p2; // difference in radii (r1 - r0) |
248 | 248 |
249 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); | 249 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); |
250 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); | 250 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); |
251 builder->getUniformVariable(fParamUni).appendArrayAccess(2, &p2); | 251 builder->getUniformVariable(fParamUni).appendArrayAccess(2, &p2); |
252 | 252 |
253 // We interpolate the linear component in coords[1]. | 253 // We interpolate the linear component in coords[1]. |
254 SkASSERT(coords[0].getType() == coords[1].getType()); | 254 SkASSERT(coords[0].getType() == coords[1].getType()); |
255 const char* coords2D; | 255 const char* coords2D; |
256 SkString bVar; | 256 SkString bVar; |
257 GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 257 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
258 if (kVec3f_GrSLType == coords[0].getType()) { | 258 if (kVec3f_GrSLType == coords[0].getType()) { |
259 fsBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x /
%s.z);\n", | 259 fsBuilder->codeAppendf("\tvec3 interpolants = vec3(%s.xy / %s.z, %s.x /
%s.z);\n", |
260 coords[0].c_str(), coords[0].c_str(), coords[1].c
_str(), | 260 coords[0].c_str(), coords[0].c_str(), coords[1].c
_str(), |
261 coords[1].c_str()); | 261 coords[1].c_str()); |
262 coords2D = "interpolants.xy"; | 262 coords2D = "interpolants.xy"; |
263 bVar = "interpolants.z"; | 263 bVar = "interpolants.z"; |
264 } else { | 264 } else { |
265 coords2D = coords[0].c_str(); | 265 coords2D = coords[0].c_str(); |
266 bVar.printf("%s.x", coords[1].c_str()); | 266 bVar.printf("%s.x", coords[1].c_str()); |
267 } | 267 } |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 kFloat_GrSLType, kDefault_GrSLPrecision
, | 529 kFloat_GrSLType, kDefault_GrSLPrecision
, |
530 "Conical2FSParams", 2); | 530 "Conical2FSParams", 2); |
531 SkString tName("t"); | 531 SkString tName("t"); |
532 SkString p0; // focalX | 532 SkString p0; // focalX |
533 SkString p1; // 1 - focalX * focalX | 533 SkString p1; // 1 - focalX * focalX |
534 | 534 |
535 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); | 535 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); |
536 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); | 536 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); |
537 | 537 |
538 // if we have a vec3 from being in perspective, convert it to a vec2 first | 538 // if we have a vec3 from being in perspective, convert it to a vec2 first |
539 GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 539 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
540 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0); | 540 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0); |
541 const char* coords2D = coords2DString.c_str(); | 541 const char* coords2D = coords2DString.c_str(); |
542 | 542 |
543 // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2) | 543 // t = p.x * focal.x +/- sqrt(p.x^2 + (1 - focal.x^2) * p.y^2) |
544 | 544 |
545 // output will default to transparent black (we simply won't write anything | 545 // output will default to transparent black (we simply won't write anything |
546 // else to it if invalid, instead of discarding or returning prematurely) | 546 // else to it if invalid, instead of discarding or returning prematurely) |
547 fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); | 547 fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); |
548 | 548 |
549 fsBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D); | 549 fsBuilder->codeAppendf("\tfloat xs = %s.x * %s.x;\n", coords2D, coords2D); |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 745 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
746 kFloat_GrSLType, kDefault_GrSLPrecision, | 746 kFloat_GrSLType, kDefault_GrSLPrecision, |
747 "Conical2FSParams"); | 747 "Conical2FSParams"); |
748 SkString tName("t"); | 748 SkString tName("t"); |
749 | 749 |
750 // this is the distance along x-axis from the end center to focal point in | 750 // this is the distance along x-axis from the end center to focal point in |
751 // transformed coordinates | 751 // transformed coordinates |
752 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni); | 752 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni); |
753 | 753 |
754 // if we have a vec3 from being in perspective, convert it to a vec2 first | 754 // if we have a vec3 from being in perspective, convert it to a vec2 first |
755 GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 755 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
756 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0); | 756 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0); |
757 const char* coords2D = coords2DString.c_str(); | 757 const char* coords2D = coords2DString.c_str(); |
758 | 758 |
759 // t = p.x * focalX + length(p) | 759 // t = p.x * focalX + length(p) |
760 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_st
r(), | 760 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_st
r(), |
761 coords2D, focal.c_str(), coords2D); | 761 coords2D, focal.c_str(), coords2D); |
762 | 762 |
763 this->emitColor(builder, ge, tName.c_str(), outputColor, inputColor, sampler
s); | 763 this->emitColor(builder, ge, tName.c_str(), outputColor, inputColor, sampler
s); |
764 } | 764 } |
765 | 765 |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1009 "Conical2FSParams"); | 1009 "Conical2FSParams"); |
1010 SkString tName("t"); | 1010 SkString tName("t"); |
1011 | 1011 |
1012 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); | 1012 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); |
1013 // params.x = A | 1013 // params.x = A |
1014 // params.y = B | 1014 // params.y = B |
1015 // params.z = C | 1015 // params.z = C |
1016 GrGLShaderVar params = builder->getUniformVariable(fParamUni); | 1016 GrGLShaderVar params = builder->getUniformVariable(fParamUni); |
1017 | 1017 |
1018 // if we have a vec3 from being in perspective, convert it to a vec2 first | 1018 // if we have a vec3 from being in perspective, convert it to a vec2 first |
1019 GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 1019 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
1020 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0); | 1020 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0); |
1021 const char* coords2D = coords2DString.c_str(); | 1021 const char* coords2D = coords2DString.c_str(); |
1022 | 1022 |
1023 // p = coords2D | 1023 // p = coords2D |
1024 // e = center end | 1024 // e = center end |
1025 // r = radius end | 1025 // r = radius end |
1026 // A = dot(e, e) - r^2 + 2 * r - 1 | 1026 // A = dot(e, e) - r^2 + 2 * r - 1 |
1027 // B = (r -1) / A | 1027 // B = (r -1) / A |
1028 // C = 1 / A | 1028 // C = 1 / A |
1029 // d = dot(e, p) + B | 1029 // d = dot(e, p) + B |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1255 "Conical2FSParams"); | 1255 "Conical2FSParams"); |
1256 SkString tName("t"); | 1256 SkString tName("t"); |
1257 | 1257 |
1258 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); | 1258 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); |
1259 // params.x = A | 1259 // params.x = A |
1260 // params.y = B | 1260 // params.y = B |
1261 // params.z = C | 1261 // params.z = C |
1262 GrGLShaderVar params = builder->getUniformVariable(fParamUni); | 1262 GrGLShaderVar params = builder->getUniformVariable(fParamUni); |
1263 | 1263 |
1264 // if we have a vec3 from being in perspective, convert it to a vec2 first | 1264 // if we have a vec3 from being in perspective, convert it to a vec2 first |
1265 GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 1265 GrGLFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
1266 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0); | 1266 SkString coords2DString = fsBuilder->ensureFSCoords2D(coords, 0); |
1267 const char* coords2D = coords2DString.c_str(); | 1267 const char* coords2D = coords2DString.c_str(); |
1268 | 1268 |
1269 // output will default to transparent black (we simply won't write anything | 1269 // output will default to transparent black (we simply won't write anything |
1270 // else to it if invalid, instead of discarding or returning prematurely) | 1270 // else to it if invalid, instead of discarding or returning prematurely) |
1271 fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); | 1271 fsBuilder->codeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); |
1272 | 1272 |
1273 // p = coords2D | 1273 // p = coords2D |
1274 // e = center end | 1274 // e = center end |
1275 // r = radius end | 1275 // r = radius end |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1372 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf
o); | 1372 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf
o); |
1373 } else if (type == kEdge_ConicalType) { | 1373 } else if (type == kEdge_ConicalType) { |
1374 set_matrix_edge_conical(shader, &matrix); | 1374 set_matrix_edge_conical(shader, &matrix); |
1375 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); | 1375 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); |
1376 } else { | 1376 } else { |
1377 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); | 1377 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); |
1378 } | 1378 } |
1379 } | 1379 } |
1380 | 1380 |
1381 #endif | 1381 #endif |
OLD | NEW |