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 "GrDistanceFieldGeoProc.h" | 8 #include "GrDistanceFieldGeoProc.h" |
9 #include "GrInvariantOutput.h" | 9 #include "GrInvariantOutput.h" |
10 #include "GrTexture.h" | 10 #include "GrTexture.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision)
; | 94 varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision)
; |
95 vertBuilder->codeAppendf("%s = vec2(%d, %d) * %s;", st.vsOut(), | 95 vertBuilder->codeAppendf("%s = vec2(%d, %d) * %s;", st.vsOut(), |
96 atlas->width(), atlas->height(), | 96 atlas->width(), atlas->height(), |
97 dfTexEffect.inTextureCoords()->fName); | 97 dfTexEffect.inTextureCoords()->fName); |
98 | 98 |
99 // Use highp to work around aliasing issues | 99 // Use highp to work around aliasing issues |
100 fragBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); | 100 fragBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); |
101 fragBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); | 101 fragBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); |
102 | 102 |
103 fragBuilder->codeAppend("\tfloat texColor = "); | 103 fragBuilder->codeAppend("\tfloat texColor = "); |
104 fragBuilder->appendTextureLookup(args.fTexSamplers[0], | 104 fragBuilder->appendTextureLookup(uniformHandler->getSampler(args.fTexSam
plers[0]), |
105 "uv", | 105 "uv", |
106 kVec2f_GrSLType); | 106 kVec2f_GrSLType); |
107 fragBuilder->codeAppend(".r;\n"); | 107 fragBuilder->codeAppend(".r;\n"); |
108 fragBuilder->codeAppend("\tfloat distance = " | 108 fragBuilder->codeAppend("\tfloat distance = " |
109 SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFie
ldThreshold ");"); | 109 SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFie
ldThreshold ");"); |
110 #ifdef SK_GAMMA_APPLY_TO_A8 | 110 #ifdef SK_GAMMA_APPLY_TO_A8 |
111 // adjust width based on gamma | 111 // adjust width based on gamma |
112 fragBuilder->codeAppendf("distance -= %s;", distanceAdjustUniName); | 112 fragBuilder->codeAppendf("distance -= %s;", distanceAdjustUniName); |
113 #endif | 113 #endif |
114 | 114 |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 const char* textureSizeUniName = nullptr; | 331 const char* textureSizeUniName = nullptr; |
332 fTextureSizeUni = uniformHandler->addUniform(kFragment_GrShaderFlag, | 332 fTextureSizeUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
333 kVec2f_GrSLType, kDefault_G
rSLPrecision, | 333 kVec2f_GrSLType, kDefault_G
rSLPrecision, |
334 "TextureSize", &textureSize
UniName); | 334 "TextureSize", &textureSize
UniName); |
335 | 335 |
336 // Use highp to work around aliasing issues | 336 // Use highp to work around aliasing issues |
337 fragBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); | 337 fragBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); |
338 fragBuilder->codeAppendf("vec2 uv = %s;", v.fsIn()); | 338 fragBuilder->codeAppendf("vec2 uv = %s;", v.fsIn()); |
339 | 339 |
340 fragBuilder->codeAppend("float texColor = "); | 340 fragBuilder->codeAppend("float texColor = "); |
341 fragBuilder->appendTextureLookup(args.fTexSamplers[0], | 341 fragBuilder->appendTextureLookup(uniformHandler->getSampler(args.fTexSam
plers[0]), |
342 "uv", | 342 "uv", |
343 kVec2f_GrSLType); | 343 kVec2f_GrSLType); |
344 fragBuilder->codeAppend(".r;"); | 344 fragBuilder->codeAppend(".r;"); |
345 fragBuilder->codeAppend("float distance = " | 345 fragBuilder->codeAppend("float distance = " |
346 SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold
");"); | 346 SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold
");"); |
347 | 347 |
348 fragBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); | 348 fragBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); |
349 fragBuilder->codeAppendf("vec2 st = uv*%s;", textureSizeUniName); | 349 fragBuilder->codeAppendf("vec2 st = uv*%s;", textureSizeUniName); |
350 fragBuilder->codeAppend("float afwidth;"); | 350 fragBuilder->codeAppend("float afwidth;"); |
351 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi
eldEffectMask) == | 351 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi
eldEffectMask) == |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 fragBuilder->codeAppend("float st_grad_len = length(st_grad);"); | 598 fragBuilder->codeAppend("float st_grad_len = length(st_grad);"); |
599 fragBuilder->codeAppend("vec2 offset = delta*vec2(st_grad.y, -st_gra
d.x);"); | 599 fragBuilder->codeAppend("vec2 offset = delta*vec2(st_grad.y, -st_gra
d.x);"); |
600 } else { | 600 } else { |
601 fragBuilder->codeAppendf("vec2 st = %s;\n", st.fsIn()); | 601 fragBuilder->codeAppendf("vec2 st = %s;\n", st.fsIn()); |
602 | 602 |
603 fragBuilder->codeAppend("vec2 Jdx = dFdx(st);"); | 603 fragBuilder->codeAppend("vec2 Jdx = dFdx(st);"); |
604 fragBuilder->codeAppend("vec2 Jdy = dFdy(st);"); | 604 fragBuilder->codeAppend("vec2 Jdy = dFdy(st);"); |
605 fragBuilder->codeAppend("vec2 offset = delta*Jdx;"); | 605 fragBuilder->codeAppend("vec2 offset = delta*Jdx;"); |
606 } | 606 } |
607 | 607 |
| 608 const GrGLSLSampler& sampler = uniformHandler->getSampler(args.fTexSampl
ers[0]); |
608 // green is distance to uv center | 609 // green is distance to uv center |
609 fragBuilder->codeAppend("\tvec4 texColor = "); | 610 fragBuilder->codeAppend("\tvec4 texColor = "); |
610 fragBuilder->appendTextureLookup(args.fTexSamplers[0], "uv", kVec2f_GrSL
Type); | 611 fragBuilder->appendTextureLookup(sampler, "uv",kVec2f_GrSLType); |
611 fragBuilder->codeAppend(";\n"); | 612 fragBuilder->codeAppend(";\n"); |
612 fragBuilder->codeAppend("\tvec3 distance;\n"); | 613 fragBuilder->codeAppend("\tvec3 distance;\n"); |
613 fragBuilder->codeAppend("\tdistance.y = texColor.r;\n"); | 614 fragBuilder->codeAppend("\tdistance.y = texColor.r;\n"); |
614 // red is distance to left offset | 615 // red is distance to left offset |
615 fragBuilder->codeAppend("\tvec2 uv_adjusted = uv - offset;\n"); | 616 fragBuilder->codeAppend("\tvec2 uv_adjusted = uv - offset;\n"); |
616 fragBuilder->codeAppend("\ttexColor = "); | 617 fragBuilder->codeAppend("\ttexColor = "); |
617 fragBuilder->appendTextureLookup(args.fTexSamplers[0], "uv_adjusted", kV
ec2f_GrSLType); | 618 fragBuilder->appendTextureLookup(sampler, "uv_adjusted", kVec2f_GrSLType
); |
618 fragBuilder->codeAppend(";\n"); | 619 fragBuilder->codeAppend(";\n"); |
619 fragBuilder->codeAppend("\tdistance.x = texColor.r;\n"); | 620 fragBuilder->codeAppend("\tdistance.x = texColor.r;\n"); |
620 // blue is distance to right offset | 621 // blue is distance to right offset |
621 fragBuilder->codeAppend("\tuv_adjusted = uv + offset;\n"); | 622 fragBuilder->codeAppend("\tuv_adjusted = uv + offset;\n"); |
622 fragBuilder->codeAppend("\ttexColor = "); | 623 fragBuilder->codeAppend("\ttexColor = "); |
623 fragBuilder->appendTextureLookup(args.fTexSamplers[0], "uv_adjusted", kV
ec2f_GrSLType); | 624 fragBuilder->appendTextureLookup(sampler, "uv_adjusted", kVec2f_GrSLType
); |
624 fragBuilder->codeAppend(";\n"); | 625 fragBuilder->codeAppend(";\n"); |
625 fragBuilder->codeAppend("\tdistance.z = texColor.r;\n"); | 626 fragBuilder->codeAppend("\tdistance.z = texColor.r;\n"); |
626 | 627 |
627 fragBuilder->codeAppend("\tdistance = " | 628 fragBuilder->codeAppend("\tdistance = " |
628 "vec3(" SK_DistanceFieldMultiplier ")*(distance - vec3(" SK_DistanceF
ieldThreshold"));"); | 629 "vec3(" SK_DistanceFieldMultiplier ")*(distance - vec3(" SK_DistanceF
ieldThreshold"));"); |
629 | 630 |
630 // adjust width based on gamma | 631 // adjust width based on gamma |
631 const char* distanceAdjustUniName = nullptr; | 632 const char* distanceAdjustUniName = nullptr; |
632 fDistanceAdjustUni = uniformHandler->addUniform(kFragment_GrShaderFlag, | 633 fDistanceAdjustUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
633 kVec3f_GrSLType, kDefaul
t_GrSLPrecision, | 634 kVec3f_GrSLType, kDefaul
t_GrSLPrecision, |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0
; | 784 flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0
; |
784 } | 785 } |
785 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 786 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
786 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), | 787 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), |
787 GrTest::TestMatrix(d->fRandom), | 788 GrTest::TestMatrix(d->fRandom), |
788 d->fTextures[texIdx], params, | 789 d->fTextures[texIdx], params, |
789 wa, | 790 wa, |
790 flags, | 791 flags, |
791 d->fRandom->nextBool()); | 792 d->fRandom->nextBool()); |
792 } | 793 } |
OLD | NEW |