| Index: src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| diff --git a/src/gpu/effects/GrDistanceFieldTextureEffect.cpp b/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| index 510142e8fe1fb78d854c283b038a076d865af4b9..7ef1cbb2ba3c64719a045d27d0ae145897488953 100755
|
| --- a/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| +++ b/src/gpu/effects/GrDistanceFieldTextureEffect.cpp
|
| @@ -79,7 +79,7 @@ public:
|
| builder->fsCodeAppendf("\tvec2 uv = %s;\n", fsCoordName.c_str());
|
| builder->fsCodeAppendf("\tvec2 st = uv*%s;\n", textureSizeUniName);
|
| builder->fsCodeAppend("\tfloat afwidth;\n");
|
| - if (dfTexEffect.isSimilarity()) {
|
| + if (dfTexEffect.getFlags() & kSimilarity_DistanceFieldEffectFlag) {
|
| // this gives us a smooth step across approximately one fragment
|
| builder->fsCodeAppend("\tafwidth = " SK_DistanceFieldAAFactor "*dFdx(st.x);\n");
|
| } else {
|
| @@ -153,7 +153,7 @@ public:
|
| const GrDistanceFieldTextureEffect& dfTexEffect =
|
| drawEffect.castEffect<GrDistanceFieldTextureEffect>();
|
|
|
| - b->add32(dfTexEffect.isSimilarity());
|
| + b->add32(dfTexEffect.getFlags());
|
| }
|
|
|
| private:
|
| @@ -174,13 +174,14 @@ GrDistanceFieldTextureEffect::GrDistanceFieldTextureEffect(GrTexture* texture,
|
| const GrTextureParams& gammaParams,
|
| float luminance,
|
| #endif
|
| - bool similarity)
|
| + uint32_t flags)
|
| : fTextureAccess(texture, params)
|
| #ifdef SK_GAMMA_APPLY_TO_A8
|
| , fGammaTextureAccess(gamma, gammaParams)
|
| , fLuminance(luminance)
|
| #endif
|
| - , fIsSimilarity(similarity) {
|
| + , fFlags(flags & kNonLCD_DistanceFieldEffectMask) {
|
| + SkASSERT(!(flags & ~kNonLCD_DistanceFieldEffectMask));
|
| this->addTextureAccess(&fTextureAccess);
|
| #ifdef SK_GAMMA_APPLY_TO_A8
|
| this->addTextureAccess(&fGammaTextureAccess);
|
| @@ -190,7 +191,12 @@ GrDistanceFieldTextureEffect::GrDistanceFieldTextureEffect(GrTexture* texture,
|
|
|
| bool GrDistanceFieldTextureEffect::onIsEqual(const GrEffect& other) const {
|
| const GrDistanceFieldTextureEffect& cte = CastEffect<GrDistanceFieldTextureEffect>(other);
|
| - return fTextureAccess == cte.fTextureAccess;
|
| + return fTextureAccess == cte.fTextureAccess &&
|
| +#ifdef SK_GAMMA_APPLY_TO_A8
|
| + fGammaTextureAccess == cte.fGammaTextureAccess &&
|
| + fLuminance == cte.fLuminance &&
|
| +#endif
|
| + fFlags == cte.fFlags;
|
| }
|
|
|
| void GrDistanceFieldTextureEffect::getConstantColorComponents(GrColor* color,
|
| @@ -242,7 +248,8 @@ GrEffect* GrDistanceFieldTextureEffect::TestCreate(SkRandom* random,
|
| textures[texIdx2], params2,
|
| random->nextF(),
|
| #endif
|
| - random->nextBool());
|
| + random->nextBool() ?
|
| + kSimilarity_DistanceFieldEffectFlag : 0);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -286,7 +293,8 @@ public:
|
| // create LCD offset adjusted by inverse of transform
|
| builder->fsCodeAppendf("\tvec2 uv = %s;\n", fsCoordName.c_str());
|
| builder->fsCodeAppendf("\tvec2 st = uv*%s.xy;\n", textureSizeUniName);
|
| - if (dfTexEffect.isUniformScale()) {
|
| + bool isUniformScale = !!(dfTexEffect.getFlags() & kUniformScale_DistanceFieldEffectMask);
|
| + if (isUniformScale) {
|
| builder->fsCodeAppend("\tfloat dx = dFdx(st.x);\n");
|
| builder->fsCodeAppendf("\tvec2 offset = vec2(dx*%s.z, 0.0);\n", textureSizeUniName);
|
| } else {
|
| @@ -327,7 +335,7 @@ public:
|
| // transformations, and even then using a single factor seems like a reasonable
|
| // trade-off between quality and speed.
|
| builder->fsCodeAppend("\tfloat afwidth;\n");
|
| - if (dfTexEffect.isUniformScale()) {
|
| + if (isUniformScale) {
|
| // this gives us a smooth step across approximately one fragment
|
| builder->fsCodeAppend("\tafwidth = " SK_DistanceFieldAAFactor "*dx;\n");
|
| } else {
|
| @@ -393,7 +401,7 @@ public:
|
| texture->height() != fTextureSize.height()) {
|
| fTextureSize = SkISize::Make(texture->width(), texture->height());
|
| float delta = 1.0f/(3.0f*texture->width());
|
| - if (dfTexEffect.useBGR()) {
|
| + if (dfTexEffect.getFlags() & kBGR_DistanceFieldEffectFlag) {
|
| delta = -delta;
|
| }
|
| pdman.set3f(fTextureSizeUni,
|
| @@ -418,7 +426,7 @@ public:
|
| const GrDistanceFieldLCDTextureEffect& dfTexEffect =
|
| drawEffect.castEffect<GrDistanceFieldLCDTextureEffect>();
|
|
|
| - b->add32(dfTexEffect.isUniformScale());
|
| + b->add32(dfTexEffect.getFlags());
|
| }
|
|
|
| private:
|
| @@ -436,12 +444,13 @@ GrDistanceFieldLCDTextureEffect::GrDistanceFieldLCDTextureEffect(
|
| GrTexture* texture, const GrTextureParams& params,
|
| GrTexture* gamma, const GrTextureParams& gParams,
|
| SkColor textColor,
|
| - bool uniformScale, bool useBGR)
|
| + uint32_t flags)
|
| : fTextureAccess(texture, params)
|
| , fGammaTextureAccess(gamma, gParams)
|
| , fTextColor(textColor)
|
| - , fUniformScale(uniformScale)
|
| - , fUseBGR(useBGR) {
|
| + , fFlags(flags & kLCD_DistanceFieldEffectMask) {
|
| + SkASSERT(!(flags & ~kLCD_DistanceFieldEffectMask) && (flags & kUseLCD_DistanceFieldEffectFlag));
|
| +
|
| this->addTextureAccess(&fTextureAccess);
|
| this->addTextureAccess(&fGammaTextureAccess);
|
| this->addVertexAttrib(kVec2f_GrSLType);
|
| @@ -450,7 +459,10 @@ GrDistanceFieldLCDTextureEffect::GrDistanceFieldLCDTextureEffect(
|
| bool GrDistanceFieldLCDTextureEffect::onIsEqual(const GrEffect& other) const {
|
| const GrDistanceFieldLCDTextureEffect& cte =
|
| CastEffect<GrDistanceFieldLCDTextureEffect>(other);
|
| - return (fTextureAccess == cte.fTextureAccess && fGammaTextureAccess == cte.fGammaTextureAccess);
|
| + return (fTextureAccess == cte.fTextureAccess &&
|
| + fGammaTextureAccess == cte.fGammaTextureAccess &&
|
| + fTextColor == cte.fTextColor &&
|
| + fFlags == cte.fFlags);
|
| }
|
|
|
| void GrDistanceFieldLCDTextureEffect::getConstantColorComponents(GrColor* color,
|
| @@ -496,8 +508,11 @@ GrEffect* GrDistanceFieldLCDTextureEffect::TestCreate(SkRandom* random,
|
| random->nextULessThan(256),
|
| random->nextULessThan(256),
|
| random->nextULessThan(256));
|
| + uint32_t flags = kUseLCD_DistanceFieldEffectFlag;
|
| + flags |= random->nextBool() ? kUniformScale_DistanceFieldEffectMask : 0;
|
| + flags |= random->nextBool() ? kBGR_DistanceFieldEffectFlag : 0;
|
| return GrDistanceFieldLCDTextureEffect::Create(textures[texIdx], params,
|
| textures[texIdx2], params2,
|
| textColor,
|
| - random->nextBool(), random->nextBool());
|
| + flags);
|
| }
|
|
|