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 "GrTBackendProcessorFactory.h" | |
15 #include "gl/builders/GrGLProgramBuilder.h" | 14 #include "gl/builders/GrGLProgramBuilder.h" |
16 // For brevity | 15 // For brevity |
17 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 16 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
18 | 17 |
19 static const SkScalar kErrorTol = 0.00001f; | 18 static const SkScalar kErrorTol = 0.00001f; |
20 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol; | 19 static const SkScalar kEdgeErrorTol = 5.f * kErrorTol; |
21 | 20 |
22 /** | 21 /** |
23 * We have three general cases for 2pt conical gradients. First we always assume
that | 22 * 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 | 23 * the start radius <= end radius. Our first case (kInside_) is when the start c
ircle |
(...skipping 23 matching lines...) Expand all Loading... |
48 SkScalar diffLen = diff.length(); | 47 SkScalar diffLen = diff.length(); |
49 if (0 != diffLen) { | 48 if (0 != diffLen) { |
50 SkScalar invDiffLen = SkScalarInvert(diffLen); | 49 SkScalar invDiffLen = SkScalarInvert(diffLen); |
51 SkMatrix rot; | 50 SkMatrix rot; |
52 rot.setSinCos(-SkScalarMul(invDiffLen, diff.fY), | 51 rot.setSinCos(-SkScalarMul(invDiffLen, diff.fY), |
53 SkScalarMul(invDiffLen, diff.fX)); | 52 SkScalarMul(invDiffLen, diff.fX)); |
54 invLMatrix->postConcat(rot); | 53 invLMatrix->postConcat(rot); |
55 } | 54 } |
56 } | 55 } |
57 | 56 |
58 class GLEdge2PtConicalEffect; | |
59 | |
60 class Edge2PtConicalEffect : public GrGradientEffect { | 57 class Edge2PtConicalEffect : public GrGradientEffect { |
61 public: | 58 public: |
62 | 59 |
63 static GrFragmentProcessor* Create(GrContext* ctx, | 60 static GrFragmentProcessor* Create(GrContext* ctx, |
64 const SkTwoPointConicalGradient& shader, | 61 const SkTwoPointConicalGradient& shader, |
65 const SkMatrix& matrix, | 62 const SkMatrix& matrix, |
66 SkShader::TileMode tm) { | 63 SkShader::TileMode tm) { |
67 return SkNEW_ARGS(Edge2PtConicalEffect, (ctx, shader, matrix, tm)); | 64 return SkNEW_ARGS(Edge2PtConicalEffect, (ctx, shader, matrix, tm)); |
68 } | 65 } |
69 | 66 |
70 virtual ~Edge2PtConicalEffect() {} | 67 virtual ~Edge2PtConicalEffect() {} |
71 | 68 |
72 static const char* Name() { return "Two-Point Conical Gradient Edge Touching
"; } | 69 virtual const char* name() const SK_OVERRIDE { |
73 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | 70 return "Two-Point Conical Gradient Edge Touching"; |
| 71 } |
| 72 |
| 73 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons
t SK_OVERRIDE; |
| 74 |
| 75 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
74 | 76 |
75 // 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. |
76 SkScalar center() const { return fCenterX1; } | 78 SkScalar center() const { return fCenterX1; } |
77 SkScalar diffRadius() const { return fDiffRadius; } | 79 SkScalar diffRadius() const { return fDiffRadius; } |
78 SkScalar radius() const { return fRadius0; } | 80 SkScalar radius() const { return fRadius0; } |
79 | 81 |
80 typedef GLEdge2PtConicalEffect GLProcessor; | |
81 | |
82 private: | 82 private: |
83 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 83 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
84 const Edge2PtConicalEffect& s = sBase.cast<Edge2PtConicalEffect>(); | 84 const Edge2PtConicalEffect& s = sBase.cast<Edge2PtConicalEffect>(); |
85 return (INHERITED::onIsEqual(sBase) && | 85 return (INHERITED::onIsEqual(sBase) && |
86 this->fCenterX1 == s.fCenterX1 && | 86 this->fCenterX1 == s.fCenterX1 && |
87 this->fRadius0 == s.fRadius0 && | 87 this->fRadius0 == s.fRadius0 && |
88 this->fDiffRadius == s.fDiffRadius); | 88 this->fDiffRadius == s.fDiffRadius); |
89 } | 89 } |
90 | 90 |
91 Edge2PtConicalEffect(GrContext* ctx, | 91 Edge2PtConicalEffect(GrContext* ctx, |
92 const SkTwoPointConicalGradient& shader, | 92 const SkTwoPointConicalGradient& shader, |
93 const SkMatrix& matrix, | 93 const SkMatrix& matrix, |
94 SkShader::TileMode tm) | 94 SkShader::TileMode tm) |
95 : INHERITED(ctx, shader, matrix, tm), | 95 : INHERITED(ctx, shader, matrix, tm), |
96 fCenterX1(shader.getCenterX1()), | 96 fCenterX1(shader.getCenterX1()), |
97 fRadius0(shader.getStartRadius()), | 97 fRadius0(shader.getStartRadius()), |
98 fDiffRadius(shader.getDiffRadius()){ | 98 fDiffRadius(shader.getDiffRadius()){ |
| 99 this->initClassID<Edge2PtConicalEffect>(); |
99 // We should only be calling this shader if we are degenerate case with
touching circles | 100 // We should only be calling this shader if we are degenerate case with
touching circles |
100 // When deciding if we are in edge case, we scaled by the end radius for
cases when the | 101 // When deciding if we are in edge case, we scaled by the end radius for
cases when the |
101 // start radius was close to zero, otherwise we scaled by the start radi
us. In addition | 102 // start radius was close to zero, otherwise we scaled by the start radi
us. In addition |
102 // Our test for the edge case in set_matrix_circle_conical has a higher
tolerance so we | 103 // Our test for the edge case in set_matrix_circle_conical has a higher
tolerance so we |
103 // need the sqrt value below | 104 // need the sqrt value below |
104 SkASSERT(SkScalarAbs(SkScalarAbs(fDiffRadius) - fCenterX1) < | 105 SkASSERT(SkScalarAbs(SkScalarAbs(fDiffRadius) - fCenterX1) < |
105 (fRadius0 < kErrorTol ? shader.getEndRadius() * kEdgeErrorTol : | 106 (fRadius0 < kErrorTol ? shader.getEndRadius() * kEdgeErrorTol : |
106 fRadius0 * sqrt(kEdgeErrorTol))); | 107 fRadius0 * sqrt(kEdgeErrorTol))); |
107 | 108 |
108 // We pass the linear part of the quadratic as a varying. | 109 // We pass the linear part of the quadratic as a varying. |
(...skipping 21 matching lines...) Expand all Loading... |
130 SkScalar fRadius0; | 131 SkScalar fRadius0; |
131 SkScalar fDiffRadius; | 132 SkScalar fDiffRadius; |
132 | 133 |
133 // @} | 134 // @} |
134 | 135 |
135 typedef GrGradientEffect INHERITED; | 136 typedef GrGradientEffect INHERITED; |
136 }; | 137 }; |
137 | 138 |
138 class GLEdge2PtConicalEffect : public GrGLGradientEffect { | 139 class GLEdge2PtConicalEffect : public GrGLGradientEffect { |
139 public: | 140 public: |
140 GLEdge2PtConicalEffect(const GrBackendProcessorFactory& factory, const GrPro
cessor&); | 141 GLEdge2PtConicalEffect(const GrProcessor&); |
141 virtual ~GLEdge2PtConicalEffect() { } | 142 virtual ~GLEdge2PtConicalEffect() { } |
142 | 143 |
143 virtual void emitCode(GrGLFPBuilder*, | 144 virtual void emitCode(GrGLFPBuilder*, |
144 const GrFragmentProcessor&, | 145 const GrFragmentProcessor&, |
145 const char* outputColor, | 146 const char* outputColor, |
146 const char* inputColor, | 147 const char* inputColor, |
147 const TransformedCoordsArray&, | 148 const TransformedCoordsArray&, |
148 const TextureSamplerArray&) SK_OVERRIDE; | 149 const TextureSamplerArray&) SK_OVERRIDE; |
149 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 150 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
150 | 151 |
(...skipping 11 matching lines...) Expand all Loading... |
162 SkScalar fCachedRadius; | 163 SkScalar fCachedRadius; |
163 SkScalar fCachedDiffRadius; | 164 SkScalar fCachedDiffRadius; |
164 | 165 |
165 // @} | 166 // @} |
166 | 167 |
167 private: | 168 private: |
168 typedef GrGLGradientEffect INHERITED; | 169 typedef GrGLGradientEffect INHERITED; |
169 | 170 |
170 }; | 171 }; |
171 | 172 |
172 const GrBackendFragmentProcessorFactory& Edge2PtConicalEffect::getFactory() cons
t { | 173 void Edge2PtConicalEffect::getGLProcessorKey(const GrGLCaps& caps, |
173 return GrTBackendFragmentProcessorFactory<Edge2PtConicalEffect>::getInstance
(); | 174 GrProcessorKeyBuilder* b) const { |
| 175 GLEdge2PtConicalEffect::GenKey(*this, caps, b); |
| 176 } |
| 177 |
| 178 GrGLFragmentProcessor* Edge2PtConicalEffect::createGLInstance() const { |
| 179 return SkNEW_ARGS(GLEdge2PtConicalEffect, (*this)); |
174 } | 180 } |
175 | 181 |
176 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Edge2PtConicalEffect); | 182 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Edge2PtConicalEffect); |
177 | 183 |
178 /* | 184 /* |
179 * 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 |
180 */ | 186 */ |
181 GrFragmentProcessor* Edge2PtConicalEffect::TestCreate(SkRandom* random, | 187 GrFragmentProcessor* Edge2PtConicalEffect::TestCreate(SkRandom* random, |
182 GrContext* context, | 188 GrContext* context, |
183 const GrDrawTargetCaps&, | 189 const GrDrawTargetCaps&, |
(...skipping 23 matching lines...) Expand all Loading... |
207 center
2, radius2, | 213 center
2, radius2, |
208 colors
, stops, colorCount, | 214 colors
, stops, colorCount, |
209 tm)); | 215 tm)); |
210 SkPaint paint; | 216 SkPaint paint; |
211 GrFragmentProcessor* fp; | 217 GrFragmentProcessor* fp; |
212 GrColor paintColor; | 218 GrColor paintColor; |
213 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &fp)); | 219 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &fp)); |
214 return fp; | 220 return fp; |
215 } | 221 } |
216 | 222 |
217 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrBackendProcessorFactory&
factory, | 223 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&) |
218 const GrProcessor&) | 224 : fVSVaryingName(NULL) |
219 : INHERITED(factory) | |
220 , fVSVaryingName(NULL) | |
221 , fFSVaryingName(NULL) | 225 , fFSVaryingName(NULL) |
222 , fCachedRadius(-SK_ScalarMax) | 226 , fCachedRadius(-SK_ScalarMax) |
223 , fCachedDiffRadius(-SK_ScalarMax) {} | 227 , fCachedDiffRadius(-SK_ScalarMax) {} |
224 | 228 |
225 void GLEdge2PtConicalEffect::emitCode(GrGLFPBuilder* builder, | 229 void GLEdge2PtConicalEffect::emitCode(GrGLFPBuilder* builder, |
226 const GrFragmentProcessor& fp, | 230 const GrFragmentProcessor& fp, |
227 const char* outputColor, | 231 const char* outputColor, |
228 const char* inputColor, | 232 const char* inputColor, |
229 const TransformedCoordsArray& coords, | 233 const TransformedCoordsArray& coords, |
230 const TextureSamplerArray& samplers) { | 234 const TextureSamplerArray& samplers) { |
231 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 235 const Edge2PtConicalEffect& ge = fp.cast<Edge2PtConicalEffect>(); |
232 this->emitUniforms(builder, ge); | 236 this->emitUniforms(builder, ge); |
233 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit
y, | 237 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit
y, |
234 kFloat_GrSLType, "Conical2FSParams", 3)
; | 238 kFloat_GrSLType, "Conical2FSParams", 3)
; |
235 | 239 |
236 SkString cName("c"); | 240 SkString cName("c"); |
237 SkString tName("t"); | 241 SkString tName("t"); |
238 SkString p0; // start radius | 242 SkString p0; // start radius |
239 SkString p1; // start radius squared | 243 SkString p1; // start radius squared |
240 SkString p2; // difference in radii (r1 - r0) | 244 SkString p2; // difference in radii (r1 - r0) |
241 | 245 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 matrix.postScale(s, s); | 365 matrix.postScale(s, s); |
362 } | 366 } |
363 | 367 |
364 invLMatrix->postConcat(matrix); | 368 invLMatrix->postConcat(matrix); |
365 | 369 |
366 return conicalType; | 370 return conicalType; |
367 } | 371 } |
368 | 372 |
369 ////////////////////////////////////////////////////////////////////////////// | 373 ////////////////////////////////////////////////////////////////////////////// |
370 | 374 |
371 class GLFocalOutside2PtConicalEffect; | |
372 | |
373 class FocalOutside2PtConicalEffect : public GrGradientEffect { | 375 class FocalOutside2PtConicalEffect : public GrGradientEffect { |
374 public: | 376 public: |
375 | 377 |
376 static GrFragmentProcessor* Create(GrContext* ctx, | 378 static GrFragmentProcessor* Create(GrContext* ctx, |
377 const SkTwoPointConicalGradient& shader, | 379 const SkTwoPointConicalGradient& shader, |
378 const SkMatrix& matrix, | 380 const SkMatrix& matrix, |
379 SkShader::TileMode tm, | 381 SkShader::TileMode tm, |
380 SkScalar focalX) { | 382 SkScalar focalX) { |
381 return SkNEW_ARGS(FocalOutside2PtConicalEffect, (ctx, shader, matrix, tm
, focalX)); | 383 return SkNEW_ARGS(FocalOutside2PtConicalEffect, (ctx, shader, matrix, tm
, focalX)); |
382 } | 384 } |
383 | 385 |
384 virtual ~FocalOutside2PtConicalEffect() { } | 386 virtual ~FocalOutside2PtConicalEffect() { } |
385 | 387 |
386 static const char* Name() { return "Two-Point Conical Gradient Focal Outside
"; } | 388 virtual const char* name() const SK_OVERRIDE { |
387 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | 389 return "Two-Point Conical Gradient Focal Outside"; |
| 390 } |
| 391 |
| 392 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons
t SK_OVERRIDE; |
| 393 |
| 394 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
388 | 395 |
389 bool isFlipped() const { return fIsFlipped; } | 396 bool isFlipped() const { return fIsFlipped; } |
390 SkScalar focal() const { return fFocalX; } | 397 SkScalar focal() const { return fFocalX; } |
391 | 398 |
392 typedef GLFocalOutside2PtConicalEffect GLProcessor; | |
393 | |
394 private: | 399 private: |
395 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 400 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
396 const FocalOutside2PtConicalEffect& s = sBase.cast<FocalOutside2PtConica
lEffect>(); | 401 const FocalOutside2PtConicalEffect& s = sBase.cast<FocalOutside2PtConica
lEffect>(); |
397 return (INHERITED::onIsEqual(sBase) && | 402 return (INHERITED::onIsEqual(sBase) && |
398 this->fFocalX == s.fFocalX && | 403 this->fFocalX == s.fFocalX && |
399 this->fIsFlipped == s.fIsFlipped); | 404 this->fIsFlipped == s.fIsFlipped); |
400 } | 405 } |
401 | 406 |
402 FocalOutside2PtConicalEffect(GrContext* ctx, | 407 FocalOutside2PtConicalEffect(GrContext* ctx, |
403 const SkTwoPointConicalGradient& shader, | 408 const SkTwoPointConicalGradient& shader, |
404 const SkMatrix& matrix, | 409 const SkMatrix& matrix, |
405 SkShader::TileMode tm, | 410 SkShader::TileMode tm, |
406 SkScalar focalX) | 411 SkScalar focalX) |
407 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX), fIsFlipped(shader.isF
lippedGrad()) {} | 412 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX), fIsFlipped(shader.isF
lippedGrad()) { |
| 413 this->initClassID<FocalOutside2PtConicalEffect>(); |
| 414 } |
408 | 415 |
409 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 416 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
410 | 417 |
411 SkScalar fFocalX; | 418 SkScalar fFocalX; |
412 bool fIsFlipped; | 419 bool fIsFlipped; |
413 | 420 |
414 typedef GrGradientEffect INHERITED; | 421 typedef GrGradientEffect INHERITED; |
415 }; | 422 }; |
416 | 423 |
417 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect { | 424 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect { |
418 public: | 425 public: |
419 GLFocalOutside2PtConicalEffect(const GrBackendProcessorFactory& factory, con
st GrProcessor&); | 426 GLFocalOutside2PtConicalEffect(const GrProcessor&); |
420 virtual ~GLFocalOutside2PtConicalEffect() { } | 427 virtual ~GLFocalOutside2PtConicalEffect() { } |
421 | 428 |
422 virtual void emitCode(GrGLFPBuilder*, | 429 virtual void emitCode(GrGLFPBuilder*, |
423 const GrFragmentProcessor&, | 430 const GrFragmentProcessor&, |
424 const char* outputColor, | 431 const char* outputColor, |
425 const char* inputColor, | 432 const char* inputColor, |
426 const TransformedCoordsArray&, | 433 const TransformedCoordsArray&, |
427 const TextureSamplerArray&) SK_OVERRIDE; | 434 const TextureSamplerArray&) SK_OVERRIDE; |
428 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 435 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
429 | 436 |
(...skipping 12 matching lines...) Expand all Loading... |
442 | 449 |
443 SkScalar fCachedFocal; | 450 SkScalar fCachedFocal; |
444 | 451 |
445 // @} | 452 // @} |
446 | 453 |
447 private: | 454 private: |
448 typedef GrGLGradientEffect INHERITED; | 455 typedef GrGLGradientEffect INHERITED; |
449 | 456 |
450 }; | 457 }; |
451 | 458 |
452 const GrBackendFragmentProcessorFactory& FocalOutside2PtConicalEffect::getFactor
y() const { | 459 void FocalOutside2PtConicalEffect::getGLProcessorKey(const GrGLCaps& caps, |
453 return GrTBackendFragmentProcessorFactory<FocalOutside2PtConicalEffect>::get
Instance(); | 460 GrProcessorKeyBuilder* b) c
onst { |
| 461 GLFocalOutside2PtConicalEffect::GenKey(*this, caps, b); |
| 462 } |
| 463 |
| 464 GrGLFragmentProcessor* FocalOutside2PtConicalEffect::createGLInstance() const { |
| 465 return SkNEW_ARGS(GLFocalOutside2PtConicalEffect, (*this)); |
454 } | 466 } |
455 | 467 |
456 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalOutside2PtConicalEffect); | 468 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalOutside2PtConicalEffect); |
457 | 469 |
458 /* | 470 /* |
459 * All Two point conical gradient test create functions may occasionally create
edge case shaders | 471 * All Two point conical gradient test create functions may occasionally create
edge case shaders |
460 */ | 472 */ |
461 GrFragmentProcessor* FocalOutside2PtConicalEffect::TestCreate(SkRandom* random, | 473 GrFragmentProcessor* FocalOutside2PtConicalEffect::TestCreate(SkRandom* random, |
462 GrContext* context
, | 474 GrContext* context
, |
463 const GrDrawTarget
Caps&, | 475 const GrDrawTarget
Caps&, |
(...skipping 20 matching lines...) Expand all Loading... |
484 center
2, radius2, | 496 center
2, radius2, |
485 colors
, stops, colorCount, | 497 colors
, stops, colorCount, |
486 tm)); | 498 tm)); |
487 SkPaint paint; | 499 SkPaint paint; |
488 GrFragmentProcessor* effect; | 500 GrFragmentProcessor* effect; |
489 GrColor paintColor; | 501 GrColor paintColor; |
490 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &effect)); | 502 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &effect)); |
491 return effect; | 503 return effect; |
492 } | 504 } |
493 | 505 |
494 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrBackendPr
ocessorFactory& factory, | 506 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor
& processor) |
495 const GrProcessor
& processor) | 507 : fVSVaryingName(NULL) |
496 : INHERITED(factory) | |
497 , fVSVaryingName(NULL) | |
498 , fFSVaryingName(NULL) | 508 , fFSVaryingName(NULL) |
499 , fCachedFocal(SK_ScalarMax) { | 509 , fCachedFocal(SK_ScalarMax) { |
500 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon
icalEffect>(); | 510 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon
icalEffect>(); |
501 fIsFlipped = data.isFlipped(); | 511 fIsFlipped = data.isFlipped(); |
502 } | 512 } |
503 | 513 |
504 void GLFocalOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, | 514 void GLFocalOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, |
505 const GrFragmentProcessor& fp, | 515 const GrFragmentProcessor& fp, |
506 const char* outputColor, | 516 const char* outputColor, |
507 const char* inputColor, | 517 const char* inputColor, |
508 const TransformedCoordsArray& coor
ds, | 518 const TransformedCoordsArray& coor
ds, |
509 const TextureSamplerArray& sampler
s) { | 519 const TextureSamplerArray& sampler
s) { |
510 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 520 const FocalOutside2PtConicalEffect& ge = fp.cast<FocalOutside2PtConicalEffec
t>(); |
511 this->emitUniforms(builder, ge); | 521 this->emitUniforms(builder, ge); |
512 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit
y, | 522 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit
y, |
513 kFloat_GrSLType, "Conical2FSParams", 2)
; | 523 kFloat_GrSLType, "Conical2FSParams", 2)
; |
514 SkString tName("t"); | 524 SkString tName("t"); |
515 SkString p0; // focalX | 525 SkString p0; // focalX |
516 SkString p1; // 1 - focalX * focalX | 526 SkString p1; // 1 - focalX * focalX |
517 | 527 |
518 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); | 528 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); |
519 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); | 529 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); |
520 | 530 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
586 static GrFragmentProcessor* Create(GrContext* ctx, | 596 static GrFragmentProcessor* Create(GrContext* ctx, |
587 const SkTwoPointConicalGradient& shader, | 597 const SkTwoPointConicalGradient& shader, |
588 const SkMatrix& matrix, | 598 const SkMatrix& matrix, |
589 SkShader::TileMode tm, | 599 SkShader::TileMode tm, |
590 SkScalar focalX) { | 600 SkScalar focalX) { |
591 return SkNEW_ARGS(FocalInside2PtConicalEffect, (ctx, shader, matrix, tm,
focalX)); | 601 return SkNEW_ARGS(FocalInside2PtConicalEffect, (ctx, shader, matrix, tm,
focalX)); |
592 } | 602 } |
593 | 603 |
594 virtual ~FocalInside2PtConicalEffect() {} | 604 virtual ~FocalInside2PtConicalEffect() {} |
595 | 605 |
596 static const char* Name() { return "Two-Point Conical Gradient Focal Inside"
; } | 606 virtual const char* name() const SK_OVERRIDE { |
597 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | 607 return "Two-Point Conical Gradient Focal Inside"; |
| 608 } |
| 609 |
| 610 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons
t SK_OVERRIDE; |
| 611 |
| 612 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
598 | 613 |
599 SkScalar focal() const { return fFocalX; } | 614 SkScalar focal() const { return fFocalX; } |
600 | 615 |
601 typedef GLFocalInside2PtConicalEffect GLProcessor; | 616 typedef GLFocalInside2PtConicalEffect GLProcessor; |
602 | 617 |
603 private: | 618 private: |
604 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 619 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
605 const FocalInside2PtConicalEffect& s = sBase.cast<FocalInside2PtConicalE
ffect>(); | 620 const FocalInside2PtConicalEffect& s = sBase.cast<FocalInside2PtConicalE
ffect>(); |
606 return (INHERITED::onIsEqual(sBase) && | 621 return (INHERITED::onIsEqual(sBase) && |
607 this->fFocalX == s.fFocalX); | 622 this->fFocalX == s.fFocalX); |
608 } | 623 } |
609 | 624 |
610 FocalInside2PtConicalEffect(GrContext* ctx, | 625 FocalInside2PtConicalEffect(GrContext* ctx, |
611 const SkTwoPointConicalGradient& shader, | 626 const SkTwoPointConicalGradient& shader, |
612 const SkMatrix& matrix, | 627 const SkMatrix& matrix, |
613 SkShader::TileMode tm, | 628 SkShader::TileMode tm, |
614 SkScalar focalX) | 629 SkScalar focalX) |
615 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX) {} | 630 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX) { |
| 631 this->initClassID<FocalInside2PtConicalEffect>(); |
| 632 } |
616 | 633 |
617 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 634 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
618 | 635 |
619 SkScalar fFocalX; | 636 SkScalar fFocalX; |
620 | 637 |
621 typedef GrGradientEffect INHERITED; | 638 typedef GrGradientEffect INHERITED; |
622 }; | 639 }; |
623 | 640 |
624 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect { | 641 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect { |
625 public: | 642 public: |
626 GLFocalInside2PtConicalEffect(const GrBackendProcessorFactory& factory, cons
t GrProcessor&); | 643 GLFocalInside2PtConicalEffect(const GrProcessor&); |
627 virtual ~GLFocalInside2PtConicalEffect() {} | 644 virtual ~GLFocalInside2PtConicalEffect() {} |
628 | 645 |
629 virtual void emitCode(GrGLFPBuilder*, | 646 virtual void emitCode(GrGLFPBuilder*, |
630 const GrFragmentProcessor&, | 647 const GrFragmentProcessor&, |
631 const char* outputColor, | 648 const char* outputColor, |
632 const char* inputColor, | 649 const char* inputColor, |
633 const TransformedCoordsArray&, | 650 const TransformedCoordsArray&, |
634 const TextureSamplerArray&) SK_OVERRIDE; | 651 const TextureSamplerArray&) SK_OVERRIDE; |
635 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 652 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
636 | 653 |
(...skipping 10 matching lines...) Expand all Loading... |
647 | 664 |
648 SkScalar fCachedFocal; | 665 SkScalar fCachedFocal; |
649 | 666 |
650 // @} | 667 // @} |
651 | 668 |
652 private: | 669 private: |
653 typedef GrGLGradientEffect INHERITED; | 670 typedef GrGLGradientEffect INHERITED; |
654 | 671 |
655 }; | 672 }; |
656 | 673 |
657 const GrBackendFragmentProcessorFactory& FocalInside2PtConicalEffect::getFactory
() const { | 674 void FocalInside2PtConicalEffect::getGLProcessorKey(const GrGLCaps& caps, |
658 return GrTBackendFragmentProcessorFactory<FocalInside2PtConicalEffect>::getI
nstance(); | 675 GrProcessorKeyBuilder* b) const { |
| 676 GLFocalInside2PtConicalEffect::GenKey(*this, caps, b); |
| 677 } |
| 678 |
| 679 GrGLFragmentProcessor* FocalInside2PtConicalEffect::createGLInstance() const { |
| 680 return SkNEW_ARGS(GLFocalInside2PtConicalEffect, (*this)); |
659 } | 681 } |
660 | 682 |
661 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalInside2PtConicalEffect); | 683 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalInside2PtConicalEffect); |
662 | 684 |
663 /* | 685 /* |
664 * All Two point conical gradient test create functions may occasionally create
edge case shaders | 686 * All Two point conical gradient test create functions may occasionally create
edge case shaders |
665 */ | 687 */ |
666 GrFragmentProcessor* FocalInside2PtConicalEffect::TestCreate(SkRandom* random, | 688 GrFragmentProcessor* FocalInside2PtConicalEffect::TestCreate(SkRandom* random, |
667 GrContext* context, | 689 GrContext* context, |
668 const GrDrawTargetC
aps&, | 690 const GrDrawTargetC
aps&, |
(...skipping 22 matching lines...) Expand all Loading... |
691 center
2, radius2, | 713 center
2, radius2, |
692 colors
, stops, colorCount, | 714 colors
, stops, colorCount, |
693 tm)); | 715 tm)); |
694 SkPaint paint; | 716 SkPaint paint; |
695 GrColor paintColor; | 717 GrColor paintColor; |
696 GrFragmentProcessor* fp; | 718 GrFragmentProcessor* fp; |
697 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &fp)); | 719 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &fp)); |
698 return fp; | 720 return fp; |
699 } | 721 } |
700 | 722 |
701 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrBackendProc
essorFactory& factory, | 723 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&) |
702 const GrProcessor&) | 724 : fVSVaryingName(NULL) |
703 : INHERITED(factory) | |
704 , fVSVaryingName(NULL) | |
705 , fFSVaryingName(NULL) | 725 , fFSVaryingName(NULL) |
706 , fCachedFocal(SK_ScalarMax) {} | 726 , fCachedFocal(SK_ScalarMax) {} |
707 | 727 |
708 void GLFocalInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, | 728 void GLFocalInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, |
709 const GrFragmentProcessor& fp, | 729 const GrFragmentProcessor& fp, |
710 const char* outputColor, | 730 const char* outputColor, |
711 const char* inputColor, | 731 const char* inputColor, |
712 const TransformedCoordsArray& coord
s, | 732 const TransformedCoordsArray& coord
s, |
713 const TextureSamplerArray& samplers
) { | 733 const TextureSamplerArray& samplers
) { |
714 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 734 const FocalInside2PtConicalEffect& ge = fp.cast<FocalInside2PtConicalEffect>
(); |
715 this->emitUniforms(builder, ge); | 735 this->emitUniforms(builder, ge); |
716 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 736 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
717 kFloat_GrSLType, "Conical2FSParams"); | 737 kFloat_GrSLType, "Conical2FSParams"); |
718 SkString tName("t"); | 738 SkString tName("t"); |
719 | 739 |
720 // this is the distance along x-axis from the end center to focal point in | 740 // this is the distance along x-axis from the end center to focal point in |
721 // transformed coordinates | 741 // transformed coordinates |
722 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni); | 742 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni); |
723 | 743 |
724 // if we have a vec3 from being in perspective, convert it to a vec2 first | 744 // if we have a vec3 from being in perspective, convert it to a vec2 first |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
807 info->fB = B; | 827 info->fB = B; |
808 info->fC = C; | 828 info->fC = C; |
809 | 829 |
810 // if A ends up being negative, the start circle is contained completely ins
ide the end cirlce | 830 // if A ends up being negative, the start circle is contained completely ins
ide the end cirlce |
811 if (A < 0.f) { | 831 if (A < 0.f) { |
812 return kInside_ConicalType; | 832 return kInside_ConicalType; |
813 } | 833 } |
814 return kOutside_ConicalType; | 834 return kOutside_ConicalType; |
815 } | 835 } |
816 | 836 |
817 class GLCircleInside2PtConicalEffect; | |
818 | |
819 class CircleInside2PtConicalEffect : public GrGradientEffect { | 837 class CircleInside2PtConicalEffect : public GrGradientEffect { |
820 public: | 838 public: |
821 | 839 |
822 static GrFragmentProcessor* Create(GrContext* ctx, | 840 static GrFragmentProcessor* Create(GrContext* ctx, |
823 const SkTwoPointConicalGradient& shader, | 841 const SkTwoPointConicalGradient& shader, |
824 const SkMatrix& matrix, | 842 const SkMatrix& matrix, |
825 SkShader::TileMode tm, | 843 SkShader::TileMode tm, |
826 const CircleConicalInfo& info) { | 844 const CircleConicalInfo& info) { |
827 return SkNEW_ARGS(CircleInside2PtConicalEffect, (ctx, shader, matrix, tm
, info)); | 845 return SkNEW_ARGS(CircleInside2PtConicalEffect, (ctx, shader, matrix, tm
, info)); |
828 } | 846 } |
829 | 847 |
830 virtual ~CircleInside2PtConicalEffect() {} | 848 virtual ~CircleInside2PtConicalEffect() {} |
831 | 849 |
832 static const char* Name() { return "Two-Point Conical Gradient Inside"; } | 850 virtual const char* name() const SK_OVERRIDE { return "Two-Point Conical Gra
dient Inside"; } |
833 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | 851 |
| 852 virtual void getGLProcessorKey(const GrGLCaps& caps, |
| 853 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
| 854 |
| 855 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
834 | 856 |
835 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } | 857 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } |
836 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } | 858 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } |
837 SkScalar A() const { return fInfo.fA; } | 859 SkScalar A() const { return fInfo.fA; } |
838 SkScalar B() const { return fInfo.fB; } | 860 SkScalar B() const { return fInfo.fB; } |
839 SkScalar C() const { return fInfo.fC; } | 861 SkScalar C() const { return fInfo.fC; } |
840 | 862 |
841 typedef GLCircleInside2PtConicalEffect GLProcessor; | |
842 | |
843 private: | 863 private: |
844 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 864 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
845 const CircleInside2PtConicalEffect& s = sBase.cast<CircleInside2PtConica
lEffect>(); | 865 const CircleInside2PtConicalEffect& s = sBase.cast<CircleInside2PtConica
lEffect>(); |
846 return (INHERITED::onIsEqual(sBase) && | 866 return (INHERITED::onIsEqual(sBase) && |
847 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && | 867 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && |
848 this->fInfo.fA == s.fInfo.fA && | 868 this->fInfo.fA == s.fInfo.fA && |
849 this->fInfo.fB == s.fInfo.fB && | 869 this->fInfo.fB == s.fInfo.fB && |
850 this->fInfo.fC == s.fInfo.fC); | 870 this->fInfo.fC == s.fInfo.fC); |
851 } | 871 } |
852 | 872 |
853 CircleInside2PtConicalEffect(GrContext* ctx, | 873 CircleInside2PtConicalEffect(GrContext* ctx, |
854 const SkTwoPointConicalGradient& shader, | 874 const SkTwoPointConicalGradient& shader, |
855 const SkMatrix& matrix, | 875 const SkMatrix& matrix, |
856 SkShader::TileMode tm, | 876 SkShader::TileMode tm, |
857 const CircleConicalInfo& info) | 877 const CircleConicalInfo& info) |
858 : INHERITED(ctx, shader, matrix, tm), fInfo(info) {} | 878 : INHERITED(ctx, shader, matrix, tm), fInfo(info) { |
| 879 this->initClassID<CircleInside2PtConicalEffect>(); |
| 880 } |
859 | 881 |
860 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 882 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
861 | 883 |
862 const CircleConicalInfo fInfo; | 884 const CircleConicalInfo fInfo; |
863 | 885 |
864 typedef GrGradientEffect INHERITED; | 886 typedef GrGradientEffect INHERITED; |
865 }; | 887 }; |
866 | 888 |
867 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect { | 889 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect { |
868 public: | 890 public: |
869 GLCircleInside2PtConicalEffect(const GrBackendProcessorFactory& factory, con
st GrProcessor&); | 891 GLCircleInside2PtConicalEffect(const GrProcessor&); |
870 virtual ~GLCircleInside2PtConicalEffect() {} | 892 virtual ~GLCircleInside2PtConicalEffect() {} |
871 | 893 |
872 virtual void emitCode(GrGLFPBuilder*, | 894 virtual void emitCode(GrGLFPBuilder*, |
873 const GrFragmentProcessor&, | 895 const GrFragmentProcessor&, |
874 const char* outputColor, | 896 const char* outputColor, |
875 const char* inputColor, | 897 const char* inputColor, |
876 const TransformedCoordsArray&, | 898 const TransformedCoordsArray&, |
877 const TextureSamplerArray&) SK_OVERRIDE; | 899 const TextureSamplerArray&) SK_OVERRIDE; |
878 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 900 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
879 | 901 |
(...skipping 15 matching lines...) Expand all Loading... |
895 SkScalar fCachedB; | 917 SkScalar fCachedB; |
896 SkScalar fCachedC; | 918 SkScalar fCachedC; |
897 | 919 |
898 // @} | 920 // @} |
899 | 921 |
900 private: | 922 private: |
901 typedef GrGLGradientEffect INHERITED; | 923 typedef GrGLGradientEffect INHERITED; |
902 | 924 |
903 }; | 925 }; |
904 | 926 |
905 const GrBackendFragmentProcessorFactory& CircleInside2PtConicalEffect::getFactor
y() const { | 927 void CircleInside2PtConicalEffect::getGLProcessorKey(const GrGLCaps& caps, |
906 return GrTBackendFragmentProcessorFactory<CircleInside2PtConicalEffect>::get
Instance(); | 928 GrProcessorKeyBuilder* b) c
onst { |
| 929 GLCircleInside2PtConicalEffect::GenKey(*this, caps, b); |
| 930 } |
| 931 |
| 932 GrGLFragmentProcessor* CircleInside2PtConicalEffect::createGLInstance() const { |
| 933 return SkNEW_ARGS(GLCircleInside2PtConicalEffect, (*this)); |
907 } | 934 } |
908 | 935 |
909 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleInside2PtConicalEffect); | 936 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleInside2PtConicalEffect); |
910 | 937 |
911 /* | 938 /* |
912 * All Two point conical gradient test create functions may occasionally create
edge case shaders | 939 * All Two point conical gradient test create functions may occasionally create
edge case shaders |
913 */ | 940 */ |
914 GrFragmentProcessor* CircleInside2PtConicalEffect::TestCreate(SkRandom* random, | 941 GrFragmentProcessor* CircleInside2PtConicalEffect::TestCreate(SkRandom* random, |
915 GrContext* context
, | 942 GrContext* context
, |
916 const GrDrawTarget
Caps&, | 943 const GrDrawTarget
Caps&, |
(...skipping 21 matching lines...) Expand all Loading... |
938 center
2, radius2, | 965 center
2, radius2, |
939 colors
, stops, colorCount, | 966 colors
, stops, colorCount, |
940 tm)); | 967 tm)); |
941 SkPaint paint; | 968 SkPaint paint; |
942 GrColor paintColor; | 969 GrColor paintColor; |
943 GrFragmentProcessor* processor; | 970 GrFragmentProcessor* processor; |
944 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &processor)); | 971 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &processor)); |
945 return processor; | 972 return processor; |
946 } | 973 } |
947 | 974 |
948 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrBackendPr
ocessorFactory& factory, | 975 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrProcessor
& processor) |
949 const GrProcessor
& processor) | 976 : fVSVaryingName(NULL) |
950 : INHERITED(factory) | |
951 , fVSVaryingName(NULL) | |
952 , fFSVaryingName(NULL) | 977 , fFSVaryingName(NULL) |
953 , fCachedCenterX(SK_ScalarMax) | 978 , fCachedCenterX(SK_ScalarMax) |
954 , fCachedCenterY(SK_ScalarMax) | 979 , fCachedCenterY(SK_ScalarMax) |
955 , fCachedA(SK_ScalarMax) | 980 , fCachedA(SK_ScalarMax) |
956 , fCachedB(SK_ScalarMax) | 981 , fCachedB(SK_ScalarMax) |
957 , fCachedC(SK_ScalarMax) {} | 982 , fCachedC(SK_ScalarMax) {} |
958 | 983 |
959 void GLCircleInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, | 984 void GLCircleInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, |
960 const GrFragmentProcessor& fp, | 985 const GrFragmentProcessor& fp, |
961 const char* outputColor, | 986 const char* outputColor, |
962 const char* inputColor, | 987 const char* inputColor, |
963 const TransformedCoordsArray& coor
ds, | 988 const TransformedCoordsArray& coor
ds, |
964 const TextureSamplerArray& sampler
s) { | 989 const TextureSamplerArray& sampler
s) { |
965 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 990 const CircleInside2PtConicalEffect& ge = fp.cast<CircleInside2PtConicalEffec
t>(); |
966 this->emitUniforms(builder, ge); | 991 this->emitUniforms(builder, ge); |
967 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 992 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
968 kVec2f_GrSLType, "Conical2FSCenter"); | 993 kVec2f_GrSLType, "Conical2FSCenter"); |
969 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 994 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
970 kVec3f_GrSLType, "Conical2FSParams"); | 995 kVec3f_GrSLType, "Conical2FSParams"); |
971 SkString tName("t"); | 996 SkString tName("t"); |
972 | 997 |
973 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); | 998 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); |
974 // params.x = A | 999 // params.x = A |
975 // params.y = B | 1000 // params.y = B |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1022 } | 1047 } |
1023 } | 1048 } |
1024 | 1049 |
1025 void GLCircleInside2PtConicalEffect::GenKey(const GrProcessor& processor, | 1050 void GLCircleInside2PtConicalEffect::GenKey(const GrProcessor& processor, |
1026 const GrGLCaps&, GrProcessorKeyBuild
er* b) { | 1051 const GrGLCaps&, GrProcessorKeyBuild
er* b) { |
1027 b->add32(GenBaseGradientKey(processor)); | 1052 b->add32(GenBaseGradientKey(processor)); |
1028 } | 1053 } |
1029 | 1054 |
1030 ////////////////////////////////////////////////////////////////////////////// | 1055 ////////////////////////////////////////////////////////////////////////////// |
1031 | 1056 |
1032 class GLCircleOutside2PtConicalEffect; | |
1033 | |
1034 class CircleOutside2PtConicalEffect : public GrGradientEffect { | 1057 class CircleOutside2PtConicalEffect : public GrGradientEffect { |
1035 public: | 1058 public: |
1036 | 1059 |
1037 static GrFragmentProcessor* Create(GrContext* ctx, | 1060 static GrFragmentProcessor* Create(GrContext* ctx, |
1038 const SkTwoPointConicalGradient& shader, | 1061 const SkTwoPointConicalGradient& shader, |
1039 const SkMatrix& matrix, | 1062 const SkMatrix& matrix, |
1040 SkShader::TileMode tm, | 1063 SkShader::TileMode tm, |
1041 const CircleConicalInfo& info) { | 1064 const CircleConicalInfo& info) { |
1042 return SkNEW_ARGS(CircleOutside2PtConicalEffect, (ctx, shader, matrix, t
m, info)); | 1065 return SkNEW_ARGS(CircleOutside2PtConicalEffect, (ctx, shader, matrix, t
m, info)); |
1043 } | 1066 } |
1044 | 1067 |
1045 virtual ~CircleOutside2PtConicalEffect() {} | 1068 virtual ~CircleOutside2PtConicalEffect() {} |
1046 | 1069 |
1047 static const char* Name() { return "Two-Point Conical Gradient Outside"; } | 1070 virtual const char* name() const SK_OVERRIDE { return "Two-Point Conical Gra
dient Outside"; } |
1048 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | 1071 |
| 1072 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons
t SK_OVERRIDE; |
| 1073 |
| 1074 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
1049 | 1075 |
1050 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } | 1076 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } |
1051 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } | 1077 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } |
1052 SkScalar A() const { return fInfo.fA; } | 1078 SkScalar A() const { return fInfo.fA; } |
1053 SkScalar B() const { return fInfo.fB; } | 1079 SkScalar B() const { return fInfo.fB; } |
1054 SkScalar C() const { return fInfo.fC; } | 1080 SkScalar C() const { return fInfo.fC; } |
1055 SkScalar tLimit() const { return fTLimit; } | 1081 SkScalar tLimit() const { return fTLimit; } |
1056 bool isFlipped() const { return fIsFlipped; } | 1082 bool isFlipped() const { return fIsFlipped; } |
1057 | 1083 |
1058 typedef GLCircleOutside2PtConicalEffect GLProcessor; | |
1059 | |
1060 private: | 1084 private: |
1061 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 1085 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
1062 const CircleOutside2PtConicalEffect& s = sBase.cast<CircleOutside2PtConi
calEffect>(); | 1086 const CircleOutside2PtConicalEffect& s = sBase.cast<CircleOutside2PtConi
calEffect>(); |
1063 return (INHERITED::onIsEqual(sBase) && | 1087 return (INHERITED::onIsEqual(sBase) && |
1064 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && | 1088 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && |
1065 this->fInfo.fA == s.fInfo.fA && | 1089 this->fInfo.fA == s.fInfo.fA && |
1066 this->fInfo.fB == s.fInfo.fB && | 1090 this->fInfo.fB == s.fInfo.fB && |
1067 this->fInfo.fC == s.fInfo.fC && | 1091 this->fInfo.fC == s.fInfo.fC && |
1068 this->fTLimit == s.fTLimit && | 1092 this->fTLimit == s.fTLimit && |
1069 this->fIsFlipped == s.fIsFlipped); | 1093 this->fIsFlipped == s.fIsFlipped); |
1070 } | 1094 } |
1071 | 1095 |
1072 CircleOutside2PtConicalEffect(GrContext* ctx, | 1096 CircleOutside2PtConicalEffect(GrContext* ctx, |
1073 const SkTwoPointConicalGradient& shader, | 1097 const SkTwoPointConicalGradient& shader, |
1074 const SkMatrix& matrix, | 1098 const SkMatrix& matrix, |
1075 SkShader::TileMode tm, | 1099 SkShader::TileMode tm, |
1076 const CircleConicalInfo& info) | 1100 const CircleConicalInfo& info) |
1077 : INHERITED(ctx, shader, matrix, tm), fInfo(info) { | 1101 : INHERITED(ctx, shader, matrix, tm), fInfo(info) { |
| 1102 this->initClassID<CircleOutside2PtConicalEffect>(); |
1078 if (shader.getStartRadius() != shader.getEndRadius()) { | 1103 if (shader.getStartRadius() != shader.getEndRadius()) { |
1079 fTLimit = SkScalarDiv(shader.getStartRadius(), | 1104 fTLimit = SkScalarDiv(shader.getStartRadius(), |
1080 (shader.getStartRadius() - shader.getEndRadius
())); | 1105 (shader.getStartRadius() - shader.getEndRadius
())); |
1081 } else { | 1106 } else { |
1082 fTLimit = SK_ScalarMin; | 1107 fTLimit = SK_ScalarMin; |
1083 } | 1108 } |
1084 | 1109 |
1085 fIsFlipped = shader.isFlippedGrad(); | 1110 fIsFlipped = shader.isFlippedGrad(); |
1086 } | 1111 } |
1087 | 1112 |
1088 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 1113 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
1089 | 1114 |
1090 const CircleConicalInfo fInfo; | 1115 const CircleConicalInfo fInfo; |
1091 SkScalar fTLimit; | 1116 SkScalar fTLimit; |
1092 bool fIsFlipped; | 1117 bool fIsFlipped; |
1093 | 1118 |
1094 typedef GrGradientEffect INHERITED; | 1119 typedef GrGradientEffect INHERITED; |
1095 }; | 1120 }; |
1096 | 1121 |
1097 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect { | 1122 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect { |
1098 public: | 1123 public: |
1099 GLCircleOutside2PtConicalEffect(const GrBackendProcessorFactory&, const GrPr
ocessor&); | 1124 GLCircleOutside2PtConicalEffect(const GrProcessor&); |
1100 virtual ~GLCircleOutside2PtConicalEffect() {} | 1125 virtual ~GLCircleOutside2PtConicalEffect() {} |
1101 | 1126 |
1102 virtual void emitCode(GrGLFPBuilder*, | 1127 virtual void emitCode(GrGLFPBuilder*, |
1103 const GrFragmentProcessor&, | 1128 const GrFragmentProcessor&, |
1104 const char* outputColor, | 1129 const char* outputColor, |
1105 const char* inputColor, | 1130 const char* inputColor, |
1106 const TransformedCoordsArray&, | 1131 const TransformedCoordsArray&, |
1107 const TextureSamplerArray&) SK_OVERRIDE; | 1132 const TextureSamplerArray&) SK_OVERRIDE; |
1108 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 1133 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
1109 | 1134 |
(...skipping 18 matching lines...) Expand all Loading... |
1128 SkScalar fCachedC; | 1153 SkScalar fCachedC; |
1129 SkScalar fCachedTLimit; | 1154 SkScalar fCachedTLimit; |
1130 | 1155 |
1131 // @} | 1156 // @} |
1132 | 1157 |
1133 private: | 1158 private: |
1134 typedef GrGLGradientEffect INHERITED; | 1159 typedef GrGLGradientEffect INHERITED; |
1135 | 1160 |
1136 }; | 1161 }; |
1137 | 1162 |
1138 const GrBackendFragmentProcessorFactory& CircleOutside2PtConicalEffect::getFacto
ry() const { | 1163 void CircleOutside2PtConicalEffect::getGLProcessorKey(const GrGLCaps& caps, |
1139 return GrTBackendFragmentProcessorFactory<CircleOutside2PtConicalEffect>::ge
tInstance(); | 1164 GrProcessorKeyBuilder* b)
const { |
| 1165 GLCircleOutside2PtConicalEffect::GenKey(*this, caps, b); |
| 1166 } |
| 1167 |
| 1168 GrGLFragmentProcessor* CircleOutside2PtConicalEffect::createGLInstance() const { |
| 1169 return SkNEW_ARGS(GLCircleOutside2PtConicalEffect, (*this)); |
1140 } | 1170 } |
1141 | 1171 |
1142 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleOutside2PtConicalEffect); | 1172 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleOutside2PtConicalEffect); |
1143 | 1173 |
1144 /* | 1174 /* |
1145 * All Two point conical gradient test create functions may occasionally create
edge case shaders | 1175 * All Two point conical gradient test create functions may occasionally create
edge case shaders |
1146 */ | 1176 */ |
1147 GrFragmentProcessor* CircleOutside2PtConicalEffect::TestCreate(SkRandom* random, | 1177 GrFragmentProcessor* CircleOutside2PtConicalEffect::TestCreate(SkRandom* random, |
1148 GrContext* contex
t, | 1178 GrContext* contex
t, |
1149 const GrDrawTarge
tCaps&, | 1179 const GrDrawTarge
tCaps&, |
(...skipping 22 matching lines...) Expand all Loading... |
1172 center
2, radius2, | 1202 center
2, radius2, |
1173 colors
, stops, colorCount, | 1203 colors
, stops, colorCount, |
1174 tm)); | 1204 tm)); |
1175 SkPaint paint; | 1205 SkPaint paint; |
1176 GrColor paintColor; | 1206 GrColor paintColor; |
1177 GrFragmentProcessor* processor; | 1207 GrFragmentProcessor* processor; |
1178 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &processor)); | 1208 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &processor)); |
1179 return processor; | 1209 return processor; |
1180 } | 1210 } |
1181 | 1211 |
1182 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrBackend
ProcessorFactory& factory, | 1212 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrProcess
or& processor) |
1183 const GrProcess
or& processor) | 1213 : fVSVaryingName(NULL) |
1184 : INHERITED(factory) | |
1185 , fVSVaryingName(NULL) | |
1186 , fFSVaryingName(NULL) | 1214 , fFSVaryingName(NULL) |
1187 , fCachedCenterX(SK_ScalarMax) | 1215 , fCachedCenterX(SK_ScalarMax) |
1188 , fCachedCenterY(SK_ScalarMax) | 1216 , fCachedCenterY(SK_ScalarMax) |
1189 , fCachedA(SK_ScalarMax) | 1217 , fCachedA(SK_ScalarMax) |
1190 , fCachedB(SK_ScalarMax) | 1218 , fCachedB(SK_ScalarMax) |
1191 , fCachedC(SK_ScalarMax) | 1219 , fCachedC(SK_ScalarMax) |
1192 , fCachedTLimit(SK_ScalarMax) { | 1220 , fCachedTLimit(SK_ScalarMax) { |
1193 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC
onicalEffect>(); | 1221 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC
onicalEffect>(); |
1194 fIsFlipped = data.isFlipped(); | 1222 fIsFlipped = data.isFlipped(); |
1195 } | 1223 } |
1196 | 1224 |
1197 void GLCircleOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, | 1225 void GLCircleOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, |
1198 const GrFragmentProcessor& fp, | 1226 const GrFragmentProcessor& fp, |
1199 const char* outputColor, | 1227 const char* outputColor, |
1200 const char* inputColor, | 1228 const char* inputColor, |
1201 const TransformedCoordsArray& coo
rds, | 1229 const TransformedCoordsArray& coo
rds, |
1202 const TextureSamplerArray& sample
rs) { | 1230 const TextureSamplerArray& sample
rs) { |
1203 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 1231 const CircleOutside2PtConicalEffect& ge = fp.cast<CircleOutside2PtConicalEff
ect>(); |
1204 this->emitUniforms(builder, ge); | 1232 this->emitUniforms(builder, ge); |
1205 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1233 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
1206 kVec2f_GrSLType, "Conical2FSCenter"); | 1234 kVec2f_GrSLType, "Conical2FSCenter"); |
1207 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1235 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
1208 kVec4f_GrSLType, "Conical2FSParams"); | 1236 kVec4f_GrSLType, "Conical2FSParams"); |
1209 SkString tName("t"); | 1237 SkString tName("t"); |
1210 | 1238 |
1211 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); | 1239 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); |
1212 // params.x = A | 1240 // params.x = A |
1213 // params.y = B | 1241 // params.y = B |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1325 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf
o); | 1353 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf
o); |
1326 } else if (type == kEdge_ConicalType) { | 1354 } else if (type == kEdge_ConicalType) { |
1327 set_matrix_edge_conical(shader, &matrix); | 1355 set_matrix_edge_conical(shader, &matrix); |
1328 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); | 1356 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); |
1329 } else { | 1357 } else { |
1330 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); | 1358 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); |
1331 } | 1359 } |
1332 } | 1360 } |
1333 | 1361 |
1334 #endif | 1362 #endif |
OLD | NEW |