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 "gl/builders/GrGLProgramBuilder.h" | 8 #include "gl/builders/GrGLProgramBuilder.h" |
9 #include "GrDistanceFieldTextureEffect.h" | 9 #include "GrDistanceFieldTextureEffect.h" |
10 #include "gl/GrGLEffect.h" | 10 #include "gl/GrGLEffect.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 #define SK_DistanceFieldLCDFactor "0.05" | 25 #define SK_DistanceFieldLCDFactor "0.05" |
26 #define SK_DistanceFieldNonLCDFactor "0.05" | 26 #define SK_DistanceFieldNonLCDFactor "0.05" |
27 #endif | 27 #endif |
28 | 28 |
29 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/
2 | 29 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/
2 |
30 #define SK_DistanceFieldAAFactor "0.7071" | 30 #define SK_DistanceFieldAAFactor "0.7071" |
31 | 31 |
32 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor { | 32 class GrGLDistanceFieldTextureEffect : public GrGLGeometryProcessor { |
33 public: | 33 public: |
34 GrGLDistanceFieldTextureEffect(const GrBackendEffectFactory& factory, | 34 GrGLDistanceFieldTextureEffect(const GrBackendEffectFactory& factory, |
35 const GrDrawEffect& drawEffect) | 35 const GrEffect& effect) |
36 : INHERITED (factory) | 36 : INHERITED (factory) |
37 , fTextureSize(SkISize::Make(-1,-1)) {} | 37 , fTextureSize(SkISize::Make(-1,-1)) {} |
38 | 38 |
39 virtual void emitCode(GrGLFullProgramBuilder* builder, | 39 virtual void emitCode(GrGLFullProgramBuilder* builder, |
40 const GrDrawEffect& drawEffect, | 40 const GrEffect& effect, |
41 const GrEffectKey& key, | 41 const GrEffectKey& key, |
42 const char* outputColor, | 42 const char* outputColor, |
43 const char* inputColor, | 43 const char* inputColor, |
44 const TransformedCoordsArray&, | 44 const TransformedCoordsArray&, |
45 const TextureSamplerArray& samplers) SK_OVERRIDE { | 45 const TextureSamplerArray& samplers) SK_OVERRIDE { |
46 const GrDistanceFieldTextureEffect& dfTexEffect = | 46 const GrDistanceFieldTextureEffect& dfTexEffect = |
47 drawEffect.castEffect<GrDistanceFi
eldTextureEffect>(); | 47 GrEffect::CastEffect<GrDistanceFieldTextureEffect>(effect); |
48 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); | 48 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); |
49 | 49 |
50 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder
(); | 50 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder
(); |
51 SkAssertResult(fsBuilder->enableFeature( | 51 SkAssertResult(fsBuilder->enableFeature( |
52 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); | 52 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); |
53 | 53 |
54 SkString fsCoordName; | 54 SkString fsCoordName; |
55 const char* vsCoordName; | 55 const char* vsCoordName; |
56 const char* fsCoordNamePtr; | 56 const char* fsCoordNamePtr; |
57 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC
oordNamePtr); | 57 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC
oordNamePtr); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); | 120 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); |
121 fsBuilder->codeAppend(";\n"); | 121 fsBuilder->codeAppend(";\n"); |
122 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); | 122 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); |
123 #endif | 123 #endif |
124 | 124 |
125 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, | 125 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, |
126 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("val")
).c_str()); | 126 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("val")
).c_str()); |
127 } | 127 } |
128 | 128 |
129 virtual void setData(const GrGLProgramDataManager& pdman, | 129 virtual void setData(const GrGLProgramDataManager& pdman, |
130 const GrDrawEffect& drawEffect) SK_OVERRIDE { | 130 const GrEffect& effect) SK_OVERRIDE { |
131 SkASSERT(fTextureSizeUni.isValid()); | 131 SkASSERT(fTextureSizeUni.isValid()); |
132 | 132 |
133 GrTexture* texture = drawEffect.effect()->texture(0); | 133 GrTexture* texture = effect.texture(0); |
134 if (texture->width() != fTextureSize.width() || | 134 if (texture->width() != fTextureSize.width() || |
135 texture->height() != fTextureSize.height()) { | 135 texture->height() != fTextureSize.height()) { |
136 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 136 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
137 pdman.set2f(fTextureSizeUni, | 137 pdman.set2f(fTextureSizeUni, |
138 SkIntToScalar(fTextureSize.width()), | 138 SkIntToScalar(fTextureSize.width()), |
139 SkIntToScalar(fTextureSize.height())); | 139 SkIntToScalar(fTextureSize.height())); |
140 } | 140 } |
141 #ifdef SK_GAMMA_APPLY_TO_A8 | 141 #ifdef SK_GAMMA_APPLY_TO_A8 |
142 const GrDistanceFieldTextureEffect& dfTexEffect = | 142 const GrDistanceFieldTextureEffect& dfTexEffect = |
143 drawEffect.castEffect<GrDistanceFi
eldTextureEffect>(); | 143 GrEffect::CastEffect<GrDistanceFie
ldTextureEffect>(effect); |
144 float luminance = dfTexEffect.getLuminance(); | 144 float luminance = dfTexEffect.getLuminance(); |
145 if (luminance != fLuminance) { | 145 if (luminance != fLuminance) { |
146 pdman.set1f(fLuminanceUni, luminance); | 146 pdman.set1f(fLuminanceUni, luminance); |
147 fLuminance = luminance; | 147 fLuminance = luminance; |
148 } | 148 } |
149 #endif | 149 #endif |
150 } | 150 } |
151 | 151 |
152 static inline void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, | 152 static inline void GenKey(const GrEffect& effect, const GrGLCaps&, |
153 GrEffectKeyBuilder* b) { | 153 GrEffectKeyBuilder* b) { |
154 const GrDistanceFieldTextureEffect& dfTexEffect = | 154 const GrDistanceFieldTextureEffect& dfTexEffect = |
155 drawEffect.castEffect<GrDistanceFi
eldTextureEffect>(); | 155 GrEffect::CastEffect<GrDistanceFieldTextureEffect>(effect); |
156 | 156 |
157 b->add32(dfTexEffect.getFlags()); | 157 b->add32(dfTexEffect.getFlags()); |
158 } | 158 } |
159 | 159 |
160 private: | 160 private: |
161 GrGLProgramDataManager::UniformHandle fTextureSizeUni; | 161 GrGLProgramDataManager::UniformHandle fTextureSizeUni; |
162 SkISize fTextureSize; | 162 SkISize fTextureSize; |
163 GrGLProgramDataManager::UniformHandle fLuminanceUni; | 163 GrGLProgramDataManager::UniformHandle fLuminanceUni; |
164 float fLuminance; | 164 float fLuminance; |
165 | 165 |
(...skipping 20 matching lines...) Expand all Loading... |
186 kVec2f_GrSLType, | 186 kVec2f_GrSLType, |
187 GrShaderVar::kAttribute
_TypeModifier))) { | 187 GrShaderVar::kAttribute
_TypeModifier))) { |
188 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); | 188 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); |
189 this->addTextureAccess(&fTextureAccess); | 189 this->addTextureAccess(&fTextureAccess); |
190 #ifdef SK_GAMMA_APPLY_TO_A8 | 190 #ifdef SK_GAMMA_APPLY_TO_A8 |
191 this->addTextureAccess(&fGammaTextureAccess); | 191 this->addTextureAccess(&fGammaTextureAccess); |
192 #endif | 192 #endif |
193 } | 193 } |
194 | 194 |
195 bool GrDistanceFieldTextureEffect::onIsEqual(const GrEffect& other) const { | 195 bool GrDistanceFieldTextureEffect::onIsEqual(const GrEffect& other) const { |
196 const GrDistanceFieldTextureEffect& cte = CastEffect<GrDistanceFieldTextureE
ffect>(other); | 196 const GrDistanceFieldTextureEffect& cte = |
| 197 GrEffect::CastEffect<GrDistanceFieldTextureEffect>(other); |
197 return fTextureAccess == cte.fTextureAccess && | 198 return fTextureAccess == cte.fTextureAccess && |
198 #ifdef SK_GAMMA_APPLY_TO_A8 | 199 #ifdef SK_GAMMA_APPLY_TO_A8 |
199 fGammaTextureAccess == cte.fGammaTextureAccess && | 200 fGammaTextureAccess == cte.fGammaTextureAccess && |
200 fLuminance == cte.fLuminance && | 201 fLuminance == cte.fLuminance && |
201 #endif | 202 #endif |
202 fFlags == cte.fFlags; | 203 fFlags == cte.fFlags; |
203 } | 204 } |
204 | 205 |
205 void GrDistanceFieldTextureEffect::getConstantColorComponents(GrColor* color, | 206 void GrDistanceFieldTextureEffect::getConstantColorComponents(GrColor* color, |
206 uint32_t* validFlag
s) const { | 207 uint32_t* validFlag
s) const { |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 #endif | 254 #endif |
254 random->nextBool() ? | 255 random->nextBool() ? |
255 kSimilarity_DistanceFieldEff
ectFlag : 0); | 256 kSimilarity_DistanceFieldEff
ectFlag : 0); |
256 } | 257 } |
257 | 258 |
258 /////////////////////////////////////////////////////////////////////////////// | 259 /////////////////////////////////////////////////////////////////////////////// |
259 | 260 |
260 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { | 261 class GrGLDistanceFieldLCDTextureEffect : public GrGLGeometryProcessor { |
261 public: | 262 public: |
262 GrGLDistanceFieldLCDTextureEffect(const GrBackendEffectFactory& factory, | 263 GrGLDistanceFieldLCDTextureEffect(const GrBackendEffectFactory& factory, |
263 const GrDrawEffect& drawEffect) | 264 const GrEffect& effect) |
264 : INHERITED (factory) | 265 : INHERITED (factory) |
265 , fTextureSize(SkISize::Make(-1,-1)) {} | 266 , fTextureSize(SkISize::Make(-1,-1)) {} |
266 | 267 |
267 virtual void emitCode(GrGLFullProgramBuilder* builder, | 268 virtual void emitCode(GrGLFullProgramBuilder* builder, |
268 const GrDrawEffect& drawEffect, | 269 const GrEffect& effect, |
269 const GrEffectKey& key, | 270 const GrEffectKey& key, |
270 const char* outputColor, | 271 const char* outputColor, |
271 const char* inputColor, | 272 const char* inputColor, |
272 const TransformedCoordsArray&, | 273 const TransformedCoordsArray&, |
273 const TextureSamplerArray& samplers) SK_OVERRIDE { | 274 const TextureSamplerArray& samplers) SK_OVERRIDE { |
274 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 275 const GrDistanceFieldLCDTextureEffect& dfTexEffect = |
275 drawEffect.castEffect<GrDistanceField
LCDTextureEffect>(); | 276 GrEffect::CastEffect<GrDistanceFieldLCDTextureEffect>(effect); |
276 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); | 277 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); |
277 | 278 |
278 SkString fsCoordName; | 279 SkString fsCoordName; |
279 const char* vsCoordName; | 280 const char* vsCoordName; |
280 const char* fsCoordNamePtr; | 281 const char* fsCoordNamePtr; |
281 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC
oordNamePtr); | 282 builder->addVarying(kVec2f_GrSLType, "textureCoords", &vsCoordName, &fsC
oordNamePtr); |
282 fsCoordName = fsCoordNamePtr; | 283 fsCoordName = fsCoordNamePtr; |
283 | 284 |
284 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); | 285 GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder(); |
285 vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dfTexEffect.inTextur
eCoords().c_str()); | 286 vsBuilder->codeAppendf("\t%s = %s;\n", vsCoordName, dfTexEffect.inTextur
eCoords().c_str()); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 fsBuilder->codeAppend("\tgammaColor = "); | 389 fsBuilder->codeAppend("\tgammaColor = "); |
389 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); | 390 fsBuilder->appendTextureLookup(samplers[1], "uv", kVec2f_GrSLType); |
390 fsBuilder->codeAppend(";\n"); | 391 fsBuilder->codeAppend(";\n"); |
391 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n"); | 392 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n"); |
392 | 393 |
393 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, | 394 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, |
394 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("val")).c_
str()); | 395 (GrGLSLExpr4(inputColor) * GrGLSLExpr4("val")).c_
str()); |
395 } | 396 } |
396 | 397 |
397 virtual void setData(const GrGLProgramDataManager& pdman, | 398 virtual void setData(const GrGLProgramDataManager& pdman, |
398 const GrDrawEffect& drawEffect) SK_OVERRIDE { | 399 const GrEffect& effect) SK_OVERRIDE { |
399 SkASSERT(fTextureSizeUni.isValid()); | 400 SkASSERT(fTextureSizeUni.isValid()); |
400 SkASSERT(fTextColorUni.isValid()); | 401 SkASSERT(fTextColorUni.isValid()); |
401 | 402 |
402 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 403 const GrDistanceFieldLCDTextureEffect& dfTexEffect = |
403 drawEffect.castEffect<GrDistanceFieldLCDText
ureEffect>(); | 404 GrEffect::CastEffect<GrDistanceFieldLCDTextu
reEffect>(effect); |
404 GrTexture* texture = drawEffect.effect()->texture(0); | 405 GrTexture* texture = effect.texture(0); |
405 if (texture->width() != fTextureSize.width() || | 406 if (texture->width() != fTextureSize.width() || |
406 texture->height() != fTextureSize.height()) { | 407 texture->height() != fTextureSize.height()) { |
407 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 408 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
408 float delta = 1.0f/(3.0f*texture->width()); | 409 float delta = 1.0f/(3.0f*texture->width()); |
409 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { | 410 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { |
410 delta = -delta; | 411 delta = -delta; |
411 } | 412 } |
412 pdman.set3f(fTextureSizeUni, | 413 pdman.set3f(fTextureSizeUni, |
413 SkIntToScalar(fTextureSize.width()), | 414 SkIntToScalar(fTextureSize.width()), |
414 SkIntToScalar(fTextureSize.height()), | 415 SkIntToScalar(fTextureSize.height()), |
415 delta); | 416 delta); |
416 } | 417 } |
417 | 418 |
418 GrColor textColor = dfTexEffect.getTextColor(); | 419 GrColor textColor = dfTexEffect.getTextColor(); |
419 if (textColor != fTextColor) { | 420 if (textColor != fTextColor) { |
420 static const float ONE_OVER_255 = 1.f / 255.f; | 421 static const float ONE_OVER_255 = 1.f / 255.f; |
421 pdman.set3f(fTextColorUni, | 422 pdman.set3f(fTextColorUni, |
422 GrColorUnpackR(textColor) * ONE_OVER_255, | 423 GrColorUnpackR(textColor) * ONE_OVER_255, |
423 GrColorUnpackG(textColor) * ONE_OVER_255, | 424 GrColorUnpackG(textColor) * ONE_OVER_255, |
424 GrColorUnpackB(textColor) * ONE_OVER_255); | 425 GrColorUnpackB(textColor) * ONE_OVER_255); |
425 fTextColor = textColor; | 426 fTextColor = textColor; |
426 } | 427 } |
427 } | 428 } |
428 | 429 |
429 static inline void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, | 430 static inline void GenKey(const GrEffect& effect, const GrGLCaps&, |
430 GrEffectKeyBuilder* b) { | 431 GrEffectKeyBuilder* b) { |
431 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 432 const GrDistanceFieldLCDTextureEffect& dfTexEffect = |
432 drawEffect.castEffect<GrDistanceField
LCDTextureEffect>(); | 433 GrEffect::CastEffect<GrDistanceFieldLCDTextureEffect>(effect); |
433 | 434 |
434 b->add32(dfTexEffect.getFlags()); | 435 b->add32(dfTexEffect.getFlags()); |
435 } | 436 } |
436 | 437 |
437 private: | 438 private: |
438 GrGLProgramDataManager::UniformHandle fTextureSizeUni; | 439 GrGLProgramDataManager::UniformHandle fTextureSizeUni; |
439 SkISize fTextureSize; | 440 SkISize fTextureSize; |
440 GrGLProgramDataManager::UniformHandle fTextColorUni; | 441 GrGLProgramDataManager::UniformHandle fTextColorUni; |
441 SkColor fTextColor; | 442 SkColor fTextColor; |
442 | 443 |
(...skipping 15 matching lines...) Expand all Loading... |
458 kVec2f_GrSLType, | 459 kVec2f_GrSLType, |
459 GrShaderVar::kAttribute
_TypeModifier))) { | 460 GrShaderVar::kAttribute
_TypeModifier))) { |
460 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); | 461 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); |
461 | 462 |
462 this->addTextureAccess(&fTextureAccess); | 463 this->addTextureAccess(&fTextureAccess); |
463 this->addTextureAccess(&fGammaTextureAccess); | 464 this->addTextureAccess(&fGammaTextureAccess); |
464 } | 465 } |
465 | 466 |
466 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrEffect& other) const { | 467 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrEffect& other) const { |
467 const GrDistanceFieldLCDTextureEffect& cte = | 468 const GrDistanceFieldLCDTextureEffect& cte = |
468 CastEffect<GrDistanceFieldLCDTexture
Effect>(other); | 469 GrEffect::CastEffect<GrDistanceFieldLCDTextureEffect>(other); |
469 return (fTextureAccess == cte.fTextureAccess && | 470 return (fTextureAccess == cte.fTextureAccess && |
470 fGammaTextureAccess == cte.fGammaTextureAccess && | 471 fGammaTextureAccess == cte.fGammaTextureAccess && |
471 fTextColor == cte.fTextColor && | 472 fTextColor == cte.fTextColor && |
472 fFlags == cte.fFlags); | 473 fFlags == cte.fFlags); |
473 } | 474 } |
474 | 475 |
475 void GrDistanceFieldLCDTextureEffect::getConstantColorComponents(GrColor* color, | 476 void GrDistanceFieldLCDTextureEffect::getConstantColorComponents(GrColor* color, |
476 uint32_t* valid
Flags) const { | 477 uint32_t* valid
Flags) const { |
477 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color
) && | 478 if ((*validFlags & kA_GrColorComponentFlag) && 0xFF == GrColorUnpackA(*color
) && |
478 GrPixelConfigIsOpaque(this->texture(0)->config())) { | 479 GrPixelConfigIsOpaque(this->texture(0)->config())) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 random->nextULessThan(256), | 517 random->nextULessThan(256), |
517 random->nextULessThan(256)); | 518 random->nextULessThan(256)); |
518 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 519 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
519 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 520 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
520 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 521 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
521 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, | 522 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, |
522 textures[texIdx2], params2, | 523 textures[texIdx2], params2, |
523 textColor, | 524 textColor, |
524 flags); | 525 flags); |
525 } | 526 } |
OLD | NEW |