| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrDistanceFieldTextureEffect.h" | 8 #include "GrDistanceFieldTextureEffect.h" |
| 9 #include "GrInvariantOutput.h" | 9 #include "GrInvariantOutput.h" |
| 10 #include "gl/builders/GrGLProgramBuilder.h" | 10 #include "GrTexture.h" |
| 11 #include "SkDistanceFieldGen.h" |
| 11 #include "gl/GrGLProcessor.h" | 12 #include "gl/GrGLProcessor.h" |
| 12 #include "gl/GrGLSL.h" | 13 #include "gl/GrGLSL.h" |
| 13 #include "gl/GrGLTexture.h" | 14 #include "gl/GrGLTexture.h" |
| 14 #include "gl/GrGLGeometryProcessor.h" | 15 #include "gl/GrGLGeometryProcessor.h" |
| 15 #include "GrTBackendProcessorFactory.h" | 16 #include "gl/builders/GrGLProgramBuilder.h" |
| 16 #include "GrTexture.h" | |
| 17 | |
| 18 #include "SkDistanceFieldGen.h" | |
| 19 | 17 |
| 20 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/
2 | 18 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/
2 |
| 21 #define SK_DistanceFieldAAFactor "0.7071" | 19 #define SK_DistanceFieldAAFactor "0.7071" |
| 22 | 20 |
| 23 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor { | 21 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor { |
| 24 public: | 22 public: |
| 25 GrGLDistanceFieldTextureEffect(const GrBackendProcessorFactory& factory, | 23 GrGLDistanceFieldTextureEffect(const GrGeometryProcessor&, |
| 26 const GrGeometryProcessor&, | |
| 27 const GrBatchTracker&) | 24 const GrBatchTracker&) |
| 28 : INHERITED (factory) | 25 : fTextureSize(SkISize::Make(-1,-1)) |
| 29 , fTextureSize(SkISize::Make(-1,-1)) | |
| 30 #ifdef SK_GAMMA_APPLY_TO_A8 | 26 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 31 , fLuminance(-1.0f) | 27 , fLuminance(-1.0f) |
| 32 #endif | 28 #endif |
| 33 {} | 29 {} |
| 34 | 30 |
| 35 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 31 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
| 36 const GrDistanceFieldTextureEffect& dfTexEffect = | 32 const GrDistanceFieldTextureEffect& dfTexEffect = |
| 37 args.fGP.cast<GrDistanceFieldTextureEffect>(); | 33 args.fGP.cast<GrDistanceFieldTextureEffect>(); |
| 38 | 34 |
| 39 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 35 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 #ifdef SK_GAMMA_APPLY_TO_A8 | 200 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 205 fLuminance == cte.fLuminance && | 201 fLuminance == cte.fLuminance && |
| 206 #endif | 202 #endif |
| 207 fFlags == cte.fFlags; | 203 fFlags == cte.fFlags; |
| 208 } | 204 } |
| 209 | 205 |
| 210 void GrDistanceFieldTextureEffect::onComputeInvariantOutput(GrInvariantOutput* i
nout) const { | 206 void GrDistanceFieldTextureEffect::onComputeInvariantOutput(GrInvariantOutput* i
nout) const { |
| 211 inout->mulByUnknownAlpha(); | 207 inout->mulByUnknownAlpha(); |
| 212 } | 208 } |
| 213 | 209 |
| 214 const GrBackendGeometryProcessorFactory& GrDistanceFieldTextureEffect::getFactor
y() const { | 210 void GrDistanceFieldTextureEffect::getGLProcessorKey(const GrBatchTracker& bt, |
| 215 return GrTBackendGeometryProcessorFactory<GrDistanceFieldTextureEffect>::get
Instance(); | 211 const GrGLCaps& caps, |
| 212 GrProcessorKeyBuilder* b) c
onst { |
| 213 GrGLDistanceFieldTextureEffect::GenKey(*this, bt, caps, b); |
| 214 } |
| 215 |
| 216 GrGLGeometryProcessor* |
| 217 GrDistanceFieldTextureEffect::createGLInstance(const GrBatchTracker& bt) const { |
| 218 return SkNEW_ARGS(GrGLDistanceFieldTextureEffect, (*this, bt)); |
| 216 } | 219 } |
| 217 | 220 |
| 218 /////////////////////////////////////////////////////////////////////////////// | 221 /////////////////////////////////////////////////////////////////////////////// |
| 219 | 222 |
| 220 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldTextureEffect); | 223 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldTextureEffect); |
| 221 | 224 |
| 222 GrGeometryProcessor* GrDistanceFieldTextureEffect::TestCreate(SkRandom* random, | 225 GrGeometryProcessor* GrDistanceFieldTextureEffect::TestCreate(SkRandom* random, |
| 223 GrContext*, | 226 GrContext*, |
| 224 const GrDrawTarget
Caps&, | 227 const GrDrawTarget
Caps&, |
| 225 GrTexture* texture
s[]) { | 228 GrTexture* texture
s[]) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 251 random->nextF(), | 254 random->nextF(), |
| 252 #endif | 255 #endif |
| 253 random->nextBool() ? | 256 random->nextBool() ? |
| 254 kSimilarity_DistanceFieldEff
ectFlag : 0); | 257 kSimilarity_DistanceFieldEff
ectFlag : 0); |
| 255 } | 258 } |
| 256 | 259 |
| 257 /////////////////////////////////////////////////////////////////////////////// | 260 /////////////////////////////////////////////////////////////////////////////// |
| 258 | 261 |
| 259 class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor { | 262 class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor { |
| 260 public: | 263 public: |
| 261 GrGLDistanceFieldNoGammaTextureEffect(const GrBackendProcessorFactory& facto
ry, | 264 GrGLDistanceFieldNoGammaTextureEffect(const GrGeometryProcessor&, |
| 262 const GrGeometryProcessor&, | |
| 263 const GrBatchTracker&) | 265 const GrBatchTracker&) |
| 264 : INHERITED(factory) | 266 : fTextureSize(SkISize::Make(-1, -1)) {} |
| 265 , fTextureSize(SkISize::Make(-1, -1)) {} | |
| 266 | 267 |
| 267 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 268 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
| 268 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = | 269 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = |
| 269 args.fGP.cast<GrDistanceFieldNoGammaTextureEffect>(); | 270 args.fGP.cast<GrDistanceFieldNoGammaTextureEffect>(); |
| 270 | 271 |
| 271 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 272 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 272 SkAssertResult(fsBuilder->enableFeature( | 273 SkAssertResult(fsBuilder->enableFeature( |
| 273 GrGLFragmentShaderBuilder::kStandardDerivat
ives_GLSLFeature)); | 274 GrGLFragmentShaderBuilder::kStandardDerivat
ives_GLSLFeature)); |
| 274 | 275 |
| 275 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 276 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 bool GrDistanceFieldNoGammaTextureEffect::onIsEqual(const GrGeometryProcessor& o
ther) const { | 397 bool GrDistanceFieldNoGammaTextureEffect::onIsEqual(const GrGeometryProcessor& o
ther) const { |
| 397 const GrDistanceFieldNoGammaTextureEffect& cte = | 398 const GrDistanceFieldNoGammaTextureEffect& cte = |
| 398 other.cast<GrDistanceFieldNoGam
maTextureEffect>(); | 399 other.cast<GrDistanceFieldNoGam
maTextureEffect>(); |
| 399 return fFlags == cte.fFlags; | 400 return fFlags == cte.fFlags; |
| 400 } | 401 } |
| 401 | 402 |
| 402 void GrDistanceFieldNoGammaTextureEffect::onComputeInvariantOutput(GrInvariantOu
tput* inout) const { | 403 void GrDistanceFieldNoGammaTextureEffect::onComputeInvariantOutput(GrInvariantOu
tput* inout) const { |
| 403 inout->mulByUnknownAlpha(); | 404 inout->mulByUnknownAlpha(); |
| 404 } | 405 } |
| 405 | 406 |
| 406 const GrBackendGeometryProcessorFactory& GrDistanceFieldNoGammaTextureEffect::ge
tFactory() const { | 407 void GrDistanceFieldNoGammaTextureEffect::getGLProcessorKey(const GrBatchTracker
& bt, |
| 407 return GrTBackendGeometryProcessorFactory<GrDistanceFieldNoGammaTextureEffec
t>::getInstance(); | 408 const GrGLCaps& caps
, |
| 409 GrProcessorKeyBuilde
r* b) const { |
| 410 GrGLDistanceFieldNoGammaTextureEffect::GenKey(*this, bt, caps, b); |
| 411 } |
| 412 |
| 413 GrGLGeometryProcessor* |
| 414 GrDistanceFieldNoGammaTextureEffect::createGLInstance(const GrBatchTracker& bt)
const { |
| 415 return SkNEW_ARGS(GrGLDistanceFieldNoGammaTextureEffect, (*this, bt)); |
| 408 } | 416 } |
| 409 | 417 |
| 410 /////////////////////////////////////////////////////////////////////////////// | 418 /////////////////////////////////////////////////////////////////////////////// |
| 411 | 419 |
| 412 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldNoGammaTextureEffect); | 420 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldNoGammaTextureEffect); |
| 413 | 421 |
| 414 GrGeometryProcessor* GrDistanceFieldNoGammaTextureEffect::TestCreate(SkRandom* r
andom, | 422 GrGeometryProcessor* GrDistanceFieldNoGammaTextureEffect::TestCreate(SkRandom* r
andom, |
| 415 GrContext*, | 423 GrContext*, |
| 416 const GrDra
wTargetCaps&, | 424 const GrDra
wTargetCaps&, |
| 417 GrTexture*
textures[]) { | 425 GrTexture*
textures[]) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 430 : GrTextureParams::kNon
e_FilterMode); | 438 : GrTextureParams::kNon
e_FilterMode); |
| 431 | 439 |
| 432 return GrDistanceFieldNoGammaTextureEffect::Create(textures[texIdx], params, | 440 return GrDistanceFieldNoGammaTextureEffect::Create(textures[texIdx], params, |
| 433 random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0); | 441 random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0); |
| 434 } | 442 } |
| 435 | 443 |
| 436 /////////////////////////////////////////////////////////////////////////////// | 444 /////////////////////////////////////////////////////////////////////////////// |
| 437 | 445 |
| 438 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { | 446 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { |
| 439 public: | 447 public: |
| 440 GrGLDistanceFieldLCDTextureEffect(const GrBackendProcessorFactory& factory, | 448 GrGLDistanceFieldLCDTextureEffect(const GrGeometryProcessor&, |
| 441 const GrGeometryProcessor&, | |
| 442 const GrBatchTracker&) | 449 const GrBatchTracker&) |
| 443 : INHERITED (factory) | 450 : fTextureSize(SkISize::Make(-1,-1)) |
| 444 , fTextureSize(SkISize::Make(-1,-1)) | |
| 445 , fTextColor(GrColor_ILLEGAL) {} | 451 , fTextColor(GrColor_ILLEGAL) {} |
| 446 | 452 |
| 447 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 453 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
| 448 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 454 const GrDistanceFieldLCDTextureEffect& dfTexEffect = |
| 449 args.fGP.cast<GrDistanceFieldLCDTextureEffect>(); | 455 args.fGP.cast<GrDistanceFieldLCDTextureEffect>(); |
| 450 | 456 |
| 451 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 457 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
| 452 GrGLVertToFrag v(kVec2f_GrSLType); | 458 GrGLVertToFrag v(kVec2f_GrSLType); |
| 453 args.fPB->addVarying("TextureCoords", &v); | 459 args.fPB->addVarying("TextureCoords", &v); |
| 454 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord
s()->fName); | 460 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord
s()->fName); |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrGeometryProcessor& other
) const { | 651 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrGeometryProcessor& other
) const { |
| 646 const GrDistanceFieldLCDTextureEffect& cte = other.cast<GrDistanceFieldLCDTe
xtureEffect>(); | 652 const GrDistanceFieldLCDTextureEffect& cte = other.cast<GrDistanceFieldLCDTe
xtureEffect>(); |
| 647 return (fTextColor == cte.fTextColor && | 653 return (fTextColor == cte.fTextColor && |
| 648 fFlags == cte.fFlags); | 654 fFlags == cte.fFlags); |
| 649 } | 655 } |
| 650 | 656 |
| 651 void GrDistanceFieldLCDTextureEffect::onComputeInvariantOutput(GrInvariantOutput
* inout) const { | 657 void GrDistanceFieldLCDTextureEffect::onComputeInvariantOutput(GrInvariantOutput
* inout) const { |
| 652 inout->mulByUnknownColor(); | 658 inout->mulByUnknownColor(); |
| 653 } | 659 } |
| 654 | 660 |
| 655 const GrBackendGeometryProcessorFactory& GrDistanceFieldLCDTextureEffect::getFac
tory() const { | 661 void GrDistanceFieldLCDTextureEffect::getGLProcessorKey(const GrBatchTracker& bt
, |
| 656 return GrTBackendGeometryProcessorFactory<GrDistanceFieldLCDTextureEffect>::
getInstance(); | 662 const GrGLCaps& caps, |
| 663 GrProcessorKeyBuilder* b
) const { |
| 664 GrGLDistanceFieldLCDTextureEffect::GenKey(*this, bt, caps, b); |
| 665 } |
| 666 |
| 667 GrGLGeometryProcessor* |
| 668 GrDistanceFieldLCDTextureEffect::createGLInstance(const GrBatchTracker& bt) cons
t { |
| 669 return SkNEW_ARGS(GrGLDistanceFieldLCDTextureEffect, (*this, bt)); |
| 657 } | 670 } |
| 658 | 671 |
| 659 /////////////////////////////////////////////////////////////////////////////// | 672 /////////////////////////////////////////////////////////////////////////////// |
| 660 | 673 |
| 661 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextureEffect); | 674 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrDistanceFieldLCDTextureEffect); |
| 662 | 675 |
| 663 GrGeometryProcessor* GrDistanceFieldLCDTextureEffect::TestCreate(SkRandom* rando
m, | 676 GrGeometryProcessor* GrDistanceFieldLCDTextureEffect::TestCreate(SkRandom* rando
m, |
| 664 GrContext*, | 677 GrContext*, |
| 665 const GrDrawTar
getCaps&, | 678 const GrDrawTar
getCaps&, |
| 666 GrTexture* text
ures[]) { | 679 GrTexture* text
ures[]) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 686 random->nextULessThan(256), | 699 random->nextULessThan(256), |
| 687 random->nextULessThan(256)); | 700 random->nextULessThan(256)); |
| 688 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 701 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
| 689 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 702 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
| 690 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 703 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
| 691 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, | 704 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, |
| 692 textures[texIdx2], params2, | 705 textures[texIdx2], params2, |
| 693 textColor, | 706 textColor, |
| 694 flags); | 707 flags); |
| 695 } | 708 } |
| OLD | NEW |