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 "Sk4fLinearGradient.h" | 8 #include "Sk4fLinearGradient.h" |
9 #include "SkLinearGradient.h" | 9 #include "SkLinearGradient.h" |
| 10 #include "SkRefCnt.h" |
10 | 11 |
11 // define to test the 4f gradient path | 12 // define to test the 4f gradient path |
12 // #define FORCE_4F_CONTEXT | 13 // #define FORCE_4F_CONTEXT |
13 | 14 |
14 static const float kInv255Float = 1.0f / 255; | 15 static const float kInv255Float = 1.0f / 255; |
15 | 16 |
16 static inline int repeat_8bits(int x) { | 17 static inline int repeat_8bits(int x) { |
17 return x & 0xFF; | 18 return x & 0xFF; |
18 } | 19 } |
19 | 20 |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 private: | 363 private: |
363 | 364 |
364 typedef GrGLGradientEffect INHERITED; | 365 typedef GrGLGradientEffect INHERITED; |
365 }; | 366 }; |
366 | 367 |
367 ///////////////////////////////////////////////////////////////////// | 368 ///////////////////////////////////////////////////////////////////// |
368 | 369 |
369 class GrLinearGradient : public GrGradientEffect { | 370 class GrLinearGradient : public GrGradientEffect { |
370 public: | 371 public: |
371 | 372 |
372 static GrFragmentProcessor* Create(GrContext* ctx, | 373 static sk_sp<GrFragmentProcessor> Make(GrContext* ctx, |
373 const SkLinearGradient& shader, | 374 const SkLinearGradient& shader, |
374 const SkMatrix& matrix, | 375 const SkMatrix& matrix, |
375 SkShader::TileMode tm) { | 376 SkShader::TileMode tm) { |
376 return new GrLinearGradient(ctx, shader, matrix, tm); | 377 return sk_sp<GrFragmentProcessor>(new GrLinearGradient(ctx, shader, matr
ix, tm)); |
377 } | 378 } |
378 | 379 |
379 virtual ~GrLinearGradient() { } | 380 virtual ~GrLinearGradient() { } |
380 | 381 |
381 const char* name() const override { return "Linear Gradient"; } | 382 const char* name() const override { return "Linear Gradient"; } |
382 | 383 |
383 private: | 384 private: |
384 GrLinearGradient(GrContext* ctx, | 385 GrLinearGradient(GrContext* ctx, |
385 const SkLinearGradient& shader, | 386 const SkLinearGradient& shader, |
386 const SkMatrix& matrix, | 387 const SkMatrix& matrix, |
(...skipping 13 matching lines...) Expand all Loading... |
400 | 401 |
401 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 402 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
402 | 403 |
403 typedef GrGradientEffect INHERITED; | 404 typedef GrGradientEffect INHERITED; |
404 }; | 405 }; |
405 | 406 |
406 ///////////////////////////////////////////////////////////////////// | 407 ///////////////////////////////////////////////////////////////////// |
407 | 408 |
408 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrLinearGradient); | 409 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrLinearGradient); |
409 | 410 |
410 const GrFragmentProcessor* GrLinearGradient::TestCreate(GrProcessorTestData* d)
{ | 411 sk_sp<GrFragmentProcessor> GrLinearGradient::TestCreate(GrProcessorTestData* d)
{ |
411 SkPoint points[] = {{d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}
, | 412 SkPoint points[] = {{d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}
, |
412 {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}
}; | 413 {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}
}; |
413 | 414 |
414 SkColor colors[kMaxRandomGradientColors]; | 415 SkColor colors[kMaxRandomGradientColors]; |
415 SkScalar stopsArray[kMaxRandomGradientColors]; | 416 SkScalar stopsArray[kMaxRandomGradientColors]; |
416 SkScalar* stops = stopsArray; | 417 SkScalar* stops = stopsArray; |
417 SkShader::TileMode tm; | 418 SkShader::TileMode tm; |
418 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); | 419 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); |
419 auto shader = SkGradientShader::MakeLinear(points, colors, stops, colorCount
, tm); | 420 auto shader = SkGradientShader::MakeLinear(points, colors, stops, colorCount
, tm); |
420 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, | 421 sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(d->fContext, |
421 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, | 422 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, |
422 SkSourceGammaTreatment::kRespect); | 423 SkSourceGammaTreatment::kRespect); |
423 GrAlwaysAssert(fp); | 424 GrAlwaysAssert(fp); |
424 return fp; | 425 return fp; |
425 } | 426 } |
426 | 427 |
427 ///////////////////////////////////////////////////////////////////// | 428 ///////////////////////////////////////////////////////////////////// |
428 | 429 |
429 void GrGLLinearGradient::emitCode(EmitArgs& args) { | 430 void GrGLLinearGradient::emitCode(EmitArgs& args) { |
430 const GrLinearGradient& ge = args.fFp.cast<GrLinearGradient>(); | 431 const GrLinearGradient& ge = args.fFp.cast<GrLinearGradient>(); |
431 this->emitUniforms(args.fUniformHandler, ge); | 432 this->emitUniforms(args.fUniformHandler, ge); |
432 SkString t = args.fFragBuilder->ensureFSCoords2D(args.fCoords, 0); | 433 SkString t = args.fFragBuilder->ensureFSCoords2D(args.fCoords, 0); |
433 t.append(".x"); | 434 t.append(".x"); |
434 this->emitColor(args.fFragBuilder, | 435 this->emitColor(args.fFragBuilder, |
435 args.fUniformHandler, | 436 args.fUniformHandler, |
436 args.fGLSLCaps, | 437 args.fGLSLCaps, |
437 ge, t.c_str(), | 438 ge, t.c_str(), |
438 args.fOutputColor, | 439 args.fOutputColor, |
439 args.fInputColor, | 440 args.fInputColor, |
440 args.fTexSamplers); | 441 args.fTexSamplers); |
441 } | 442 } |
442 | 443 |
443 ///////////////////////////////////////////////////////////////////// | 444 ///////////////////////////////////////////////////////////////////// |
444 | 445 |
445 const GrFragmentProcessor* SkLinearGradient::asFragmentProcessor( | 446 sk_sp<GrFragmentProcessor> SkLinearGradient::asFragmentProcessor( |
446 GrContext* context, | 447 GrContext* context, |
447 const SkMatrix& viewm, | 448 const SkMatrix& viewm, |
448 const SkMatrix* localMatrix, | 449 const SkMatrix* localMatrix, |
449 SkFilterQuality, | 450 SkFilterQuality, |
450 SkSourceGammaTreatment) const { | 451 SkSourceGammaTreatment) const { |
451 SkASSERT(context); | 452 SkASSERT(context); |
452 | 453 |
453 SkMatrix matrix; | 454 SkMatrix matrix; |
454 if (!this->getLocalMatrix().invert(&matrix)) { | 455 if (!this->getLocalMatrix().invert(&matrix)) { |
455 return nullptr; | 456 return nullptr; |
456 } | 457 } |
457 if (localMatrix) { | 458 if (localMatrix) { |
458 SkMatrix inv; | 459 SkMatrix inv; |
459 if (!localMatrix->invert(&inv)) { | 460 if (!localMatrix->invert(&inv)) { |
460 return nullptr; | 461 return nullptr; |
461 } | 462 } |
462 matrix.postConcat(inv); | 463 matrix.postConcat(inv); |
463 } | 464 } |
464 matrix.postConcat(fPtsToUnit); | 465 matrix.postConcat(fPtsToUnit); |
465 | 466 |
466 SkAutoTUnref<const GrFragmentProcessor> inner( | 467 sk_sp<GrFragmentProcessor> inner(GrLinearGradient::Make(context, *this, matr
ix, fTileMode)); |
467 GrLinearGradient::Create(context, *this, matrix, fTileMode)); | 468 return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner)); |
468 return GrFragmentProcessor::MulOutputByInputAlpha(inner); | |
469 } | 469 } |
470 | 470 |
471 | 471 |
472 #endif | 472 #endif |
473 | 473 |
474 #ifndef SK_IGNORE_TO_STRING | 474 #ifndef SK_IGNORE_TO_STRING |
475 void SkLinearGradient::toString(SkString* str) const { | 475 void SkLinearGradient::toString(SkString* str) const { |
476 str->append("SkLinearGradient ("); | 476 str->append("SkLinearGradient ("); |
477 | 477 |
478 str->appendf("start: (%f, %f)", fStart.fX, fStart.fY); | 478 str->appendf("start: (%f, %f)", fStart.fX, fStart.fY); |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
756 this->shade4_dx_clamp<false, true>(dstC, count, fx, dx, invDx, dithe
r); | 756 this->shade4_dx_clamp<false, true>(dstC, count, fx, dx, invDx, dithe
r); |
757 } | 757 } |
758 } else { | 758 } else { |
759 if (fApplyAlphaAfterInterp) { | 759 if (fApplyAlphaAfterInterp) { |
760 this->shade4_dx_clamp<true, false>(dstC, count, fx, dx, invDx, dithe
r); | 760 this->shade4_dx_clamp<true, false>(dstC, count, fx, dx, invDx, dithe
r); |
761 } else { | 761 } else { |
762 this->shade4_dx_clamp<false, false>(dstC, count, fx, dx, invDx, dith
er); | 762 this->shade4_dx_clamp<false, false>(dstC, count, fx, dx, invDx, dith
er); |
763 } | 763 } |
764 } | 764 } |
765 } | 765 } |
OLD | NEW |