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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 dfTexEffect.inPosition()->fName, | 75 dfTexEffect.inPosition()->fName, |
76 args.fTransformsIn, | 76 args.fTransformsIn, |
77 args.fTransformsOut); | 77 args.fTransformsOut); |
78 | 78 |
79 // add varyings | 79 // add varyings |
80 GrGLSLVertToFrag recipScale(kFloat_GrSLType); | 80 GrGLSLVertToFrag recipScale(kFloat_GrSLType); |
81 GrGLSLVertToFrag uv(kVec2f_GrSLType); | 81 GrGLSLVertToFrag uv(kVec2f_GrSLType); |
82 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi
eldEffectMask) == | 82 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi
eldEffectMask) == |
83 kUniformScale_DistanceFieldEffectMask; | 83 kUniformScale_DistanceFieldEffectMask; |
84 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); | 84 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); |
85 bool srgbOutput = SkToBool(dfTexEffect.getFlags() & kSRGB_DistanceFieldE
ffectFlag); | 85 bool isGammaCorrect = |
| 86 SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectF
lag); |
86 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); | 87 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); |
87 vertBuilder->codeAppendf("%s = %s;", uv.vsOut(), dfTexEffect.inTextureCo
ords()->fName); | 88 vertBuilder->codeAppendf("%s = %s;", uv.vsOut(), dfTexEffect.inTextureCo
ords()->fName); |
88 | 89 |
89 // compute numbers to be hardcoded to convert texture coordinates from f
loat to int | 90 // compute numbers to be hardcoded to convert texture coordinates from f
loat to int |
90 SkASSERT(dfTexEffect.numTextures() == 1); | 91 SkASSERT(dfTexEffect.numTextures() == 1); |
91 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); | 92 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); |
92 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()))
; | 93 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()))
; |
93 | 94 |
94 GrGLSLVertToFrag st(kVec2f_GrSLType); | 95 GrGLSLVertToFrag st(kVec2f_GrSLType); |
95 varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision)
; | 96 varyingHandler->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision)
; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 fragBuilder->codeAppend("vec2 grad = vec2(dist_grad.x*Jdx.x + dist_g
rad.y*Jdy.x,"); | 152 fragBuilder->codeAppend("vec2 grad = vec2(dist_grad.x*Jdx.x + dist_g
rad.y*Jdy.x,"); |
152 fragBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_g
rad.y*Jdy.y);"); | 153 fragBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_g
rad.y*Jdy.y);"); |
153 | 154 |
154 // this gives us a smooth step across approximately one fragment | 155 // this gives us a smooth step across approximately one fragment |
155 fragBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*leng
th(grad);"); | 156 fragBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*leng
th(grad);"); |
156 } | 157 } |
157 | 158 |
158 // The smoothstep falloff compensates for the non-linear sRGB response c
urve. If we are | 159 // The smoothstep falloff compensates for the non-linear sRGB response c
urve. If we are |
159 // doing gamma-correct rendering (to an sRGB or F16 buffer), then we act
ually want distance | 160 // doing gamma-correct rendering (to an sRGB or F16 buffer), then we act
ually want distance |
160 // mapped linearly to coverage, so use a linear step: | 161 // mapped linearly to coverage, so use a linear step: |
161 if (srgbOutput) { | 162 if (isGammaCorrect) { |
162 fragBuilder->codeAppend( | 163 fragBuilder->codeAppend( |
163 "float val = clamp(distance + afwidth / (2.0 * afwidth), 0.0, 1.
0);"); | 164 "float val = clamp(distance + afwidth / (2.0 * afwidth), 0.0, 1.
0);"); |
164 } else { | 165 } else { |
165 fragBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, d
istance);"); | 166 fragBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, d
istance);"); |
166 } | 167 } |
167 | 168 |
168 fragBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 169 fragBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
169 } | 170 } |
170 | 171 |
171 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess
or& proc) override { | 172 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess
or& proc) override { |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
556 uniformHandler, | 557 uniformHandler, |
557 gpArgs->fPositionVar, | 558 gpArgs->fPositionVar, |
558 dfTexEffect.inPosition()->fName, | 559 dfTexEffect.inPosition()->fName, |
559 args.fTransformsIn, | 560 args.fTransformsIn, |
560 args.fTransformsOut); | 561 args.fTransformsOut); |
561 | 562 |
562 // set up varyings | 563 // set up varyings |
563 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi
eldEffectMask) == | 564 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi
eldEffectMask) == |
564 kUniformScale_DistanceFieldEffectMask; | 565 kUniformScale_DistanceFieldEffectMask; |
565 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); | 566 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); |
566 bool srgbOutput = SkToBool(dfTexEffect.getFlags() & kSRGB_DistanceFieldE
ffectFlag); | 567 bool isGammaCorrect = |
| 568 SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectF
lag); |
567 GrGLSLVertToFrag recipScale(kFloat_GrSLType); | 569 GrGLSLVertToFrag recipScale(kFloat_GrSLType); |
568 GrGLSLVertToFrag uv(kVec2f_GrSLType); | 570 GrGLSLVertToFrag uv(kVec2f_GrSLType); |
569 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); | 571 varyingHandler->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); |
570 vertBuilder->codeAppendf("%s = %s;", uv.vsOut(), dfTexEffect.inTextureCo
ords()->fName); | 572 vertBuilder->codeAppendf("%s = %s;", uv.vsOut(), dfTexEffect.inTextureCo
ords()->fName); |
571 | 573 |
572 // compute numbers to be hardcoded to convert texture coordinates from f
loat to int | 574 // compute numbers to be hardcoded to convert texture coordinates from f
loat to int |
573 SkASSERT(dfTexEffect.numTextures() == 1); | 575 SkASSERT(dfTexEffect.numTextures() == 1); |
574 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); | 576 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); |
575 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()))
; | 577 SkASSERT(atlas && SkIsPow2(atlas->width()) && SkIsPow2(atlas->height()))
; |
576 | 578 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 fragBuilder->codeAppend("vec2 grad = vec2(dist_grad.x*Jdx.x + dist_g
rad.y*Jdy.x,"); | 676 fragBuilder->codeAppend("vec2 grad = vec2(dist_grad.x*Jdx.x + dist_g
rad.y*Jdy.x,"); |
675 fragBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_g
rad.y*Jdy.y);"); | 677 fragBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_g
rad.y*Jdy.y);"); |
676 | 678 |
677 // this gives us a smooth step across approximately one fragment | 679 // this gives us a smooth step across approximately one fragment |
678 fragBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*leng
th(grad);"); | 680 fragBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*leng
th(grad);"); |
679 } | 681 } |
680 | 682 |
681 // The smoothstep falloff compensates for the non-linear sRGB response c
urve. If we are | 683 // The smoothstep falloff compensates for the non-linear sRGB response c
urve. If we are |
682 // doing gamma-correct rendering (to an sRGB or F16 buffer), then we act
ually want distance | 684 // doing gamma-correct rendering (to an sRGB or F16 buffer), then we act
ually want distance |
683 // mapped linearly to coverage, so use a linear step: | 685 // mapped linearly to coverage, so use a linear step: |
684 if (srgbOutput) { | 686 if (isGammaCorrect) { |
685 fragBuilder->codeAppend("vec4 val = " | 687 fragBuilder->codeAppend("vec4 val = " |
686 "vec4(clamp(distance + vec3(afwidth) / vec3(2.0 * afwidth), 0.0,
1.0), 1.0f);"); | 688 "vec4(clamp(distance + vec3(afwidth) / vec3(2.0 * afwidth), 0.0,
1.0), 1.0f);"); |
687 } else { | 689 } else { |
688 fragBuilder->codeAppend( | 690 fragBuilder->codeAppend( |
689 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), dista
nce), 1.0);"); | 691 "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), dista
nce), 1.0);"); |
690 } | 692 } |
691 | 693 |
692 // set alpha to be max of rgb coverage | 694 // set alpha to be max of rgb coverage |
693 fragBuilder->codeAppend("val.a = max(max(val.r, val.g), val.b);"); | 695 fragBuilder->codeAppend("val.a = max(max(val.r, val.g), val.b);"); |
694 | 696 |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0
; | 805 flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0
; |
804 } | 806 } |
805 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 807 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
806 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), | 808 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), |
807 GrTest::TestMatrix(d->fRandom), | 809 GrTest::TestMatrix(d->fRandom), |
808 d->fTextures[texIdx], params, | 810 d->fTextures[texIdx], params, |
809 wa, | 811 wa, |
810 flags, | 812 flags, |
811 d->fRandom->nextBool()); | 813 d->fRandom->nextBool()); |
812 } | 814 } |
OLD | NEW |