| 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 | 
|---|