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