OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2014 Google Inc. | 3 * Copyright 2014 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_gpu.h" | 9 #include "SkTwoPointConicalGradient_gpu.h" |
10 | 10 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 invLMatrix->postConcat(rot); | 56 invLMatrix->postConcat(rot); |
57 } | 57 } |
58 } | 58 } |
59 | 59 |
60 class Edge2PtConicalEffect : public GrGradientEffect { | 60 class Edge2PtConicalEffect : public GrGradientEffect { |
61 public: | 61 public: |
62 | 62 |
63 static GrFragmentProcessor* Create(GrContext* ctx, | 63 static GrFragmentProcessor* Create(GrContext* ctx, |
64 const SkTwoPointConicalGradient& shader, | 64 const SkTwoPointConicalGradient& shader, |
65 const SkMatrix& matrix, | 65 const SkMatrix& matrix, |
66 SkShader::TileMode tm) { | 66 SkShader::TileMode tm, GrRenderTarget* ds
t) { |
67 return new Edge2PtConicalEffect(ctx, shader, matrix, tm); | 67 return new Edge2PtConicalEffect(ctx, shader, matrix, tm, dst); |
68 } | 68 } |
69 | 69 |
70 virtual ~Edge2PtConicalEffect() {} | 70 virtual ~Edge2PtConicalEffect() {} |
71 | 71 |
72 const char* name() const override { | 72 const char* name() const override { |
73 return "Two-Point Conical Gradient Edge Touching"; | 73 return "Two-Point Conical Gradient Edge Touching"; |
74 } | 74 } |
75 | 75 |
76 // The radial gradient parameters can collapse to a linear (instead of quadr
atic) equation. | 76 // The radial gradient parameters can collapse to a linear (instead of quadr
atic) equation. |
77 SkScalar center() const { return fCenterX1; } | 77 SkScalar center() const { return fCenterX1; } |
78 SkScalar diffRadius() const { return fDiffRadius; } | 78 SkScalar diffRadius() const { return fDiffRadius; } |
79 SkScalar radius() const { return fRadius0; } | 79 SkScalar radius() const { return fRadius0; } |
80 | 80 |
81 private: | 81 private: |
82 GrGLFragmentProcessor* onCreateGLInstance() const override; | 82 GrGLFragmentProcessor* onCreateGLInstance() const override; |
83 | 83 |
84 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; | 84 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; |
85 | 85 |
86 bool onIsEqual(const GrFragmentProcessor& sBase) const override { | 86 bool onIsEqual(const GrFragmentProcessor& sBase) const override { |
87 const Edge2PtConicalEffect& s = sBase.cast<Edge2PtConicalEffect>(); | 87 const Edge2PtConicalEffect& s = sBase.cast<Edge2PtConicalEffect>(); |
88 return (INHERITED::onIsEqual(sBase) && | 88 return (INHERITED::onIsEqual(sBase) && |
89 this->fCenterX1 == s.fCenterX1 && | 89 this->fCenterX1 == s.fCenterX1 && |
90 this->fRadius0 == s.fRadius0 && | 90 this->fRadius0 == s.fRadius0 && |
91 this->fDiffRadius == s.fDiffRadius); | 91 this->fDiffRadius == s.fDiffRadius); |
92 } | 92 } |
93 | 93 |
94 Edge2PtConicalEffect(GrContext* ctx, | 94 Edge2PtConicalEffect(GrContext* ctx, |
95 const SkTwoPointConicalGradient& shader, | 95 const SkTwoPointConicalGradient& shader, |
96 const SkMatrix& matrix, | 96 const SkMatrix& matrix, |
97 SkShader::TileMode tm) | 97 SkShader::TileMode tm, GrRenderTarget* dst) |
98 : INHERITED(ctx, shader, matrix, tm), | 98 : INHERITED(ctx, shader, matrix, tm, dst), |
99 fCenterX1(shader.getCenterX1()), | 99 fCenterX1(shader.getCenterX1()), |
100 fRadius0(shader.getStartRadius()), | 100 fRadius0(shader.getStartRadius()), |
101 fDiffRadius(shader.getDiffRadius()){ | 101 fDiffRadius(shader.getDiffRadius()){ |
102 this->initClassID<Edge2PtConicalEffect>(); | 102 this->initClassID<Edge2PtConicalEffect>(); |
103 // We should only be calling this shader if we are degenerate case with
touching circles | 103 // We should only be calling this shader if we are degenerate case with
touching circles |
104 // When deciding if we are in edge case, we scaled by the end radius for
cases when the | 104 // When deciding if we are in edge case, we scaled by the end radius for
cases when the |
105 // start radius was close to zero, otherwise we scaled by the start radi
us. In addition | 105 // start radius was close to zero, otherwise we scaled by the start radi
us. In addition |
106 // Our test for the edge case in set_matrix_circle_conical has a higher
tolerance so we | 106 // Our test for the edge case in set_matrix_circle_conical has a higher
tolerance so we |
107 // need the sqrt value below | 107 // need the sqrt value below |
108 SkASSERT(SkScalarAbs(SkScalarAbs(fDiffRadius) - fCenterX1) < | 108 SkASSERT(SkScalarAbs(SkScalarAbs(fDiffRadius) - fCenterX1) < |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 SkColor colors[kMaxRandomGradientColors]; | 203 SkColor colors[kMaxRandomGradientColors]; |
204 SkScalar stopsArray[kMaxRandomGradientColors]; | 204 SkScalar stopsArray[kMaxRandomGradientColors]; |
205 SkScalar* stops = stopsArray; | 205 SkScalar* stops = stopsArray; |
206 SkShader::TileMode tm; | 206 SkShader::TileMode tm; |
207 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); | 207 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); |
208 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center
1, radius1, | 208 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center
1, radius1, |
209 center
2, radius2, | 209 center
2, radius2, |
210 colors
, stops, colorCount, | 210 colors
, stops, colorCount, |
211 tm)); | 211 tm)); |
212 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, | 212 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, |
213 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality); | 213 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, NULL); |
214 GrAlwaysAssert(fp); | 214 GrAlwaysAssert(fp); |
215 return fp; | 215 return fp; |
216 } | 216 } |
217 | 217 |
218 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&) | 218 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&) |
219 : fVSVaryingName(nullptr) | 219 : fVSVaryingName(nullptr) |
220 , fFSVaryingName(nullptr) | 220 , fFSVaryingName(nullptr) |
221 , fCachedRadius(-SK_ScalarMax) | 221 , fCachedRadius(-SK_ScalarMax) |
222 , fCachedDiffRadius(-SK_ScalarMax) {} | 222 , fCachedDiffRadius(-SK_ScalarMax) {} |
223 | 223 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 | 364 |
365 ////////////////////////////////////////////////////////////////////////////// | 365 ////////////////////////////////////////////////////////////////////////////// |
366 | 366 |
367 class FocalOutside2PtConicalEffect : public GrGradientEffect { | 367 class FocalOutside2PtConicalEffect : public GrGradientEffect { |
368 public: | 368 public: |
369 | 369 |
370 static GrFragmentProcessor* Create(GrContext* ctx, | 370 static GrFragmentProcessor* Create(GrContext* ctx, |
371 const SkTwoPointConicalGradient& shader, | 371 const SkTwoPointConicalGradient& shader, |
372 const SkMatrix& matrix, | 372 const SkMatrix& matrix, |
373 SkShader::TileMode tm, | 373 SkShader::TileMode tm, |
374 SkScalar focalX) { | 374 SkScalar focalX, GrRenderTarget* dst) { |
375 return new FocalOutside2PtConicalEffect(ctx, shader, matrix, tm, focalX)
; | 375 return new FocalOutside2PtConicalEffect(ctx, shader, matrix, tm, focalX,
dst); |
376 } | 376 } |
377 | 377 |
378 virtual ~FocalOutside2PtConicalEffect() { } | 378 virtual ~FocalOutside2PtConicalEffect() { } |
379 | 379 |
380 const char* name() const override { | 380 const char* name() const override { |
381 return "Two-Point Conical Gradient Focal Outside"; | 381 return "Two-Point Conical Gradient Focal Outside"; |
382 } | 382 } |
383 | 383 |
384 bool isFlipped() const { return fIsFlipped; } | 384 bool isFlipped() const { return fIsFlipped; } |
385 SkScalar focal() const { return fFocalX; } | 385 SkScalar focal() const { return fFocalX; } |
386 | 386 |
387 private: | 387 private: |
388 GrGLFragmentProcessor* onCreateGLInstance() const override; | 388 GrGLFragmentProcessor* onCreateGLInstance() const override; |
389 | 389 |
390 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; | 390 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; |
391 | 391 |
392 bool onIsEqual(const GrFragmentProcessor& sBase) const override { | 392 bool onIsEqual(const GrFragmentProcessor& sBase) const override { |
393 const FocalOutside2PtConicalEffect& s = sBase.cast<FocalOutside2PtConica
lEffect>(); | 393 const FocalOutside2PtConicalEffect& s = sBase.cast<FocalOutside2PtConica
lEffect>(); |
394 return (INHERITED::onIsEqual(sBase) && | 394 return (INHERITED::onIsEqual(sBase) && |
395 this->fFocalX == s.fFocalX && | 395 this->fFocalX == s.fFocalX && |
396 this->fIsFlipped == s.fIsFlipped); | 396 this->fIsFlipped == s.fIsFlipped); |
397 } | 397 } |
398 | 398 |
399 FocalOutside2PtConicalEffect(GrContext* ctx, | 399 FocalOutside2PtConicalEffect(GrContext* ctx, |
400 const SkTwoPointConicalGradient& shader, | 400 const SkTwoPointConicalGradient& shader, |
401 const SkMatrix& matrix, | 401 const SkMatrix& matrix, |
402 SkShader::TileMode tm, | 402 SkShader::TileMode tm, |
403 SkScalar focalX) | 403 SkScalar focalX, GrRenderTarget* dst) |
404 : INHERITED(ctx, shader, matrix, tm) | 404 : INHERITED(ctx, shader, matrix, tm, dst) |
405 , fFocalX(focalX) | 405 , fFocalX(focalX) |
406 , fIsFlipped(shader.isFlippedGrad()) { | 406 , fIsFlipped(shader.isFlippedGrad()) { |
407 this->initClassID<FocalOutside2PtConicalEffect>(); | 407 this->initClassID<FocalOutside2PtConicalEffect>(); |
408 } | 408 } |
409 | 409 |
410 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 410 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
411 | 411 |
412 SkScalar fFocalX; | 412 SkScalar fFocalX; |
413 bool fIsFlipped; | 413 bool fIsFlipped; |
414 | 414 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 SkColor colors[kMaxRandomGradientColors]; | 477 SkColor colors[kMaxRandomGradientColors]; |
478 SkScalar stopsArray[kMaxRandomGradientColors]; | 478 SkScalar stopsArray[kMaxRandomGradientColors]; |
479 SkScalar* stops = stopsArray; | 479 SkScalar* stops = stopsArray; |
480 SkShader::TileMode tm; | 480 SkShader::TileMode tm; |
481 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); | 481 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); |
482 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center
1, radius1, | 482 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center
1, radius1, |
483 center
2, radius2, | 483 center
2, radius2, |
484 colors
, stops, colorCount, | 484 colors
, stops, colorCount, |
485 tm)); | 485 tm)); |
486 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, | 486 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, |
487 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality); | 487 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, NULL); |
488 GrAlwaysAssert(fp); | 488 GrAlwaysAssert(fp); |
489 return fp; | 489 return fp; |
490 } | 490 } |
491 | 491 |
492 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor
& processor) | 492 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor
& processor) |
493 : fVSVaryingName(nullptr) | 493 : fVSVaryingName(nullptr) |
494 , fFSVaryingName(nullptr) | 494 , fFSVaryingName(nullptr) |
495 , fCachedFocal(SK_ScalarMax) { | 495 , fCachedFocal(SK_ScalarMax) { |
496 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon
icalEffect>(); | 496 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon
icalEffect>(); |
497 fIsFlipped = data.isFlipped(); | 497 fIsFlipped = data.isFlipped(); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 | 573 |
574 class GLFocalInside2PtConicalEffect; | 574 class GLFocalInside2PtConicalEffect; |
575 | 575 |
576 class FocalInside2PtConicalEffect : public GrGradientEffect { | 576 class FocalInside2PtConicalEffect : public GrGradientEffect { |
577 public: | 577 public: |
578 | 578 |
579 static GrFragmentProcessor* Create(GrContext* ctx, | 579 static GrFragmentProcessor* Create(GrContext* ctx, |
580 const SkTwoPointConicalGradient& shader, | 580 const SkTwoPointConicalGradient& shader, |
581 const SkMatrix& matrix, | 581 const SkMatrix& matrix, |
582 SkShader::TileMode tm, | 582 SkShader::TileMode tm, |
583 SkScalar focalX) { | 583 SkScalar focalX, GrRenderTarget* dst) { |
584 return new FocalInside2PtConicalEffect(ctx, shader, matrix, tm, focalX); | 584 return new FocalInside2PtConicalEffect(ctx, shader, matrix, tm, focalX,
dst); |
585 } | 585 } |
586 | 586 |
587 virtual ~FocalInside2PtConicalEffect() {} | 587 virtual ~FocalInside2PtConicalEffect() {} |
588 | 588 |
589 const char* name() const override { | 589 const char* name() const override { |
590 return "Two-Point Conical Gradient Focal Inside"; | 590 return "Two-Point Conical Gradient Focal Inside"; |
591 } | 591 } |
592 | 592 |
593 SkScalar focal() const { return fFocalX; } | 593 SkScalar focal() const { return fFocalX; } |
594 | 594 |
595 typedef GLFocalInside2PtConicalEffect GLProcessor; | 595 typedef GLFocalInside2PtConicalEffect GLProcessor; |
596 | 596 |
597 private: | 597 private: |
598 GrGLFragmentProcessor* onCreateGLInstance() const override; | 598 GrGLFragmentProcessor* onCreateGLInstance() const override; |
599 | 599 |
600 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; | 600 void onGetGLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const ov
erride; |
601 | 601 |
602 bool onIsEqual(const GrFragmentProcessor& sBase) const override { | 602 bool onIsEqual(const GrFragmentProcessor& sBase) const override { |
603 const FocalInside2PtConicalEffect& s = sBase.cast<FocalInside2PtConicalE
ffect>(); | 603 const FocalInside2PtConicalEffect& s = sBase.cast<FocalInside2PtConicalE
ffect>(); |
604 return (INHERITED::onIsEqual(sBase) && | 604 return (INHERITED::onIsEqual(sBase) && |
605 this->fFocalX == s.fFocalX); | 605 this->fFocalX == s.fFocalX); |
606 } | 606 } |
607 | 607 |
608 FocalInside2PtConicalEffect(GrContext* ctx, | 608 FocalInside2PtConicalEffect(GrContext* ctx, |
609 const SkTwoPointConicalGradient& shader, | 609 const SkTwoPointConicalGradient& shader, |
610 const SkMatrix& matrix, | 610 const SkMatrix& matrix, |
611 SkShader::TileMode tm, | 611 SkShader::TileMode tm, |
612 SkScalar focalX) | 612 SkScalar focalX, GrRenderTarget* dst) |
613 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX) { | 613 : INHERITED(ctx, shader, matrix, tm, dst), fFocalX(focalX) { |
614 this->initClassID<FocalInside2PtConicalEffect>(); | 614 this->initClassID<FocalInside2PtConicalEffect>(); |
615 } | 615 } |
616 | 616 |
617 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 617 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
618 | 618 |
619 SkScalar fFocalX; | 619 SkScalar fFocalX; |
620 | 620 |
621 typedef GrGradientEffect INHERITED; | 621 typedef GrGradientEffect INHERITED; |
622 }; | 622 }; |
623 | 623 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
683 SkColor colors[kMaxRandomGradientColors]; | 683 SkColor colors[kMaxRandomGradientColors]; |
684 SkScalar stopsArray[kMaxRandomGradientColors]; | 684 SkScalar stopsArray[kMaxRandomGradientColors]; |
685 SkScalar* stops = stopsArray; | 685 SkScalar* stops = stopsArray; |
686 SkShader::TileMode tm; | 686 SkShader::TileMode tm; |
687 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); | 687 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); |
688 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center
1, radius1, | 688 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center
1, radius1, |
689 center
2, radius2, | 689 center
2, radius2, |
690 colors
, stops, colorCount, | 690 colors
, stops, colorCount, |
691 tm)); | 691 tm)); |
692 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, | 692 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, |
693 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality); | 693 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, NULL); |
694 GrAlwaysAssert(fp); | 694 GrAlwaysAssert(fp); |
695 return fp; | 695 return fp; |
696 } | 696 } |
697 | 697 |
698 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&) | 698 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&) |
699 : fVSVaryingName(nullptr) | 699 : fVSVaryingName(nullptr) |
700 , fFSVaryingName(nullptr) | 700 , fFSVaryingName(nullptr) |
701 , fCachedFocal(SK_ScalarMax) {} | 701 , fCachedFocal(SK_ScalarMax) {} |
702 | 702 |
703 void GLFocalInside2PtConicalEffect::emitCode(EmitArgs& args) { | 703 void GLFocalInside2PtConicalEffect::emitCode(EmitArgs& args) { |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 return kOutside_ConicalType; | 806 return kOutside_ConicalType; |
807 } | 807 } |
808 | 808 |
809 class CircleInside2PtConicalEffect : public GrGradientEffect { | 809 class CircleInside2PtConicalEffect : public GrGradientEffect { |
810 public: | 810 public: |
811 | 811 |
812 static GrFragmentProcessor* Create(GrContext* ctx, | 812 static GrFragmentProcessor* Create(GrContext* ctx, |
813 const SkTwoPointConicalGradient& shader, | 813 const SkTwoPointConicalGradient& shader, |
814 const SkMatrix& matrix, | 814 const SkMatrix& matrix, |
815 SkShader::TileMode tm, | 815 SkShader::TileMode tm, |
816 const CircleConicalInfo& info) { | 816 const CircleConicalInfo& info, GrRenderTa
rget* dst) { |
817 return new CircleInside2PtConicalEffect(ctx, shader, matrix, tm, info); | 817 return new CircleInside2PtConicalEffect(ctx, shader, matrix, tm, info, d
st); |
818 } | 818 } |
819 | 819 |
820 virtual ~CircleInside2PtConicalEffect() {} | 820 virtual ~CircleInside2PtConicalEffect() {} |
821 | 821 |
822 const char* name() const override { return "Two-Point Conical Gradient Insid
e"; } | 822 const char* name() const override { return "Two-Point Conical Gradient Insid
e"; } |
823 | 823 |
824 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } | 824 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } |
825 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } | 825 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } |
826 SkScalar A() const { return fInfo.fA; } | 826 SkScalar A() const { return fInfo.fA; } |
827 SkScalar B() const { return fInfo.fB; } | 827 SkScalar B() const { return fInfo.fB; } |
(...skipping 11 matching lines...) Expand all Loading... |
839 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && | 839 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && |
840 this->fInfo.fA == s.fInfo.fA && | 840 this->fInfo.fA == s.fInfo.fA && |
841 this->fInfo.fB == s.fInfo.fB && | 841 this->fInfo.fB == s.fInfo.fB && |
842 this->fInfo.fC == s.fInfo.fC); | 842 this->fInfo.fC == s.fInfo.fC); |
843 } | 843 } |
844 | 844 |
845 CircleInside2PtConicalEffect(GrContext* ctx, | 845 CircleInside2PtConicalEffect(GrContext* ctx, |
846 const SkTwoPointConicalGradient& shader, | 846 const SkTwoPointConicalGradient& shader, |
847 const SkMatrix& matrix, | 847 const SkMatrix& matrix, |
848 SkShader::TileMode tm, | 848 SkShader::TileMode tm, |
849 const CircleConicalInfo& info) | 849 const CircleConicalInfo& info, GrRenderTarget*
dst) |
850 : INHERITED(ctx, shader, matrix, tm), fInfo(info) { | 850 : INHERITED(ctx, shader, matrix, tm, dst), fInfo(info) { |
851 this->initClassID<CircleInside2PtConicalEffect>(); | 851 this->initClassID<CircleInside2PtConicalEffect>(); |
852 } | 852 } |
853 | 853 |
854 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 854 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
855 | 855 |
856 const CircleConicalInfo fInfo; | 856 const CircleConicalInfo fInfo; |
857 | 857 |
858 typedef GrGradientEffect INHERITED; | 858 typedef GrGradientEffect INHERITED; |
859 }; | 859 }; |
860 | 860 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
924 SkColor colors[kMaxRandomGradientColors]; | 924 SkColor colors[kMaxRandomGradientColors]; |
925 SkScalar stopsArray[kMaxRandomGradientColors]; | 925 SkScalar stopsArray[kMaxRandomGradientColors]; |
926 SkScalar* stops = stopsArray; | 926 SkScalar* stops = stopsArray; |
927 SkShader::TileMode tm; | 927 SkShader::TileMode tm; |
928 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); | 928 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); |
929 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center
1, radius1, | 929 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center
1, radius1, |
930 center
2, radius2, | 930 center
2, radius2, |
931 colors
, stops, colorCount, | 931 colors
, stops, colorCount, |
932 tm)); | 932 tm)); |
933 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, | 933 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, |
934 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality); | 934 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, NULL); |
935 GrAlwaysAssert(fp); | 935 GrAlwaysAssert(fp); |
936 return fp; | 936 return fp; |
937 } | 937 } |
938 | 938 |
939 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrProcessor
& processor) | 939 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrProcessor
& processor) |
940 : fVSVaryingName(nullptr) | 940 : fVSVaryingName(nullptr) |
941 , fFSVaryingName(nullptr) | 941 , fFSVaryingName(nullptr) |
942 , fCachedCenterX(SK_ScalarMax) | 942 , fCachedCenterX(SK_ScalarMax) |
943 , fCachedCenterY(SK_ScalarMax) | 943 , fCachedCenterY(SK_ScalarMax) |
944 , fCachedA(SK_ScalarMax) | 944 , fCachedA(SK_ScalarMax) |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 | 1016 |
1017 ////////////////////////////////////////////////////////////////////////////// | 1017 ////////////////////////////////////////////////////////////////////////////// |
1018 | 1018 |
1019 class CircleOutside2PtConicalEffect : public GrGradientEffect { | 1019 class CircleOutside2PtConicalEffect : public GrGradientEffect { |
1020 public: | 1020 public: |
1021 | 1021 |
1022 static GrFragmentProcessor* Create(GrContext* ctx, | 1022 static GrFragmentProcessor* Create(GrContext* ctx, |
1023 const SkTwoPointConicalGradient& shader, | 1023 const SkTwoPointConicalGradient& shader, |
1024 const SkMatrix& matrix, | 1024 const SkMatrix& matrix, |
1025 SkShader::TileMode tm, | 1025 SkShader::TileMode tm, |
1026 const CircleConicalInfo& info) { | 1026 const CircleConicalInfo& info, GrRenderTa
rget* dst) { |
1027 return new CircleOutside2PtConicalEffect(ctx, shader, matrix, tm, info); | 1027 return new CircleOutside2PtConicalEffect(ctx, shader, matrix, tm, info,
dst); |
1028 } | 1028 } |
1029 | 1029 |
1030 virtual ~CircleOutside2PtConicalEffect() {} | 1030 virtual ~CircleOutside2PtConicalEffect() {} |
1031 | 1031 |
1032 const char* name() const override { return "Two-Point Conical Gradient Outsi
de"; } | 1032 const char* name() const override { return "Two-Point Conical Gradient Outsi
de"; } |
1033 | 1033 |
1034 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } | 1034 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } |
1035 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } | 1035 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } |
1036 SkScalar A() const { return fInfo.fA; } | 1036 SkScalar A() const { return fInfo.fA; } |
1037 SkScalar B() const { return fInfo.fB; } | 1037 SkScalar B() const { return fInfo.fB; } |
(...skipping 14 matching lines...) Expand all Loading... |
1052 this->fInfo.fB == s.fInfo.fB && | 1052 this->fInfo.fB == s.fInfo.fB && |
1053 this->fInfo.fC == s.fInfo.fC && | 1053 this->fInfo.fC == s.fInfo.fC && |
1054 this->fTLimit == s.fTLimit && | 1054 this->fTLimit == s.fTLimit && |
1055 this->fIsFlipped == s.fIsFlipped); | 1055 this->fIsFlipped == s.fIsFlipped); |
1056 } | 1056 } |
1057 | 1057 |
1058 CircleOutside2PtConicalEffect(GrContext* ctx, | 1058 CircleOutside2PtConicalEffect(GrContext* ctx, |
1059 const SkTwoPointConicalGradient& shader, | 1059 const SkTwoPointConicalGradient& shader, |
1060 const SkMatrix& matrix, | 1060 const SkMatrix& matrix, |
1061 SkShader::TileMode tm, | 1061 SkShader::TileMode tm, |
1062 const CircleConicalInfo& info) | 1062 const CircleConicalInfo& info, GrRenderTarget*
dst) |
1063 : INHERITED(ctx, shader, matrix, tm), fInfo(info) { | 1063 : INHERITED(ctx, shader, matrix, tm, dst), fInfo(info) { |
1064 this->initClassID<CircleOutside2PtConicalEffect>(); | 1064 this->initClassID<CircleOutside2PtConicalEffect>(); |
1065 if (shader.getStartRadius() != shader.getEndRadius()) { | 1065 if (shader.getStartRadius() != shader.getEndRadius()) { |
1066 fTLimit = shader.getStartRadius() / (shader.getStartRadius() - shade
r.getEndRadius()); | 1066 fTLimit = shader.getStartRadius() / (shader.getStartRadius() - shade
r.getEndRadius()); |
1067 } else { | 1067 } else { |
1068 fTLimit = SK_ScalarMin; | 1068 fTLimit = SK_ScalarMin; |
1069 } | 1069 } |
1070 | 1070 |
1071 fIsFlipped = shader.isFlippedGrad(); | 1071 fIsFlipped = shader.isFlippedGrad(); |
1072 } | 1072 } |
1073 | 1073 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 SkColor colors[kMaxRandomGradientColors]; | 1150 SkColor colors[kMaxRandomGradientColors]; |
1151 SkScalar stopsArray[kMaxRandomGradientColors]; | 1151 SkScalar stopsArray[kMaxRandomGradientColors]; |
1152 SkScalar* stops = stopsArray; | 1152 SkScalar* stops = stopsArray; |
1153 SkShader::TileMode tm; | 1153 SkShader::TileMode tm; |
1154 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); | 1154 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); |
1155 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center
1, radius1, | 1155 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateTwoPointConical(center
1, radius1, |
1156 center
2, radius2, | 1156 center
2, radius2, |
1157 colors
, stops, colorCount, | 1157 colors
, stops, colorCount, |
1158 tm)); | 1158 tm)); |
1159 const GrFragmentProcessor* fp = shader->asFragmentProcessor( | 1159 const GrFragmentProcessor* fp = shader->asFragmentProcessor( |
1160 d->fContext,GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality)
; | 1160 d->fContext,GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
NULL); |
1161 GrAlwaysAssert(fp); | 1161 GrAlwaysAssert(fp); |
1162 return fp; | 1162 return fp; |
1163 } | 1163 } |
1164 | 1164 |
1165 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrProcess
or& processor) | 1165 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrProcess
or& processor) |
1166 : fVSVaryingName(nullptr) | 1166 : fVSVaryingName(nullptr) |
1167 , fFSVaryingName(nullptr) | 1167 , fFSVaryingName(nullptr) |
1168 , fCachedCenterX(SK_ScalarMax) | 1168 , fCachedCenterX(SK_ScalarMax) |
1169 , fCachedCenterY(SK_ScalarMax) | 1169 , fCachedCenterY(SK_ScalarMax) |
1170 , fCachedA(SK_ScalarMax) | 1170 , fCachedA(SK_ScalarMax) |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1264 uint32_t* key = b->add32n(2); | 1264 uint32_t* key = b->add32n(2); |
1265 key[0] = GenBaseGradientKey(processor); | 1265 key[0] = GenBaseGradientKey(processor); |
1266 key[1] = processor.cast<CircleOutside2PtConicalEffect>().isFlipped(); | 1266 key[1] = processor.cast<CircleOutside2PtConicalEffect>().isFlipped(); |
1267 } | 1267 } |
1268 | 1268 |
1269 ////////////////////////////////////////////////////////////////////////////// | 1269 ////////////////////////////////////////////////////////////////////////////// |
1270 | 1270 |
1271 GrFragmentProcessor* Gr2PtConicalGradientEffect::Create(GrContext* ctx, | 1271 GrFragmentProcessor* Gr2PtConicalGradientEffect::Create(GrContext* ctx, |
1272 const SkTwoPointConicalG
radient& shader, | 1272 const SkTwoPointConicalG
radient& shader, |
1273 SkShader::TileMode tm, | 1273 SkShader::TileMode tm, |
1274 const SkMatrix* localMat
rix) { | 1274 const SkMatrix* localMat
rix, GrRenderTarget* dst) { |
1275 SkMatrix matrix; | 1275 SkMatrix matrix; |
1276 if (!shader.getLocalMatrix().invert(&matrix)) { | 1276 if (!shader.getLocalMatrix().invert(&matrix)) { |
1277 return nullptr; | 1277 return nullptr; |
1278 } | 1278 } |
1279 if (localMatrix) { | 1279 if (localMatrix) { |
1280 SkMatrix inv; | 1280 SkMatrix inv; |
1281 if (!localMatrix->invert(&inv)) { | 1281 if (!localMatrix->invert(&inv)) { |
1282 return nullptr; | 1282 return nullptr; |
1283 } | 1283 } |
1284 matrix.postConcat(inv); | 1284 matrix.postConcat(inv); |
1285 } | 1285 } |
1286 | 1286 |
1287 if (shader.getStartRadius() < kErrorTol) { | 1287 if (shader.getStartRadius() < kErrorTol) { |
1288 SkScalar focalX; | 1288 SkScalar focalX; |
1289 ConicalType type = set_matrix_focal_conical(shader, &matrix, &focalX); | 1289 ConicalType type = set_matrix_focal_conical(shader, &matrix, &focalX); |
1290 if (type == kInside_ConicalType) { | 1290 if (type == kInside_ConicalType) { |
1291 return FocalInside2PtConicalEffect::Create(ctx, shader, matrix, tm,
focalX); | 1291 return FocalInside2PtConicalEffect::Create(ctx, shader, matrix, tm, |
| 1292 focalX, dst); |
1292 } else if(type == kEdge_ConicalType) { | 1293 } else if(type == kEdge_ConicalType) { |
1293 set_matrix_edge_conical(shader, &matrix); | 1294 set_matrix_edge_conical(shader, &matrix); |
1294 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); | 1295 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm, dst); |
1295 } else { | 1296 } else { |
1296 return FocalOutside2PtConicalEffect::Create(ctx, shader, matrix, tm,
focalX); | 1297 return FocalOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, |
| 1298 focalX, dst); |
1297 } | 1299 } |
1298 } | 1300 } |
1299 | 1301 |
1300 CircleConicalInfo info; | 1302 CircleConicalInfo info; |
1301 ConicalType type = set_matrix_circle_conical(shader, &matrix, &info); | 1303 ConicalType type = set_matrix_circle_conical(shader, &matrix, &info); |
1302 | 1304 |
1303 if (type == kInside_ConicalType) { | 1305 if (type == kInside_ConicalType) { |
1304 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf
o); | 1306 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, |
| 1307 info, dst); |
1305 } else if (type == kEdge_ConicalType) { | 1308 } else if (type == kEdge_ConicalType) { |
1306 set_matrix_edge_conical(shader, &matrix); | 1309 set_matrix_edge_conical(shader, &matrix); |
1307 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); | 1310 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm, dst); |
1308 } else { | 1311 } else { |
1309 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); | 1312 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, |
| 1313 info, dst); |
1310 } | 1314 } |
1311 } | 1315 } |
1312 | 1316 |
1313 #endif | 1317 #endif |
OLD | NEW |