OLD | NEW |
1 | |
2 /* | 1 /* |
3 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
4 * | 3 * |
5 * 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 |
6 * found in the LICENSE file. | 5 * found in the LICENSE file. |
7 */ | 6 */ |
8 | 7 |
9 #include "SkTwoPointConicalGradient.h" | 8 #include "SkTwoPointConicalGradient.h" |
10 | 9 |
11 static int valid_divide(float numer, float denom, float* ratio) { | 10 static int valid_divide(float numer, float denom, float* ratio) { |
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 const GrDrawEffect&, | 490 const GrDrawEffect&, |
492 EffectKey key, | 491 EffectKey key, |
493 const char* outputColor, | 492 const char* outputColor, |
494 const char* inputColor, | 493 const char* inputColor, |
495 const TextureSamplerArray& samplers) { | 494 const TextureSamplerArray& samplers) { |
496 const char* fsCoords; | 495 const char* fsCoords; |
497 const char* vsCoordsVarying; | 496 const char* vsCoordsVarying; |
498 GrSLType coordsVaryingType; | 497 GrSLType coordsVaryingType; |
499 this->setupMatrix(builder, key, &fsCoords, &vsCoordsVarying, &coordsVaryingT
ype); | 498 this->setupMatrix(builder, key, &fsCoords, &vsCoordsVarying, &coordsVaryingT
ype); |
500 | 499 |
501 this->emitYCoordUniform(builder); | 500 this->emitUniforms(builder, key); |
502 // 2 copies of uniform array, 1 for each of vertex & fragment shader, | 501 // 2 copies of uniform array, 1 for each of vertex & fragment shader, |
503 // to work around Xoom bug. Doesn't seem to cause performance decrease | 502 // to work around Xoom bug. Doesn't seem to cause performance decrease |
504 // in test apps, but need to keep an eye on it. | 503 // in test apps, but need to keep an eye on it. |
505 fVSParamUni = builder->addUniformArray(GrGLShaderBuilder::kVertex_ShaderType
, | 504 fVSParamUni = builder->addUniformArray(GrGLShaderBuilder::kVertex_ShaderType
, |
506 kFloat_GrSLType, "Conical2VSParams",
6); | 505 kFloat_GrSLType, "Conical2VSParams",
6); |
507 fFSParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderTy
pe, | 506 fFSParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderTy
pe, |
508 kFloat_GrSLType, "Conical2FSParams",
6); | 507 kFloat_GrSLType, "Conical2FSParams",
6); |
509 | 508 |
510 // For radial gradients without perspective we can pass the linear | 509 // For radial gradients without perspective we can pass the linear |
511 // part of the quadratic as a varying. | 510 // part of the quadratic as a varying. |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
611 | 610 |
612 // so we'll look at the larger one first: | 611 // so we'll look at the larger one first: |
613 builder->fsCodeAppendf("\t\tfloat %s = max(%s, %s);\n", tName.c_str(
), | 612 builder->fsCodeAppendf("\t\tfloat %s = max(%s, %s);\n", tName.c_str(
), |
614 r0Name.c_str(), r1Name.c_str()); | 613 r0Name.c_str(), r1Name.c_str()); |
615 | 614 |
616 // if r(t) > 0, then we're done; t will be our x coordinate | 615 // if r(t) > 0, then we're done; t will be our x coordinate |
617 builder->fsCodeAppendf("\t\tif (%s * %s + %s > 0.0) {\n", tName.c_st
r(), | 616 builder->fsCodeAppendf("\t\tif (%s * %s + %s > 0.0) {\n", tName.c_st
r(), |
618 p5.c_str(), p3.c_str()); | 617 p5.c_str(), p3.c_str()); |
619 | 618 |
620 builder->fsCodeAppend("\t\t"); | 619 builder->fsCodeAppend("\t\t"); |
621 this->emitColorLookup(builder, tName.c_str(), outputColor, inputColo
r, samplers[0]); | 620 this->emitColor(builder, tName.c_str(), key, outputColor, inputColor
, samplers); |
622 | 621 |
623 // otherwise, if r(t) for the larger root was <= 0, try the other ro
ot | 622 // otherwise, if r(t) for the larger root was <= 0, try the other ro
ot |
624 builder->fsCodeAppend("\t\t} else {\n"); | 623 builder->fsCodeAppend("\t\t} else {\n"); |
625 builder->fsCodeAppendf("\t\t\t%s = min(%s, %s);\n", tName.c_str(), | 624 builder->fsCodeAppendf("\t\t\t%s = min(%s, %s);\n", tName.c_str(), |
626 r0Name.c_str(), r1Name.c_str()); | 625 r0Name.c_str(), r1Name.c_str()); |
627 | 626 |
628 // if r(t) > 0 for the smaller root, then t will be our x coordinate | 627 // if r(t) > 0 for the smaller root, then t will be our x coordinate |
629 builder->fsCodeAppendf("\t\t\tif (%s * %s + %s > 0.0) {\n", | 628 builder->fsCodeAppendf("\t\t\tif (%s * %s + %s > 0.0) {\n", |
630 tName.c_str(), p5.c_str(), p3.c_str()); | 629 tName.c_str(), p5.c_str(), p3.c_str()); |
631 | 630 |
632 builder->fsCodeAppend("\t\t\t"); | 631 builder->fsCodeAppend("\t\t\t"); |
633 this->emitColorLookup(builder, tName.c_str(), outputColor, inputColo
r, samplers[0]); | 632 this->emitColor(builder, tName.c_str(), key, outputColor, inputColor
, samplers); |
634 | 633 |
635 // end if (r(t) > 0) for smaller root | 634 // end if (r(t) > 0) for smaller root |
636 builder->fsCodeAppend("\t\t\t}\n"); | 635 builder->fsCodeAppend("\t\t\t}\n"); |
637 // end if (r(t) > 0), else, for larger root | 636 // end if (r(t) > 0), else, for larger root |
638 builder->fsCodeAppend("\t\t}\n"); | 637 builder->fsCodeAppend("\t\t}\n"); |
639 // end if (discriminant >= 0) | 638 // end if (discriminant >= 0) |
640 builder->fsCodeAppend("\t}\n"); | 639 builder->fsCodeAppend("\t}\n"); |
641 } else { | 640 } else { |
642 | 641 |
643 // linear case: t = -c/b | 642 // linear case: t = -c/b |
644 builder->fsCodeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(), | 643 builder->fsCodeAppendf("\tfloat %s = -(%s / %s);\n", tName.c_str(), |
645 cName.c_str(), bVar.c_str()); | 644 cName.c_str(), bVar.c_str()); |
646 | 645 |
647 // if r(t) > 0, then t will be the x coordinate | 646 // if r(t) > 0, then t will be the x coordinate |
648 builder->fsCodeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(
), | 647 builder->fsCodeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(
), |
649 p5.c_str(), p3.c_str()); | 648 p5.c_str(), p3.c_str()); |
650 builder->fsCodeAppend("\t"); | 649 builder->fsCodeAppend("\t"); |
651 this->emitColorLookup(builder, tName.c_str(), outputColor, inputColo
r, samplers[0]); | 650 this->emitColor(builder, tName.c_str(), key, outputColor, inputColor
, samplers); |
652 builder->fsCodeAppend("\t}\n"); | 651 builder->fsCodeAppend("\t}\n"); |
653 } | 652 } |
654 } | 653 } |
655 } | 654 } |
656 | 655 |
657 void GrGLConical2Gradient::setData(const GrGLUniformManager& uman, | 656 void GrGLConical2Gradient::setData(const GrGLUniformManager& uman, |
658 const GrDrawEffect& drawEffect) { | 657 const GrDrawEffect& drawEffect) { |
659 INHERITED::setData(uman, drawEffect); | 658 INHERITED::setData(uman, drawEffect); |
660 const GrConical2Gradient& data = drawEffect.castEffect<GrConical2Gradient>()
; | 659 const GrConical2Gradient& data = drawEffect.castEffect<GrConical2Gradient>()
; |
661 GrAssert(data.isDegenerate() == fIsDegenerate); | 660 GrAssert(data.isDegenerate() == fIsDegenerate); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
756 str->appendScalar(fCenter2.fY); | 755 str->appendScalar(fCenter2.fY); |
757 str->append(") radius2: "); | 756 str->append(") radius2: "); |
758 str->appendScalar(fRadius2); | 757 str->appendScalar(fRadius2); |
759 str->append(" "); | 758 str->append(" "); |
760 | 759 |
761 this->INHERITED::toString(str); | 760 this->INHERITED::toString(str); |
762 | 761 |
763 str->append(")"); | 762 str->append(")"); |
764 } | 763 } |
765 #endif | 764 #endif |
OLD | NEW |