| 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 |