| Index: src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| diff --git a/src/gpu/effects/GrDistanceFieldTextureEffect.cpp b/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| index 1a8a07e3a26bda4986be8809bf1077d50be3ea7b..9015a6ff43dd59acadc988512dc23548ebadf4ee 100755
|
| --- a/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| +++ b/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| @@ -6,6 +6,7 @@
|
| */
|
|
|
| #include "GrDistanceFieldTextureEffect.h"
|
| +#include "GrFontAtlasSizes.h"
|
| #include "GrInvariantOutput.h"
|
| #include "GrTexture.h"
|
| #include "SkDistanceFieldGen.h"
|
| @@ -29,7 +30,6 @@ public:
|
| GrGLDistanceFieldTextureEffect(const GrGeometryProcessor&,
|
| const GrBatchTracker&)
|
| : fColor(GrColor_ILLEGAL)
|
| - , fTextureSize(SkISize::Make(-1,-1))
|
| #ifdef SK_GAMMA_APPLY_TO_A8
|
| , fLuminance(-1.0f)
|
| #endif
|
| @@ -49,9 +49,16 @@ public:
|
| // emit attributes
|
| vsBuilder->emitAttributes(dfTexEffect);
|
|
|
| - GrGLVertToFrag v(kVec2f_GrSLType);
|
| - args.fPB->addVarying("TextureCoords", &v);
|
| - vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoords()->fName);
|
| + GrGLVertToFrag st(kVec2f_GrSLType);
|
| + args.fPB->addVarying("IntTextureCoords", &st);
|
| + vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoords()->fName);
|
| +
|
| + GrGLVertToFrag uv(kVec2f_GrSLType);
|
| + args.fPB->addVarying("TextureCoords", &uv);
|
| + // this is only used with text, so our texture bounds always match the glyph atlas
|
| + vsBuilder->codeAppendf("%s = vec2(" GR_FONT_ATLAS_RECIP_WIDTH ", "
|
| + GR_FONT_ATLAS_RECIP_HEIGHT ")*%s;", uv.vsOut(),
|
| + dfTexEffect.inTextureCoords()->fName);
|
|
|
| // Setup pass through color
|
| this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor,
|
| @@ -64,15 +71,10 @@ public:
|
| this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosition()->fName,
|
| dfTexEffect.localMatrix(), args.fTransformsIn, args.fTransformsOut);
|
|
|
| - const char* textureSizeUniName = NULL;
|
| - fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| - kVec2f_GrSLType, kDefault_GrSLPrecision,
|
| - "TextureSize", &textureSizeUniName);
|
| -
|
| // Use highp to work around aliasing issues
|
| fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision,
|
| pb->ctxInfo().standard()));
|
| - fsBuilder->codeAppendf("vec2 uv = %s;\n", v.fsIn());
|
| + fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn());
|
|
|
| fsBuilder->codeAppend("\tfloat texColor = ");
|
| fsBuilder->appendTextureLookup(args.fSamplers[0],
|
| @@ -87,7 +89,7 @@ public:
|
| // to ensure we're mapping 1:1 from texel space to pixel space.
|
| fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision,
|
| pb->ctxInfo().standard()));
|
| - fsBuilder->codeAppendf("vec2 st = uv*%s;\n", textureSizeUniName);
|
| + fsBuilder->codeAppendf("vec2 st = %s;\n", st.fsIn());
|
| fsBuilder->codeAppend("\tfloat afwidth;\n");
|
| if (dfTexEffect.getFlags() & kSimilarity_DistanceFieldEffectFlag) {
|
| // this gives us a smooth step across approximately one fragment
|
| @@ -137,16 +139,6 @@ public:
|
| virtual void setData(const GrGLProgramDataManager& pdman,
|
| const GrPrimitiveProcessor& proc,
|
| const GrBatchTracker& bt) SK_OVERRIDE {
|
| - SkASSERT(fTextureSizeUni.isValid());
|
| -
|
| - GrTexture* texture = proc.texture(0);
|
| - if (texture->width() != fTextureSize.width() ||
|
| - texture->height() != fTextureSize.height()) {
|
| - fTextureSize = SkISize::Make(texture->width(), texture->height());
|
| - pdman.set2f(fTextureSizeUni,
|
| - SkIntToScalar(fTextureSize.width()),
|
| - SkIntToScalar(fTextureSize.height()));
|
| - }
|
| #ifdef SK_GAMMA_APPLY_TO_A8
|
| const GrDistanceFieldTextureEffect& dfTexEffect =
|
| proc.cast<GrDistanceFieldTextureEffect>();
|
| @@ -184,10 +176,8 @@ public:
|
| private:
|
| GrColor fColor;
|
| UniformHandle fColorUniform;
|
| - UniformHandle fTextureSizeUni;
|
| - SkISize fTextureSize;
|
| - UniformHandle fLuminanceUni;
|
| #ifdef SK_GAMMA_APPLY_TO_A8
|
| + UniformHandle fLuminanceUni;
|
| float fLuminance;
|
| #endif
|
|
|
| @@ -222,7 +212,7 @@ GrDistanceFieldTextureEffect::GrDistanceFieldTextureEffect(GrColor color,
|
| this->setHasVertexColor();
|
| }
|
| fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
|
| - kVec2f_GrVertexAttribType));
|
| + kVec2s_GrVertexAttribType));
|
| this->addTextureAccess(&fTextureAccess);
|
| #ifdef SK_GAMMA_APPLY_TO_A8
|
| this->addTextureAccess(&fGammaTextureAccess);
|
| @@ -572,7 +562,6 @@ public:
|
| GrGLDistanceFieldLCDTextureEffect(const GrGeometryProcessor&,
|
| const GrBatchTracker&)
|
| : fColor(GrColor_ILLEGAL)
|
| - , fTextureSize(SkISize::Make(-1,-1))
|
| , fTextColor(GrColor_ILLEGAL) {}
|
|
|
| void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) SK_OVERRIDE{
|
| @@ -586,10 +575,17 @@ public:
|
| // emit attributes
|
| vsBuilder->emitAttributes(dfTexEffect);
|
|
|
| - GrGLVertToFrag v(kVec2f_GrSLType);
|
| - args.fPB->addVarying("TextureCoords", &v);
|
| - vsBuilder->codeAppendf("%s = %s;", v.vsOut(), dfTexEffect.inTextureCoords()->fName);
|
| -
|
| + GrGLVertToFrag st(kVec2f_GrSLType);
|
| + args.fPB->addVarying("IntTextureCoords", &st);
|
| + vsBuilder->codeAppendf("%s = %s;", st.vsOut(), dfTexEffect.inTextureCoords()->fName);
|
| +
|
| + GrGLVertToFrag uv(kVec2f_GrSLType);
|
| + args.fPB->addVarying("TextureCoords", &uv);
|
| + // this is only used with text, so our texture bounds always match the glyph atlas
|
| + vsBuilder->codeAppendf("%s = vec2(" GR_FONT_ATLAS_RECIP_WIDTH ", "
|
| + GR_FONT_ATLAS_RECIP_HEIGHT ")*%s;", uv.vsOut(),
|
| + dfTexEffect.inTextureCoords()->fName);
|
| +
|
| // setup pass through color
|
| this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputColor, NULL,
|
| &fColorUniform);
|
| @@ -601,12 +597,6 @@ public:
|
| this->emitTransforms(args.fPB, gpArgs->fPositionVar, dfTexEffect.inPosition()->fName,
|
| dfTexEffect.localMatrix(), args.fTransformsIn, args.fTransformsOut);
|
|
|
| - const char* textureSizeUniName = NULL;
|
| - // width, height, 1/(3*width)
|
| - fTextureSizeUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| - kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| - "TextureSize", &textureSizeUniName);
|
| -
|
| GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder();
|
|
|
| SkAssertResult(fsBuilder->enableFeature(
|
| @@ -616,18 +606,24 @@ public:
|
| // Use highp to work around aliasing issues
|
| fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision,
|
| pb->ctxInfo().standard()));
|
| - fsBuilder->codeAppendf("vec2 uv = %s;\n", v.fsIn());
|
| + fsBuilder->codeAppendf("vec2 uv = %s;\n", uv.fsIn());
|
| fsBuilder->codeAppend(GrGLShaderVar::PrecisionString(kHigh_GrSLPrecision,
|
| pb->ctxInfo().standard()));
|
| - fsBuilder->codeAppendf("vec2 st = uv*%s.xy;\n", textureSizeUniName);
|
| + fsBuilder->codeAppendf("vec2 st = %s;\n", st.fsIn());
|
| bool isUniformScale = !!(dfTexEffect.getFlags() & kUniformScale_DistanceFieldEffectMask);
|
| +
|
| + if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) {
|
| + fsBuilder->codeAppend("float delta = -" GR_FONT_ATLAS_LCD_DELTA ";\n");
|
| + } else {
|
| + fsBuilder->codeAppend("float delta = " GR_FONT_ATLAS_LCD_DELTA ";\n");
|
| + }
|
| if (isUniformScale) {
|
| fsBuilder->codeAppend("\tfloat dx = dFdx(st.x);\n");
|
| - fsBuilder->codeAppendf("\tvec2 offset = vec2(dx*%s.z, 0.0);\n", textureSizeUniName);
|
| + fsBuilder->codeAppend("\tvec2 offset = vec2(dx*delta, 0.0);\n");
|
| } else {
|
| fsBuilder->codeAppend("\tvec2 Jdx = dFdx(st);\n");
|
| fsBuilder->codeAppend("\tvec2 Jdy = dFdy(st);\n");
|
| - fsBuilder->codeAppendf("\tvec2 offset = %s.z*Jdx;\n", textureSizeUniName);
|
| + fsBuilder->codeAppend("\tvec2 offset = delta*Jdx;\n");
|
| }
|
|
|
| // green is distance to uv center
|
| @@ -688,7 +684,6 @@ public:
|
|
|
| // adjust based on gamma
|
| const char* textColorUniName = NULL;
|
| - // width, height, 1/(3*width)
|
| fTextColorUni = args.fPB->addUniform(GrGLProgramBuilder::kFragment_Visibility,
|
| kVec3f_GrSLType, kDefault_GrSLPrecision,
|
| "TextColor", &textColorUniName);
|
| @@ -717,25 +712,10 @@ public:
|
| virtual void setData(const GrGLProgramDataManager& pdman,
|
| const GrPrimitiveProcessor& processor,
|
| const GrBatchTracker& bt) SK_OVERRIDE {
|
| - SkASSERT(fTextureSizeUni.isValid());
|
| SkASSERT(fTextColorUni.isValid());
|
|
|
| const GrDistanceFieldLCDTextureEffect& dfTexEffect =
|
| processor.cast<GrDistanceFieldLCDTextureEffect>();
|
| - GrTexture* texture = processor.texture(0);
|
| - if (texture->width() != fTextureSize.width() ||
|
| - texture->height() != fTextureSize.height()) {
|
| - fTextureSize = SkISize::Make(texture->width(), texture->height());
|
| - float delta = 1.0f/(3.0f*texture->width());
|
| - if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) {
|
| - delta = -delta;
|
| - }
|
| - pdman.set3f(fTextureSizeUni,
|
| - SkIntToScalar(fTextureSize.width()),
|
| - SkIntToScalar(fTextureSize.height()),
|
| - delta);
|
| - }
|
| -
|
| GrColor textColor = dfTexEffect.getTextColor();
|
| if (textColor != fTextColor) {
|
| static const float ONE_OVER_255 = 1.f / 255.f;
|
| @@ -775,8 +755,6 @@ public:
|
| private:
|
| GrColor fColor;
|
| UniformHandle fColorUniform;
|
| - UniformHandle fTextureSizeUni;
|
| - SkISize fTextureSize;
|
| UniformHandle fTextColorUni;
|
| SkColor fTextColor;
|
|
|
| @@ -800,7 +778,7 @@ GrDistanceFieldLCDTextureEffect::GrDistanceFieldLCDTextureEffect(
|
| this->initClassID<GrDistanceFieldLCDTextureEffect>();
|
| fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVertexAttribType));
|
| fInTextureCoords = &this->addVertexAttrib(Attribute("inTextureCoords",
|
| - kVec2f_GrVertexAttribType));
|
| + kVec2s_GrVertexAttribType));
|
| this->addTextureAccess(&fTextureAccess);
|
| this->addTextureAccess(&fGammaTextureAccess);
|
| }
|
|
|