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