Index: src/gpu/GrDistanceFieldTextContext.cpp |
diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp |
index 32d8f0c38454c8243c98cbc2305d5d0b95201f40..0ef596a27ba0ef8ebea604127018d056c3bc7313 100755 |
--- a/src/gpu/GrDistanceFieldTextContext.cpp |
+++ b/src/gpu/GrDistanceFieldTextContext.cpp |
@@ -66,10 +66,7 @@ |
fGammaTexture = NULL; |
fCurrVertex = 0; |
- fEffectTextureUniqueID = SK_InvalidUniqueID; |
- fEffectColor = GrColor_ILLEGAL; |
- fEffectFlags = 0; |
- |
+ |
fVertices = NULL; |
} |
@@ -114,58 +111,6 @@ |
return GrColorPackRGBA(r, g, b, 0xff); |
} |
-void GrDistanceFieldTextContext::setupCoverageEffect(const SkColor& filteredColor) { |
- GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBilerp_FilterMode); |
- GrTextureParams gammaParams(SkShader::kClamp_TileMode, GrTextureParams::kNone_FilterMode); |
- |
- GrTexture* currTexture = fStrike->getTexture(); |
- SkASSERT(currTexture); |
- uint32_t textureUniqueID = currTexture->getUniqueID(); |
- |
- // set up any flags |
- uint32_t flags = 0; |
- flags |= fContext->getMatrix().isSimilarity() ? kSimilarity_DistanceFieldEffectFlag : 0; |
- flags |= fUseLCDText ? kUseLCD_DistanceFieldEffectFlag : 0; |
- flags |= fUseLCDText && fContext->getMatrix().rectStaysRect() ? |
- kRectToRect_DistanceFieldEffectFlag : 0; |
- bool useBGR = SkDeviceProperties::Geometry::kBGR_Layout == |
- fDeviceProperties.fGeometry.getLayout(); |
- flags |= fUseLCDText && useBGR ? kBGR_DistanceFieldEffectFlag : 0; |
- |
- // see if we need to create a new effect |
- if (textureUniqueID != fEffectTextureUniqueID || |
- filteredColor != fEffectColor || |
- flags != fEffectFlags) { |
- if (fUseLCDText) { |
- GrColor colorNoPreMul = skcolor_to_grcolor_nopremultiply(filteredColor); |
- fCachedEffect.reset(GrDistanceFieldLCDTextureEffect::Create(currTexture, |
- params, |
- fGammaTexture, |
- gammaParams, |
- colorNoPreMul, |
- flags)); |
- } else { |
-#ifdef SK_GAMMA_APPLY_TO_A8 |
- U8CPU lum = SkColorSpaceLuminance::computeLuminance(fDeviceProperties.fGamma, |
- filteredColor); |
- fCachedEffect.reset(GrDistanceFieldTextureEffect::Create(currTexture, |
- params, |
- fGammaTexture, |
- gammaParams, |
- lum/255.f, |
- flags)); |
-#else |
- fCachedEffect.reset(GrDistanceFieldTextureEffect::Create(currTexture, |
- params, flags)); |
-#endif |
- } |
- fEffectTextureUniqueID = textureUniqueID; |
- fEffectColor = filteredColor; |
- fEffectFlags = flags; |
- } |
- |
-} |
- |
void GrDistanceFieldTextContext::flushGlyphs() { |
if (NULL == fDrawTarget) { |
return; |
@@ -178,8 +123,14 @@ |
if (fCurrVertex > 0) { |
// setup our sampler state for our text texture/atlas |
SkASSERT(SkIsAlign4(fCurrVertex)); |
- |
- // get our current color |
+ GrTexture* currTexture = fStrike->getTexture(); |
+ SkASSERT(currTexture); |
+ GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBilerp_FilterMode); |
+ GrTextureParams gammaParams(SkShader::kClamp_TileMode, GrTextureParams::kNone_FilterMode); |
+ |
+ // Effects could be stored with one of the cache objects (atlas?) |
+ int coordsIdx = drawState->hasColorVertexAttribute() ? kGlyphCoordsWithColorAttributeIndex : |
+ kGlyphCoordsNoColorAttributeIndex; |
SkColor filteredColor; |
SkColorFilter* colorFilter = fSkPaint.getColorFilter(); |
if (NULL != colorFilter) { |
@@ -187,16 +138,21 @@ |
} else { |
filteredColor = fSkPaint.getColor(); |
} |
- this->setupCoverageEffect(filteredColor); |
- |
- // Effects could be stored with one of the cache objects (atlas?) |
- int coordsIdx = drawState->hasColorVertexAttribute() ? kGlyphCoordsWithColorAttributeIndex : |
- kGlyphCoordsNoColorAttributeIndex; |
- drawState->addCoverageEffect(fCachedEffect.get(), coordsIdx); |
- |
- // Set draw state |
if (fUseLCDText) { |
GrColor colorNoPreMul = skcolor_to_grcolor_nopremultiply(filteredColor); |
+ bool useBGR = SkDeviceProperties::Geometry::kBGR_Layout == |
+ fDeviceProperties.fGeometry.getLayout(); |
+ drawState->addCoverageEffect(GrDistanceFieldLCDTextureEffect::Create( |
+ currTexture, |
+ params, |
+ fGammaTexture, |
+ gammaParams, |
+ colorNoPreMul, |
+ fContext->getMatrix().rectStaysRect() && |
+ fContext->getMatrix().isSimilarity(), |
+ useBGR), |
+ coordsIdx)->unref(); |
+ |
if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() || |
kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() || |
fPaint.numColorStages()) { |
@@ -214,6 +170,21 @@ |
drawState->setBlendConstant(colorNoPreMul); |
drawState->setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff); |
} else { |
+#ifdef SK_GAMMA_APPLY_TO_A8 |
+ U8CPU lum = SkColorSpaceLuminance::computeLuminance(fDeviceProperties.fGamma, |
+ filteredColor); |
+ drawState->addCoverageEffect(GrDistanceFieldTextureEffect::Create( |
+ currTexture, params, |
+ fGammaTexture, gammaParams, |
+ lum/255.f, |
+ fContext->getMatrix().isSimilarity()), |
+ coordsIdx)->unref(); |
+#else |
+ drawState->addCoverageEffect(GrDistanceFieldTextureEffect::Create( |
+ currTexture, params, |
+ fContext->getMatrix().isSimilarity()), |
+ coordsIdx)->unref(); |
+#endif |
// set back to normal in case we took LCD path previously. |
drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff()); |
//drawState->setColor(fPaint.getColor()); |