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 |
11 #include "SkTwoPointConicalGradient.h" | 11 #include "SkTwoPointConicalGradient.h" |
12 | 12 |
13 #if SK_SUPPORT_GPU | 13 #if SK_SUPPORT_GPU |
14 #include "GrPaint.h" | 14 #include "GrPaint.h" |
15 #include "gl/builders/GrGLProgramBuilder.h" | 15 #include "gl/builders/GrGLProgramBuilder.h" |
| 16 #include "glsl/GrGLSLProgramDataManager.h" |
16 // For brevity | 17 // For brevity |
17 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 18 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
18 | 19 |
19 static const SkScalar kErrorTol = 0.00001f; | 20 static const SkScalar kErrorTol = 0.00001f; |
20 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol; | 21 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol; |
21 | 22 |
22 /** | 23 /** |
23 * We have three general cases for 2pt conical gradients. First we always assume
that | 24 * We have three general cases for 2pt conical gradients. First we always assume
that |
24 * the start radius <= end radius. Our first case (kInside_) is when the start c
ircle | 25 * the start radius <= end radius. Our first case (kInside_) is when the start c
ircle |
25 * is completely enclosed by the end circle. The second case (kOutside_) is the
case | 26 * is completely enclosed by the end circle. The second case (kOutside_) is the
case |
26 * when the start circle is either completely outside the end circle or the circ
les | 27 * when the start circle is either completely outside the end circle or the circ
les |
27 * overlap. The final case (kEdge_) is when the start circle is inside the end o
ne, | 28 * overlap. The final case (kEdge_) is when the start circle is inside the end o
ne, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 class GLEdge2PtConicalEffect : public GrGLGradientEffect { | 141 class GLEdge2PtConicalEffect : public GrGLGradientEffect { |
141 public: | 142 public: |
142 GLEdge2PtConicalEffect(const GrProcessor&); | 143 GLEdge2PtConicalEffect(const GrProcessor&); |
143 virtual ~GLEdge2PtConicalEffect() { } | 144 virtual ~GLEdge2PtConicalEffect() { } |
144 | 145 |
145 virtual void emitCode(EmitArgs&) override; | 146 virtual void emitCode(EmitArgs&) override; |
146 | 147 |
147 static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKe
yBuilder* b); | 148 static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKe
yBuilder* b); |
148 | 149 |
149 protected: | 150 protected: |
150 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 151 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
151 | 152 |
152 UniformHandle fParamUni; | 153 UniformHandle fParamUni; |
153 | 154 |
154 const char* fVSVaryingName; | 155 const char* fVSVaryingName; |
155 const char* fFSVaryingName; | 156 const char* fFSVaryingName; |
156 | 157 |
157 // @{ | 158 // @{ |
158 /// Values last uploaded as uniforms | 159 /// Values last uploaded as uniforms |
159 | 160 |
160 SkScalar fCachedRadius; | 161 SkScalar fCachedRadius; |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 | 267 |
267 // if r(t) > 0, then t will be the x coordinate | 268 // if r(t) > 0, then t will be the x coordinate |
268 fsBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(), | 269 fsBuilder->codeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(), |
269 p2.c_str(), p0.c_str()); | 270 p2.c_str(), p0.c_str()); |
270 fsBuilder->codeAppend("\t"); | 271 fsBuilder->codeAppend("\t"); |
271 this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fI
nputColor, | 272 this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fI
nputColor, |
272 args.fSamplers); | 273 args.fSamplers); |
273 fsBuilder->codeAppend("\t}\n"); | 274 fsBuilder->codeAppend("\t}\n"); |
274 } | 275 } |
275 | 276 |
276 void GLEdge2PtConicalEffect::onSetData(const GrGLProgramDataManager& pdman, | 277 void GLEdge2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pdman, |
277 const GrProcessor& processor) { | 278 const GrProcessor& processor) { |
278 INHERITED::onSetData(pdman, processor); | 279 INHERITED::onSetData(pdman, processor); |
279 const Edge2PtConicalEffect& data = processor.cast<Edge2PtConicalEffect>(); | 280 const Edge2PtConicalEffect& data = processor.cast<Edge2PtConicalEffect>(); |
280 SkScalar radius0 = data.radius(); | 281 SkScalar radius0 = data.radius(); |
281 SkScalar diffRadius = data.diffRadius(); | 282 SkScalar diffRadius = data.diffRadius(); |
282 | 283 |
283 if (fCachedRadius != radius0 || | 284 if (fCachedRadius != radius0 || |
284 fCachedDiffRadius != diffRadius) { | 285 fCachedDiffRadius != diffRadius) { |
285 | 286 |
286 float values[3] = { | 287 float values[3] = { |
287 SkScalarToFloat(radius0), | 288 SkScalarToFloat(radius0), |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect { | 417 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect { |
417 public: | 418 public: |
418 GLFocalOutside2PtConicalEffect(const GrProcessor&); | 419 GLFocalOutside2PtConicalEffect(const GrProcessor&); |
419 virtual ~GLFocalOutside2PtConicalEffect() { } | 420 virtual ~GLFocalOutside2PtConicalEffect() { } |
420 | 421 |
421 virtual void emitCode(EmitArgs&) override; | 422 virtual void emitCode(EmitArgs&) override; |
422 | 423 |
423 static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKe
yBuilder* b); | 424 static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKe
yBuilder* b); |
424 | 425 |
425 protected: | 426 protected: |
426 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 427 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
427 | 428 |
428 UniformHandle fParamUni; | 429 UniformHandle fParamUni; |
429 | 430 |
430 const char* fVSVaryingName; | 431 const char* fVSVaryingName; |
431 const char* fFSVaryingName; | 432 const char* fFSVaryingName; |
432 | 433 |
433 bool fIsFlipped; | 434 bool fIsFlipped; |
434 | 435 |
435 // @{ | 436 // @{ |
436 /// Values last uploaded as uniforms | 437 /// Values last uploaded as uniforms |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 coords2D, p0.c_str()); | 534 coords2D, p0.c_str()); |
534 } | 535 } |
535 | 536 |
536 fsBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str()); | 537 fsBuilder->codeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str()); |
537 fsBuilder->codeAppend("\t\t"); | 538 fsBuilder->codeAppend("\t\t"); |
538 this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fI
nputColor, | 539 this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fI
nputColor, |
539 args.fSamplers); | 540 args.fSamplers); |
540 fsBuilder->codeAppend("\t}\n"); | 541 fsBuilder->codeAppend("\t}\n"); |
541 } | 542 } |
542 | 543 |
543 void GLFocalOutside2PtConicalEffect::onSetData(const GrGLProgramDataManager& pdm
an, | 544 void GLFocalOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p
dman, |
544 const GrProcessor& processor) { | 545 const GrProcessor& processor) { |
545 INHERITED::onSetData(pdman, processor); | 546 INHERITED::onSetData(pdman, processor); |
546 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon
icalEffect>(); | 547 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon
icalEffect>(); |
547 SkASSERT(data.isFlipped() == fIsFlipped); | 548 SkASSERT(data.isFlipped() == fIsFlipped); |
548 SkScalar focal = data.focal(); | 549 SkScalar focal = data.focal(); |
549 | 550 |
550 if (fCachedFocal != focal) { | 551 if (fCachedFocal != focal) { |
551 SkScalar oneMinus2F = 1.f - SkScalarMul(focal, focal); | 552 SkScalar oneMinus2F = 1.f - SkScalarMul(focal, focal); |
552 | 553 |
553 float values[2] = { | 554 float values[2] = { |
554 SkScalarToFloat(focal), | 555 SkScalarToFloat(focal), |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
622 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect { | 623 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect { |
623 public: | 624 public: |
624 GLFocalInside2PtConicalEffect(const GrProcessor&); | 625 GLFocalInside2PtConicalEffect(const GrProcessor&); |
625 virtual ~GLFocalInside2PtConicalEffect() {} | 626 virtual ~GLFocalInside2PtConicalEffect() {} |
626 | 627 |
627 virtual void emitCode(EmitArgs&) override; | 628 virtual void emitCode(EmitArgs&) override; |
628 | 629 |
629 static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKe
yBuilder* b); | 630 static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKe
yBuilder* b); |
630 | 631 |
631 protected: | 632 protected: |
632 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 633 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
633 | 634 |
634 UniformHandle fFocalUni; | 635 UniformHandle fFocalUni; |
635 | 636 |
636 const char* fVSVaryingName; | 637 const char* fVSVaryingName; |
637 const char* fFSVaryingName; | 638 const char* fFSVaryingName; |
638 | 639 |
639 // @{ | 640 // @{ |
640 /// Values last uploaded as uniforms | 641 /// Values last uploaded as uniforms |
641 | 642 |
642 SkScalar fCachedFocal; | 643 SkScalar fCachedFocal; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
716 const char* coords2D = coords2DString.c_str(); | 717 const char* coords2D = coords2DString.c_str(); |
717 | 718 |
718 // t = p.x * focalX + length(p) | 719 // t = p.x * focalX + length(p) |
719 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_st
r(), | 720 fsBuilder->codeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_st
r(), |
720 coords2D, focal.c_str(), coords2D); | 721 coords2D, focal.c_str(), coords2D); |
721 | 722 |
722 this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fI
nputColor, | 723 this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fI
nputColor, |
723 args.fSamplers); | 724 args.fSamplers); |
724 } | 725 } |
725 | 726 |
726 void GLFocalInside2PtConicalEffect::onSetData(const GrGLProgramDataManager& pdma
n, | 727 void GLFocalInside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& pd
man, |
727 const GrProcessor& processor) { | 728 const GrProcessor& processor) { |
728 INHERITED::onSetData(pdman, processor); | 729 INHERITED::onSetData(pdman, processor); |
729 const FocalInside2PtConicalEffect& data = processor.cast<FocalInside2PtConic
alEffect>(); | 730 const FocalInside2PtConicalEffect& data = processor.cast<FocalInside2PtConic
alEffect>(); |
730 SkScalar focal = data.focal(); | 731 SkScalar focal = data.focal(); |
731 | 732 |
732 if (fCachedFocal != focal) { | 733 if (fCachedFocal != focal) { |
733 pdman.set1f(fFocalUni, SkScalarToFloat(focal)); | 734 pdman.set1f(fFocalUni, SkScalarToFloat(focal)); |
734 fCachedFocal = focal; | 735 fCachedFocal = focal; |
735 } | 736 } |
736 } | 737 } |
737 | 738 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
859 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect { | 860 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect { |
860 public: | 861 public: |
861 GLCircleInside2PtConicalEffect(const GrProcessor&); | 862 GLCircleInside2PtConicalEffect(const GrProcessor&); |
862 virtual ~GLCircleInside2PtConicalEffect() {} | 863 virtual ~GLCircleInside2PtConicalEffect() {} |
863 | 864 |
864 virtual void emitCode(EmitArgs&) override; | 865 virtual void emitCode(EmitArgs&) override; |
865 | 866 |
866 static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKe
yBuilder* b); | 867 static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKe
yBuilder* b); |
867 | 868 |
868 protected: | 869 protected: |
869 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 870 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
870 | 871 |
871 UniformHandle fCenterUni; | 872 UniformHandle fCenterUni; |
872 UniformHandle fParamUni; | 873 UniformHandle fParamUni; |
873 | 874 |
874 const char* fVSVaryingName; | 875 const char* fVSVaryingName; |
875 const char* fFSVaryingName; | 876 const char* fFSVaryingName; |
876 | 877 |
877 // @{ | 878 // @{ |
878 /// Values last uploaded as uniforms | 879 /// Values last uploaded as uniforms |
879 | 880 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
976 fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D
); | 977 fsBuilder->codeAppendf("\tfloat pDotp = dot(%s, %s);\n", coords2D, coords2D
); |
977 fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente
r.c_str(), | 978 fsBuilder->codeAppendf("\tfloat d = dot(%s, %s) + %s.y;\n", coords2D, cente
r.c_str(), |
978 params.c_str()); | 979 params.c_str()); |
979 fsBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\
n", | 980 fsBuilder->codeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\
n", |
980 tName.c_str(), params.c_str(), params.c_str()); | 981 tName.c_str(), params.c_str(), params.c_str()); |
981 | 982 |
982 this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fI
nputColor, | 983 this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fI
nputColor, |
983 args.fSamplers); | 984 args.fSamplers); |
984 } | 985 } |
985 | 986 |
986 void GLCircleInside2PtConicalEffect::onSetData(const GrGLProgramDataManager& pdm
an, | 987 void GLCircleInside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager& p
dman, |
987 const GrProcessor& processor) { | 988 const GrProcessor& processor) { |
988 INHERITED::onSetData(pdman, processor); | 989 INHERITED::onSetData(pdman, processor); |
989 const CircleInside2PtConicalEffect& data = processor.cast<CircleInside2PtCon
icalEffect>(); | 990 const CircleInside2PtConicalEffect& data = processor.cast<CircleInside2PtCon
icalEffect>(); |
990 SkScalar centerX = data.centerX(); | 991 SkScalar centerX = data.centerX(); |
991 SkScalar centerY = data.centerY(); | 992 SkScalar centerY = data.centerY(); |
992 SkScalar A = data.A(); | 993 SkScalar A = data.A(); |
993 SkScalar B = data.B(); | 994 SkScalar B = data.B(); |
994 SkScalar C = data.C(); | 995 SkScalar C = data.C(); |
995 | 996 |
996 if (fCachedCenterX != centerX || fCachedCenterY != centerY || | 997 if (fCachedCenterX != centerX || fCachedCenterY != centerY || |
997 fCachedA != A || fCachedB != B || fCachedC != C) { | 998 fCachedA != A || fCachedB != B || fCachedC != C) { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1081 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect { | 1082 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect { |
1082 public: | 1083 public: |
1083 GLCircleOutside2PtConicalEffect(const GrProcessor&); | 1084 GLCircleOutside2PtConicalEffect(const GrProcessor&); |
1084 virtual ~GLCircleOutside2PtConicalEffect() {} | 1085 virtual ~GLCircleOutside2PtConicalEffect() {} |
1085 | 1086 |
1086 virtual void emitCode(EmitArgs&) override; | 1087 virtual void emitCode(EmitArgs&) override; |
1087 | 1088 |
1088 static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKe
yBuilder* b); | 1089 static void GenKey(const GrProcessor&, const GrGLSLCaps& caps, GrProcessorKe
yBuilder* b); |
1089 | 1090 |
1090 protected: | 1091 protected: |
1091 void onSetData(const GrGLProgramDataManager&, const GrProcessor&) override; | 1092 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override
; |
1092 | 1093 |
1093 UniformHandle fCenterUni; | 1094 UniformHandle fCenterUni; |
1094 UniformHandle fParamUni; | 1095 UniformHandle fParamUni; |
1095 | 1096 |
1096 const char* fVSVaryingName; | 1097 const char* fVSVaryingName; |
1097 const char* fFSVaryingName; | 1098 const char* fFSVaryingName; |
1098 | 1099 |
1099 bool fIsFlipped; | 1100 bool fIsFlipped; |
1100 | 1101 |
1101 // @{ | 1102 // @{ |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1222 fsBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str())
; | 1223 fsBuilder->codeAppendf("\tfloat %s = d - sqrt(deter);\n", tName.c_str())
; |
1223 } | 1224 } |
1224 | 1225 |
1225 fsBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str(
), params.c_str()); | 1226 fsBuilder->codeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str(
), params.c_str()); |
1226 fsBuilder->codeAppend("\t\t"); | 1227 fsBuilder->codeAppend("\t\t"); |
1227 this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fI
nputColor, | 1228 this->emitColor(args.fBuilder, ge, tName.c_str(), args.fOutputColor, args.fI
nputColor, |
1228 args.fSamplers); | 1229 args.fSamplers); |
1229 fsBuilder->codeAppend("\t}\n"); | 1230 fsBuilder->codeAppend("\t}\n"); |
1230 } | 1231 } |
1231 | 1232 |
1232 void GLCircleOutside2PtConicalEffect::onSetData(const GrGLProgramDataManager& pd
man, | 1233 void GLCircleOutside2PtConicalEffect::onSetData(const GrGLSLProgramDataManager&
pdman, |
1233 const GrProcessor& processor) { | 1234 const GrProcessor& processor) { |
1234 INHERITED::onSetData(pdman, processor); | 1235 INHERITED::onSetData(pdman, processor); |
1235 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC
onicalEffect>(); | 1236 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC
onicalEffect>(); |
1236 SkASSERT(data.isFlipped() == fIsFlipped); | 1237 SkASSERT(data.isFlipped() == fIsFlipped); |
1237 SkScalar centerX = data.centerX(); | 1238 SkScalar centerX = data.centerX(); |
1238 SkScalar centerY = data.centerY(); | 1239 SkScalar centerY = data.centerY(); |
1239 SkScalar A = data.A(); | 1240 SkScalar A = data.A(); |
1240 SkScalar B = data.B(); | 1241 SkScalar B = data.B(); |
1241 SkScalar C = data.C(); | 1242 SkScalar C = data.C(); |
1242 SkScalar tLimit = data.tLimit(); | 1243 SkScalar tLimit = data.tLimit(); |
1243 | 1244 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1302 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf
o); | 1303 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf
o); |
1303 } else if (type == kEdge_ConicalType) { | 1304 } else if (type == kEdge_ConicalType) { |
1304 set_matrix_edge_conical(shader, &matrix); | 1305 set_matrix_edge_conical(shader, &matrix); |
1305 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); | 1306 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); |
1306 } else { | 1307 } else { |
1307 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); | 1308 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); |
1308 } | 1309 } |
1309 } | 1310 } |
1310 | 1311 |
1311 #endif | 1312 #endif |
OLD | NEW |