| 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 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 fragBuilder->codeAppend(".r;"); | 355 fragBuilder->codeAppend(".r;"); |
| 356 fragBuilder->codeAppend("float distance = " | 356 fragBuilder->codeAppend("float distance = " |
| 357 SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold
");"); | 357 SK_DistanceFieldMultiplier "*(texColor - " SK_DistanceFieldThreshold
");"); |
| 358 | 358 |
| 359 fragBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); | 359 fragBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); |
| 360 fragBuilder->codeAppendf("vec2 st = uv*%s;", textureSizeUniName); | 360 fragBuilder->codeAppendf("vec2 st = uv*%s;", textureSizeUniName); |
| 361 fragBuilder->codeAppend("float afwidth;"); | 361 fragBuilder->codeAppend("float afwidth;"); |
| 362 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi
eldEffectMask) == | 362 bool isUniformScale = (dfTexEffect.getFlags() & kUniformScale_DistanceFi
eldEffectMask) == |
| 363 kUniformScale_DistanceFieldEffectMask; | 363 kUniformScale_DistanceFieldEffectMask; |
| 364 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); | 364 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); |
| 365 bool isGammaCorrect = |
| 366 SkToBool(dfTexEffect.getFlags() & kGammaCorrect_DistanceFieldEffectF
lag); |
| 365 if (isUniformScale) { | 367 if (isUniformScale) { |
| 366 // For uniform scale, we adjust for the effect of the transformation
on the distance | 368 // For uniform scale, we adjust for the effect of the transformation
on the distance |
| 367 // by using the length of the gradient of the t coordinate in the y
direction. | 369 // by using the length of the gradient of the t coordinate in the y
direction. |
| 368 // We use st coordinates to ensure we're mapping 1:1 from texel spac
e to pixel space. | 370 // We use st coordinates to ensure we're mapping 1:1 from texel spac
e to pixel space. |
| 369 // We use the y gradient because there is a bug in the Mali 400 in t
he x direction. | 371 // We use the y gradient because there is a bug in the Mali 400 in t
he x direction. |
| 370 | 372 |
| 371 // this gives us a smooth step across approximately one fragment | 373 // this gives us a smooth step across approximately one fragment |
| 372 fragBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*
dFdy(st.y));"); | 374 fragBuilder->codeAppend("afwidth = abs(" SK_DistanceFieldAAFactor "*
dFdy(st.y));"); |
| 373 | 375 |
| 374 } else if (isSimilarity) { | 376 } else if (isSimilarity) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 395 fragBuilder->codeAppend("}"); | 397 fragBuilder->codeAppend("}"); |
| 396 | 398 |
| 397 fragBuilder->codeAppend("vec2 Jdx = dFdx(st);"); | 399 fragBuilder->codeAppend("vec2 Jdx = dFdx(st);"); |
| 398 fragBuilder->codeAppend("vec2 Jdy = dFdy(st);"); | 400 fragBuilder->codeAppend("vec2 Jdy = dFdy(st);"); |
| 399 fragBuilder->codeAppend("vec2 grad = vec2(dist_grad.x*Jdx.x + dist_g
rad.y*Jdy.x,"); | 401 fragBuilder->codeAppend("vec2 grad = vec2(dist_grad.x*Jdx.x + dist_g
rad.y*Jdy.x,"); |
| 400 fragBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_g
rad.y*Jdy.y);"); | 402 fragBuilder->codeAppend(" dist_grad.x*Jdx.y + dist_g
rad.y*Jdy.y);"); |
| 401 | 403 |
| 402 // this gives us a smooth step across approximately one fragment | 404 // this gives us a smooth step across approximately one fragment |
| 403 fragBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*leng
th(grad);"); | 405 fragBuilder->codeAppend("afwidth = " SK_DistanceFieldAAFactor "*leng
th(grad);"); |
| 404 } | 406 } |
| 405 fragBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, dista
nce);"); | 407 // The smoothstep falloff compensates for the non-linear sRGB response c
urve. If we are |
| 408 // doing gamma-correct rendering (to an sRGB or F16 buffer), then we act
ually want distance |
| 409 // mapped linearly to coverage, so use a linear step: |
| 410 if (isGammaCorrect) { |
| 411 fragBuilder->codeAppend( |
| 412 "float val = clamp(distance + afwidth / (2.0 * afwidth), 0.0, 1.
0);"); |
| 413 } else { |
| 414 fragBuilder->codeAppend("float val = smoothstep(-afwidth, afwidth, d
istance);"); |
| 415 } |
| 406 | 416 |
| 407 fragBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); | 417 fragBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage); |
| 408 } | 418 } |
| 409 | 419 |
| 410 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess
or& proc) override { | 420 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcess
or& proc) override { |
| 411 SkASSERT(fTextureSizeUni.isValid()); | 421 SkASSERT(fTextureSizeUni.isValid()); |
| 412 | 422 |
| 413 GrTexture* texture = proc.texture(0); | 423 GrTexture* texture = proc.texture(0); |
| 414 if (texture->width() != fTextureSize.width() || | 424 if (texture->width() != fTextureSize.width() || |
| 415 texture->height() != fTextureSize.height()) { | 425 texture->height() != fTextureSize.height()) { |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 805 flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0
; | 815 flags |= d->fRandom->nextBool() ? kScaleOnly_DistanceFieldEffectFlag : 0
; |
| 806 } | 816 } |
| 807 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 817 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
| 808 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), | 818 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), |
| 809 GrTest::TestMatrix(d->fRandom), | 819 GrTest::TestMatrix(d->fRandom), |
| 810 d->fTextures[texIdx], params, | 820 d->fTextures[texIdx], params, |
| 811 wa, | 821 wa, |
| 812 flags, | 822 flags, |
| 813 d->fRandom->nextBool()); | 823 d->fRandom->nextBool()); |
| 814 } | 824 } |
| OLD | NEW |