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 |