| 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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 vsBuilder->uViewM(), dfTexEffect.inPosition()->fN
ame); | 51 vsBuilder->uViewM(), dfTexEffect.inPosition()->fN
ame); |
| 52 | 52 |
| 53 // setup output coords | 53 // setup output coords |
| 54 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), | 54 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), |
| 55 dfTexEffect.inPosition()->fName); | 55 dfTexEffect.inPosition()->fName); |
| 56 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), | 56 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), |
| 57 dfTexEffect.inPosition()->fName); | 57 dfTexEffect.inPosition()->fName); |
| 58 | 58 |
| 59 const char* textureSizeUniName = NULL; | 59 const char* textureSizeUniName = NULL; |
| 60 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 60 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, |
| 61 kVec2f_GrSLType, "TextureSize", | 61 kVec2f_GrSLType, kDefault_GrSLPre
cision, |
| 62 &textureSizeUniName); | 62 "TextureSize", &textureSizeUniNam
e); |
| 63 | 63 |
| 64 fsBuilder->codeAppend("\tvec4 texColor = "); | 64 fsBuilder->codeAppend("\tvec4 texColor = "); |
| 65 fsBuilder->appendTextureLookup(args.fSamplers[0], | 65 fsBuilder->appendTextureLookup(args.fSamplers[0], |
| 66 v.fsIn(), | 66 v.fsIn(), |
| 67 kVec2f_GrSLType); | 67 kVec2f_GrSLType); |
| 68 fsBuilder->codeAppend(";\n"); | 68 fsBuilder->codeAppend(";\n"); |
| 69 fsBuilder->codeAppend("\tfloat distance = " | 69 fsBuilder->codeAppend("\tfloat distance = " |
| 70 SK_DistanceFieldMultiplier "*(texColor.r - " SK_DistanceF
ieldThreshold ");"); | 70 SK_DistanceFieldMultiplier "*(texColor.r - " SK_DistanceF
ieldThreshold ");"); |
| 71 | 71 |
| 72 // we adjust for the effect of the transformation on the distance by usi
ng | 72 // we adjust for the effect of the transformation on the distance by usi
ng |
| (...skipping 27 matching lines...) Expand all Loading... |
| 100 // this gives us a smooth step across approximately one fragment | 100 // this gives us a smooth step across approximately one fragment |
| 101 fsBuilder->codeAppend("\tafwidth = " SK_DistanceFieldAAFactor "*leng
th(grad);\n"); | 101 fsBuilder->codeAppend("\tafwidth = " SK_DistanceFieldAAFactor "*leng
th(grad);\n"); |
| 102 } | 102 } |
| 103 fsBuilder->codeAppend("\tfloat val = smoothstep(-afwidth, afwidth, dista
nce);\n"); | 103 fsBuilder->codeAppend("\tfloat val = smoothstep(-afwidth, afwidth, dista
nce);\n"); |
| 104 | 104 |
| 105 #ifdef SK_GAMMA_APPLY_TO_A8 | 105 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 106 // adjust based on gamma | 106 // adjust based on gamma |
| 107 const char* luminanceUniName = NULL; | 107 const char* luminanceUniName = NULL; |
| 108 // width, height, 1/(3*width) | 108 // width, height, 1/(3*width) |
| 109 fLuminanceUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visib
ility, | 109 fLuminanceUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visib
ility, |
| 110 kFloat_GrSLType, "Luminance", | 110 kFloat_GrSLType, kDefault_GrSLPreci
sion, |
| 111 &luminanceUniName); | 111 "Luminance", &luminanceUniName); |
| 112 | 112 |
| 113 fsBuilder->codeAppendf("\tuv = vec2(val, %s);\n", luminanceUniName); | 113 fsBuilder->codeAppendf("\tuv = vec2(val, %s);\n", luminanceUniName); |
| 114 fsBuilder->codeAppend("\tvec4 gammaColor = "); | 114 fsBuilder->codeAppend("\tvec4 gammaColor = "); |
| 115 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; | 115 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; |
| 116 fsBuilder->codeAppend(";\n"); | 116 fsBuilder->codeAppend(";\n"); |
| 117 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); | 117 fsBuilder->codeAppend("\tval = gammaColor.r;\n"); |
| 118 #endif | 118 #endif |
| 119 | 119 |
| 120 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 120 fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
| 121 } | 121 } |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 dfTexEffect.inPosition()->fName); | 290 dfTexEffect.inPosition()->fName); |
| 291 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), | 291 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), |
| 292 dfTexEffect.inPosition()->fName); | 292 dfTexEffect.inPosition()->fName); |
| 293 | 293 |
| 294 // setup position varying | 294 // setup position varying |
| 295 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition()
, | 295 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition()
, |
| 296 vsBuilder->uViewM(), dfTexEffect.inPosition()->fN
ame); | 296 vsBuilder->uViewM(), dfTexEffect.inPosition()->fN
ame); |
| 297 | 297 |
| 298 const char* textureSizeUniName = NULL; | 298 const char* textureSizeUniName = NULL; |
| 299 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 299 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, |
| 300 kVec2f_GrSLType, "TextureSize", | 300 kVec2f_GrSLType, kDefault_GrSLPrec
ision, |
| 301 &textureSizeUniName); | 301 "TextureSize", &textureSizeUniName
); |
| 302 | 302 |
| 303 fsBuilder->codeAppend("vec4 texColor = "); | 303 fsBuilder->codeAppend("vec4 texColor = "); |
| 304 fsBuilder->appendTextureLookup(args.fSamplers[0], | 304 fsBuilder->appendTextureLookup(args.fSamplers[0], |
| 305 v.fsIn(), | 305 v.fsIn(), |
| 306 kVec2f_GrSLType); | 306 kVec2f_GrSLType); |
| 307 fsBuilder->codeAppend(";"); | 307 fsBuilder->codeAppend(";"); |
| 308 fsBuilder->codeAppend("float distance = " | 308 fsBuilder->codeAppend("float distance = " |
| 309 SK_DistanceFieldMultiplier "*(texColor.r - " SK_DistanceFieldThresho
ld ");"); | 309 SK_DistanceFieldMultiplier "*(texColor.r - " SK_DistanceFieldThresho
ld ");"); |
| 310 | 310 |
| 311 // we adjust for the effect of the transformation on the distance by usi
ng | 311 // we adjust for the effect of the transformation on the distance by usi
ng |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), | 467 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), |
| 468 dfTexEffect.inPosition()->fName); | 468 dfTexEffect.inPosition()->fName); |
| 469 | 469 |
| 470 // setup position varying | 470 // setup position varying |
| 471 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition()
, | 471 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPosition()
, |
| 472 vsBuilder->uViewM(), dfTexEffect.inPosition()->fN
ame); | 472 vsBuilder->uViewM(), dfTexEffect.inPosition()->fN
ame); |
| 473 | 473 |
| 474 const char* textureSizeUniName = NULL; | 474 const char* textureSizeUniName = NULL; |
| 475 // width, height, 1/(3*width) | 475 // width, height, 1/(3*width) |
| 476 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, | 476 fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Vis
ibility, |
| 477 kVec3f_GrSLType, "TextureSize", | 477 kVec3f_GrSLType, kDefault_GrSLPrec
ision, |
| 478 &textureSizeUniName); | 478 "TextureSize", &textureSizeUniName
); |
| 479 | 479 |
| 480 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 480 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 481 | 481 |
| 482 SkAssertResult(fsBuilder->enableFeature( | 482 SkAssertResult(fsBuilder->enableFeature( |
| 483 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); | 483 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); |
| 484 | 484 |
| 485 // create LCD offset adjusted by inverse of transform | 485 // create LCD offset adjusted by inverse of transform |
| 486 fsBuilder->codeAppendf("\tvec2 uv = %s;\n", v.fsIn()); | 486 fsBuilder->codeAppendf("\tvec2 uv = %s;\n", v.fsIn()); |
| 487 fsBuilder->codeAppendf("\tvec2 st = uv*%s.xy;\n", textureSizeUniName); | 487 fsBuilder->codeAppendf("\tvec2 st = uv*%s.xy;\n", textureSizeUniName); |
| 488 bool isUniformScale = !!(dfTexEffect.getFlags() & kUniformScale_Distance
FieldEffectMask); | 488 bool isUniformScale = !!(dfTexEffect.getFlags() & kUniformScale_Distance
FieldEffectMask); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 // this gives us a smooth step across approximately one fragment | 548 // this gives us a smooth step across approximately one fragment |
| 549 fsBuilder->codeAppend("\tafwidth = " SK_DistanceFieldAAFactor "*leng
th(grad);\n"); | 549 fsBuilder->codeAppend("\tafwidth = " SK_DistanceFieldAAFactor "*leng
th(grad);\n"); |
| 550 } | 550 } |
| 551 | 551 |
| 552 fsBuilder->codeAppend("\tvec4 val = vec4(smoothstep(vec3(-afwidth), vec3
(afwidth), distance), 1.0);\n"); | 552 fsBuilder->codeAppend("\tvec4 val = vec4(smoothstep(vec3(-afwidth), vec3
(afwidth), distance), 1.0);\n"); |
| 553 | 553 |
| 554 // adjust based on gamma | 554 // adjust based on gamma |
| 555 const char* textColorUniName = NULL; | 555 const char* textColorUniName = NULL; |
| 556 // width, height, 1/(3*width) | 556 // width, height, 1/(3*width) |
| 557 fTextColorUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visib
ility, | 557 fTextColorUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visib
ility, |
| 558 kVec3f_GrSLType, "TextColor", | 558 kVec3f_GrSLType, kDefault_GrSLPreci
sion, |
| 559 &textColorUniName); | 559 "TextColor", &textColorUniName); |
| 560 | 560 |
| 561 fsBuilder->codeAppendf("\tuv = vec2(val.x, %s.x);\n", textColorUniName); | 561 fsBuilder->codeAppendf("\tuv = vec2(val.x, %s.x);\n", textColorUniName); |
| 562 fsBuilder->codeAppend("\tvec4 gammaColor = "); | 562 fsBuilder->codeAppend("\tvec4 gammaColor = "); |
| 563 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; | 563 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; |
| 564 fsBuilder->codeAppend(";\n"); | 564 fsBuilder->codeAppend(";\n"); |
| 565 fsBuilder->codeAppend("\tval.x = gammaColor.r;\n"); | 565 fsBuilder->codeAppend("\tval.x = gammaColor.r;\n"); |
| 566 | 566 |
| 567 fsBuilder->codeAppendf("\tuv = vec2(val.y, %s.y);\n", textColorUniName); | 567 fsBuilder->codeAppendf("\tuv = vec2(val.y, %s.y);\n", textColorUniName); |
| 568 fsBuilder->codeAppend("\tgammaColor = "); | 568 fsBuilder->codeAppend("\tgammaColor = "); |
| 569 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; | 569 fsBuilder->appendTextureLookup(args.fSamplers[1], "uv", kVec2f_GrSLType)
; |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 random->nextULessThan(256), | 702 random->nextULessThan(256), |
| 703 random->nextULessThan(256)); | 703 random->nextULessThan(256)); |
| 704 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 704 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
| 705 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 705 flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
| 706 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 706 flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
| 707 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, | 707 return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params, |
| 708 textures[texIdx2], params2, | 708 textures[texIdx2], params2, |
| 709 textColor, | 709 textColor, |
| 710 flags); | 710 flags); |
| 711 } | 711 } |
| OLD | NEW |