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; |
| 76 |
| 77 virtual uint32_t classID() const { |
| 78 static uint32_t id = GenClassID(); |
| 79 return id; |
| 80 } |
74 | 81 |
75 // The radial gradient parameters can collapse to a linear (instead of quadr
atic) equation. | 82 // The radial gradient parameters can collapse to a linear (instead of quadr
atic) equation. |
76 SkScalar center() const { return fCenterX1; } | 83 SkScalar center() const { return fCenterX1; } |
77 SkScalar diffRadius() const { return fDiffRadius; } | 84 SkScalar diffRadius() const { return fDiffRadius; } |
78 SkScalar radius() const { return fRadius0; } | 85 SkScalar radius() const { return fRadius0; } |
79 | 86 |
80 typedef GLEdge2PtConicalEffect GLProcessor; | |
81 | |
82 private: | 87 private: |
83 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 88 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
84 const Edge2PtConicalEffect& s = sBase.cast<Edge2PtConicalEffect>(); | 89 const Edge2PtConicalEffect& s = sBase.cast<Edge2PtConicalEffect>(); |
85 return (INHERITED::onIsEqual(sBase) && | 90 return (INHERITED::onIsEqual(sBase) && |
86 this->fCenterX1 == s.fCenterX1 && | 91 this->fCenterX1 == s.fCenterX1 && |
87 this->fRadius0 == s.fRadius0 && | 92 this->fRadius0 == s.fRadius0 && |
88 this->fDiffRadius == s.fDiffRadius); | 93 this->fDiffRadius == s.fDiffRadius); |
89 } | 94 } |
90 | 95 |
91 Edge2PtConicalEffect(GrContext* ctx, | 96 Edge2PtConicalEffect(GrContext* ctx, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 SkScalar fRadius0; | 135 SkScalar fRadius0; |
131 SkScalar fDiffRadius; | 136 SkScalar fDiffRadius; |
132 | 137 |
133 // @} | 138 // @} |
134 | 139 |
135 typedef GrGradientEffect INHERITED; | 140 typedef GrGradientEffect INHERITED; |
136 }; | 141 }; |
137 | 142 |
138 class GLEdge2PtConicalEffect : public GrGLGradientEffect { | 143 class GLEdge2PtConicalEffect : public GrGLGradientEffect { |
139 public: | 144 public: |
140 GLEdge2PtConicalEffect(const GrBackendProcessorFactory& factory, const GrPro
cessor&); | 145 GLEdge2PtConicalEffect(const GrProcessor&); |
141 virtual ~GLEdge2PtConicalEffect() { } | 146 virtual ~GLEdge2PtConicalEffect() { } |
142 | 147 |
143 virtual void emitCode(GrGLFPBuilder*, | 148 virtual void emitCode(GrGLFPBuilder*, |
144 const GrFragmentProcessor&, | 149 const GrFragmentProcessor&, |
145 const char* outputColor, | 150 const char* outputColor, |
146 const char* inputColor, | 151 const char* inputColor, |
147 const TransformedCoordsArray&, | 152 const TransformedCoordsArray&, |
148 const TextureSamplerArray&) SK_OVERRIDE; | 153 const TextureSamplerArray&) SK_OVERRIDE; |
149 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 154 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
150 | 155 |
(...skipping 11 matching lines...) Expand all Loading... |
162 SkScalar fCachedRadius; | 167 SkScalar fCachedRadius; |
163 SkScalar fCachedDiffRadius; | 168 SkScalar fCachedDiffRadius; |
164 | 169 |
165 // @} | 170 // @} |
166 | 171 |
167 private: | 172 private: |
168 typedef GrGLGradientEffect INHERITED; | 173 typedef GrGLGradientEffect INHERITED; |
169 | 174 |
170 }; | 175 }; |
171 | 176 |
172 const GrBackendFragmentProcessorFactory& Edge2PtConicalEffect::getFactory() cons
t { | 177 void Edge2PtConicalEffect::getGLProcessorKey(const GrGLCaps& caps, |
173 return GrTBackendFragmentProcessorFactory<Edge2PtConicalEffect>::getInstance
(); | 178 GrProcessorKeyBuilder* b) const { |
| 179 GLEdge2PtConicalEffect::GenKey(*this, caps, b); |
| 180 } |
| 181 |
| 182 GrGLFragmentProcessor* Edge2PtConicalEffect::createGLInstance() const { |
| 183 return SkNEW_ARGS(GLEdge2PtConicalEffect, (*this)); |
174 } | 184 } |
175 | 185 |
176 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Edge2PtConicalEffect); | 186 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(Edge2PtConicalEffect); |
177 | 187 |
178 /* | 188 /* |
179 * All Two point conical gradient test create functions may occasionally create
edge case shaders | 189 * All Two point conical gradient test create functions may occasionally create
edge case shaders |
180 */ | 190 */ |
181 GrFragmentProcessor* Edge2PtConicalEffect::TestCreate(SkRandom* random, | 191 GrFragmentProcessor* Edge2PtConicalEffect::TestCreate(SkRandom* random, |
182 GrContext* context, | 192 GrContext* context, |
183 const GrDrawTargetCaps&, | 193 const GrDrawTargetCaps&, |
(...skipping 23 matching lines...) Expand all Loading... |
207 center
2, radius2, | 217 center
2, radius2, |
208 colors
, stops, colorCount, | 218 colors
, stops, colorCount, |
209 tm)); | 219 tm)); |
210 SkPaint paint; | 220 SkPaint paint; |
211 GrFragmentProcessor* fp; | 221 GrFragmentProcessor* fp; |
212 GrColor paintColor; | 222 GrColor paintColor; |
213 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &fp)); | 223 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &fp)); |
214 return fp; | 224 return fp; |
215 } | 225 } |
216 | 226 |
217 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrBackendProcessorFactory&
factory, | 227 GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrProcessor&) |
218 const GrProcessor&) | 228 : fVSVaryingName(NULL) |
219 : INHERITED(factory) | |
220 , fVSVaryingName(NULL) | |
221 , fFSVaryingName(NULL) | 229 , fFSVaryingName(NULL) |
222 , fCachedRadius(-SK_ScalarMax) | 230 , fCachedRadius(-SK_ScalarMax) |
223 , fCachedDiffRadius(-SK_ScalarMax) {} | 231 , fCachedDiffRadius(-SK_ScalarMax) {} |
224 | 232 |
225 void GLEdge2PtConicalEffect::emitCode(GrGLFPBuilder* builder, | 233 void GLEdge2PtConicalEffect::emitCode(GrGLFPBuilder* builder, |
226 const GrFragmentProcessor& fp, | 234 const GrFragmentProcessor& fp, |
227 const char* outputColor, | 235 const char* outputColor, |
228 const char* inputColor, | 236 const char* inputColor, |
229 const TransformedCoordsArray& coords, | 237 const TransformedCoordsArray& coords, |
230 const TextureSamplerArray& samplers) { | 238 const TextureSamplerArray& samplers) { |
231 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 239 const Edge2PtConicalEffect& ge = fp.cast<Edge2PtConicalEffect>(); |
232 this->emitUniforms(builder, ge); | 240 this->emitUniforms(builder, ge); |
233 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit
y, | 241 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit
y, |
234 kFloat_GrSLType, "Conical2FSParams", 3)
; | 242 kFloat_GrSLType, "Conical2FSParams", 3)
; |
235 | 243 |
236 SkString cName("c"); | 244 SkString cName("c"); |
237 SkString tName("t"); | 245 SkString tName("t"); |
238 SkString p0; // start radius | 246 SkString p0; // start radius |
239 SkString p1; // start radius squared | 247 SkString p1; // start radius squared |
240 SkString p2; // difference in radii (r1 - r0) | 248 SkString p2; // difference in radii (r1 - r0) |
241 | 249 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 matrix.postScale(s, s); | 369 matrix.postScale(s, s); |
362 } | 370 } |
363 | 371 |
364 invLMatrix->postConcat(matrix); | 372 invLMatrix->postConcat(matrix); |
365 | 373 |
366 return conicalType; | 374 return conicalType; |
367 } | 375 } |
368 | 376 |
369 ////////////////////////////////////////////////////////////////////////////// | 377 ////////////////////////////////////////////////////////////////////////////// |
370 | 378 |
371 class GLFocalOutside2PtConicalEffect; | |
372 | |
373 class FocalOutside2PtConicalEffect : public GrGradientEffect { | 379 class FocalOutside2PtConicalEffect : public GrGradientEffect { |
374 public: | 380 public: |
375 | 381 |
376 static GrFragmentProcessor* Create(GrContext* ctx, | 382 static GrFragmentProcessor* Create(GrContext* ctx, |
377 const SkTwoPointConicalGradient& shader, | 383 const SkTwoPointConicalGradient& shader, |
378 const SkMatrix& matrix, | 384 const SkMatrix& matrix, |
379 SkShader::TileMode tm, | 385 SkShader::TileMode tm, |
380 SkScalar focalX) { | 386 SkScalar focalX) { |
381 return SkNEW_ARGS(FocalOutside2PtConicalEffect, (ctx, shader, matrix, tm
, focalX)); | 387 return SkNEW_ARGS(FocalOutside2PtConicalEffect, (ctx, shader, matrix, tm
, focalX)); |
382 } | 388 } |
383 | 389 |
384 virtual ~FocalOutside2PtConicalEffect() { } | 390 virtual ~FocalOutside2PtConicalEffect() { } |
385 | 391 |
386 static const char* Name() { return "Two-Point Conical Gradient Focal Outside
"; } | 392 virtual const char* name() const SK_OVERRIDE { |
387 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | 393 return "Two-Point Conical Gradient Focal Outside"; |
| 394 } |
| 395 |
| 396 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons
t SK_OVERRIDE; |
| 397 |
| 398 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
| 399 |
| 400 virtual uint32_t classID() const { |
| 401 static uint32_t id = GenClassID(); |
| 402 return id; |
| 403 } |
388 | 404 |
389 bool isFlipped() const { return fIsFlipped; } | 405 bool isFlipped() const { return fIsFlipped; } |
390 SkScalar focal() const { return fFocalX; } | 406 SkScalar focal() const { return fFocalX; } |
391 | 407 |
392 typedef GLFocalOutside2PtConicalEffect GLProcessor; | |
393 | |
394 private: | 408 private: |
395 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 409 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
396 const FocalOutside2PtConicalEffect& s = sBase.cast<FocalOutside2PtConica
lEffect>(); | 410 const FocalOutside2PtConicalEffect& s = sBase.cast<FocalOutside2PtConica
lEffect>(); |
397 return (INHERITED::onIsEqual(sBase) && | 411 return (INHERITED::onIsEqual(sBase) && |
398 this->fFocalX == s.fFocalX && | 412 this->fFocalX == s.fFocalX && |
399 this->fIsFlipped == s.fIsFlipped); | 413 this->fIsFlipped == s.fIsFlipped); |
400 } | 414 } |
401 | 415 |
402 FocalOutside2PtConicalEffect(GrContext* ctx, | 416 FocalOutside2PtConicalEffect(GrContext* ctx, |
403 const SkTwoPointConicalGradient& shader, | 417 const SkTwoPointConicalGradient& shader, |
404 const SkMatrix& matrix, | 418 const SkMatrix& matrix, |
405 SkShader::TileMode tm, | 419 SkShader::TileMode tm, |
406 SkScalar focalX) | 420 SkScalar focalX) |
407 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX), fIsFlipped(shader.isF
lippedGrad()) {} | 421 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX), fIsFlipped(shader.isF
lippedGrad()) {} |
408 | 422 |
409 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 423 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
410 | 424 |
411 SkScalar fFocalX; | 425 SkScalar fFocalX; |
412 bool fIsFlipped; | 426 bool fIsFlipped; |
413 | 427 |
414 typedef GrGradientEffect INHERITED; | 428 typedef GrGradientEffect INHERITED; |
415 }; | 429 }; |
416 | 430 |
417 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect { | 431 class GLFocalOutside2PtConicalEffect : public GrGLGradientEffect { |
418 public: | 432 public: |
419 GLFocalOutside2PtConicalEffect(const GrBackendProcessorFactory& factory, con
st GrProcessor&); | 433 GLFocalOutside2PtConicalEffect(const GrProcessor&); |
420 virtual ~GLFocalOutside2PtConicalEffect() { } | 434 virtual ~GLFocalOutside2PtConicalEffect() { } |
421 | 435 |
422 virtual void emitCode(GrGLFPBuilder*, | 436 virtual void emitCode(GrGLFPBuilder*, |
423 const GrFragmentProcessor&, | 437 const GrFragmentProcessor&, |
424 const char* outputColor, | 438 const char* outputColor, |
425 const char* inputColor, | 439 const char* inputColor, |
426 const TransformedCoordsArray&, | 440 const TransformedCoordsArray&, |
427 const TextureSamplerArray&) SK_OVERRIDE; | 441 const TextureSamplerArray&) SK_OVERRIDE; |
428 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 442 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
429 | 443 |
(...skipping 12 matching lines...) Expand all Loading... |
442 | 456 |
443 SkScalar fCachedFocal; | 457 SkScalar fCachedFocal; |
444 | 458 |
445 // @} | 459 // @} |
446 | 460 |
447 private: | 461 private: |
448 typedef GrGLGradientEffect INHERITED; | 462 typedef GrGLGradientEffect INHERITED; |
449 | 463 |
450 }; | 464 }; |
451 | 465 |
452 const GrBackendFragmentProcessorFactory& FocalOutside2PtConicalEffect::getFactor
y() const { | 466 void FocalOutside2PtConicalEffect::getGLProcessorKey(const GrGLCaps& caps, |
453 return GrTBackendFragmentProcessorFactory<FocalOutside2PtConicalEffect>::get
Instance(); | 467 GrProcessorKeyBuilder* b) c
onst { |
| 468 GLFocalOutside2PtConicalEffect::GenKey(*this, caps, b); |
| 469 } |
| 470 |
| 471 GrGLFragmentProcessor* FocalOutside2PtConicalEffect::createGLInstance() const { |
| 472 return SkNEW_ARGS(GLFocalOutside2PtConicalEffect, (*this)); |
454 } | 473 } |
455 | 474 |
456 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalOutside2PtConicalEffect); | 475 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalOutside2PtConicalEffect); |
457 | 476 |
458 /* | 477 /* |
459 * All Two point conical gradient test create functions may occasionally create
edge case shaders | 478 * All Two point conical gradient test create functions may occasionally create
edge case shaders |
460 */ | 479 */ |
461 GrFragmentProcessor* FocalOutside2PtConicalEffect::TestCreate(SkRandom* random, | 480 GrFragmentProcessor* FocalOutside2PtConicalEffect::TestCreate(SkRandom* random, |
462 GrContext* context
, | 481 GrContext* context
, |
463 const GrDrawTarget
Caps&, | 482 const GrDrawTarget
Caps&, |
(...skipping 20 matching lines...) Expand all Loading... |
484 center
2, radius2, | 503 center
2, radius2, |
485 colors
, stops, colorCount, | 504 colors
, stops, colorCount, |
486 tm)); | 505 tm)); |
487 SkPaint paint; | 506 SkPaint paint; |
488 GrFragmentProcessor* effect; | 507 GrFragmentProcessor* effect; |
489 GrColor paintColor; | 508 GrColor paintColor; |
490 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &effect)); | 509 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &effect)); |
491 return effect; | 510 return effect; |
492 } | 511 } |
493 | 512 |
494 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrBackendPr
ocessorFactory& factory, | 513 GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrProcessor
& processor) |
495 const GrProcessor
& processor) | 514 : fVSVaryingName(NULL) |
496 : INHERITED(factory) | |
497 , fVSVaryingName(NULL) | |
498 , fFSVaryingName(NULL) | 515 , fFSVaryingName(NULL) |
499 , fCachedFocal(SK_ScalarMax) { | 516 , fCachedFocal(SK_ScalarMax) { |
500 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon
icalEffect>(); | 517 const FocalOutside2PtConicalEffect& data = processor.cast<FocalOutside2PtCon
icalEffect>(); |
501 fIsFlipped = data.isFlipped(); | 518 fIsFlipped = data.isFlipped(); |
502 } | 519 } |
503 | 520 |
504 void GLFocalOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, | 521 void GLFocalOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, |
505 const GrFragmentProcessor& fp, | 522 const GrFragmentProcessor& fp, |
506 const char* outputColor, | 523 const char* outputColor, |
507 const char* inputColor, | 524 const char* inputColor, |
508 const TransformedCoordsArray& coor
ds, | 525 const TransformedCoordsArray& coor
ds, |
509 const TextureSamplerArray& sampler
s) { | 526 const TextureSamplerArray& sampler
s) { |
510 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 527 const FocalOutside2PtConicalEffect& ge = fp.cast<FocalOutside2PtConicalEffec
t>(); |
511 this->emitUniforms(builder, ge); | 528 this->emitUniforms(builder, ge); |
512 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit
y, | 529 fParamUni = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibilit
y, |
513 kFloat_GrSLType, "Conical2FSParams", 2)
; | 530 kFloat_GrSLType, "Conical2FSParams", 2)
; |
514 SkString tName("t"); | 531 SkString tName("t"); |
515 SkString p0; // focalX | 532 SkString p0; // focalX |
516 SkString p1; // 1 - focalX * focalX | 533 SkString p1; // 1 - focalX * focalX |
517 | 534 |
518 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); | 535 builder->getUniformVariable(fParamUni).appendArrayAccess(0, &p0); |
519 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); | 536 builder->getUniformVariable(fParamUni).appendArrayAccess(1, &p1); |
520 | 537 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
586 static GrFragmentProcessor* Create(GrContext* ctx, | 603 static GrFragmentProcessor* Create(GrContext* ctx, |
587 const SkTwoPointConicalGradient& shader, | 604 const SkTwoPointConicalGradient& shader, |
588 const SkMatrix& matrix, | 605 const SkMatrix& matrix, |
589 SkShader::TileMode tm, | 606 SkShader::TileMode tm, |
590 SkScalar focalX) { | 607 SkScalar focalX) { |
591 return SkNEW_ARGS(FocalInside2PtConicalEffect, (ctx, shader, matrix, tm,
focalX)); | 608 return SkNEW_ARGS(FocalInside2PtConicalEffect, (ctx, shader, matrix, tm,
focalX)); |
592 } | 609 } |
593 | 610 |
594 virtual ~FocalInside2PtConicalEffect() {} | 611 virtual ~FocalInside2PtConicalEffect() {} |
595 | 612 |
596 static const char* Name() { return "Two-Point Conical Gradient Focal Inside"
; } | 613 virtual const char* name() const SK_OVERRIDE { |
597 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | 614 return "Two-Point Conical Gradient Focal Inside"; |
| 615 } |
| 616 |
| 617 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons
t SK_OVERRIDE; |
| 618 |
| 619 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
| 620 |
| 621 virtual uint32_t classID() const { |
| 622 static uint32_t id = GenClassID(); |
| 623 return id; |
| 624 } |
598 | 625 |
599 SkScalar focal() const { return fFocalX; } | 626 SkScalar focal() const { return fFocalX; } |
600 | 627 |
601 typedef GLFocalInside2PtConicalEffect GLProcessor; | 628 typedef GLFocalInside2PtConicalEffect GLProcessor; |
602 | 629 |
603 private: | 630 private: |
604 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 631 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
605 const FocalInside2PtConicalEffect& s = sBase.cast<FocalInside2PtConicalE
ffect>(); | 632 const FocalInside2PtConicalEffect& s = sBase.cast<FocalInside2PtConicalE
ffect>(); |
606 return (INHERITED::onIsEqual(sBase) && | 633 return (INHERITED::onIsEqual(sBase) && |
607 this->fFocalX == s.fFocalX); | 634 this->fFocalX == s.fFocalX); |
608 } | 635 } |
609 | 636 |
610 FocalInside2PtConicalEffect(GrContext* ctx, | 637 FocalInside2PtConicalEffect(GrContext* ctx, |
611 const SkTwoPointConicalGradient& shader, | 638 const SkTwoPointConicalGradient& shader, |
612 const SkMatrix& matrix, | 639 const SkMatrix& matrix, |
613 SkShader::TileMode tm, | 640 SkShader::TileMode tm, |
614 SkScalar focalX) | 641 SkScalar focalX) |
615 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX) {} | 642 : INHERITED(ctx, shader, matrix, tm), fFocalX(focalX) {} |
616 | 643 |
617 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 644 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
618 | 645 |
619 SkScalar fFocalX; | 646 SkScalar fFocalX; |
620 | 647 |
621 typedef GrGradientEffect INHERITED; | 648 typedef GrGradientEffect INHERITED; |
622 }; | 649 }; |
623 | 650 |
624 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect { | 651 class GLFocalInside2PtConicalEffect : public GrGLGradientEffect { |
625 public: | 652 public: |
626 GLFocalInside2PtConicalEffect(const GrBackendProcessorFactory& factory, cons
t GrProcessor&); | 653 GLFocalInside2PtConicalEffect(const GrProcessor&); |
627 virtual ~GLFocalInside2PtConicalEffect() {} | 654 virtual ~GLFocalInside2PtConicalEffect() {} |
628 | 655 |
629 virtual void emitCode(GrGLFPBuilder*, | 656 virtual void emitCode(GrGLFPBuilder*, |
630 const GrFragmentProcessor&, | 657 const GrFragmentProcessor&, |
631 const char* outputColor, | 658 const char* outputColor, |
632 const char* inputColor, | 659 const char* inputColor, |
633 const TransformedCoordsArray&, | 660 const TransformedCoordsArray&, |
634 const TextureSamplerArray&) SK_OVERRIDE; | 661 const TextureSamplerArray&) SK_OVERRIDE; |
635 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 662 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
636 | 663 |
(...skipping 10 matching lines...) Expand all Loading... |
647 | 674 |
648 SkScalar fCachedFocal; | 675 SkScalar fCachedFocal; |
649 | 676 |
650 // @} | 677 // @} |
651 | 678 |
652 private: | 679 private: |
653 typedef GrGLGradientEffect INHERITED; | 680 typedef GrGLGradientEffect INHERITED; |
654 | 681 |
655 }; | 682 }; |
656 | 683 |
657 const GrBackendFragmentProcessorFactory& FocalInside2PtConicalEffect::getFactory
() const { | 684 void FocalInside2PtConicalEffect::getGLProcessorKey(const GrGLCaps& caps, |
658 return GrTBackendFragmentProcessorFactory<FocalInside2PtConicalEffect>::getI
nstance(); | 685 GrProcessorKeyBuilder* b) const { |
| 686 GLFocalInside2PtConicalEffect::GenKey(*this, caps, b); |
| 687 } |
| 688 |
| 689 GrGLFragmentProcessor* FocalInside2PtConicalEffect::createGLInstance() const { |
| 690 return SkNEW_ARGS(GLFocalInside2PtConicalEffect, (*this)); |
659 } | 691 } |
660 | 692 |
661 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalInside2PtConicalEffect); | 693 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(FocalInside2PtConicalEffect); |
662 | 694 |
663 /* | 695 /* |
664 * All Two point conical gradient test create functions may occasionally create
edge case shaders | 696 * All Two point conical gradient test create functions may occasionally create
edge case shaders |
665 */ | 697 */ |
666 GrFragmentProcessor* FocalInside2PtConicalEffect::TestCreate(SkRandom* random, | 698 GrFragmentProcessor* FocalInside2PtConicalEffect::TestCreate(SkRandom* random, |
667 GrContext* context, | 699 GrContext* context, |
668 const GrDrawTargetC
aps&, | 700 const GrDrawTargetC
aps&, |
(...skipping 22 matching lines...) Expand all Loading... |
691 center
2, radius2, | 723 center
2, radius2, |
692 colors
, stops, colorCount, | 724 colors
, stops, colorCount, |
693 tm)); | 725 tm)); |
694 SkPaint paint; | 726 SkPaint paint; |
695 GrColor paintColor; | 727 GrColor paintColor; |
696 GrFragmentProcessor* fp; | 728 GrFragmentProcessor* fp; |
697 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &fp)); | 729 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &fp)); |
698 return fp; | 730 return fp; |
699 } | 731 } |
700 | 732 |
701 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrBackendProc
essorFactory& factory, | 733 GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrProcessor&) |
702 const GrProcessor&) | 734 : fVSVaryingName(NULL) |
703 : INHERITED(factory) | |
704 , fVSVaryingName(NULL) | |
705 , fFSVaryingName(NULL) | 735 , fFSVaryingName(NULL) |
706 , fCachedFocal(SK_ScalarMax) {} | 736 , fCachedFocal(SK_ScalarMax) {} |
707 | 737 |
708 void GLFocalInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, | 738 void GLFocalInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, |
709 const GrFragmentProcessor& fp, | 739 const GrFragmentProcessor& fp, |
710 const char* outputColor, | 740 const char* outputColor, |
711 const char* inputColor, | 741 const char* inputColor, |
712 const TransformedCoordsArray& coord
s, | 742 const TransformedCoordsArray& coord
s, |
713 const TextureSamplerArray& samplers
) { | 743 const TextureSamplerArray& samplers
) { |
714 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 744 const FocalInside2PtConicalEffect& ge = fp.cast<FocalInside2PtConicalEffect>
(); |
715 this->emitUniforms(builder, ge); | 745 this->emitUniforms(builder, ge); |
716 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 746 fFocalUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
717 kFloat_GrSLType, "Conical2FSParams"); | 747 kFloat_GrSLType, "Conical2FSParams"); |
718 SkString tName("t"); | 748 SkString tName("t"); |
719 | 749 |
720 // this is the distance along x-axis from the end center to focal point in | 750 // this is the distance along x-axis from the end center to focal point in |
721 // transformed coordinates | 751 // transformed coordinates |
722 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni); | 752 GrGLShaderVar focal = builder->getUniformVariable(fFocalUni); |
723 | 753 |
724 // if we have a vec3 from being in perspective, convert it to a vec2 first | 754 // 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; | 837 info->fB = B; |
808 info->fC = C; | 838 info->fC = C; |
809 | 839 |
810 // if A ends up being negative, the start circle is contained completely ins
ide the end cirlce | 840 // if A ends up being negative, the start circle is contained completely ins
ide the end cirlce |
811 if (A < 0.f) { | 841 if (A < 0.f) { |
812 return kInside_ConicalType; | 842 return kInside_ConicalType; |
813 } | 843 } |
814 return kOutside_ConicalType; | 844 return kOutside_ConicalType; |
815 } | 845 } |
816 | 846 |
817 class GLCircleInside2PtConicalEffect; | |
818 | |
819 class CircleInside2PtConicalEffect : public GrGradientEffect { | 847 class CircleInside2PtConicalEffect : public GrGradientEffect { |
820 public: | 848 public: |
821 | 849 |
822 static GrFragmentProcessor* Create(GrContext* ctx, | 850 static GrFragmentProcessor* Create(GrContext* ctx, |
823 const SkTwoPointConicalGradient& shader, | 851 const SkTwoPointConicalGradient& shader, |
824 const SkMatrix& matrix, | 852 const SkMatrix& matrix, |
825 SkShader::TileMode tm, | 853 SkShader::TileMode tm, |
826 const CircleConicalInfo& info) { | 854 const CircleConicalInfo& info) { |
827 return SkNEW_ARGS(CircleInside2PtConicalEffect, (ctx, shader, matrix, tm
, info)); | 855 return SkNEW_ARGS(CircleInside2PtConicalEffect, (ctx, shader, matrix, tm
, info)); |
828 } | 856 } |
829 | 857 |
830 virtual ~CircleInside2PtConicalEffect() {} | 858 virtual ~CircleInside2PtConicalEffect() {} |
831 | 859 |
832 static const char* Name() { return "Two-Point Conical Gradient Inside"; } | 860 virtual const char* name() const SK_OVERRIDE { return "Two-Point Conical Gra
dient Inside"; } |
833 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | 861 |
| 862 virtual void getGLProcessorKey(const GrGLCaps& caps, |
| 863 GrProcessorKeyBuilder* b) const SK_OVERRIDE; |
| 864 |
| 865 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
| 866 |
| 867 virtual uint32_t classID() const { |
| 868 static uint32_t id = GenClassID(); |
| 869 return id; |
| 870 } |
834 | 871 |
835 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } | 872 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } |
836 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } | 873 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } |
837 SkScalar A() const { return fInfo.fA; } | 874 SkScalar A() const { return fInfo.fA; } |
838 SkScalar B() const { return fInfo.fB; } | 875 SkScalar B() const { return fInfo.fB; } |
839 SkScalar C() const { return fInfo.fC; } | 876 SkScalar C() const { return fInfo.fC; } |
840 | 877 |
841 typedef GLCircleInside2PtConicalEffect GLProcessor; | |
842 | |
843 private: | 878 private: |
844 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 879 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
845 const CircleInside2PtConicalEffect& s = sBase.cast<CircleInside2PtConica
lEffect>(); | 880 const CircleInside2PtConicalEffect& s = sBase.cast<CircleInside2PtConica
lEffect>(); |
846 return (INHERITED::onIsEqual(sBase) && | 881 return (INHERITED::onIsEqual(sBase) && |
847 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && | 882 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && |
848 this->fInfo.fA == s.fInfo.fA && | 883 this->fInfo.fA == s.fInfo.fA && |
849 this->fInfo.fB == s.fInfo.fB && | 884 this->fInfo.fB == s.fInfo.fB && |
850 this->fInfo.fC == s.fInfo.fC); | 885 this->fInfo.fC == s.fInfo.fC); |
851 } | 886 } |
852 | 887 |
853 CircleInside2PtConicalEffect(GrContext* ctx, | 888 CircleInside2PtConicalEffect(GrContext* ctx, |
854 const SkTwoPointConicalGradient& shader, | 889 const SkTwoPointConicalGradient& shader, |
855 const SkMatrix& matrix, | 890 const SkMatrix& matrix, |
856 SkShader::TileMode tm, | 891 SkShader::TileMode tm, |
857 const CircleConicalInfo& info) | 892 const CircleConicalInfo& info) |
858 : INHERITED(ctx, shader, matrix, tm), fInfo(info) {} | 893 : INHERITED(ctx, shader, matrix, tm), fInfo(info) {} |
859 | 894 |
860 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; | 895 GR_DECLARE_FRAGMENT_PROCESSOR_TEST; |
861 | 896 |
862 const CircleConicalInfo fInfo; | 897 const CircleConicalInfo fInfo; |
863 | 898 |
864 typedef GrGradientEffect INHERITED; | 899 typedef GrGradientEffect INHERITED; |
865 }; | 900 }; |
866 | 901 |
867 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect { | 902 class GLCircleInside2PtConicalEffect : public GrGLGradientEffect { |
868 public: | 903 public: |
869 GLCircleInside2PtConicalEffect(const GrBackendProcessorFactory& factory, con
st GrProcessor&); | 904 GLCircleInside2PtConicalEffect(const GrProcessor&); |
870 virtual ~GLCircleInside2PtConicalEffect() {} | 905 virtual ~GLCircleInside2PtConicalEffect() {} |
871 | 906 |
872 virtual void emitCode(GrGLFPBuilder*, | 907 virtual void emitCode(GrGLFPBuilder*, |
873 const GrFragmentProcessor&, | 908 const GrFragmentProcessor&, |
874 const char* outputColor, | 909 const char* outputColor, |
875 const char* inputColor, | 910 const char* inputColor, |
876 const TransformedCoordsArray&, | 911 const TransformedCoordsArray&, |
877 const TextureSamplerArray&) SK_OVERRIDE; | 912 const TextureSamplerArray&) SK_OVERRIDE; |
878 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 913 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
879 | 914 |
(...skipping 15 matching lines...) Expand all Loading... |
895 SkScalar fCachedB; | 930 SkScalar fCachedB; |
896 SkScalar fCachedC; | 931 SkScalar fCachedC; |
897 | 932 |
898 // @} | 933 // @} |
899 | 934 |
900 private: | 935 private: |
901 typedef GrGLGradientEffect INHERITED; | 936 typedef GrGLGradientEffect INHERITED; |
902 | 937 |
903 }; | 938 }; |
904 | 939 |
905 const GrBackendFragmentProcessorFactory& CircleInside2PtConicalEffect::getFactor
y() const { | 940 void CircleInside2PtConicalEffect::getGLProcessorKey(const GrGLCaps& caps, |
906 return GrTBackendFragmentProcessorFactory<CircleInside2PtConicalEffect>::get
Instance(); | 941 GrProcessorKeyBuilder* b) c
onst { |
| 942 GLCircleInside2PtConicalEffect::GenKey(*this, caps, b); |
| 943 } |
| 944 |
| 945 GrGLFragmentProcessor* CircleInside2PtConicalEffect::createGLInstance() const { |
| 946 return SkNEW_ARGS(GLCircleInside2PtConicalEffect, (*this)); |
907 } | 947 } |
908 | 948 |
909 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleInside2PtConicalEffect); | 949 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleInside2PtConicalEffect); |
910 | 950 |
911 /* | 951 /* |
912 * All Two point conical gradient test create functions may occasionally create
edge case shaders | 952 * All Two point conical gradient test create functions may occasionally create
edge case shaders |
913 */ | 953 */ |
914 GrFragmentProcessor* CircleInside2PtConicalEffect::TestCreate(SkRandom* random, | 954 GrFragmentProcessor* CircleInside2PtConicalEffect::TestCreate(SkRandom* random, |
915 GrContext* context
, | 955 GrContext* context
, |
916 const GrDrawTarget
Caps&, | 956 const GrDrawTarget
Caps&, |
(...skipping 21 matching lines...) Expand all Loading... |
938 center
2, radius2, | 978 center
2, radius2, |
939 colors
, stops, colorCount, | 979 colors
, stops, colorCount, |
940 tm)); | 980 tm)); |
941 SkPaint paint; | 981 SkPaint paint; |
942 GrColor paintColor; | 982 GrColor paintColor; |
943 GrFragmentProcessor* processor; | 983 GrFragmentProcessor* processor; |
944 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &processor)); | 984 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &processor)); |
945 return processor; | 985 return processor; |
946 } | 986 } |
947 | 987 |
948 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrBackendPr
ocessorFactory& factory, | 988 GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrProcessor
& processor) |
949 const GrProcessor
& processor) | 989 : fVSVaryingName(NULL) |
950 : INHERITED(factory) | |
951 , fVSVaryingName(NULL) | |
952 , fFSVaryingName(NULL) | 990 , fFSVaryingName(NULL) |
953 , fCachedCenterX(SK_ScalarMax) | 991 , fCachedCenterX(SK_ScalarMax) |
954 , fCachedCenterY(SK_ScalarMax) | 992 , fCachedCenterY(SK_ScalarMax) |
955 , fCachedA(SK_ScalarMax) | 993 , fCachedA(SK_ScalarMax) |
956 , fCachedB(SK_ScalarMax) | 994 , fCachedB(SK_ScalarMax) |
957 , fCachedC(SK_ScalarMax) {} | 995 , fCachedC(SK_ScalarMax) {} |
958 | 996 |
959 void GLCircleInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, | 997 void GLCircleInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, |
960 const GrFragmentProcessor& fp, | 998 const GrFragmentProcessor& fp, |
961 const char* outputColor, | 999 const char* outputColor, |
962 const char* inputColor, | 1000 const char* inputColor, |
963 const TransformedCoordsArray& coor
ds, | 1001 const TransformedCoordsArray& coor
ds, |
964 const TextureSamplerArray& sampler
s) { | 1002 const TextureSamplerArray& sampler
s) { |
965 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 1003 const CircleInside2PtConicalEffect& ge = fp.cast<CircleInside2PtConicalEffec
t>(); |
966 this->emitUniforms(builder, ge); | 1004 this->emitUniforms(builder, ge); |
967 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1005 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
968 kVec2f_GrSLType, "Conical2FSCenter"); | 1006 kVec2f_GrSLType, "Conical2FSCenter"); |
969 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1007 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
970 kVec3f_GrSLType, "Conical2FSParams"); | 1008 kVec3f_GrSLType, "Conical2FSParams"); |
971 SkString tName("t"); | 1009 SkString tName("t"); |
972 | 1010 |
973 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); | 1011 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); |
974 // params.x = A | 1012 // params.x = A |
975 // params.y = B | 1013 // params.y = B |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1022 } | 1060 } |
1023 } | 1061 } |
1024 | 1062 |
1025 void GLCircleInside2PtConicalEffect::GenKey(const GrProcessor& processor, | 1063 void GLCircleInside2PtConicalEffect::GenKey(const GrProcessor& processor, |
1026 const GrGLCaps&, GrProcessorKeyBuild
er* b) { | 1064 const GrGLCaps&, GrProcessorKeyBuild
er* b) { |
1027 b->add32(GenBaseGradientKey(processor)); | 1065 b->add32(GenBaseGradientKey(processor)); |
1028 } | 1066 } |
1029 | 1067 |
1030 ////////////////////////////////////////////////////////////////////////////// | 1068 ////////////////////////////////////////////////////////////////////////////// |
1031 | 1069 |
1032 class GLCircleOutside2PtConicalEffect; | |
1033 | |
1034 class CircleOutside2PtConicalEffect : public GrGradientEffect { | 1070 class CircleOutside2PtConicalEffect : public GrGradientEffect { |
1035 public: | 1071 public: |
1036 | 1072 |
1037 static GrFragmentProcessor* Create(GrContext* ctx, | 1073 static GrFragmentProcessor* Create(GrContext* ctx, |
1038 const SkTwoPointConicalGradient& shader, | 1074 const SkTwoPointConicalGradient& shader, |
1039 const SkMatrix& matrix, | 1075 const SkMatrix& matrix, |
1040 SkShader::TileMode tm, | 1076 SkShader::TileMode tm, |
1041 const CircleConicalInfo& info) { | 1077 const CircleConicalInfo& info) { |
1042 return SkNEW_ARGS(CircleOutside2PtConicalEffect, (ctx, shader, matrix, t
m, info)); | 1078 return SkNEW_ARGS(CircleOutside2PtConicalEffect, (ctx, shader, matrix, t
m, info)); |
1043 } | 1079 } |
1044 | 1080 |
1045 virtual ~CircleOutside2PtConicalEffect() {} | 1081 virtual ~CircleOutside2PtConicalEffect() {} |
1046 | 1082 |
1047 static const char* Name() { return "Two-Point Conical Gradient Outside"; } | 1083 virtual const char* name() const SK_OVERRIDE { return "Two-Point Conical Gra
dient Outside"; } |
1048 virtual const GrBackendFragmentProcessorFactory& getFactory() const SK_OVERR
IDE; | 1084 |
| 1085 virtual void getGLProcessorKey(const GrGLCaps&, GrProcessorKeyBuilder*) cons
t SK_OVERRIDE; |
| 1086 |
| 1087 virtual GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE; |
| 1088 |
| 1089 virtual uint32_t classID() const { |
| 1090 static uint32_t id = GenClassID(); |
| 1091 return id; |
| 1092 } |
1049 | 1093 |
1050 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } | 1094 SkScalar centerX() const { return fInfo.fCenterEnd.fX; } |
1051 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } | 1095 SkScalar centerY() const { return fInfo.fCenterEnd.fY; } |
1052 SkScalar A() const { return fInfo.fA; } | 1096 SkScalar A() const { return fInfo.fA; } |
1053 SkScalar B() const { return fInfo.fB; } | 1097 SkScalar B() const { return fInfo.fB; } |
1054 SkScalar C() const { return fInfo.fC; } | 1098 SkScalar C() const { return fInfo.fC; } |
1055 SkScalar tLimit() const { return fTLimit; } | 1099 SkScalar tLimit() const { return fTLimit; } |
1056 bool isFlipped() const { return fIsFlipped; } | 1100 bool isFlipped() const { return fIsFlipped; } |
1057 | 1101 |
1058 typedef GLCircleOutside2PtConicalEffect GLProcessor; | |
1059 | |
1060 private: | 1102 private: |
1061 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { | 1103 virtual bool onIsEqual(const GrFragmentProcessor& sBase) const SK_OVERRIDE { |
1062 const CircleOutside2PtConicalEffect& s = sBase.cast<CircleOutside2PtConi
calEffect>(); | 1104 const CircleOutside2PtConicalEffect& s = sBase.cast<CircleOutside2PtConi
calEffect>(); |
1063 return (INHERITED::onIsEqual(sBase) && | 1105 return (INHERITED::onIsEqual(sBase) && |
1064 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && | 1106 this->fInfo.fCenterEnd == s.fInfo.fCenterEnd && |
1065 this->fInfo.fA == s.fInfo.fA && | 1107 this->fInfo.fA == s.fInfo.fA && |
1066 this->fInfo.fB == s.fInfo.fB && | 1108 this->fInfo.fB == s.fInfo.fB && |
1067 this->fInfo.fC == s.fInfo.fC && | 1109 this->fInfo.fC == s.fInfo.fC && |
1068 this->fTLimit == s.fTLimit && | 1110 this->fTLimit == s.fTLimit && |
1069 this->fIsFlipped == s.fIsFlipped); | 1111 this->fIsFlipped == s.fIsFlipped); |
(...skipping 19 matching lines...) Expand all Loading... |
1089 | 1131 |
1090 const CircleConicalInfo fInfo; | 1132 const CircleConicalInfo fInfo; |
1091 SkScalar fTLimit; | 1133 SkScalar fTLimit; |
1092 bool fIsFlipped; | 1134 bool fIsFlipped; |
1093 | 1135 |
1094 typedef GrGradientEffect INHERITED; | 1136 typedef GrGradientEffect INHERITED; |
1095 }; | 1137 }; |
1096 | 1138 |
1097 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect { | 1139 class GLCircleOutside2PtConicalEffect : public GrGLGradientEffect { |
1098 public: | 1140 public: |
1099 GLCircleOutside2PtConicalEffect(const GrBackendProcessorFactory&, const GrPr
ocessor&); | 1141 GLCircleOutside2PtConicalEffect(const GrProcessor&); |
1100 virtual ~GLCircleOutside2PtConicalEffect() {} | 1142 virtual ~GLCircleOutside2PtConicalEffect() {} |
1101 | 1143 |
1102 virtual void emitCode(GrGLFPBuilder*, | 1144 virtual void emitCode(GrGLFPBuilder*, |
1103 const GrFragmentProcessor&, | 1145 const GrFragmentProcessor&, |
1104 const char* outputColor, | 1146 const char* outputColor, |
1105 const char* inputColor, | 1147 const char* inputColor, |
1106 const TransformedCoordsArray&, | 1148 const TransformedCoordsArray&, |
1107 const TextureSamplerArray&) SK_OVERRIDE; | 1149 const TextureSamplerArray&) SK_OVERRIDE; |
1108 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 1150 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
1109 | 1151 |
(...skipping 18 matching lines...) Expand all Loading... |
1128 SkScalar fCachedC; | 1170 SkScalar fCachedC; |
1129 SkScalar fCachedTLimit; | 1171 SkScalar fCachedTLimit; |
1130 | 1172 |
1131 // @} | 1173 // @} |
1132 | 1174 |
1133 private: | 1175 private: |
1134 typedef GrGLGradientEffect INHERITED; | 1176 typedef GrGLGradientEffect INHERITED; |
1135 | 1177 |
1136 }; | 1178 }; |
1137 | 1179 |
1138 const GrBackendFragmentProcessorFactory& CircleOutside2PtConicalEffect::getFacto
ry() const { | 1180 void CircleOutside2PtConicalEffect::getGLProcessorKey(const GrGLCaps& caps, |
1139 return GrTBackendFragmentProcessorFactory<CircleOutside2PtConicalEffect>::ge
tInstance(); | 1181 GrProcessorKeyBuilder* b)
const { |
| 1182 GLCircleOutside2PtConicalEffect::GenKey(*this, caps, b); |
| 1183 } |
| 1184 |
| 1185 GrGLFragmentProcessor* CircleOutside2PtConicalEffect::createGLInstance() const S
K_OVERRIDE { |
| 1186 return SkNEW_ARGS(GLCircleOutside2PtConicalEffect, (*this)); |
1140 } | 1187 } |
1141 | 1188 |
1142 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleOutside2PtConicalEffect); | 1189 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(CircleOutside2PtConicalEffect); |
1143 | 1190 |
1144 /* | 1191 /* |
1145 * All Two point conical gradient test create functions may occasionally create
edge case shaders | 1192 * All Two point conical gradient test create functions may occasionally create
edge case shaders |
1146 */ | 1193 */ |
1147 GrFragmentProcessor* CircleOutside2PtConicalEffect::TestCreate(SkRandom* random, | 1194 GrFragmentProcessor* CircleOutside2PtConicalEffect::TestCreate(SkRandom* random, |
1148 GrContext* contex
t, | 1195 GrContext* contex
t, |
1149 const GrDrawTarge
tCaps&, | 1196 const GrDrawTarge
tCaps&, |
(...skipping 22 matching lines...) Expand all Loading... |
1172 center
2, radius2, | 1219 center
2, radius2, |
1173 colors
, stops, colorCount, | 1220 colors
, stops, colorCount, |
1174 tm)); | 1221 tm)); |
1175 SkPaint paint; | 1222 SkPaint paint; |
1176 GrColor paintColor; | 1223 GrColor paintColor; |
1177 GrFragmentProcessor* processor; | 1224 GrFragmentProcessor* processor; |
1178 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &processor)); | 1225 SkAssertResult(shader->asFragmentProcessor(context, paint, NULL, &paintColor
, &processor)); |
1179 return processor; | 1226 return processor; |
1180 } | 1227 } |
1181 | 1228 |
1182 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrBackend
ProcessorFactory& factory, | 1229 GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrProcess
or& processor) |
1183 const GrProcess
or& processor) | 1230 : fVSVaryingName(NULL) |
1184 : INHERITED(factory) | |
1185 , fVSVaryingName(NULL) | |
1186 , fFSVaryingName(NULL) | 1231 , fFSVaryingName(NULL) |
1187 , fCachedCenterX(SK_ScalarMax) | 1232 , fCachedCenterX(SK_ScalarMax) |
1188 , fCachedCenterY(SK_ScalarMax) | 1233 , fCachedCenterY(SK_ScalarMax) |
1189 , fCachedA(SK_ScalarMax) | 1234 , fCachedA(SK_ScalarMax) |
1190 , fCachedB(SK_ScalarMax) | 1235 , fCachedB(SK_ScalarMax) |
1191 , fCachedC(SK_ScalarMax) | 1236 , fCachedC(SK_ScalarMax) |
1192 , fCachedTLimit(SK_ScalarMax) { | 1237 , fCachedTLimit(SK_ScalarMax) { |
1193 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC
onicalEffect>(); | 1238 const CircleOutside2PtConicalEffect& data = processor.cast<CircleOutside2PtC
onicalEffect>(); |
1194 fIsFlipped = data.isFlipped(); | 1239 fIsFlipped = data.isFlipped(); |
1195 } | 1240 } |
1196 | 1241 |
1197 void GLCircleOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, | 1242 void GLCircleOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder, |
1198 const GrFragmentProcessor& fp, | 1243 const GrFragmentProcessor& fp, |
1199 const char* outputColor, | 1244 const char* outputColor, |
1200 const char* inputColor, | 1245 const char* inputColor, |
1201 const TransformedCoordsArray& coo
rds, | 1246 const TransformedCoordsArray& coo
rds, |
1202 const TextureSamplerArray& sample
rs) { | 1247 const TextureSamplerArray& sample
rs) { |
1203 const GrGradientEffect& ge = fp.cast<GrGradientEffect>(); | 1248 const CircleOutside2PtConicalEffect& ge = fp.cast<CircleOutside2PtConicalEff
ect>(); |
1204 this->emitUniforms(builder, ge); | 1249 this->emitUniforms(builder, ge); |
1205 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1250 fCenterUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
1206 kVec2f_GrSLType, "Conical2FSCenter"); | 1251 kVec2f_GrSLType, "Conical2FSCenter"); |
1207 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1252 fParamUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
1208 kVec4f_GrSLType, "Conical2FSParams"); | 1253 kVec4f_GrSLType, "Conical2FSParams"); |
1209 SkString tName("t"); | 1254 SkString tName("t"); |
1210 | 1255 |
1211 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); | 1256 GrGLShaderVar center = builder->getUniformVariable(fCenterUni); |
1212 // params.x = A | 1257 // params.x = A |
1213 // params.y = B | 1258 // 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); | 1370 return CircleInside2PtConicalEffect::Create(ctx, shader, matrix, tm, inf
o); |
1326 } else if (type == kEdge_ConicalType) { | 1371 } else if (type == kEdge_ConicalType) { |
1327 set_matrix_edge_conical(shader, &matrix); | 1372 set_matrix_edge_conical(shader, &matrix); |
1328 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); | 1373 return Edge2PtConicalEffect::Create(ctx, shader, matrix, tm); |
1329 } else { | 1374 } else { |
1330 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); | 1375 return CircleOutside2PtConicalEffect::Create(ctx, shader, matrix, tm, in
fo); |
1331 } | 1376 } |
1332 } | 1377 } |
1333 | 1378 |
1334 #endif | 1379 #endif |
OLD | NEW |