| 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 "GrTexture.h" | 10 #include "GrTexture.h" |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 /////////////////////////////////////////////////////////////////////////////// | 166 /////////////////////////////////////////////////////////////////////////////// |
| 167 | 167 |
| 168 GrDistanceFieldTextureEffect::GrDistanceFieldTextureEffect(GrColor color, | 168 GrDistanceFieldTextureEffect::GrDistanceFieldTextureEffect(GrColor color, |
| 169 GrTexture* texture, | 169 GrTexture* texture, |
| 170 const GrTextureParams
& params, | 170 const GrTextureParams
& params, |
| 171 #ifdef SK_GAMMA_APPLY_TO_A8 | 171 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 172 GrTexture* gamma, | 172 GrTexture* gamma, |
| 173 const GrTextureParams
& gammaParams, | 173 const GrTextureParams
& gammaParams, |
| 174 float luminance, | 174 float luminance, |
| 175 #endif | 175 #endif |
| 176 uint32_t flags) | 176 uint32_t flags, bool
opaqueVertexColors) |
| 177 : INHERITED(color) | 177 : INHERITED(color, opaqueVertexColors) |
| 178 , fTextureAccess(texture, params) | 178 , fTextureAccess(texture, params) |
| 179 #ifdef SK_GAMMA_APPLY_TO_A8 | 179 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 180 , fGammaTextureAccess(gamma, gammaParams) | 180 , fGammaTextureAccess(gamma, gammaParams) |
| 181 , fLuminance(luminance) | 181 , fLuminance(luminance) |
| 182 #endif | 182 #endif |
| 183 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) | 183 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) |
| 184 , fInColor(NULL) { | 184 , fInColor(NULL) { |
| 185 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); | 185 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); |
| 186 this->initClassID<GrDistanceFieldTextureEffect>(); | 186 this->initClassID<GrDistanceFieldTextureEffect>(); |
| 187 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); | 187 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 199 | 199 |
| 200 bool GrDistanceFieldTextureEffect::onIsEqual(const GrGeometryProcessor& other) c
onst { | 200 bool GrDistanceFieldTextureEffect::onIsEqual(const GrGeometryProcessor& other) c
onst { |
| 201 const GrDistanceFieldTextureEffect& cte = other.cast<GrDistanceFieldTextureE
ffect>(); | 201 const GrDistanceFieldTextureEffect& cte = other.cast<GrDistanceFieldTextureE
ffect>(); |
| 202 return | 202 return |
| 203 #ifdef SK_GAMMA_APPLY_TO_A8 | 203 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 204 fLuminance == cte.fLuminance && | 204 fLuminance == cte.fLuminance && |
| 205 #endif | 205 #endif |
| 206 fFlags == cte.fFlags; | 206 fFlags == cte.fFlags; |
| 207 } | 207 } |
| 208 | 208 |
| 209 void GrDistanceFieldTextureEffect::onComputeInvariantOutput(GrInvariantOutput* i
nout) const { | 209 void GrDistanceFieldTextureEffect::onGetInvariantOutputCoverage(GrInitInvariantO
utput* out) const { |
| 210 inout->mulByUnknownAlpha(); | 210 out->setUnknownSingleComponent(); |
| 211 } | 211 } |
| 212 | 212 |
| 213 void GrDistanceFieldTextureEffect::getGLProcessorKey(const GrBatchTracker& bt, | 213 void GrDistanceFieldTextureEffect::getGLProcessorKey(const GrBatchTracker& bt, |
| 214 const GrGLCaps& caps, | 214 const GrGLCaps& caps, |
| 215 GrProcessorKeyBuilder* b) c
onst { | 215 GrProcessorKeyBuilder* b) c
onst { |
| 216 GrGLDistanceFieldTextureEffect::GenKey(*this, bt, caps, b); | 216 GrGLDistanceFieldTextureEffect::GenKey(*this, bt, caps, b); |
| 217 } | 217 } |
| 218 | 218 |
| 219 GrGLGeometryProcessor* | 219 GrGLGeometryProcessor* |
| 220 GrDistanceFieldTextureEffect::createGLInstance(const GrBatchTracker& bt) const { | 220 GrDistanceFieldTextureEffect::createGLInstance(const GrBatchTracker& bt) const { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 250 GrTextureParams params2(tileModes, random->nextBool() ? GrTextureParams::kBi
lerp_FilterMode : | 250 GrTextureParams params2(tileModes, random->nextBool() ? GrTextureParams::kBi
lerp_FilterMode : |
| 251 GrTextureParams::kNo
ne_FilterMode); | 251 GrTextureParams::kNo
ne_FilterMode); |
| 252 #endif | 252 #endif |
| 253 | 253 |
| 254 return GrDistanceFieldTextureEffect::Create(GrRandomColor(random), textures[
texIdx], params, | 254 return GrDistanceFieldTextureEffect::Create(GrRandomColor(random), textures[
texIdx], params, |
| 255 #ifdef SK_GAMMA_APPLY_TO_A8 | 255 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 256 textures[texIdx2], params2, | 256 textures[texIdx2], params2, |
| 257 random->nextF(), | 257 random->nextF(), |
| 258 #endif | 258 #endif |
| 259 random->nextBool() ? | 259 random->nextBool() ? |
| 260 kSimilarity_DistanceFieldEff
ectFlag : 0); | 260 kSimilarity_DistanceFieldEff
ectFlag : 0, |
| 261 random->nextBool()); |
| 261 } | 262 } |
| 262 | 263 |
| 263 /////////////////////////////////////////////////////////////////////////////// | 264 /////////////////////////////////////////////////////////////////////////////// |
| 264 | 265 |
| 265 class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor { | 266 class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor { |
| 266 public: | 267 public: |
| 267 GrGLDistanceFieldNoGammaTextureEffect(const GrGeometryProcessor&, | 268 GrGLDistanceFieldNoGammaTextureEffect(const GrGeometryProcessor&, |
| 268 const GrBatchTracker&) | 269 const GrBatchTracker&) |
| 269 : fTextureSize(SkISize::Make(-1, -1)) {} | 270 : fTextureSize(SkISize::Make(-1, -1)) {} |
| 270 | 271 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 | 378 |
| 378 typedef GrGLGeometryProcessor INHERITED; | 379 typedef GrGLGeometryProcessor INHERITED; |
| 379 }; | 380 }; |
| 380 | 381 |
| 381 /////////////////////////////////////////////////////////////////////////////// | 382 /////////////////////////////////////////////////////////////////////////////// |
| 382 | 383 |
| 383 GrDistanceFieldNoGammaTextureEffect::GrDistanceFieldNoGammaTextureEffect( | 384 GrDistanceFieldNoGammaTextureEffect::GrDistanceFieldNoGammaTextureEffect( |
| 384 GrColor color, | 385 GrColor color, |
| 385 GrTexture* texture, | 386 GrTexture* texture, |
| 386 const GrTextureParams& params, | 387 const GrTextureParams& params, |
| 387 uint32_t flags) | 388 uint32_t flags, |
| 388 : INHERITED(color) | 389 bool opaqueVertexColors) |
| 390 : INHERITED(color, opaqueVertexColors) |
| 389 , fTextureAccess(texture, params) | 391 , fTextureAccess(texture, params) |
| 390 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) | 392 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) |
| 391 , fInColor(NULL) { | 393 , fInColor(NULL) { |
| 392 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); | 394 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); |
| 393 this->initClassID<GrDistanceFieldNoGammaTextureEffect>(); | 395 this->initClassID<GrDistanceFieldNoGammaTextureEffect>(); |
| 394 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); | 396 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); |
| 395 if (flags & kColorAttr_DistanceFieldEffectFlag) { | 397 if (flags & kColorAttr_DistanceFieldEffectFlag) { |
| 396 fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVerte
xAttribType)); | 398 fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVerte
xAttribType)); |
| 397 this->setHasVertexColor(); | 399 this->setHasVertexColor(); |
| 398 } | 400 } |
| 399 fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords", | 401 fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords", |
| 400 kVec2f_GrVertexAttribT
ype)); | 402 kVec2f_GrVertexAttribT
ype)); |
| 401 this->addTextureAccess(&fTextureAccess); | 403 this->addTextureAccess(&fTextureAccess); |
| 402 } | 404 } |
| 403 | 405 |
| 404 bool GrDistanceFieldNoGammaTextureEffect::onIsEqual(const GrGeometryProcessor& o
ther) const { | 406 bool GrDistanceFieldNoGammaTextureEffect::onIsEqual(const GrGeometryProcessor& o
ther) const { |
| 405 const GrDistanceFieldNoGammaTextureEffect& cte = | 407 const GrDistanceFieldNoGammaTextureEffect& cte = |
| 406 other.cast<GrDistanceFieldNoGam
maTextureEffect>(); | 408 other.cast<GrDistanceFieldNoGam
maTextureEffect>(); |
| 407 return fFlags == cte.fFlags; | 409 return fFlags == cte.fFlags; |
| 408 } | 410 } |
| 409 | 411 |
| 410 void GrDistanceFieldNoGammaTextureEffect::onComputeInvariantOutput(GrInvariantOu
tput* inout) const { | 412 void GrDistanceFieldNoGammaTextureEffect::onGetInvariantOutputCoverage(GrInitInv
ariantOutput* out) const{ |
| 411 inout->mulByUnknownAlpha(); | 413 out->setUnknownSingleComponent(); |
| 412 } | 414 } |
| 413 | 415 |
| 414 void GrDistanceFieldNoGammaTextureEffect::getGLProcessorKey(const GrBatchTracker
& bt, | 416 void GrDistanceFieldNoGammaTextureEffect::getGLProcessorKey(const GrBatchTracker
& bt, |
| 415 const GrGLCaps& caps
, | 417 const GrGLCaps& caps
, |
| 416 GrProcessorKeyBuilde
r* b) const { | 418 GrProcessorKeyBuilde
r* b) const { |
| 417 GrGLDistanceFieldNoGammaTextureEffect::GenKey(*this, bt, caps, b); | 419 GrGLDistanceFieldNoGammaTextureEffect::GenKey(*this, bt, caps, b); |
| 418 } | 420 } |
| 419 | 421 |
| 420 GrGLGeometryProcessor* | 422 GrGLGeometryProcessor* |
| 421 GrDistanceFieldNoGammaTextureEffect::createGLInstance(const GrBatchTracker& bt)
const { | 423 GrDistanceFieldNoGammaTextureEffect::createGLInstance(const GrBatchTracker& bt)
const { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 439 }; | 441 }; |
| 440 SkShader::TileMode tileModes[] = { | 442 SkShader::TileMode tileModes[] = { |
| 441 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], | 443 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], |
| 442 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], | 444 kTileModes[random->nextULessThan(SK_ARRAY_COUNT(kTileModes))], |
| 443 }; | 445 }; |
| 444 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil
erp_FilterMode | 446 GrTextureParams params(tileModes, random->nextBool() ? GrTextureParams::kBil
erp_FilterMode |
| 445 : GrTextureParams::kNon
e_FilterMode); | 447 : GrTextureParams::kNon
e_FilterMode); |
| 446 | 448 |
| 447 return GrDistanceFieldNoGammaTextureEffect::Create(GrRandomColor(random), te
xtures[texIdx], | 449 return GrDistanceFieldNoGammaTextureEffect::Create(GrRandomColor(random), te
xtures[texIdx], |
| 448 params, | 450 params, |
| 449 random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0); | 451 random->nextBool() ? kSimilarity_DistanceFieldEffectFlag : 0, random->ne
xtBool()); |
| 450 } | 452 } |
| 451 | 453 |
| 452 /////////////////////////////////////////////////////////////////////////////// | 454 /////////////////////////////////////////////////////////////////////////////// |
| 453 | 455 |
| 454 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { | 456 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { |
| 455 public: | 457 public: |
| 456 GrGLDistanceFieldLCDTextureEffect(const GrGeometryProcessor&, | 458 GrGLDistanceFieldLCDTextureEffect(const GrGeometryProcessor&, |
| 457 const GrBatchTracker&) | 459 const GrBatchTracker&) |
| 458 : fTextureSize(SkISize::Make(-1,-1)) | 460 : fTextureSize(SkISize::Make(-1,-1)) |
| 459 , fTextColor(GrColor_ILLEGAL) {} | 461 , fTextColor(GrColor_ILLEGAL) {} |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 this->addTextureAccess(&fTextureAccess); | 660 this->addTextureAccess(&fTextureAccess); |
| 659 this->addTextureAccess(&fGammaTextureAccess); | 661 this->addTextureAccess(&fGammaTextureAccess); |
| 660 } | 662 } |
| 661 | 663 |
| 662 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrGeometryProcessor& other
) const { | 664 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrGeometryProcessor& other
) const { |
| 663 const GrDistanceFieldLCDTextureEffect& cte = other.cast<GrDistanceFieldLCDTe
xtureEffect>(); | 665 const GrDistanceFieldLCDTextureEffect& cte = other.cast<GrDistanceFieldLCDTe
xtureEffect>(); |
| 664 return (fTextColor == cte.fTextColor && | 666 return (fTextColor == cte.fTextColor && |
| 665 fFlags == cte.fFlags); | 667 fFlags == cte.fFlags); |
| 666 } | 668 } |
| 667 | 669 |
| 668 void GrDistanceFieldLCDTextureEffect::onComputeInvariantOutput(GrInvariantOutput
* inout) const { | 670 void GrDistanceFieldLCDTextureEffect::onGetInvariantOutputCoverage(GrInitInvaria
ntOutput* out) const { |
| 669 inout->mulByUnknownColor(); | 671 out->setUnknownFourComponents(); |
| 670 inout->setUsingLCDCoverage(); | 672 out->setUsingLCDCoverage(); |
| 671 } | 673 } |
| 672 | 674 |
| 673 void GrDistanceFieldLCDTextureEffect::getGLProcessorKey(const GrBatchTracker& bt
, | 675 void GrDistanceFieldLCDTextureEffect::getGLProcessorKey(const GrBatchTracker& bt
, |
| 674 const GrGLCaps& caps, | 676 const GrGLCaps& caps, |
| 675 GrProcessorKeyBuilder* b
) const { | 677 GrProcessorKeyBuilder* b
) const { |
| 676 GrGLDistanceFieldLCDTextureEffect::GenKey(*this, bt, caps, b); | 678 GrGLDistanceFieldLCDTextureEffect::GenKey(*this, bt, caps, b); |
| 677 } | 679 } |
| 678 | 680 |
| 679 GrGLGeometryProcessor* | 681 GrGLGeometryProcessor* |
| 680 GrDistanceFieldLCDTextureEffect::createGLInstance(const GrBatchTracker& bt) cons
t { | 682 GrDistanceFieldLCDTextureEffect::createGLInstance(const GrBatchTracker& bt) cons
t { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 711 random->nextULessThan(256), | 713 random->nextULessThan(256), |
| 712 random->nextULessThan(256)); | 714 random->nextULessThan(256)); |
| 713 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 715 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
| 714 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 716 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
| 715 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 717 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
| 716 return GrDistanceFieldLCDTextureEffect::Create(GrRandomColor(random), textur
es[texIdx], params, | 718 return GrDistanceFieldLCDTextureEffect::Create(GrRandomColor(random), textur
es[texIdx], params, |
| 717 textures[texIdx2], params2, | 719 textures[texIdx2], params2, |
| 718 textColor, | 720 textColor, |
| 719 flags); | 721 flags); |
| 720 } | 722 } |
| OLD | NEW |