Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp

Issue 2041113004: sk_sp for gpu. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Reserve correctly. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/effects/gradients/SkTwoPointConicalGradient_gpu.h ('k') | src/gpu/GrBlurUtils.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 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 "SkTwoPointConicalGradient_gpu.h" 8 #include "SkTwoPointConicalGradient_gpu.h"
9 9
10 #include "SkTwoPointConicalGradient.h" 10 #include "SkTwoPointConicalGradient.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 SkMatrix rot; 54 SkMatrix rot;
55 rot.setSinCos(-SkScalarMul(invDiffLen, diff.fY), 55 rot.setSinCos(-SkScalarMul(invDiffLen, diff.fY),
56 SkScalarMul(invDiffLen, diff.fX)); 56 SkScalarMul(invDiffLen, diff.fX));
57 invLMatrix->postConcat(rot); 57 invLMatrix->postConcat(rot);
58 } 58 }
59 } 59 }
60 60
61 class Edge2PtConicalEffect : public GrGradientEffect { 61 class Edge2PtConicalEffect : public GrGradientEffect {
62 public: 62 public:
63 63
64 static GrFragmentProcessor* Create(GrContext* ctx, 64 static sk_sp<GrFragmentProcessor> Make(GrContext* ctx,
65 const SkTwoPointConicalGradient& shader, 65 const SkTwoPointConicalGradient& shad er,
66 const SkMatrix& matrix, 66 const SkMatrix& matrix,
67 SkShader::TileMode tm) { 67 SkShader::TileMode tm) {
68 return new Edge2PtConicalEffect(ctx, shader, matrix, tm); 68 return sk_sp<GrFragmentProcessor>(new Edge2PtConicalEffect(ctx, shader, matrix, tm));
69 } 69 }
70 70
71 virtual ~Edge2PtConicalEffect() {} 71 virtual ~Edge2PtConicalEffect() {}
72 72
73 const char* name() const override { 73 const char* name() const override {
74 return "Two-Point Conical Gradient Edge Touching"; 74 return "Two-Point Conical Gradient Edge Touching";
75 } 75 }
76 76
77 // The radial gradient parameters can collapse to a linear (instead of quadr atic) equation. 77 // The radial gradient parameters can collapse to a linear (instead of quadr atic) equation.
78 SkScalar center() const { return fCenterX1; } 78 SkScalar center() const { return fCenterX1; }
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 177
178 GrGLSLFragmentProcessor* Edge2PtConicalEffect::onCreateGLSLInstance() const { 178 GrGLSLFragmentProcessor* Edge2PtConicalEffect::onCreateGLSLInstance() const {
179 return new GLEdge2PtConicalEffect(*this); 179 return new GLEdge2PtConicalEffect(*this);
180 } 180 }
181 181
182 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Edge2PtConicalEffect); 182 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Edge2PtConicalEffect);
183 183
184 /* 184 /*
185 * All Two point conical gradient test create functions may occasionally create edge case shaders 185 * All Two point conical gradient test create functions may occasionally create edge case shaders
186 */ 186 */
187 const GrFragmentProcessor* Edge2PtConicalEffect::TestCreate(GrProcessorTestData* d) { 187 sk_sp<GrFragmentProcessor> Edge2PtConicalEffect::TestCreate(GrProcessorTestData* d) {
188 SkPoint center1 = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}; 188 SkPoint center1 = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()};
189 SkScalar radius1 = d->fRandom->nextUScalar1(); 189 SkScalar radius1 = d->fRandom->nextUScalar1();
190 SkPoint center2; 190 SkPoint center2;
191 SkScalar radius2; 191 SkScalar radius2;
192 do { 192 do {
193 center2.set(d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()); 193 center2.set(d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1());
194 // If the circles are identical the factory will give us an empty shader . 194 // If the circles are identical the factory will give us an empty shader .
195 // This will happen if we pick identical centers 195 // This will happen if we pick identical centers
196 } while (center1 == center2); 196 } while (center1 == center2);
197 197
198 // Below makes sure that circle one is contained within circle two 198 // Below makes sure that circle one is contained within circle two
199 // and both circles are touching on an edge 199 // and both circles are touching on an edge
200 SkPoint diff = center2 - center1; 200 SkPoint diff = center2 - center1;
201 SkScalar diffLen = diff.length(); 201 SkScalar diffLen = diff.length();
202 radius2 = radius1 + diffLen; 202 radius2 = radius1 + diffLen;
203 203
204 SkColor colors[kMaxRandomGradientColors]; 204 SkColor colors[kMaxRandomGradientColors];
205 SkScalar stopsArray[kMaxRandomGradientColors]; 205 SkScalar stopsArray[kMaxRandomGradientColors];
206 SkScalar* stops = stopsArray; 206 SkScalar* stops = stopsArray;
207 SkShader::TileMode tm; 207 SkShader::TileMode tm;
208 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); 208 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm);
209 auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center 2, radius2, 209 auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center 2, radius2,
210 colors, stops, colorCoun t, tm); 210 colors, stops, colorCoun t, tm);
211 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, 211 sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(d->fContext,
212 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, 212 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
213 SkSourceGammaTreatment::kRespect); 213 SkSourceGammaTreatment::kRespect);
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)
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 invLMatrix->postConcat(matrix); 363 invLMatrix->postConcat(matrix);
364 364
365 return conicalType; 365 return conicalType;
366 } 366 }
367 367
368 ////////////////////////////////////////////////////////////////////////////// 368 //////////////////////////////////////////////////////////////////////////////
369 369
370 class FocalOutside2PtConicalEffect : public GrGradientEffect { 370 class FocalOutside2PtConicalEffect : public GrGradientEffect {
371 public: 371 public:
372 372
373 static GrFragmentProcessor* Create(GrContext* ctx, 373 static sk_sp<GrFragmentProcessor> Make(GrContext* ctx,
374 const SkTwoPointConicalGradient& shader, 374 const SkTwoPointConicalGradient& shad er,
375 const SkMatrix& matrix, 375 const SkMatrix& matrix,
376 SkShader::TileMode tm, 376 SkShader::TileMode tm,
377 SkScalar focalX) { 377 SkScalar focalX) {
378 return new FocalOutside2PtConicalEffect(ctx, shader, matrix, tm, focalX) ; 378 return sk_sp<GrFragmentProcessor>(
379 new FocalOutside2PtConicalEffect(ctx, shader, matrix, tm, focalX));
379 } 380 }
380 381
381 virtual ~FocalOutside2PtConicalEffect() { } 382 virtual ~FocalOutside2PtConicalEffect() { }
382 383
383 const char* name() const override { 384 const char* name() const override {
384 return "Two-Point Conical Gradient Focal Outside"; 385 return "Two-Point Conical Gradient Focal Outside";
385 } 386 }
386 387
387 bool isFlipped() const { return fIsFlipped; } 388 bool isFlipped() const { return fIsFlipped; }
388 SkScalar focal() const { return fFocalX; } 389 SkScalar focal() const { return fFocalX; }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 457
457 GrGLSLFragmentProcessor* FocalOutside2PtConicalEffect::onCreateGLSLInstance() co nst { 458 GrGLSLFragmentProcessor* FocalOutside2PtConicalEffect::onCreateGLSLInstance() co nst {
458 return new GLFocalOutside2PtConicalEffect(*this); 459 return new GLFocalOutside2PtConicalEffect(*this);
459 } 460 }
460 461
461 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalOutside2PtConicalEffect); 462 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalOutside2PtConicalEffect);
462 463
463 /* 464 /*
464 * All Two point conical gradient test create functions may occasionally create edge case shaders 465 * All Two point conical gradient test create functions may occasionally create edge case shaders
465 */ 466 */
466 const GrFragmentProcessor* FocalOutside2PtConicalEffect::TestCreate(GrProcessorT estData* d) { 467 sk_sp<GrFragmentProcessor> FocalOutside2PtConicalEffect::TestCreate(GrProcessorT estData* d) {
467 SkPoint center1 = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}; 468 SkPoint center1 = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()};
468 SkScalar radius1 = 0.f; 469 SkScalar radius1 = 0.f;
469 SkPoint center2; 470 SkPoint center2;
470 SkScalar radius2; 471 SkScalar radius2;
471 do { 472 do {
472 center2.set(d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()); 473 center2.set(d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1());
473 // Need to make sure the centers are not the same or else focal point wi ll be inside 474 // Need to make sure the centers are not the same or else focal point wi ll be inside
474 } while (center1 == center2); 475 } while (center1 == center2);
475 SkPoint diff = center2 - center1; 476 SkPoint diff = center2 - center1;
476 SkScalar diffLen = diff.length(); 477 SkScalar diffLen = diff.length();
477 // Below makes sure that the focal point is not contained within circle two 478 // Below makes sure that the focal point is not contained within circle two
478 radius2 = d->fRandom->nextRangeF(0.f, diffLen); 479 radius2 = d->fRandom->nextRangeF(0.f, diffLen);
479 480
480 SkColor colors[kMaxRandomGradientColors]; 481 SkColor colors[kMaxRandomGradientColors];
481 SkScalar stopsArray[kMaxRandomGradientColors]; 482 SkScalar stopsArray[kMaxRandomGradientColors];
482 SkScalar* stops = stopsArray; 483 SkScalar* stops = stopsArray;
483 SkShader::TileMode tm; 484 SkShader::TileMode tm;
484 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); 485 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm);
485 auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center 2, radius2, 486 auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center 2, radius2,
486 colors, stops, colorCoun t, tm); 487 colors, stops, colorCoun t, tm);
487 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, 488 sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(d->fContext,
488 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, 489 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
489 SkSourceGammaTreatment::kRespect); 490 SkSourceGammaTreatment::kRespect);
490 GrAlwaysAssert(fp); 491 GrAlwaysAssert(fp);
491 return fp; 492 return fp;
492 } 493 }
493 494
494 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor & processor) 495 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor & processor)
495 : fVSVaryingName(nullptr) 496 : fVSVaryingName(nullptr)
496 , fFSVaryingName(nullptr) 497 , fFSVaryingName(nullptr)
497 , fCachedFocal(SK_ScalarMax) { 498 , fCachedFocal(SK_ScalarMax) {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 key[1] = processor.cast<FocalOutside2PtConicalEffect>().isFlipped(); 574 key[1] = processor.cast<FocalOutside2PtConicalEffect>().isFlipped();
574 } 575 }
575 576
576 ////////////////////////////////////////////////////////////////////////////// 577 //////////////////////////////////////////////////////////////////////////////
577 578
578 class GLFocalInside2PtConicalEffect; 579 class GLFocalInside2PtConicalEffect;
579 580
580 class FocalInside2PtConicalEffect : public GrGradientEffect { 581 class FocalInside2PtConicalEffect : public GrGradientEffect {
581 public: 582 public:
582 583
583 static GrFragmentProcessor* Create(GrContext* ctx, 584 static sk_sp<GrFragmentProcessor> Make(GrContext* ctx,
584 const SkTwoPointConicalGradient& shader, 585 const SkTwoPointConicalGradient& shad er,
585 const SkMatrix& matrix, 586 const SkMatrix& matrix,
586 SkShader::TileMode tm, 587 SkShader::TileMode tm,
587 SkScalar focalX) { 588 SkScalar focalX) {
588 return new FocalInside2PtConicalEffect(ctx, shader, matrix, tm, focalX); 589 return sk_sp<GrFragmentProcessor>(
590 new FocalInside2PtConicalEffect(ctx, shader, matrix, tm, focalX));
589 } 591 }
590 592
591 virtual ~FocalInside2PtConicalEffect() {} 593 virtual ~FocalInside2PtConicalEffect() {}
592 594
593 const char* name() const override { 595 const char* name() const override {
594 return "Two-Point Conical Gradient Focal Inside"; 596 return "Two-Point Conical Gradient Focal Inside";
595 } 597 }
596 598
597 SkScalar focal() const { return fFocalX; } 599 SkScalar focal() const { return fFocalX; }
598 600
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 663
662 GrGLSLFragmentProcessor* FocalInside2PtConicalEffect::onCreateGLSLInstance() con st { 664 GrGLSLFragmentProcessor* FocalInside2PtConicalEffect::onCreateGLSLInstance() con st {
663 return new GLFocalInside2PtConicalEffect(*this); 665 return new GLFocalInside2PtConicalEffect(*this);
664 } 666 }
665 667
666 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalInside2PtConicalEffect); 668 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalInside2PtConicalEffect);
667 669
668 /* 670 /*
669 * All Two point conical gradient test create functions may occasionally create edge case shaders 671 * All Two point conical gradient test create functions may occasionally create edge case shaders
670 */ 672 */
671 const GrFragmentProcessor* FocalInside2PtConicalEffect::TestCreate(GrProcessorTe stData* d) { 673 sk_sp<GrFragmentProcessor> FocalInside2PtConicalEffect::TestCreate(GrProcessorTe stData* d) {
672 SkPoint center1 = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}; 674 SkPoint center1 = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()};
673 SkScalar radius1 = 0.f; 675 SkScalar radius1 = 0.f;
674 SkPoint center2; 676 SkPoint center2;
675 SkScalar radius2; 677 SkScalar radius2;
676 do { 678 do {
677 center2.set(d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()); 679 center2.set(d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1());
678 // Below makes sure radius2 is larger enouch such that the focal point 680 // Below makes sure radius2 is larger enouch such that the focal point
679 // is inside the end circle 681 // is inside the end circle
680 SkScalar increase = d->fRandom->nextUScalar1(); 682 SkScalar increase = d->fRandom->nextUScalar1();
681 SkPoint diff = center2 - center1; 683 SkPoint diff = center2 - center1;
682 SkScalar diffLen = diff.length(); 684 SkScalar diffLen = diff.length();
683 radius2 = diffLen + increase; 685 radius2 = diffLen + increase;
684 // If the circles are identical the factory will give us an empty shader . 686 // If the circles are identical the factory will give us an empty shader .
685 } while (radius1 == radius2 && center1 == center2); 687 } while (radius1 == radius2 && center1 == center2);
686 688
687 SkColor colors[kMaxRandomGradientColors]; 689 SkColor colors[kMaxRandomGradientColors];
688 SkScalar stopsArray[kMaxRandomGradientColors]; 690 SkScalar stopsArray[kMaxRandomGradientColors];
689 SkScalar* stops = stopsArray; 691 SkScalar* stops = stopsArray;
690 SkShader::TileMode tm; 692 SkShader::TileMode tm;
691 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); 693 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm);
692 auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center 2, radius2, 694 auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center 2, radius2,
693 colors, stops, colorCoun t, tm); 695 colors, stops, colorCoun t, tm);
694 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, 696 sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(d->fContext,
695 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, 697 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
696 SkSourceGammaTreatment::kRespect); 698 SkSourceGammaTreatment::kRespect);
697 GrAlwaysAssert(fp); 699 GrAlwaysAssert(fp);
698 return fp; 700 return fp;
699 } 701 }
700 702
701 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&) 703 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&)
702 : fVSVaryingName(nullptr) 704 : fVSVaryingName(nullptr)
703 , fFSVaryingName(nullptr) 705 , fFSVaryingName(nullptr)
704 , fCachedFocal(SK_ScalarMax) {} 706 , fCachedFocal(SK_ScalarMax) {}
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 // if A ends up being negative, the start circle is contained completely ins ide the end cirlce 814 // if A ends up being negative, the start circle is contained completely ins ide the end cirlce
813 if (A < 0.f) { 815 if (A < 0.f) {
814 return kInside_ConicalType; 816 return kInside_ConicalType;
815 } 817 }
816 return kOutside_ConicalType; 818 return kOutside_ConicalType;
817 } 819 }
818 820
819 class CircleInside2PtConicalEffect : public GrGradientEffect { 821 class CircleInside2PtConicalEffect : public GrGradientEffect {
820 public: 822 public:
821 823
822 static GrFragmentProcessor* Create(GrContext* ctx, 824 static sk_sp<GrFragmentProcessor> Make(GrContext* ctx,
823 const SkTwoPointConicalGradient& shader, 825 const SkTwoPointConicalGradient& shad er,
824 const SkMatrix& matrix, 826 const SkMatrix& matrix,
825 SkShader::TileMode tm, 827 SkShader::TileMode tm,
826 const CircleConicalInfo& info) { 828 const CircleConicalInfo& info) {
827 return new CircleInside2PtConicalEffect(ctx, shader, matrix, tm, info); 829 return sk_sp<GrFragmentProcessor>(
830 new CircleInside2PtConicalEffect(ctx, shader, matrix, tm, info));
828 } 831 }
829 832
830 virtual ~CircleInside2PtConicalEffect() {} 833 virtual ~CircleInside2PtConicalEffect() {}
831 834
832 const char* name() const override { return "Two-Point Conical Gradient Insid e"; } 835 const char* name() const override { return "Two-Point Conical Gradient Insid e"; }
833 836
834 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } 837 SkScalar centerX() const { return fInfo.fCenterEnd.fX; }
835 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } 838 SkScalar centerY() const { return fInfo.fCenterEnd.fY; }
836 SkScalar A() const { return fInfo.fA; } 839 SkScalar A() const { return fInfo.fA; }
837 SkScalar B() const { return fInfo.fB; } 840 SkScalar B() const { return fInfo.fB; }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
909 912
910 GrGLSLFragmentProcessor* CircleInside2PtConicalEffect::onCreateGLSLInstance() co nst { 913 GrGLSLFragmentProcessor* CircleInside2PtConicalEffect::onCreateGLSLInstance() co nst {
911 return new GLCircleInside2PtConicalEffect(*this); 914 return new GLCircleInside2PtConicalEffect(*this);
912 } 915 }
913 916
914 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleInside2PtConicalEffect); 917 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleInside2PtConicalEffect);
915 918
916 /* 919 /*
917 * All Two point conical gradient test create functions may occasionally create edge case shaders 920 * All Two point conical gradient test create functions may occasionally create edge case shaders
918 */ 921 */
919 const GrFragmentProcessor* CircleInside2PtConicalEffect::TestCreate(GrProcessorT estData* d) { 922 sk_sp<GrFragmentProcessor> CircleInside2PtConicalEffect::TestCreate(GrProcessorT estData* d) {
920 SkPoint center1 = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}; 923 SkPoint center1 = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()};
921 SkScalar radius1 = d->fRandom->nextUScalar1() + 0.0001f; // make sure radius 1 != 0 924 SkScalar radius1 = d->fRandom->nextUScalar1() + 0.0001f; // make sure radius 1 != 0
922 SkPoint center2; 925 SkPoint center2;
923 SkScalar radius2; 926 SkScalar radius2;
924 do { 927 do {
925 center2.set(d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()); 928 center2.set(d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1());
926 // Below makes sure that circle one is contained within circle two 929 // Below makes sure that circle one is contained within circle two
927 SkScalar increase = d->fRandom->nextUScalar1(); 930 SkScalar increase = d->fRandom->nextUScalar1();
928 SkPoint diff = center2 - center1; 931 SkPoint diff = center2 - center1;
929 SkScalar diffLen = diff.length(); 932 SkScalar diffLen = diff.length();
930 radius2 = radius1 + diffLen + increase; 933 radius2 = radius1 + diffLen + increase;
931 // If the circles are identical the factory will give us an empty shader . 934 // If the circles are identical the factory will give us an empty shader .
932 } while (radius1 == radius2 && center1 == center2); 935 } while (radius1 == radius2 && center1 == center2);
933 936
934 SkColor colors[kMaxRandomGradientColors]; 937 SkColor colors[kMaxRandomGradientColors];
935 SkScalar stopsArray[kMaxRandomGradientColors]; 938 SkScalar stopsArray[kMaxRandomGradientColors];
936 SkScalar* stops = stopsArray; 939 SkScalar* stops = stopsArray;
937 SkShader::TileMode tm; 940 SkShader::TileMode tm;
938 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); 941 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm);
939 auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center 2, radius2, 942 auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center 2, radius2,
940 colors, stops, colorCoun t, tm); 943 colors, stops, colorCoun t, tm);
941 const GrFragmentProcessor* fp = shader->asFragmentProcessor(d->fContext, 944 sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(d->fContext,
942 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, 945 GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
943 SkSourceGammaTreatment::kRespect); 946 SkSourceGammaTreatment::kRespect);
944 GrAlwaysAssert(fp); 947 GrAlwaysAssert(fp);
945 return fp; 948 return fp;
946 } 949 }
947 950
948 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrProcessor & processor) 951 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrProcessor & processor)
949 : fVSVaryingName(nullptr) 952 : fVSVaryingName(nullptr)
950 , fFSVaryingName(nullptr) 953 , fFSVaryingName(nullptr)
951 , fCachedCenterX(SK_ScalarMax) 954 , fCachedCenterX(SK_ScalarMax)
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 void GLCircleInside2PtConicalEffect::GenKey(const GrProcessor& processor, 1031 void GLCircleInside2PtConicalEffect::GenKey(const GrProcessor& processor,
1029 const GrGLSLCaps&, GrProcessorKeyBui lder* b) { 1032 const GrGLSLCaps&, GrProcessorKeyBui lder* b) {
1030 b->add32(GenBaseGradientKey(processor)); 1033 b->add32(GenBaseGradientKey(processor));
1031 } 1034 }
1032 1035
1033 ////////////////////////////////////////////////////////////////////////////// 1036 //////////////////////////////////////////////////////////////////////////////
1034 1037
1035 class CircleOutside2PtConicalEffect : public GrGradientEffect { 1038 class CircleOutside2PtConicalEffect : public GrGradientEffect {
1036 public: 1039 public:
1037 1040
1038 static GrFragmentProcessor* Create(GrContext* ctx, 1041 static sk_sp<GrFragmentProcessor> Make(GrContext* ctx,
1039 const SkTwoPointConicalGradient& shader, 1042 const SkTwoPointConicalGradient& shad er,
1040 const SkMatrix& matrix, 1043 const SkMatrix& matrix,
1041 SkShader::TileMode tm, 1044 SkShader::TileMode tm,
1042 const CircleConicalInfo& info) { 1045 const CircleConicalInfo& info) {
1043 return new CircleOutside2PtConicalEffect(ctx, shader, matrix, tm, info); 1046 return sk_sp<GrFragmentProcessor>(
1047 new CircleOutside2PtConicalEffect(ctx, shader, matrix, tm, info));
1044 } 1048 }
1045 1049
1046 virtual ~CircleOutside2PtConicalEffect() {} 1050 virtual ~CircleOutside2PtConicalEffect() {}
1047 1051
1048 const char* name() const override { return "Two-Point Conical Gradient Outsi de"; } 1052 const char* name() const override { return "Two-Point Conical Gradient Outsi de"; }
1049 1053
1050 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } 1054 SkScalar centerX() const { return fInfo.fCenterEnd.fX; }
1051 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } 1055 SkScalar centerY() const { return fInfo.fCenterEnd.fY; }
1052 SkScalar A() const { return fInfo.fA; } 1056 SkScalar A() const { return fInfo.fA; }
1053 SkScalar B() const { return fInfo.fB; } 1057 SkScalar B() const { return fInfo.fB; }
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1140 1144
1141 GrGLSLFragmentProcessor* CircleOutside2PtConicalEffect::onCreateGLSLInstance() c onst { 1145 GrGLSLFragmentProcessor* CircleOutside2PtConicalEffect::onCreateGLSLInstance() c onst {
1142 return new GLCircleOutside2PtConicalEffect(*this); 1146 return new GLCircleOutside2PtConicalEffect(*this);
1143 } 1147 }
1144 1148
1145 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleOutside2PtConicalEffect); 1149 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleOutside2PtConicalEffect);
1146 1150
1147 /* 1151 /*
1148 * All Two point conical gradient test create functions may occasionally create edge case shaders 1152 * All Two point conical gradient test create functions may occasionally create edge case shaders
1149 */ 1153 */
1150 const GrFragmentProcessor* CircleOutside2PtConicalEffect::TestCreate(GrProcessor TestData* d) { 1154 sk_sp<GrFragmentProcessor> CircleOutside2PtConicalEffect::TestCreate(GrProcessor TestData* d) {
1151 SkPoint center1 = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()}; 1155 SkPoint center1 = {d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()};
1152 SkScalar radius1 = d->fRandom->nextUScalar1() + 0.0001f; // make sure radius 1 != 0 1156 SkScalar radius1 = d->fRandom->nextUScalar1() + 0.0001f; // make sure radius 1 != 0
1153 SkPoint center2; 1157 SkPoint center2;
1154 SkScalar radius2; 1158 SkScalar radius2;
1155 SkScalar diffLen; 1159 SkScalar diffLen;
1156 do { 1160 do {
1157 center2.set(d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1()); 1161 center2.set(d->fRandom->nextUScalar1(), d->fRandom->nextUScalar1());
1158 // If the circles share a center than we can't be in the outside case 1162 // If the circles share a center than we can't be in the outside case
1159 } while (center1 == center2); 1163 } while (center1 == center2);
1160 SkPoint diff = center2 - center1; 1164 SkPoint diff = center2 - center1;
1161 diffLen = diff.length(); 1165 diffLen = diff.length();
1162 // Below makes sure that circle one is not contained within circle two 1166 // Below makes sure that circle one is not contained within circle two
1163 // and have radius2 >= radius to match sorting on cpu side 1167 // and have radius2 >= radius to match sorting on cpu side
1164 radius2 = radius1 + d->fRandom->nextRangeF(0.f, diffLen); 1168 radius2 = radius1 + d->fRandom->nextRangeF(0.f, diffLen);
1165 1169
1166 SkColor colors[kMaxRandomGradientColors]; 1170 SkColor colors[kMaxRandomGradientColors];
1167 SkScalar stopsArray[kMaxRandomGradientColors]; 1171 SkScalar stopsArray[kMaxRandomGradientColors];
1168 SkScalar* stops = stopsArray; 1172 SkScalar* stops = stopsArray;
1169 SkShader::TileMode tm; 1173 SkShader::TileMode tm;
1170 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm); 1174 int colorCount = RandomGradientParams(d->fRandom, colors, &stops, &tm);
1171 auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center 2, radius2, 1175 auto shader = SkGradientShader::MakeTwoPointConical(center1, radius1, center 2, radius2,
1172 colors, stops, colorCoun t, tm); 1176 colors, stops, colorCoun t, tm);
1173 const GrFragmentProcessor* fp = shader->asFragmentProcessor( 1177 sk_sp<GrFragmentProcessor> fp = shader->asFragmentProcessor(
1174 d->fContext,GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality, 1178 d->fContext,GrTest::TestMatrix(d->fRandom), NULL, kNone_SkFilterQuality,
1175 SkSourceGammaTreatment::kRespect); 1179 SkSourceGammaTreatment::kRespect);
1176 GrAlwaysAssert(fp); 1180 GrAlwaysAssert(fp);
1177 return fp; 1181 return fp;
1178 } 1182 }
1179 1183
1180 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrProcess or& processor) 1184 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrProcess or& processor)
1181 : fVSVaryingName(nullptr) 1185 : fVSVaryingName(nullptr)
1182 , fFSVaryingName(nullptr) 1186 , fFSVaryingName(nullptr)
1183 , fCachedCenterX(SK_ScalarMax) 1187 , fCachedCenterX(SK_ScalarMax)
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 1288
1285 void GLCircleOutside2PtConicalEffect::GenKey(const GrProcessor& processor, 1289 void GLCircleOutside2PtConicalEffect::GenKey(const GrProcessor& processor,
1286 const GrGLSLCaps&, GrProcessorKeyBu ilder* b) { 1290 const GrGLSLCaps&, GrProcessorKeyBu ilder* b) {
1287 uint32_t* key = b->add32n(2); 1291 uint32_t* key = b->add32n(2);
1288 key[0] = GenBaseGradientKey(processor); 1292 key[0] = GenBaseGradientKey(processor);
1289 key[1] = processor.cast<CircleOutside2PtConicalEffect>().isFlipped(); 1293 key[1] = processor.cast<CircleOutside2PtConicalEffect>().isFlipped();
1290 } 1294 }
1291 1295
1292 ////////////////////////////////////////////////////////////////////////////// 1296 //////////////////////////////////////////////////////////////////////////////
1293 1297
1294 GrFragmentProcessor* Gr2PtConicalGradientEffect::Create(GrContext* ctx, 1298 sk_sp<GrFragmentProcessor> Gr2PtConicalGradientEffect::Make(GrContext* ctx,
1295 const SkTwoPointConicalG radient& shader, 1299 const SkTwoPointConi calGradient& shader,
1296 SkShader::TileMode tm, 1300 SkShader::TileMode t m,
1297 const SkMatrix* localMat rix) { 1301 const SkMatrix* loca lMatrix) {
1298 SkMatrix matrix; 1302 SkMatrix matrix;
1299 if (!shader.getLocalMatrix().invert(&matrix)) { 1303 if (!shader.getLocalMatrix().invert(&matrix)) {
1300 return nullptr; 1304 return nullptr;
1301 } 1305 }
1302 if (localMatrix) { 1306 if (localMatrix) {
1303 SkMatrix inv; 1307 SkMatrix inv;
1304 if (!localMatrix->invert(&inv)) { 1308 if (!localMatrix->invert(&inv)) {
1305 return nullptr; 1309 return nullptr;
1306 } 1310 }
1307 matrix.postConcat(inv); 1311 matrix.postConcat(inv);
1308 } 1312 }
1309 1313
1310 if (shader.getStartRadius() < kErrorTol) { 1314 if (shader.getStartRadius() < kErrorTol) {
1311 SkScalar focalX; 1315 SkScalar focalX;
1312 ConicalType type = set_matrix_focal_conical(shader, &matrix, &focalX); 1316 ConicalType type = set_matrix_focal_conical(shader, &matrix, &focalX);
1313 if (type == kInside_ConicalType) { 1317 if (type == kInside_ConicalType) {
1314 return FocalInside2PtConicalEffect::Create(ctx, shader, matrix, tm, focalX); 1318 return FocalInside2PtConicalEffect::Make(ctx, shader, matrix, tm, fo calX);
1315 } else if(type == kEdge_ConicalType) { 1319 } else if(type == kEdge_ConicalType) {
1316 set_matrix_edge_conical(shader, &matrix); 1320 set_matrix_edge_conical(shader, &matrix);
1317 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); 1321 return Edge2PtConicalEffect::Make(ctx, shader, matrix, tm);
1318 } else { 1322 } else {
1319 return FocalOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, focalX); 1323 return FocalOutside2PtConicalEffect::Make(ctx, shader, matrix, tm, f ocalX);
1320 } 1324 }
1321 } 1325 }
1322 1326
1323 CircleConicalInfo info; 1327 CircleConicalInfo info;
1324 ConicalType type = set_matrix_circle_conical(shader, &matrix, &info); 1328 ConicalType type = set_matrix_circle_conical(shader, &matrix, &info);
1325 1329
1326 if (type == kInside_ConicalType) { 1330 if (type == kInside_ConicalType) {
1327 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf o); 1331 return CircleInside2PtConicalEffect::Make(ctx, shader, matrix, tm, info) ;
1328 } else if (type == kEdge_ConicalType) { 1332 } else if (type == kEdge_ConicalType) {
1329 set_matrix_edge_conical(shader, &matrix); 1333 set_matrix_edge_conical(shader, &matrix);
1330 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); 1334 return Edge2PtConicalEffect::Make(ctx, shader, matrix, tm);
1331 } else { 1335 } else {
1332 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in fo); 1336 return CircleOutside2PtConicalEffect::Make(ctx, shader, matrix, tm, info );
1333 } 1337 }
1334 } 1338 }
1335 1339
1336 #endif 1340 #endif
OLDNEW
« no previous file with comments | « src/effects/gradients/SkTwoPointConicalGradient_gpu.h ('k') | src/gpu/GrBlurUtils.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698