Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(186)

Side by Side Diff: src/effects/gradients/SkTwoPointConicalGradient.cpp

Issue 23706003: Fix case where GrGLEffectMatrix gives back a dangling ptr for the coords var name. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Rob's comments Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2012 Google Inc. 3 * Copyright 2012 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.h" 9 #include "SkTwoPointConicalGradient.h"
10 10
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 const GrConical2Gradient& data = drawEffect.castEffect<GrConical2Gradient>() ; 483 const GrConical2Gradient& data = drawEffect.castEffect<GrConical2Gradient>() ;
484 fIsDegenerate = data.isDegenerate(); 484 fIsDegenerate = data.isDegenerate();
485 } 485 }
486 486
487 void GrGLConical2Gradient::emitCode(GrGLShaderBuilder* builder, 487 void GrGLConical2Gradient::emitCode(GrGLShaderBuilder* builder,
488 const GrDrawEffect&, 488 const GrDrawEffect&,
489 EffectKey key, 489 EffectKey key,
490 const char* outputColor, 490 const char* outputColor,
491 const char* inputColor, 491 const char* inputColor,
492 const TextureSamplerArray& samplers) { 492 const TextureSamplerArray& samplers) {
493 const char* fsCoords; 493 SkString fsCoords;
494 const char* vsCoordsVarying; 494 SkString vsCoordsVarying;
495 GrSLType coordsVaryingType; 495 GrSLType coordsVaryingType;
496 this->setupMatrix(builder, key, &fsCoords, &vsCoordsVarying, &coordsVaryingT ype); 496 this->setupMatrix(builder, key, &fsCoords, &vsCoordsVarying, &coordsVaryingT ype);
497 497
498 this->emitYCoordUniform(builder); 498 this->emitYCoordUniform(builder);
499 // 2 copies of uniform array, 1 for each of vertex & fragment shader, 499 // 2 copies of uniform array, 1 for each of vertex & fragment shader,
500 // to work around Xoom bug. Doesn't seem to cause performance decrease 500 // to work around Xoom bug. Doesn't seem to cause performance decrease
501 // in test apps, but need to keep an eye on it. 501 // in test apps, but need to keep an eye on it.
502 fVSParamUni = builder->addUniformArray(GrGLShaderBuilder::kVertex_ShaderType , 502 fVSParamUni = builder->addUniformArray(GrGLShaderBuilder::kVertex_ShaderType ,
503 kFloat_GrSLType, "Conical2VSParams", 6); 503 kFloat_GrSLType, "Conical2VSParams", 6);
504 fFSParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderTy pe, 504 fFSParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderTy pe,
(...skipping 14 matching lines...) Expand all
519 builder->getUniformVariable(fVSParamUni).appendArrayAccess(2, &p2); 519 builder->getUniformVariable(fVSParamUni).appendArrayAccess(2, &p2);
520 builder->getUniformVariable(fVSParamUni).appendArrayAccess(3, &p3); 520 builder->getUniformVariable(fVSParamUni).appendArrayAccess(3, &p3);
521 builder->getUniformVariable(fVSParamUni).appendArrayAccess(5, &p5); 521 builder->getUniformVariable(fVSParamUni).appendArrayAccess(5, &p5);
522 522
523 // For radial gradients without perspective we can pass the linear 523 // For radial gradients without perspective we can pass the linear
524 // part of the quadratic as a varying. 524 // part of the quadratic as a varying.
525 if (kVec2f_GrSLType == coordsVaryingType) { 525 if (kVec2f_GrSLType == coordsVaryingType) {
526 // r2Var = -2 * (r2Parm[2] * varCoord.x - r2Param[3] * r2Param[5]) 526 // r2Var = -2 * (r2Parm[2] * varCoord.x - r2Param[3] * r2Param[5])
527 builder->vsCodeAppendf("\t%s = -2.0 * (%s * %s.x + %s * %s);\n", 527 builder->vsCodeAppendf("\t%s = -2.0 * (%s * %s.x + %s * %s);\n",
528 fVSVaryingName, p2.c_str(), 528 fVSVaryingName, p2.c_str(),
529 vsCoordsVarying, p3.c_str(), p5.c_str()); 529 vsCoordsVarying.c_str(), p3.c_str(), p5.c_str ());
530 } 530 }
531 } 531 }
532 532
533 // FS 533 // FS
534 { 534 {
535 535
536 SkString cName("c"); 536 SkString cName("c");
537 SkString ac4Name("ac4"); 537 SkString ac4Name("ac4");
538 SkString dName("d"); 538 SkString dName("d");
539 SkString qName("q"); 539 SkString qName("q");
(...skipping 15 matching lines...) Expand all
555 builder->getUniformVariable(fFSParamUni).appendArrayAccess(5, &p5); 555 builder->getUniformVariable(fFSParamUni).appendArrayAccess(5, &p5);
556 556
557 // If we we're able to interpolate the linear component, 557 // If we we're able to interpolate the linear component,
558 // bVar is the varying; otherwise compute it 558 // bVar is the varying; otherwise compute it
559 SkString bVar; 559 SkString bVar;
560 if (kVec2f_GrSLType == coordsVaryingType) { 560 if (kVec2f_GrSLType == coordsVaryingType) {
561 bVar = fFSVaryingName; 561 bVar = fFSVaryingName;
562 } else { 562 } else {
563 bVar = "b"; 563 bVar = "b";
564 builder->fsCodeAppendf("\tfloat %s = -2.0 * (%s * %s.x + %s * %s);\n ", 564 builder->fsCodeAppendf("\tfloat %s = -2.0 * (%s * %s.x + %s * %s);\n ",
565 bVar.c_str(), p2.c_str(), fsCoords, 565 bVar.c_str(), p2.c_str(), fsCoords.c_str(),
566 p3.c_str(), p5.c_str()); 566 p3.c_str(), p5.c_str());
567 } 567 }
568 568
569 // output will default to transparent black (we simply won't write anyth ing 569 // output will default to transparent black (we simply won't write anyth ing
570 // else to it if invalid, instead of discarding or returning prematurely ) 570 // else to it if invalid, instead of discarding or returning prematurely )
571 builder->fsCodeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor); 571 builder->fsCodeAppendf("\t%s = vec4(0.0,0.0,0.0,0.0);\n", outputColor);
572 572
573 // c = (x^2)+(y^2) - params[4] 573 // c = (x^2)+(y^2) - params[4]
574 builder->fsCodeAppendf("\tfloat %s = dot(%s, %s) - %s;\n", cName.c_str() , 574 builder->fsCodeAppendf("\tfloat %s = dot(%s, %s) - %s;\n", cName.c_str() ,
575 fsCoords, fsCoords, 575 fsCoords.c_str(), fsCoords.c_str(),
576 p4.c_str()); 576 p4.c_str());
577 577
578 // Non-degenerate case (quadratic) 578 // Non-degenerate case (quadratic)
579 if (!fIsDegenerate) { 579 if (!fIsDegenerate) {
580 580
581 // ac4 = params[0] * c 581 // ac4 = params[0] * c
582 builder->fsCodeAppendf("\tfloat %s = %s * %s;\n", ac4Name.c_str(), p 0.c_str(), 582 builder->fsCodeAppendf("\tfloat %s = %s * %s;\n", ac4Name.c_str(), p 0.c_str(),
583 cName.c_str()); 583 cName.c_str());
584 584
585 // d = b^2 - ac4 585 // d = b^2 - ac4
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 str->appendScalar(fCenter2.fY); 753 str->appendScalar(fCenter2.fY);
754 str->append(") radius2: "); 754 str->append(") radius2: ");
755 str->appendScalar(fRadius2); 755 str->appendScalar(fRadius2);
756 str->append(" "); 756 str->append(" ");
757 757
758 this->INHERITED::toString(str); 758 this->INHERITED::toString(str);
759 759
760 str->append(")"); 760 str->append(")");
761 } 761 }
762 #endif 762 #endif
OLDNEW
« no previous file with comments | « src/effects/gradients/SkSweepGradient.cpp ('k') | src/effects/gradients/SkTwoPointRadialGradient.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698