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 |