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 "gl/builders/GrGLProgramBuilder.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 : INHERITED (factory) | 27 : INHERITED (factory) |
28 , fTextureSize(SkISize::Make(-1,-1)) | 28 , fTextureSize(SkISize::Make(-1,-1)) |
29 #ifdef SK_GAMMA_APPLY_TO_A8 | 29 #ifdef SK_GAMMA_APPLY_TO_A8 |
30 , fLuminance(-1.0f) | 30 , fLuminance(-1.0f) |
31 #endif | 31 #endif |
32 {} | 32 {} |
33 | 33 |
34 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 34 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
35 const GrDistanceFieldTextureEffect& dfTexEffect = | 35 const GrDistanceFieldTextureEffect& dfTexEffect = |
36 args.fGP.cast<GrDistanceFieldTextureEffect>(); | 36 args.fGP.cast<GrDistanceFieldTextureEffect>(); |
37 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); | |
38 | 37 |
39 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 38 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
40 SkAssertResult(fsBuilder->enableFeature( | 39 SkAssertResult(fsBuilder->enableFeature( |
41 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); | 40 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); |
42 | 41 |
| 42 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
43 GrGLVertToFrag v(kVec2f_GrSLType); | 43 GrGLVertToFrag v(kVec2f_GrSLType); |
44 args.fPB->addVarying("TextureCoords", &v); | 44 args.fPB->addVarying("TextureCoords", &v); |
| 45 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord
s()->fName); |
45 | 46 |
46 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 47 // setup color attribute |
47 vsBuilder->codeAppendf("\t%s = %s;\n", v.vsOut(), dfTexEffect.inTextureC
oords().c_str()); | 48 if(dfTexEffect.inColor()) { |
| 49 args.fPB->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutpu
tColor); |
| 50 } |
48 | 51 |
49 // setup position varying | 52 // setup position varying |
50 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition()
, | 53 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition()
, |
51 vsBuilder->uViewM(), vsBuilder->inPosition()); | 54 vsBuilder->uViewM(), dfTexEffect.inPosition()->fN
ame); |
| 55 |
| 56 // setup output coords |
| 57 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), |
| 58 dfTexEffect.inPosition()->fName); |
| 59 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), |
| 60 dfTexEffect.inPosition()->fName); |
52 | 61 |
53 const char* textureSizeUniName = NULL; | 62 const char* textureSizeUniName = NULL; |
54 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 63 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, |
55 kVec2f_GrSLType, "TextureSize", | 64 kVec2f_GrSLType, "TextureSize", |
56 &textureSizeUniName); | 65 &textureSizeUniName); |
57 | 66 |
58 fsBuilder->codeAppend("\tvec4 texColor = "); | 67 fsBuilder->codeAppend("\tvec4 texColor = "); |
59 fsBuilder->appendTextureLookup(args.fSamplers[0], | 68 fsBuilder->appendTextureLookup(args.fSamplers[0], |
60 v.fsIn(), | 69 v.fsIn(), |
61 kVec2f_GrSLType); | 70 kVec2f_GrSLType); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 kFloat_GrSLType, "Luminance", | 113 kFloat_GrSLType, "Luminance", |
105 &luminanceUniName); | 114 &luminanceUniName); |
106 | 115 |
107 fsBuilder->codeAppendf("\tuv = vec2(val, %s);\n", luminanceUniName); | 116 fsBuilder->codeAppendf("\tuv = vec2(val, %s);\n", luminanceUniName); |
108 fsBuilder->codeAppend("\tvec4 gammaColor = "); | 117 fsBuilder->codeAppend("\tvec4 gammaColor = "); |
109 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; | 118 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; |
110 fsBuilder->codeAppend(";\n"); | 119 fsBuilder->codeAppend(";\n"); |
111 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); | 120 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); |
112 #endif | 121 #endif |
113 | 122 |
114 fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput, | 123 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
115 (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("val"
)).c_str()); | |
116 } | 124 } |
117 | 125 |
118 virtual void setData(const GrGLProgramDataManager& pdman, | 126 virtual void setData(const GrGLProgramDataManager& pdman, |
119 const GrProcessor& effect) SK_OVERRIDE { | 127 const GrProcessor& effect) SK_OVERRIDE { |
120 SkASSERT(fTextureSizeUni.isValid()); | 128 SkASSERT(fTextureSizeUni.isValid()); |
121 | 129 |
122 GrTexture* texture = effect.texture(0); | 130 GrTexture* texture = effect.texture(0); |
123 if (texture->width() != fTextureSize.width() || | 131 if (texture->width() != fTextureSize.width() || |
124 texture->height() != fTextureSize.height()) { | 132 texture->height() != fTextureSize.height()) { |
125 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 133 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 const GrTextureParams
& gammaParams, | 172 const GrTextureParams
& gammaParams, |
165 float luminance, | 173 float luminance, |
166 #endif | 174 #endif |
167 uint32_t flags) | 175 uint32_t flags) |
168 : fTextureAccess(texture, params) | 176 : fTextureAccess(texture, params) |
169 #ifdef SK_GAMMA_APPLY_TO_A8 | 177 #ifdef SK_GAMMA_APPLY_TO_A8 |
170 , fGammaTextureAccess(gamma, gammaParams) | 178 , fGammaTextureAccess(gamma, gammaParams) |
171 , fLuminance(luminance) | 179 , fLuminance(luminance) |
172 #endif | 180 #endif |
173 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) | 181 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) |
174 , fInTextureCoords(this->addVertexAttrib(GrShaderVar("inTextureCoords", | 182 , fInColor(NULL) { |
175 kVec2f_GrSLType, | |
176 GrShaderVar::kAttribute
_TypeModifier))) { | |
177 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); | 183 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); |
| 184 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); |
| 185 if (flags & kColorAttr_DistanceFieldEffectFlag) { |
| 186 fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVerte
xAttribType)); |
| 187 this->setHasVertexColor(); |
| 188 } |
| 189 fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords", |
| 190 kVec2f_GrVertexAttribT
ype)); |
178 this->addTextureAccess(&fTextureAccess); | 191 this->addTextureAccess(&fTextureAccess); |
179 #ifdef SK_GAMMA_APPLY_TO_A8 | 192 #ifdef SK_GAMMA_APPLY_TO_A8 |
180 this->addTextureAccess(&fGammaTextureAccess); | 193 this->addTextureAccess(&fGammaTextureAccess); |
181 #endif | 194 #endif |
182 } | 195 } |
183 | 196 |
184 bool GrDistanceFieldTextureEffect::onIsEqual(const GrGeometryProcessor& other) c
onst { | 197 bool GrDistanceFieldTextureEffect::onIsEqual(const GrGeometryProcessor& other) c
onst { |
185 const GrDistanceFieldTextureEffect& cte = other.cast<GrDistanceFieldTextureE
ffect>(); | 198 const GrDistanceFieldTextureEffect& cte = other.cast<GrDistanceFieldTextureE
ffect>(); |
186 return | 199 return |
187 #ifdef SK_GAMMA_APPLY_TO_A8 | 200 #ifdef SK_GAMMA_APPLY_TO_A8 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor { | 255 class GrGLDistanceFieldNoGammaTextureEffect : public GrGLGeometryProcessor { |
243 public: | 256 public: |
244 GrGLDistanceFieldNoGammaTextureEffect(const GrBackendProcessorFactory& facto
ry, | 257 GrGLDistanceFieldNoGammaTextureEffect(const GrBackendProcessorFactory& facto
ry, |
245 const GrProcessor& effect) | 258 const GrProcessor& effect) |
246 : INHERITED(factory) | 259 : INHERITED(factory) |
247 , fTextureSize(SkISize::Make(-1, -1)) {} | 260 , fTextureSize(SkISize::Make(-1, -1)) {} |
248 | 261 |
249 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 262 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
250 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = | 263 const GrDistanceFieldNoGammaTextureEffect& dfTexEffect = |
251 args.fGP.cast<GrDistanceFieldNoGammaTextureEffect>(); | 264 args.fGP.cast<GrDistanceFieldNoGammaTextureEffect>(); |
252 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); | |
253 | 265 |
254 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 266 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
255 SkAssertResult(fsBuilder->enableFeature( | 267 SkAssertResult(fsBuilder->enableFeature( |
256 GrGLFragmentShaderBuilder::kStandardDerivat
ives_GLSLFeature)); | 268 GrGLFragmentShaderBuilder::kStandardDerivat
ives_GLSLFeature)); |
257 | 269 |
| 270 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
258 GrGLVertToFrag v(kVec2f_GrSLType); | 271 GrGLVertToFrag v(kVec2f_GrSLType); |
259 args.fPB->addVarying("TextureCoords", &v); | 272 args.fPB->addVarying("TextureCoords", &v); |
260 | 273 |
261 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 274 // setup color attribute |
262 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord
s().c_str()); | 275 if(dfTexEffect.inColor()) { |
| 276 args.fPB->addPassThroughAttribute(dfTexEffect.inColor(), args.fOutpu
tColor); |
| 277 } |
| 278 |
| 279 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord
s()->fName); |
| 280 |
| 281 // setup coord outputs |
| 282 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), |
| 283 dfTexEffect.inPosition()->fName); |
| 284 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), |
| 285 dfTexEffect.inPosition()->fName); |
263 | 286 |
264 // setup position varying | 287 // setup position varying |
265 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition()
, | 288 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition()
, |
266 vsBuilder->uViewM(), vsBuilder->inPosition()); | 289 vsBuilder->uViewM(), dfTexEffect.inPosition()->fN
ame); |
267 | 290 |
268 const char* textureSizeUniName = NULL; | 291 const char* textureSizeUniName = NULL; |
269 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 292 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, |
270 kVec2f_GrSLType, "TextureSize", | 293 kVec2f_GrSLType, "TextureSize", |
271 &textureSizeUniName); | 294 &textureSizeUniName); |
272 | 295 |
273 fsBuilder->codeAppend("vec4 texColor = "); | 296 fsBuilder->codeAppend("vec4 texColor = "); |
274 fsBuilder->appendTextureLookup(args.fSamplers[0], | 297 fsBuilder->appendTextureLookup(args.fSamplers[0], |
275 v.fsIn(), | 298 v.fsIn(), |
276 kVec2f_GrSLType); | 299 kVec2f_GrSLType); |
(...skipping 27 matching lines...) Expand all Loading... |
304 fsBuilder->codeAppend("uv_grad = normalize(uv);"); | 327 fsBuilder->codeAppend("uv_grad = normalize(uv);"); |
305 } | 328 } |
306 fsBuilder->codeAppend("vec2 grad = vec2(uv_grad.x*Jdx.x + uv_grad.y*
Jdy.x,"); | 329 fsBuilder->codeAppend("vec2 grad = vec2(uv_grad.x*Jdx.x + uv_grad.y*
Jdy.x,"); |
307 fsBuilder->codeAppend(" uv_grad.x*Jdx.y + uv_grad.y*
Jdy.y);"); | 330 fsBuilder->codeAppend(" uv_grad.x*Jdx.y + uv_grad.y*
Jdy.y);"); |
308 | 331 |
309 // this gives us a smooth step across approximately one fragment | 332 // this gives us a smooth step across approximately one fragment |
310 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); | 333 fsBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*length
(grad);"); |
311 } | 334 } |
312 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); | 335 fsBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, distanc
e);"); |
313 | 336 |
314 fsBuilder->codeAppendf("%s = %s;", args.fOutput, | 337 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
315 (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("val")).c_str()); | |
316 } | 338 } |
317 | 339 |
318 virtual void setData(const GrGLProgramDataManager& pdman, | 340 virtual void setData(const GrGLProgramDataManager& pdman, |
319 const GrProcessor& effect) SK_OVERRIDE { | 341 const GrProcessor& effect) SK_OVERRIDE { |
320 SkASSERT(fTextureSizeUni.isValid()); | 342 SkASSERT(fTextureSizeUni.isValid()); |
321 | 343 |
322 GrTexture* texture = effect.texture(0); | 344 GrTexture* texture = effect.texture(0); |
323 if (texture->width() != fTextureSize.width() || | 345 if (texture->width() != fTextureSize.width() || |
324 texture->height() != fTextureSize.height()) { | 346 texture->height() != fTextureSize.height()) { |
325 fTextureSize = SkISize::Make(texture->width(), texture->height()); | 347 fTextureSize = SkISize::Make(texture->width(), texture->height()); |
(...skipping 18 matching lines...) Expand all Loading... |
344 typedef GrGLGeometryProcessor INHERITED; | 366 typedef GrGLGeometryProcessor INHERITED; |
345 }; | 367 }; |
346 | 368 |
347 /////////////////////////////////////////////////////////////////////////////// | 369 /////////////////////////////////////////////////////////////////////////////// |
348 | 370 |
349 GrDistanceFieldNoGammaTextureEffect::GrDistanceFieldNoGammaTextureEffect(GrTextu
re* texture, | 371 GrDistanceFieldNoGammaTextureEffect::GrDistanceFieldNoGammaTextureEffect(GrTextu
re* texture, |
350 const GrText
ureParams& params, | 372 const GrText
ureParams& params, |
351 uint32_t fla
gs) | 373 uint32_t fla
gs) |
352 : fTextureAccess(texture, params) | 374 : fTextureAccess(texture, params) |
353 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) | 375 , fFlags(flags & kNonLCD_DistanceFieldEffectMask) |
354 , fInTextureCoords(this->addVertexAttrib(GrShaderVar("inTextureCoords", | 376 , fInColor(NULL) { |
355 kVec2f_GrSLType, | |
356 GrShaderVar::kAttribute_TypeModifier))) { | |
357 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); | 377 SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask)); |
| 378 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); |
| 379 if (flags & kColorAttr_DistanceFieldEffectFlag) { |
| 380 fInColor = &this->addVertexAttrib(GrAttribute("inColor", kVec4ub_GrVerte
xAttribType)); |
| 381 this->setHasVertexColor(); |
| 382 } |
| 383 fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords", |
| 384 kVec2f_GrVertexAttribT
ype)); |
358 this->addTextureAccess(&fTextureAccess); | 385 this->addTextureAccess(&fTextureAccess); |
359 } | 386 } |
360 | 387 |
361 bool GrDistanceFieldNoGammaTextureEffect::onIsEqual(const GrGeometryProcessor& o
ther) const { | 388 bool GrDistanceFieldNoGammaTextureEffect::onIsEqual(const GrGeometryProcessor& o
ther) const { |
362 const GrDistanceFieldNoGammaTextureEffect& cte = | 389 const GrDistanceFieldNoGammaTextureEffect& cte = |
363 other.cast<GrDistanceFieldNoGam
maTextureEffect>(); | 390 other.cast<GrDistanceFieldNoGam
maTextureEffect>(); |
364 return fFlags == cte.fFlags; | 391 return fFlags == cte.fFlags; |
365 } | 392 } |
366 | 393 |
367 void GrDistanceFieldNoGammaTextureEffect::onComputeInvariantOutput(GrInvariantOu
tput* inout) const { | 394 void GrDistanceFieldNoGammaTextureEffect::onComputeInvariantOutput(GrInvariantOu
tput* inout) const { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
404 public: | 431 public: |
405 GrGLDistanceFieldLCDTextureEffect(const GrBackendProcessorFactory& factory, | 432 GrGLDistanceFieldLCDTextureEffect(const GrBackendProcessorFactory& factory, |
406 const GrProcessor&) | 433 const GrProcessor&) |
407 : INHERITED (factory) | 434 : INHERITED (factory) |
408 , fTextureSize(SkISize::Make(-1,-1)) | 435 , fTextureSize(SkISize::Make(-1,-1)) |
409 , fTextColor(GrColor_ILLEGAL) {} | 436 , fTextColor(GrColor_ILLEGAL) {} |
410 | 437 |
411 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { | 438 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { |
412 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 439 const GrDistanceFieldLCDTextureEffect& dfTexEffect = |
413 args.fGP.cast<GrDistanceFieldLCDTextureEffect>(); | 440 args.fGP.cast<GrDistanceFieldLCDTextureEffect>(); |
414 SkASSERT(1 == dfTexEffect.getVertexAttribs().count()); | |
415 | 441 |
| 442 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
416 GrGLVertToFrag v(kVec2f_GrSLType); | 443 GrGLVertToFrag v(kVec2f_GrSLType); |
417 args.fPB->addVarying("TextureCoords", &v); | 444 args.fPB->addVarying("TextureCoords", &v); |
| 445 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoord
s()->fName); |
418 | 446 |
419 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); | 447 // setup coord outputs |
420 vsBuilder->codeAppendf("\t%s = %s;\n", v.vsOut(), dfTexEffect.inTextureC
oords().c_str()); | 448 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), |
| 449 dfTexEffect.inPosition()->fName); |
| 450 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), |
| 451 dfTexEffect.inPosition()->fName); |
421 | 452 |
422 // setup position varying | 453 // setup position varying |
423 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition()
, | 454 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition()
, |
424 vsBuilder->uViewM(), vsBuilder->inPosition()); | 455 vsBuilder->uViewM(), dfTexEffect.inPosition()->fN
ame); |
425 | 456 |
426 const char* textureSizeUniName = NULL; | 457 const char* textureSizeUniName = NULL; |
427 // width, height, 1/(3*width) | 458 // width, height, 1/(3*width) |
428 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 459 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, |
429 kVec3f_GrSLType, "TextureSize", | 460 kVec3f_GrSLType, "TextureSize", |
430 &textureSizeUniName); | 461 &textureSizeUniName); |
431 | 462 |
432 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 463 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
433 | 464 |
434 SkAssertResult(fsBuilder->enableFeature( | 465 SkAssertResult(fsBuilder->enableFeature( |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; | 552 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; |
522 fsBuilder->codeAppend(";\n"); | 553 fsBuilder->codeAppend(";\n"); |
523 fsBuilder->codeAppend("\tval.y = gammaColor.r;\n"); | 554 fsBuilder->codeAppend("\tval.y = gammaColor.r;\n"); |
524 | 555 |
525 fsBuilder->codeAppendf("\tuv = vec2(val.z, %s.z);\n", textColorUniName); | 556 fsBuilder->codeAppendf("\tuv = vec2(val.z, %s.z);\n", textColorUniName); |
526 fsBuilder->codeAppend("\tgammaColor = "); | 557 fsBuilder->codeAppend("\tgammaColor = "); |
527 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; | 558 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; |
528 fsBuilder->codeAppend(";\n"); | 559 fsBuilder->codeAppend(";\n"); |
529 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n"); | 560 fsBuilder->codeAppend("\tval.z = gammaColor.r;\n"); |
530 | 561 |
531 fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput, | 562 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
532 (GrGLSLExpr4(args.fInput) * GrGLSLExpr4("val")).c
_str()); | |
533 } | 563 } |
534 | 564 |
535 virtual void setData(const GrGLProgramDataManager& pdman, | 565 virtual void setData(const GrGLProgramDataManager& pdman, |
536 const GrProcessor& processor) SK_OVERRIDE { | 566 const GrProcessor& processor) SK_OVERRIDE { |
537 SkASSERT(fTextureSizeUni.isValid()); | 567 SkASSERT(fTextureSizeUni.isValid()); |
538 SkASSERT(fTextColorUni.isValid()); | 568 SkASSERT(fTextColorUni.isValid()); |
539 | 569 |
540 const GrDistanceFieldLCDTextureEffect& dfTexEffect = | 570 const GrDistanceFieldLCDTextureEffect& dfTexEffect = |
541 processor.cast<GrDistanceFieldLCDTextureEffect>(); | 571 processor.cast<GrDistanceFieldLCDTextureEffect>(); |
542 GrTexture* texture = processor.texture(0); | 572 GrTexture* texture = processor.texture(0); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
584 /////////////////////////////////////////////////////////////////////////////// | 614 /////////////////////////////////////////////////////////////////////////////// |
585 | 615 |
586 GrDistanceFieldLCDTextureEffect::GrDistanceFieldLCDTextureEffect( | 616 GrDistanceFieldLCDTextureEffect::GrDistanceFieldLCDTextureEffect( |
587 GrTexture* texture, const GrTe
xtureParams& params, | 617 GrTexture* texture, const GrTe
xtureParams& params, |
588 GrTexture* gamma, const GrText
ureParams& gParams, | 618 GrTexture* gamma, const GrText
ureParams& gParams, |
589 SkColor textColor, | 619 SkColor textColor, |
590 uint32_t flags) | 620 uint32_t flags) |
591 : fTextureAccess(texture, params) | 621 : fTextureAccess(texture, params) |
592 , fGammaTextureAccess(gamma, gParams) | 622 , fGammaTextureAccess(gamma, gParams) |
593 , fTextColor(textColor) | 623 , fTextColor(textColor) |
594 , fFlags(flags & kLCD_DistanceFieldEffectMask) | 624 , fFlags(flags & kLCD_DistanceFieldEffectMask){ |
595 , fInTextureCoords(this->addVertexAttrib(GrShaderVar("inTextureCoords", | |
596 kVec2f_GrSLType, | |
597 GrShaderVar::kAttribute
_TypeModifier))) { | |
598 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); | 625 SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_Distan
ceFieldEffectFlag)); |
599 | 626 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_GrVert
exAttribType)); |
| 627 fInTextureCoords = &this->addVertexAttrib(GrAttribute("inTextureCoords", |
| 628 kVec2f_GrVertexAttribT
ype)); |
600 this->addTextureAccess(&fTextureAccess); | 629 this->addTextureAccess(&fTextureAccess); |
601 this->addTextureAccess(&fGammaTextureAccess); | 630 this->addTextureAccess(&fGammaTextureAccess); |
602 } | 631 } |
603 | 632 |
604 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrGeometryProcessor& other
) const { | 633 bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrGeometryProcessor& other
) const { |
605 const GrDistanceFieldLCDTextureEffect& cte = other.cast<GrDistanceFieldLCDTe
xtureEffect>(); | 634 const GrDistanceFieldLCDTextureEffect& cte = other.cast<GrDistanceFieldLCDTe
xtureEffect>(); |
606 return (fTextColor == cte.fTextColor && | 635 return (fTextColor == cte.fTextColor && |
607 fFlags == cte.fFlags); | 636 fFlags == cte.fFlags); |
608 } | 637 } |
609 | 638 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 random->nextULessThan(256), | 674 random->nextULessThan(256), |
646 random->nextULessThan(256)); | 675 random->nextULessThan(256)); |
647 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 676 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
648 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 677 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
649 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 678 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
650 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, | 679 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, |
651 textures[texIdx2], params2, | 680 textures[texIdx2], params2, |
652 textColor, | 681 textColor, |
653 flags); | 682 flags); |
654 } | 683 } |
OLD | NEW |