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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 42 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
43 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; | 43 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
44 | 44 |
45 // emit attributes | 45 // emit attributes |
46 varyingHandler->emitAttributes(dfTexEffect); | 46 varyingHandler->emitAttributes(dfTexEffect); |
47 | 47 |
48 #ifdef SK_GAMMA_APPLY_TO_A8 | 48 #ifdef SK_GAMMA_APPLY_TO_A8 |
49 // adjust based on gamma | 49 // adjust based on gamma |
50 const char* distanceAdjustUniName = nullptr; | 50 const char* distanceAdjustUniName = nullptr; |
51 // width, height, 1/(3*width) | 51 // width, height, 1/(3*width) |
52 fDistanceAdjustUni = uniformHandler->addUniform(GrGLSLUniformHandler::kF
ragment_Visibility, | 52 fDistanceAdjustUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
53 kFloat_GrSLType, kDefaul
t_GrSLPrecision, | 53 kFloat_GrSLType, kDefaul
t_GrSLPrecision, |
54 "DistanceAdjust", &dista
nceAdjustUniName); | 54 "DistanceAdjust", &dista
nceAdjustUniName); |
55 #endif | 55 #endif |
56 | 56 |
57 // Setup pass through color | 57 // Setup pass through color |
58 if (!dfTexEffect.colorIgnored()) { | 58 if (!dfTexEffect.colorIgnored()) { |
59 varyingHandler->addPassThroughAttribute(dfTexEffect.inColor(), args.
fOutputColor); | 59 varyingHandler->addPassThroughAttribute(dfTexEffect.inColor(), args.
fOutputColor); |
60 } | 60 } |
61 | 61 |
62 // Setup position | 62 // Setup position |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 // emit transforms | 309 // emit transforms |
310 this->emitTransforms(vertBuilder, | 310 this->emitTransforms(vertBuilder, |
311 varyingHandler, | 311 varyingHandler, |
312 uniformHandler, | 312 uniformHandler, |
313 gpArgs->fPositionVar, | 313 gpArgs->fPositionVar, |
314 dfTexEffect.inPosition()->fName, | 314 dfTexEffect.inPosition()->fName, |
315 args.fTransformsIn, | 315 args.fTransformsIn, |
316 args.fTransformsOut); | 316 args.fTransformsOut); |
317 | 317 |
318 const char* textureSizeUniName = nullptr; | 318 const char* textureSizeUniName = nullptr; |
319 fTextureSizeUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFrag
ment_Visibility, | 319 fTextureSizeUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
320 kVec2f_GrSLType, kDefault_G
rSLPrecision, | 320 kVec2f_GrSLType, kDefault_G
rSLPrecision, |
321 "TextureSize", &textureSize
UniName); | 321 "TextureSize", &textureSize
UniName); |
322 | 322 |
323 // Use highp to work around aliasing issues | 323 // Use highp to work around aliasing issues |
324 fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, | 324 fragBuilder->codeAppend(GrGLSLShaderVar::PrecisionString(args.fGLSLCaps, |
325 kHigh_GrSLPreci
sion)); | 325 kHigh_GrSLPreci
sion)); |
326 fragBuilder->codeAppendf("vec2 uv = %s;", v.fsIn()); | 326 fragBuilder->codeAppendf("vec2 uv = %s;", v.fsIn()); |
327 | 327 |
328 fragBuilder->codeAppend("float texColor = "); | 328 fragBuilder->codeAppend("float texColor = "); |
329 fragBuilder->appendTextureLookup(args.fSamplers[0], | 329 fragBuilder->appendTextureLookup(args.fSamplers[0], |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 fragBuilder->codeAppend("\ttexColor = "); | 587 fragBuilder->codeAppend("\ttexColor = "); |
588 fragBuilder->appendTextureLookup(args.fSamplers[0], "uv_adjusted", kVec2
f_GrSLType); | 588 fragBuilder->appendTextureLookup(args.fSamplers[0], "uv_adjusted", kVec2
f_GrSLType); |
589 fragBuilder->codeAppend(";\n"); | 589 fragBuilder->codeAppend(";\n"); |
590 fragBuilder->codeAppend("\tdistance.z = texColor.r;\n"); | 590 fragBuilder->codeAppend("\tdistance.z = texColor.r;\n"); |
591 | 591 |
592 fragBuilder->codeAppend("\tdistance = " | 592 fragBuilder->codeAppend("\tdistance = " |
593 "vec3(" SK_DistanceFieldMultiplier ")*(distance - vec3(" SK_DistanceF
ieldThreshold"));"); | 593 "vec3(" SK_DistanceFieldMultiplier ")*(distance - vec3(" SK_DistanceF
ieldThreshold"));"); |
594 | 594 |
595 // adjust width based on gamma | 595 // adjust width based on gamma |
596 const char* distanceAdjustUniName = nullptr; | 596 const char* distanceAdjustUniName = nullptr; |
597 fDistanceAdjustUni = uniformHandler->addUniform(GrGLSLUniformHandler::kF
ragment_Visibility, | 597 fDistanceAdjustUni = uniformHandler->addUniform(kFragment_GrShaderFlag, |
598 kVec3f_GrSLType, kDefaul
t_GrSLPrecision, | 598 kVec3f_GrSLType, kDefaul
t_GrSLPrecision, |
599 "DistanceAdjust", &dista
nceAdjustUniName); | 599 "DistanceAdjust", &dista
nceAdjustUniName); |
600 fragBuilder->codeAppendf("distance -= %s;", distanceAdjustUniName); | 600 fragBuilder->codeAppendf("distance -= %s;", distanceAdjustUniName); |
601 | 601 |
602 // To be strictly correct, we should compute the anti-aliasing factor se
parately | 602 // To be strictly correct, we should compute the anti-aliasing factor se
parately |
603 // for each color component. However, this is only important when using
perspective | 603 // for each color component. However, this is only important when using
perspective |
604 // transformations, and even then using a single factor seems like a rea
sonable | 604 // transformations, and even then using a single factor seems like a rea
sonable |
605 // trade-off between quality and speed. | 605 // trade-off between quality and speed. |
606 fragBuilder->codeAppend("float afwidth;"); | 606 fragBuilder->codeAppend("float afwidth;"); |
607 if (isUniformScale) { | 607 if (isUniformScale) { |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
743 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 743 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
744 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 744 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
745 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 745 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
746 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), | 746 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), |
747 GrTest::TestMatrix(d->fRandom), | 747 GrTest::TestMatrix(d->fRandom), |
748 d->fTextures[texIdx], params, | 748 d->fTextures[texIdx], params, |
749 wa, | 749 wa, |
750 flags, | 750 flags, |
751 d->fRandom->nextBool()); | 751 d->fRandom->nextBool()); |
752 } | 752 } |
OLD | NEW |