| 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 "GrFontAtlasSizes.h" | 9 #include "GrFontAtlasSizes.h" |
| 10 #include "GrInvariantOutput.h" | 10 #include "GrInvariantOutput.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit
ion()->fName, | 70 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit
ion()->fName, |
| 71 args.fTransformsIn, args.fTransformsOut); | 71 args.fTransformsIn, args.fTransformsOut); |
| 72 | 72 |
| 73 // add varyings | 73 // add varyings |
| 74 GrGLVertToFrag recipScale(kFloat_GrSLType); | 74 GrGLVertToFrag recipScale(kFloat_GrSLType); |
| 75 GrGLVertToFrag st(kVec2f_GrSLType); | 75 GrGLVertToFrag st(kVec2f_GrSLType); |
| 76 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); | 76 bool isSimilarity = SkToBool(dfTexEffect.getFlags() & kSimilarity_Distan
ceFieldEffectFlag); |
| 77 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); | 77 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); |
| 78 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor
ds()->fName); | 78 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor
ds()->fName); |
| 79 | 79 |
| 80 // compute numbers to be hardcoded to convert texture coordinates from i
nt to float |
| 81 SkASSERT(dfTexEffect.numTextures() == 1); |
| 82 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); |
| 83 SkASSERT(atlas); |
| 84 SkScalar recipWidth = 1.0f / atlas->width(); |
| 85 SkScalar recipHeight = 1.0f / atlas->height(); |
| 86 |
| 80 GrGLVertToFrag uv(kVec2f_GrSLType); | 87 GrGLVertToFrag uv(kVec2f_GrSLType); |
| 81 args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); | 88 args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); |
| 82 // this is only used with text, so our texture bounds always match the g
lyph atlas | 89 vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(), |
| 83 vsBuilder->codeAppendf("%s = vec2(" GR_FONT_ATLAS_A8_RECIP_WIDTH ", " | 90 SK_FLT_DECIMAL_DIG, recipWidth, |
| 84 GR_FONT_ATLAS_RECIP_HEIGHT ")*%s;", uv.vsOut(), | 91 SK_FLT_DECIMAL_DIG, recipHeight, |
| 85 dfTexEffect.inTextureCoords()->fName); | 92 dfTexEffect.inTextureCoords()->fName); |
| 86 | 93 |
| 87 // Use highp to work around aliasing issues | 94 // Use highp to work around aliasing issues |
| 88 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision
, | 95 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision
, |
| 89 pb->ctxInfo().stand
ard())); | 96 pb->ctxInfo().stand
ard())); |
| 90 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); | 97 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); |
| 91 | 98 |
| 92 fsBuilder->codeAppend("\tfloat texColor = "); | 99 fsBuilder->codeAppend("\tfloat texColor = "); |
| 93 fsBuilder->appendTextureLookup(args.fSamplers[0], | 100 fsBuilder->appendTextureLookup(args.fSamplers[0], |
| 94 "uv", | 101 "uv", |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 static inline void GenKey(const GrGeometryProcessor& gp, | 176 static inline void GenKey(const GrGeometryProcessor& gp, |
| 170 const GrBatchTracker& bt, | 177 const GrBatchTracker& bt, |
| 171 const GrGLSLCaps&, | 178 const GrGLSLCaps&, |
| 172 GrProcessorKeyBuilder* b) { | 179 GrProcessorKeyBuilder* b) { |
| 173 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel
dA8TextGeoProc>(); | 180 const GrDistanceFieldA8TextGeoProc& dfTexEffect = gp.cast<GrDistanceFiel
dA8TextGeoProc>(); |
| 174 uint32_t key = dfTexEffect.getFlags(); | 181 uint32_t key = dfTexEffect.getFlags(); |
| 175 key |= dfTexEffect.hasVertexColor() << 16; | 182 key |= dfTexEffect.hasVertexColor() << 16; |
| 176 key |= dfTexEffect.colorIgnored() << 17; | 183 key |= dfTexEffect.colorIgnored() << 17; |
| 177 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 184 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
| 178 b->add32(key); | 185 b->add32(key); |
| 186 |
| 187 // Currently we hardcode numbers to convert atlas coordinates to normali
zed floating point |
| 188 SkASSERT(gp.numTextures() == 1); |
| 189 GrTexture* atlas = gp.textureAccess(0).getTexture(); |
| 190 SkASSERT(atlas); |
| 191 b->add32(atlas->width()); |
| 192 b->add32(atlas->height()); |
| 179 } | 193 } |
| 180 | 194 |
| 181 private: | 195 private: |
| 182 SkMatrix fViewMatrix; | 196 SkMatrix fViewMatrix; |
| 183 GrColor fColor; | 197 GrColor fColor; |
| 184 UniformHandle fColorUniform; | 198 UniformHandle fColorUniform; |
| 185 UniformHandle fViewMatrixUniform; | 199 UniformHandle fViewMatrixUniform; |
| 186 #ifdef SK_GAMMA_APPLY_TO_A8 | 200 #ifdef SK_GAMMA_APPLY_TO_A8 |
| 187 float fDistanceAdjust; | 201 float fDistanceAdjust; |
| 188 UniformHandle fDistanceAdjustUni; | 202 UniformHandle fDistanceAdjustUni; |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit
ion()->fName, | 532 this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosit
ion()->fName, |
| 519 args.fTransformsIn, args.fTransformsOut); | 533 args.fTransformsIn, args.fTransformsOut); |
| 520 | 534 |
| 521 // set up varyings | 535 // set up varyings |
| 522 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di
stanceFieldEffectMask); | 536 bool isUniformScale = SkToBool(dfTexEffect.getFlags() & kUniformScale_Di
stanceFieldEffectMask); |
| 523 GrGLVertToFrag recipScale(kFloat_GrSLType); | 537 GrGLVertToFrag recipScale(kFloat_GrSLType); |
| 524 GrGLVertToFrag st(kVec2f_GrSLType); | 538 GrGLVertToFrag st(kVec2f_GrSLType); |
| 525 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); | 539 args.fPB->addVarying("IntTextureCoords", &st, kHigh_GrSLPrecision); |
| 526 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor
ds()->fName); | 540 vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoor
ds()->fName); |
| 527 | 541 |
| 542 // compute numbers to be hardcoded to convert texture coordinates from i
nt to float |
| 543 SkASSERT(dfTexEffect.numTextures() == 1); |
| 544 GrTexture* atlas = dfTexEffect.textureAccess(0).getTexture(); |
| 545 SkASSERT(atlas); |
| 546 SkScalar recipWidth = 1.0f / atlas->width(); |
| 547 SkScalar recipHeight = 1.0f / atlas->height(); |
| 548 |
| 528 GrGLVertToFrag uv(kVec2f_GrSLType); | 549 GrGLVertToFrag uv(kVec2f_GrSLType); |
| 529 args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); | 550 args.fPB->addVarying("TextureCoords", &uv, kHigh_GrSLPrecision); |
| 530 // this is only used with text, so our texture bounds always match the g
lyph atlas | 551 vsBuilder->codeAppendf("%s = vec2(%.*f, %.*f) * %s;", uv.vsOut(), |
| 531 vsBuilder->codeAppendf("%s = vec2(" GR_FONT_ATLAS_A8_RECIP_WIDTH ", " | 552 SK_FLT_DECIMAL_DIG, recipWidth, |
| 532 GR_FONT_ATLAS_RECIP_HEIGHT ")*%s;", uv.vsOut(), | 553 SK_FLT_DECIMAL_DIG, recipHeight, |
| 533 dfTexEffect.inTextureCoords()->fName); | 554 dfTexEffect.inTextureCoords()->fName); |
| 534 | 555 |
| 535 // add frag shader code | 556 // add frag shader code |
| 536 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); | 557 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder(); |
| 537 | 558 |
| 538 SkAssertResult(fsBuilder->enableFeature( | 559 SkAssertResult(fsBuilder->enableFeature( |
| 539 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); | 560 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature)); |
| 540 | 561 |
| 541 // create LCD offset adjusted by inverse of transform | 562 // create LCD offset adjusted by inverse of transform |
| 542 // Use highp to work around aliasing issues | 563 // Use highp to work around aliasing issues |
| 543 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision
, | 564 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision
, |
| 544 pb->ctxInfo().stand
ard())); | 565 pb->ctxInfo().stand
ard())); |
| 545 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); | 566 fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn()); |
| 546 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision
, | 567 fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision
, |
| 547 pb->ctxInfo().stand
ard())); | 568 pb->ctxInfo().stand
ard())); |
| 569 |
| 570 SkScalar lcdDelta = 1.0f / (3.0f * atlas->width()); |
| 548 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { | 571 if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) { |
| 549 fsBuilder->codeAppend("float delta = -" GR_FONT_ATLAS_LCD_DELTA ";\n
"); | 572 fsBuilder->codeAppendf("float delta = -%.*f;\n", SK_FLT_DECIMAL_DIG,
lcdDelta); |
| 550 } else { | 573 } else { |
| 551 fsBuilder->codeAppend("float delta = " GR_FONT_ATLAS_LCD_DELTA ";\n"
); | 574 fsBuilder->codeAppendf("float delta = %.*f;\n", SK_FLT_DECIMAL_DIG,
lcdDelta); |
| 552 } | 575 } |
| 553 if (isUniformScale) { | 576 if (isUniformScale) { |
| 554 fsBuilder->codeAppendf("float dy = abs(dFdy(%s.y));", st.fsIn()); | 577 fsBuilder->codeAppendf("float dy = abs(dFdy(%s.y));", st.fsIn()); |
| 555 fsBuilder->codeAppend("vec2 offset = vec2(dy*delta, 0.0);"); | 578 fsBuilder->codeAppend("vec2 offset = vec2(dy*delta, 0.0);"); |
| 556 } else { | 579 } else { |
| 557 fsBuilder->codeAppendf("vec2 st = %s;\n", st.fsIn()); | 580 fsBuilder->codeAppendf("vec2 st = %s;\n", st.fsIn()); |
| 558 | 581 |
| 559 fsBuilder->codeAppend("vec2 Jdx = dFdx(st);"); | 582 fsBuilder->codeAppend("vec2 Jdx = dFdx(st);"); |
| 560 fsBuilder->codeAppend("vec2 Jdy = dFdy(st);"); | 583 fsBuilder->codeAppend("vec2 Jdy = dFdy(st);"); |
| 561 fsBuilder->codeAppend("vec2 offset = delta*Jdx;"); | 584 fsBuilder->codeAppend("vec2 offset = delta*Jdx;"); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 static inline void GenKey(const GrGeometryProcessor& gp, | 684 static inline void GenKey(const GrGeometryProcessor& gp, |
| 662 const GrBatchTracker& bt, | 685 const GrBatchTracker& bt, |
| 663 const GrGLSLCaps&, | 686 const GrGLSLCaps&, |
| 664 GrProcessorKeyBuilder* b) { | 687 GrProcessorKeyBuilder* b) { |
| 665 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); | 688 const GrDistanceFieldLCDTextGeoProc& dfTexEffect = gp.cast<GrDistanceFie
ldLCDTextGeoProc>(); |
| 666 | 689 |
| 667 uint32_t key = dfTexEffect.getFlags(); | 690 uint32_t key = dfTexEffect.getFlags(); |
| 668 key |= dfTexEffect.colorIgnored() << 16; | 691 key |= dfTexEffect.colorIgnored() << 16; |
| 669 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; | 692 key |= ComputePosKey(dfTexEffect.viewMatrix()) << 25; |
| 670 b->add32(key); | 693 b->add32(key); |
| 694 |
| 695 // Currently we hardcode numbers to convert atlas coordinates to normali
zed floating point |
| 696 SkASSERT(gp.numTextures() == 1); |
| 697 GrTexture* atlas = gp.textureAccess(0).getTexture(); |
| 698 SkASSERT(atlas); |
| 699 b->add32(atlas->width()); |
| 700 b->add32(atlas->height()); |
| 671 } | 701 } |
| 672 | 702 |
| 673 private: | 703 private: |
| 674 SkMatrix fViewMatrix; | 704 SkMatrix fViewMatrix; |
| 675 GrColor fColor; | 705 GrColor fColor; |
| 676 UniformHandle fViewMatrixUniform; | 706 UniformHandle fViewMatrixUniform; |
| 677 UniformHandle fColorUniform; | 707 UniformHandle fColorUniform; |
| 678 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; | 708 GrDistanceFieldLCDTextGeoProc::DistanceAdjust fDistanceAdjust; |
| 679 UniformHandle fDistanceAdjustUni; | 709 UniformHandle fDistanceAdjustUni; |
| 680 | 710 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; | 767 uint32_t flags = kUseLCD_DistanceFieldEffectFlag; |
| 738 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; | 768 flags |= d->fRandom->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0; |
| 739 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; | 769 flags |= d->fRandom->nextBool() ? kBGR_DistanceFieldEffectFlag : 0; |
| 740 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), | 770 return GrDistanceFieldLCDTextGeoProc::Create(GrRandomColor(d->fRandom), |
| 741 GrTest::TestMatrix(d->fRandom), | 771 GrTest::TestMatrix(d->fRandom), |
| 742 d->fTextures[texIdx], params, | 772 d->fTextures[texIdx], params, |
| 743 wa, | 773 wa, |
| 744 flags, | 774 flags, |
| 745 d->fRandom->nextBool()); | 775 d->fRandom->nextBool()); |
| 746 } | 776 } |
| OLD | NEW |