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 "SkRadialGradient.h" | 9 #include "SkRadialGradient.h" |
10 #include "SkRadialGradient_Table.h" | 10 #include "SkRadialGradient_Table.h" |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 dstX += SK_Scalar1; | 408 dstX += SK_Scalar1; |
409 } while (--count != 0); | 409 } while (--count != 0); |
410 } | 410 } |
411 } | 411 } |
412 | 412 |
413 ///////////////////////////////////////////////////////////////////// | 413 ///////////////////////////////////////////////////////////////////// |
414 | 414 |
415 #if SK_SUPPORT_GPU | 415 #if SK_SUPPORT_GPU |
416 | 416 |
417 #include "SkGr.h" | 417 #include "SkGr.h" |
418 #include "effects/GrExtractAlphaFragmentProcessor.h" | |
419 #include "gl/builders/GrGLProgramBuilder.h" | 418 #include "gl/builders/GrGLProgramBuilder.h" |
420 | 419 |
421 class GrGLRadialGradient : public GrGLGradientEffect { | 420 class GrGLRadialGradient : public GrGLGradientEffect { |
422 public: | 421 public: |
423 | 422 |
424 GrGLRadialGradient(const GrProcessor&) {} | 423 GrGLRadialGradient(const GrProcessor&) {} |
425 virtual ~GrGLRadialGradient() { } | 424 virtual ~GrGLRadialGradient() { } |
426 | 425 |
427 virtual void emitCode(EmitArgs&) override; | 426 virtual void emitCode(EmitArgs&) override; |
428 | 427 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 | 472 |
474 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 473 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
475 | 474 |
476 typedef GrGradientEffect INHERITED; | 475 typedef GrGradientEffect INHERITED; |
477 }; | 476 }; |
478 | 477 |
479 ///////////////////////////////////////////////////////////////////// | 478 ///////////////////////////////////////////////////////////////////// |
480 | 479 |
481 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrRadialGradient); | 480 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrRadialGradient); |
482 | 481 |
483 const GrFragmentProcessor* GrRadialGradient::TestCreate(GrProcessorTestData* d)
{ | 482 GrFragmentProcessor* GrRadialGradient::TestCreate(GrProcessorTestData* d) { |
484 SkPoint center = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}; | 483 SkPoint center = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}; |
485 SkScalar radius = d->fRandom->nextUScalar1(); | 484 SkScalar radius = d->fRandom->nextUScalar1(); |
486 | 485 |
487 SkColor colors[kMaxRandomGradientColors]; | 486 SkColor colors[kMaxRandomGradientColors]; |
488 SkScalar stopsArray[kMaxRandomGradientColors]; | 487 SkScalar stopsArray[kMaxRandomGradientColors]; |
489 SkScalar* stops = stopsArray; | 488 SkScalar* stops = stopsArray; |
490 SkShader::TileMode tm; | 489 SkShader::TileMode tm; |
491 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); | 490 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); |
492 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateRadial(center, radius, | 491 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateRadial(center, radius, |
493 colors, stops,
colorCount, | 492 colors, stops,
colorCount, |
494 tm)); | 493 tm)); |
495 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, | 494 SkPaint paint; |
496 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, d->fProcDat
aManager); | 495 GrColor paintColor; |
497 GrAlwaysAssert(fp); | 496 GrFragmentProcessor* fp; |
| 497 SkAssertResult(shader->asFragmentProcessor(d->fContext, paint, |
| 498 GrTest::TestMatrix(d->fRandom), n
ullptr, |
| 499 &paintColor, d->fProcDataManager,
&fp)); |
498 return fp; | 500 return fp; |
499 } | 501 } |
500 | 502 |
501 ///////////////////////////////////////////////////////////////////// | 503 ///////////////////////////////////////////////////////////////////// |
502 | 504 |
503 void GrGLRadialGradient::emitCode(EmitArgs& args) { | 505 void GrGLRadialGradient::emitCode(EmitArgs& args) { |
504 const GrRadialGradient& ge = args.fFp.cast<GrRadialGradient>(); | 506 const GrRadialGradient& ge = args.fFp.cast<GrRadialGradient>(); |
505 this->emitUniforms(args.fBuilder, ge); | 507 this->emitUniforms(args.fBuilder, ge); |
506 SkString t("length("); | 508 SkString t("length("); |
507 t.append(args.fBuilder->getFragmentShaderBuilder()->ensureFSCoords2D(args.fC
oords, 0)); | 509 t.append(args.fBuilder->getFragmentShaderBuilder()->ensureFSCoords2D(args.fC
oords, 0)); |
508 t.append(")"); | 510 t.append(")"); |
509 this->emitColor(args.fBuilder, ge, t.c_str(), args.fOutputColor, args.fInput
Color, | 511 this->emitColor(args.fBuilder, ge, t.c_str(), args.fOutputColor, args.fInput
Color, |
510 args.fSamplers); | 512 args.fSamplers); |
511 } | 513 } |
512 | 514 |
513 ///////////////////////////////////////////////////////////////////// | 515 ///////////////////////////////////////////////////////////////////// |
514 | 516 |
515 const GrFragmentProcessor* SkRadialGradient::asFragmentProcessor(GrContext* cont
ext, | 517 bool SkRadialGradient::asFragmentProcessor(GrContext* context, const SkPaint& pa
int, |
516 const SkMatrix& viewM, const SkMatrix* localMatrix, SkFilterQuality, | 518 const SkMatrix& viewM, |
517 GrProcessorDataManager* procDataManager) const { | 519 const SkMatrix* localMatrix, GrColor*
paintColor, |
| 520 GrProcessorDataManager* procDataManag
er, |
| 521 GrFragmentProcessor** fp) const { |
518 SkASSERT(context); | 522 SkASSERT(context); |
519 | 523 |
520 SkMatrix matrix; | 524 SkMatrix matrix; |
521 if (!this->getLocalMatrix().invert(&matrix)) { | 525 if (!this->getLocalMatrix().invert(&matrix)) { |
522 return nullptr; | 526 return false; |
523 } | 527 } |
524 if (localMatrix) { | 528 if (localMatrix) { |
525 SkMatrix inv; | 529 SkMatrix inv; |
526 if (!localMatrix->invert(&inv)) { | 530 if (!localMatrix->invert(&inv)) { |
527 return nullptr; | 531 return false; |
528 } | 532 } |
529 matrix.postConcat(inv); | 533 matrix.postConcat(inv); |
530 } | 534 } |
531 matrix.postConcat(fPtsToUnit); | 535 matrix.postConcat(fPtsToUnit); |
532 SkAutoTUnref<const GrFragmentProcessor> inner( | 536 |
533 GrRadialGradient::Create(context, procDataManager, *this, matrix, fT
ileMode)); | 537 *paintColor = SkColor2GrColorJustAlpha(paint.getColor()); |
534 return GrExtractAlphaFragmentProcessor::Create(inner); | 538 *fp = GrRadialGradient::Create(context, procDataManager, *this, matrix, fTil
eMode); |
| 539 |
| 540 return true; |
| 541 } |
| 542 |
| 543 #else |
| 544 |
| 545 bool SkRadialGradient::asFragmentProcessor(GrContext*, const SkPaint&, const SkM
atrix&, |
| 546 const SkMatrix*, GrColor*, GrProcesso
rDataManager*, |
| 547 GrFragmentProcessor**) const { |
| 548 SkDEBUGFAIL("Should not call in GPU-less build"); |
| 549 return false; |
535 } | 550 } |
536 | 551 |
537 #endif | 552 #endif |
538 | 553 |
539 #ifndef SK_IGNORE_TO_STRING | 554 #ifndef SK_IGNORE_TO_STRING |
540 void SkRadialGradient::toString(SkString* str) const { | 555 void SkRadialGradient::toString(SkString* str) const { |
541 str->append("SkRadialGradient: ("); | 556 str->append("SkRadialGradient: ("); |
542 | 557 |
543 str->append("center: ("); | 558 str->append("center: ("); |
544 str->appendScalar(fCenter.fX); | 559 str->appendScalar(fCenter.fX); |
545 str->append(", "); | 560 str->append(", "); |
546 str->appendScalar(fCenter.fY); | 561 str->appendScalar(fCenter.fY); |
547 str->append(") radius: "); | 562 str->append(") radius: "); |
548 str->appendScalar(fRadius); | 563 str->appendScalar(fRadius); |
549 str->append(" "); | 564 str->append(" "); |
550 | 565 |
551 this->INHERITED::toString(str); | 566 this->INHERITED::toString(str); |
552 | 567 |
553 str->append(")"); | 568 str->append(")"); |
554 } | 569 } |
555 #endif | 570 #endif |
OLD | NEW |