OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkTwoPointConicalGradient.h" | 8 #include "SkTwoPointConicalGradient.h" |
9 | 9 |
10 static int valid_divide(float numer, float denom, float* ratio) { | 10 static int valid_divide(float numer, float denom, float* ratio) { |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 public: | 340 public: |
341 | 341 |
342 GrGLConical2Gradient(const GrBackendEffectFactory& factory, const GrDrawEffe
ct&); | 342 GrGLConical2Gradient(const GrBackendEffectFactory& factory, const GrDrawEffe
ct&); |
343 virtual ~GrGLConical2Gradient() { } | 343 virtual ~GrGLConical2Gradient() { } |
344 | 344 |
345 virtual void emitCode(GrGLShaderBuilder*, | 345 virtual void emitCode(GrGLShaderBuilder*, |
346 const GrDrawEffect&, | 346 const GrDrawEffect&, |
347 EffectKey, | 347 EffectKey, |
348 const char* outputColor, | 348 const char* outputColor, |
349 const char* inputColor, | 349 const char* inputColor, |
| 350 const TransformedCoordsArray&, |
350 const TextureSamplerArray&) SK_OVERRIDE; | 351 const TextureSamplerArray&) SK_OVERRIDE; |
351 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; | 352 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; |
352 | 353 |
353 static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps); | 354 static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps); |
354 | 355 |
355 protected: | 356 protected: |
356 | 357 |
357 UniformHandle fVSParamUni; | 358 UniformHandle fVSParamUni; |
358 UniformHandle fFSParamUni; | 359 UniformHandle fFSParamUni; |
359 | 360 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 | 482 |
482 const GrConical2Gradient& data = drawEffect.castEffect<GrConical2Gradient>()
; | 483 const GrConical2Gradient& data = drawEffect.castEffect<GrConical2Gradient>()
; |
483 fIsDegenerate = data.isDegenerate(); | 484 fIsDegenerate = data.isDegenerate(); |
484 } | 485 } |
485 | 486 |
486 void GrGLConical2Gradient::emitCode(GrGLShaderBuilder* builder, | 487 void GrGLConical2Gradient::emitCode(GrGLShaderBuilder* builder, |
487 const GrDrawEffect&, | 488 const GrDrawEffect&, |
488 EffectKey key, | 489 EffectKey key, |
489 const char* outputColor, | 490 const char* outputColor, |
490 const char* inputColor, | 491 const char* inputColor, |
| 492 const TransformedCoordsArray& coords, |
491 const TextureSamplerArray& samplers) { | 493 const TextureSamplerArray& samplers) { |
492 SkString fsCoords; | |
493 SkString vsCoordsVarying; | |
494 GrSLType coordsVaryingType; | |
495 this->setupMatrix(builder, key, &fsCoords, &vsCoordsVarying, &coordsVaryingT
ype); | |
496 | |
497 this->emitUniforms(builder, key); | 494 this->emitUniforms(builder, key); |
498 // 2 copies of uniform array, 1 for each of vertex & fragment shader, | 495 // 2 copies of uniform array, 1 for each of vertex & fragment shader, |
499 // to work around Xoom bug. Doesn't seem to cause performance decrease | 496 // to work around Xoom bug. Doesn't seem to cause performance decrease |
500 // in test apps, but need to keep an eye on it. | 497 // in test apps, but need to keep an eye on it. |
501 fVSParamUni = builder->addUniformArray(GrGLShaderBuilder::kVertex_Visibility
, | 498 fVSParamUni = builder->addUniformArray(GrGLShaderBuilder::kVertex_Visibility
, |
502 kFloat_GrSLType, "Conical2VSParams",
6); | 499 kFloat_GrSLType, "Conical2VSParams",
6); |
503 fFSParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_Visibili
ty, | 500 fFSParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_Visibili
ty, |
504 kFloat_GrSLType, "Conical2FSParams",
6); | 501 kFloat_GrSLType, "Conical2FSParams",
6); |
505 | 502 |
506 // For radial gradients without perspective we can pass the linear | 503 // For radial gradients without perspective we can pass the linear |
507 // part of the quadratic as a varying. | 504 // part of the quadratic as a varying. |
508 GrGLShaderBuilder::VertexBuilder* vertexBuilder = | 505 GrGLShaderBuilder::VertexBuilder* vertexBuilder = |
509 (kVec2f_GrSLType == coordsVaryingType) ? builder->getVertexBuilder() : N
ULL; | 506 (kVec2f_GrSLType == coords[0].type()) ? builder->getVertexBuilder() : NU
LL; |
510 if (NULL != vertexBuilder) { | 507 if (NULL != vertexBuilder) { |
511 vertexBuilder->addVarying(kFloat_GrSLType, "Conical2BCoeff", | 508 vertexBuilder->addVarying(kFloat_GrSLType, "Conical2BCoeff", |
512 &fVSVaryingName, &fFSVaryingName); | 509 &fVSVaryingName, &fFSVaryingName); |
513 } | 510 } |
514 | 511 |
515 // VS | 512 // VS |
516 { | 513 { |
517 SkString p2; // distance between centers | 514 SkString p2; // distance between centers |
518 SkString p3; // start radius | 515 SkString p3; // start radius |
519 SkString p5; // difference in radii (r1 - r0) | 516 SkString p5; // difference in radii (r1 - r0) |
520 builder->getUniformVariable(fVSParamUni).appendArrayAccess(2, &p2); | 517 builder->getUniformVariable(fVSParamUni).appendArrayAccess(2, &p2); |
521 builder->getUniformVariable(fVSParamUni).appendArrayAccess(3, &p3); | 518 builder->getUniformVariable(fVSParamUni).appendArrayAccess(3, &p3); |
522 builder->getUniformVariable(fVSParamUni).appendArrayAccess(5, &p5); | 519 builder->getUniformVariable(fVSParamUni).appendArrayAccess(5, &p5); |
523 | 520 |
524 // For radial gradients without perspective we can pass the linear | 521 // For radial gradients without perspective we can pass the linear |
525 // part of the quadratic as a varying. | 522 // part of the quadratic as a varying. |
526 if (NULL != vertexBuilder) { | 523 if (NULL != vertexBuilder) { |
527 // r2Var = -2 * (r2Parm[2] * varCoord.x - r2Param[3] * r2Param[5]) | 524 // r2Var = -2 * (r2Parm[2] * varCoord.x - r2Param[3] * r2Param[5]) |
528 vertexBuilder->vsCodeAppendf("\t%s = -2.0 * (%s * %s.x + %s * %s);\n
", | 525 vertexBuilder->vsCodeAppendf("\t%s = -2.0 * (%s * %s.x + %s * %s);\n
", |
529 fVSVaryingName, p2.c_str(), | 526 fVSVaryingName, p2.c_str(), |
530 vsCoordsVarying.c_str(), p3.c_str(),
p5.c_str()); | 527 coords[0].getVSName().c_str(), p3.c_
str(), p5.c_str()); |
531 } | 528 } |
532 } | 529 } |
533 | 530 |
534 // FS | 531 // FS |
535 { | 532 { |
536 | 533 SkString coords2D = builder->ensureFSCoords2D(coords, 0); |
537 SkString cName("c"); | 534 SkString cName("c"); |
538 SkString ac4Name("ac4"); | 535 SkString ac4Name("ac4"); |
539 SkString dName("d"); | 536 SkString dName("d"); |
540 SkString qName("q"); | 537 SkString qName("q"); |
541 SkString r0Name("r0"); | 538 SkString r0Name("r0"); |
542 SkString r1Name("r1"); | 539 SkString r1Name("r1"); |
543 SkString tName("t"); | 540 SkString tName("t"); |
544 SkString p0; // 4a | 541 SkString p0; // 4a |
545 SkString p1; // 1/a | 542 SkString p1; // 1/a |
546 SkString p2; // distance between centers | 543 SkString p2; // distance between centers |
547 SkString p3; // start radius | 544 SkString p3; // start radius |
548 SkString p4; // start radius squared | 545 SkString p4; // start radius squared |
549 SkString p5; // difference in radii (r1 - r0) | 546 SkString p5; // difference in radii (r1 - r0) |
550 | 547 |
551 builder->getUniformVariable(fFSParamUni).appendArrayAccess(0, &p0); | 548 builder->getUniformVariable(fFSParamUni).appendArrayAccess(0, &p0); |
552 builder->getUniformVariable(fFSParamUni).appendArrayAccess(1, &p1); | 549 builder->getUniformVariable(fFSParamUni).appendArrayAccess(1, &p1); |
553 builder->getUniformVariable(fFSParamUni).appendArrayAccess(2, &p2); | 550 builder->getUniformVariable(fFSParamUni).appendArrayAccess(2, &p2); |
554 builder->getUniformVariable(fFSParamUni).appendArrayAccess(3, &p3); | 551 builder->getUniformVariable(fFSParamUni).appendArrayAccess(3, &p3); |
555 builder->getUniformVariable(fFSParamUni).appendArrayAccess(4, &p4); | 552 builder->getUniformVariable(fFSParamUni).appendArrayAccess(4, &p4); |
556 builder->getUniformVariable(fFSParamUni).appendArrayAccess(5, &p5); | 553 builder->getUniformVariable(fFSParamUni).appendArrayAccess(5, &p5); |
557 | 554 |
558 // If we we're able to interpolate the linear component, | 555 // If we we're able to interpolate the linear component, |
559 // bVar is the varying; otherwise compute it | 556 // bVar is the varying; otherwise compute it |
560 SkString bVar; | 557 SkString bVar; |
561 if (NULL != vertexBuilder) { | 558 if (NULL != vertexBuilder) { |
562 bVar = fFSVaryingName; | 559 bVar = fFSVaryingName; |
563 } else { | 560 } else { |
564 bVar = "b"; | 561 bVar = "b"; |
565 builder->fsCodeAppendf("\tfloat %s = -2.0 * (%s * %s.x + %s * %s);\n
", | 562 builder->fsCodeAppendf("\tfloat %s = -2.0 * (%s * %s.x + %s * %s);\n
", |
566 bVar.c_str(), p2.c_str(), fsCoords.c_str(), | 563 bVar.c_str(), p2.c_str(), coords2D.c_str(), |
567 p3.c_str(), p5.c_str()); | 564 p3.c_str(), p5.c_str()); |
568 } | 565 } |
569 | 566 |
570 // output will default to transparent black (we simply won't write anyth
ing | 567 // output will default to transparent black (we simply won't write anyth
ing |
571 // else to it if invalid, instead of discarding or returning prematurely
) | 568 // else to it if invalid, instead of discarding or returning prematurely
) |
572 builder->fsCodeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); | 569 builder->fsCodeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); |
573 | 570 |
574 // c = (x^2)+(y^2) - params[4] | 571 // c = (x^2)+(y^2) - params[4] |
575 builder->fsCodeAppendf("\tfloat %s = dot(%s, %s) - %s;\n", cName.c_str()
, | 572 builder->fsCodeAppendf("\tfloat %s = dot(%s, %s) - %s;\n", cName.c_str()
, |
576 fsCoords.c_str(), fsCoords.c_str(), | 573 coords2D.c_str(), coords2D.c_str(), |
577 p4.c_str()); | 574 p4.c_str()); |
578 | 575 |
579 // Non-degenerate case (quadratic) | 576 // Non-degenerate case (quadratic) |
580 if (!fIsDegenerate) { | 577 if (!fIsDegenerate) { |
581 | 578 |
582 // ac4 = params[0] * c | 579 // ac4 = params[0] * c |
583 builder->fsCodeAppendf("\tfloat %s = %s * %s;\n", ac4Name.c_str(), p
0.c_str(), | 580 builder->fsCodeAppendf("\tfloat %s = %s * %s;\n", ac4Name.c_str(), p
0.c_str(), |
584 cName.c_str()); | 581 cName.c_str()); |
585 | 582 |
586 // d = b^2 - ac4 | 583 // d = b^2 - ac4 |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 str->appendScalar(fCenter2.fY); | 751 str->appendScalar(fCenter2.fY); |
755 str->append(") radius2: "); | 752 str->append(") radius2: "); |
756 str->appendScalar(fRadius2); | 753 str->appendScalar(fRadius2); |
757 str->append(" "); | 754 str->append(" "); |
758 | 755 |
759 this->INHERITED::toString(str); | 756 this->INHERITED::toString(str); |
760 | 757 |
761 str->append(")"); | 758 str->append(")"); |
762 } | 759 } |
763 #endif | 760 #endif |
OLD | NEW |