Chromium Code Reviews| Index: src/gpu/GrDistanceFieldTextContext.cpp |
| diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp |
| index 0ef596a27ba0ef8ebea604127018d056c3bc7313..03bfa5d9f24e9b272619de0bd941de383ed02367 100755 |
| --- a/src/gpu/GrDistanceFieldTextContext.cpp |
| +++ b/src/gpu/GrDistanceFieldTextContext.cpp |
| @@ -66,7 +66,9 @@ GrDistanceFieldTextContext::GrDistanceFieldTextContext(GrContext* context, |
| fGammaTexture = NULL; |
| fCurrVertex = 0; |
| - |
| + fEffectTextureUniqueID = SK_InvalidUniqueID; |
|
robertphillips
2014/07/29 14:01:06
fEffectColor = XXX; ?
jvanverth1
2014/07/29 14:43:41
Done.
|
| + fEffectFlags = 0; |
| + |
| fVertices = NULL; |
| } |
| @@ -128,9 +130,9 @@ void GrDistanceFieldTextContext::flushGlyphs() { |
| GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kBilerp_FilterMode); |
| GrTextureParams gammaParams(SkShader::kClamp_TileMode, GrTextureParams::kNone_FilterMode); |
|
robertphillips
2014/07/29 14:01:06
textureUniqueID ?
jvanverth1
2014/07/29 14:43:41
Done.
|
| - // Effects could be stored with one of the cache objects (atlas?) |
| - int coordsIdx = drawState->hasColorVertexAttribute() ? kGlyphCoordsWithColorAttributeIndex : |
| - kGlyphCoordsNoColorAttributeIndex; |
| + uint32_t textureGenID = currTexture->getUniqueID(); |
| + |
| + // get our current color |
| SkColor filteredColor; |
| SkColorFilter* colorFilter = fSkPaint.getColorFilter(); |
| if (NULL != colorFilter) { |
| @@ -138,21 +140,58 @@ void GrDistanceFieldTextContext::flushGlyphs() { |
| } else { |
| filteredColor = fSkPaint.getColor(); |
| } |
|
robertphillips
2014/07/29 14:01:06
Could this be a helper method like "setupCoverageE
jvanverth1
2014/07/29 14:43:41
Done.
|
| + |
| + // 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 (textureGenID != 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 = textureGenID; |
| + fEffectColor = filteredColor; |
| + fEffectFlags = flags; |
| + } |
| + |
| + // 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()) { |
| @@ -170,21 +209,6 @@ void GrDistanceFieldTextContext::flushGlyphs() { |
| 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()); |