OLD | NEW |
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 "SkTwoPointRadialGradient.h" | 9 #include "SkTwoPointRadialGradient.h" |
10 | 10 |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 fOneOverTwoA = fA ? SkScalarInvert(fA * 2) : 0; | 379 fOneOverTwoA = fA ? SkScalarInvert(fA * 2) : 0; |
380 | 380 |
381 fPtsToUnit.setTranslate(-fCenter1.fX, -fCenter1.fY); | 381 fPtsToUnit.setTranslate(-fCenter1.fX, -fCenter1.fY); |
382 fPtsToUnit.postScale(inv, inv); | 382 fPtsToUnit.postScale(inv, inv); |
383 } | 383 } |
384 | 384 |
385 ///////////////////////////////////////////////////////////////////// | 385 ///////////////////////////////////////////////////////////////////// |
386 | 386 |
387 #if SK_SUPPORT_GPU | 387 #if SK_SUPPORT_GPU |
388 | 388 |
389 #include "GrTBackendProcessorFactory.h" | 389 #include "SkGr.h" |
390 #include "gl/builders/GrGLProgramBuilder.h" | 390 #include "gl/builders/GrGLProgramBuilder.h" |
391 #include "SkGr.h" | |
392 | 391 |
393 // For brevity | 392 // For brevity |
394 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 393 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
395 | 394 |
396 class GrGLRadial2Gradient : public GrGLGradientEffect { | 395 class GrGLRadial2Gradient : public GrGLGradientEffect { |
397 | 396 |
398 public: | 397 public: |
399 | 398 |
400 GrGLRadial2Gradient(const GrBackendProcessorFactory& factory, const GrProces
sor&); | 399 GrGLRadial2Gradient(const GrProcessor&); |
401 virtual ~GrGLRadial2Gradient() { } | 400 virtual ~GrGLRadial2Gradient() { } |
402 | 401 |
403 virtual void emitCode(GrGLFPBuilder*, | 402 virtual void emitCode(GrGLFPBuilder*, |
404 const GrFragmentProcessor&, | 403 const GrFragmentProcessor&, |
405 const char* outputColor, | 404 const char* outputColor, |
406 const char* inputColor, | 405 const char* inputColor, |
407 const TransformedCoordsArray&, | 406 const TransformedCoordsArray&, |
408 const TextureSamplerArray&) SK_OVERRIDE; | 407 const TextureSamplerArray&) SK_OVERRIDE; |
409 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 408 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
410 | 409 |
(...skipping 29 matching lines...) Expand all Loading... |
440 public: | 439 public: |
441 static GrFragmentProcessor* Create(GrContext* ctx, | 440 static GrFragmentProcessor* Create(GrContext* ctx, |
442 const SkTwoPointRadialGradient& shader, | 441 const SkTwoPointRadialGradient& shader, |
443 const SkMatrix& matrix, | 442 const SkMatrix& matrix, |
444 SkShader::TileMode tm) { | 443 SkShader::TileMode tm) { |
445 return SkNEW_ARGS(GrRadial2Gradient, (ctx, shader, matrix, tm)); | 444 return SkNEW_ARGS(GrRadial2Gradient, (ctx, shader, matrix, tm)); |
446 } | 445 } |
447 | 446 |
448 virtual ~GrRadial2Gradient() { } | 447 virtual ~GrRadial2Gradient() { } |
449 | 448 |
450 static const char* Name() { return "Two-Point Radial Gradient"; } | 449 virtual const char* name() const SK_OVERRIDE { return "Two-Point Radial Grad
ient"; } |
451 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE { | 450 |
452 return GrTBackendFragmentProcessorFactory<GrRadial2Gradient>::getInstanc
e(); | 451 virtual void getGLProcessorKey(const GrGLCaps& caps, |
| 452 GrProcessorKeyBuilder* b) const SK_OVERRIDE { |
| 453 GrGLRadial2Gradient::GenKey(*this, caps, b); |
| 454 } |
| 455 |
| 456 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE { |
| 457 return SkNEW_ARGS(GrGLRadial2Gradient, (*this)); |
453 } | 458 } |
454 | 459 |
455 // The radial gradient parameters can collapse to a linear (instead of quadr
atic) equation. | 460 // The radial gradient parameters can collapse to a linear (instead of quadr
atic) equation. |
456 bool isDegenerate() const { return SK_Scalar1 == fCenterX1; } | 461 bool isDegenerate() const { return SK_Scalar1 == fCenterX1; } |
457 SkScalar center() const { return fCenterX1; } | 462 SkScalar center() const { return fCenterX1; } |
458 SkScalar radius() const { return fRadius0; } | 463 SkScalar radius() const { return fRadius0; } |
459 bool isPosRoot() const { return SkToBool(fPosRoot); } | 464 bool isPosRoot() const { return SkToBool(fPosRoot); } |
460 | 465 |
461 typedef GrGLRadial2Gradient GLProcessor; | |
462 | |
463 private: | 466 private: |
464 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 467 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
465 const GrRadial2Gradient& s = sBase.cast<GrRadial2Gradient>(); | 468 const GrRadial2Gradient& s = sBase.cast<GrRadial2Gradient>(); |
466 return (INHERITED::onIsEqual(sBase) && | 469 return (INHERITED::onIsEqual(sBase) && |
467 this->fCenterX1 == s.fCenterX1 && | 470 this->fCenterX1 == s.fCenterX1 && |
468 this->fRadius0 == s.fRadius0 && | 471 this->fRadius0 == s.fRadius0 && |
469 this->fPosRoot == s.fPosRoot); | 472 this->fPosRoot == s.fPosRoot); |
470 } | 473 } |
471 | 474 |
472 GrRadial2Gradient(GrContext* ctx, | 475 GrRadial2Gradient(GrContext* ctx, |
473 const SkTwoPointRadialGradient& shader, | 476 const SkTwoPointRadialGradient& shader, |
474 const SkMatrix& matrix, | 477 const SkMatrix& matrix, |
475 SkShader::TileMode tm) | 478 SkShader::TileMode tm) |
476 : INHERITED(ctx, shader, matrix, tm) | 479 : INHERITED(ctx, shader, matrix, tm) |
477 , fCenterX1(shader.getCenterX1()) | 480 , fCenterX1(shader.getCenterX1()) |
478 , fRadius0(shader.getStartRadius()) | 481 , fRadius0(shader.getStartRadius()) |
479 , fPosRoot(shader.getDiffRadius() < 0) { | 482 , fPosRoot(shader.getDiffRadius() < 0) { |
| 483 this->initClassID<GrRadial2Gradient>(); |
480 // We pass the linear part of the quadratic as a varying. | 484 // We pass the linear part of the quadratic as a varying. |
481 // float b = 2.0 * (fCenterX1 * x - fRadius0 * z) | 485 // float b = 2.0 * (fCenterX1 * x - fRadius0 * z) |
482 fBTransform = this->getCoordTransform(); | 486 fBTransform = this->getCoordTransform(); |
483 SkMatrix& bMatrix = *fBTransform.accessMatrix(); | 487 SkMatrix& bMatrix = *fBTransform.accessMatrix(); |
484 bMatrix[SkMatrix::kMScaleX] = 2 * (SkScalarMul(fCenterX1, bMatrix[SkMatr
ix::kMScaleX]) - | 488 bMatrix[SkMatrix::kMScaleX] = 2 * (SkScalarMul(fCenterX1, bMatrix[SkMatr
ix::kMScaleX]) - |
485 SkScalarMul(fRadius0, bMatrix[SkMatri
x::kMPersp0])); | 489 SkScalarMul(fRadius0, bMatrix[SkMatri
x::kMPersp0])); |
486 bMatrix[SkMatrix::kMSkewX] = 2 * (SkScalarMul(fCenterX1, bMatrix[SkMatri
x::kMSkewX]) - | 490 bMatrix[SkMatrix::kMSkewX] = 2 * (SkScalarMul(fCenterX1, bMatrix[SkMatri
x::kMSkewX]) - |
487 SkScalarMul(fRadius0, bMatrix[SkMatrix
::kMPersp1])); | 491 SkScalarMul(fRadius0, bMatrix[SkMatrix
::kMPersp1])); |
488 bMatrix[SkMatrix::kMTransX] = 2 * (SkScalarMul(fCenterX1, bMatrix[SkMatr
ix::kMTransX]) - | 492 bMatrix[SkMatrix::kMTransX] = 2 * (SkScalarMul(fCenterX1, bMatrix[SkMatr
ix::kMTransX]) - |
489 SkScalarMul(fRadius0, bMatrix[SkMatri
x::kMPersp2])); | 493 SkScalarMul(fRadius0, bMatrix[SkMatri
x::kMPersp2])); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 tm)); | 539 tm)); |
536 SkPaint paint; | 540 SkPaint paint; |
537 GrFragmentProcessor* fp; | 541 GrFragmentProcessor* fp; |
538 GrColor paintColor; | 542 GrColor paintColor; |
539 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &fp)); | 543 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &fp)); |
540 return fp; | 544 return fp; |
541 } | 545 } |
542 | 546 |
543 ///////////////////////////////////////////////////////////////////// | 547 ///////////////////////////////////////////////////////////////////// |
544 | 548 |
545 GrGLRadial2Gradient::GrGLRadial2Gradient(const GrBackendProcessorFactory& factor
y, | 549 GrGLRadial2Gradient::GrGLRadial2Gradient(const GrProcessor& processor) |
546 const GrProcessor& processor) | 550 : fVSVaryingName(NULL) |
547 : INHERITED(factory) | |
548 , fVSVaryingName(NULL) | |
549 , fFSVaryingName(NULL) | 551 , fFSVaryingName(NULL) |
550 , fCachedCenter(SK_ScalarMax) | 552 , fCachedCenter(SK_ScalarMax) |
551 , fCachedRadius(-SK_ScalarMax) | 553 , fCachedRadius(-SK_ScalarMax) |
552 , fCachedPosRoot(0) { | 554 , fCachedPosRoot(0) { |
553 | 555 |
554 const GrRadial2Gradient& data = processor.cast<GrRadial2Gradient>(); | 556 const GrRadial2Gradient& data = processor.cast<GrRadial2Gradient>(); |
555 fIsDegenerate = data.isDegenerate(); | 557 fIsDegenerate = data.isDegenerate(); |
556 } | 558 } |
557 | 559 |
558 void GrGLRadial2Gradient::emitCode(GrGLFPBuilder* builder, | 560 void GrGLRadial2Gradient::emitCode(GrGLFPBuilder* builder, |
559 const GrFragmentProcessor& fp, | 561 const GrFragmentProcessor& fp, |
560 const char* outputColor, | 562 const char* outputColor, |
561 const char* inputColor, | 563 const char* inputColor, |
562 const TransformedCoordsArray& coords, | 564 const TransformedCoordsArray& coords, |
563 const TextureSamplerArray& samplers) { | 565 const TextureSamplerArray& samplers) { |
564 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 566 const GrRadial2Gradient& ge = fp.cast<GrRadial2Gradient>(); |
565 this->emitUniforms(builder, ge); | 567 this->emitUniforms(builder, ge); |
566 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit
y, | 568 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit
y, |
567 kFloat_GrSLType, "Radial2FSParams", 6); | 569 kFloat_GrSLType, "Radial2FSParams", 6); |
568 | 570 |
569 SkString cName("c"); | 571 SkString cName("c"); |
570 SkString ac4Name("ac4"); | 572 SkString ac4Name("ac4"); |
571 SkString rootName("root"); | 573 SkString rootName("root"); |
572 SkString t; | 574 SkString t; |
573 SkString p0; | 575 SkString p0; |
574 SkString p1; | 576 SkString p1; |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 | 709 |
708 #else | 710 #else |
709 | 711 |
710 bool SkTwoPointRadialGradient::asFragmentProcessor(GrContext*, const SkPaint&, c
onst SkMatrix*, | 712 bool SkTwoPointRadialGradient::asFragmentProcessor(GrContext*, const SkPaint&, c
onst SkMatrix*, |
711 GrColor*, GrFragmentProcessor
**) const { | 713 GrColor*, GrFragmentProcessor
**) const { |
712 SkDEBUGFAIL("Should not call in GPU-less build"); | 714 SkDEBUGFAIL("Should not call in GPU-less build"); |
713 return false; | 715 return false; |
714 } | 716 } |
715 | 717 |
716 #endif | 718 #endif |
OLD | NEW |