| 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 |