Index: src/gpu/GrDistanceFieldTextContext.cpp |
diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp |
index 1f4070f4f5bef4ad43b5fd74cb6b2b5846df417b..5b679d1c80cad90fb80f7ba6d41a83137bbb51d8 100755 |
--- a/src/gpu/GrDistanceFieldTextContext.cpp |
+++ b/src/gpu/GrDistanceFieldTextContext.cpp |
@@ -637,6 +637,8 @@ |
// Set draw state |
if (fUseLCDText) { |
+ GrColor colorNoPreMul = skcolor_to_grcolor_nopremultiply(filteredColor); |
+ |
// TODO: move supportsRGBCoverage check to setupCoverageEffect and only add LCD |
// processor if the xp can support it. For now we will simply assume that if |
// fUseLCDText is true, then we have a known color output. |
@@ -644,10 +646,22 @@ |
SkDebugf("LCD Text will not draw correctly.\n"); |
} |
SkASSERT(!drawState.hasColorVertexAttribute()); |
+ // We don't use the GrPaint's color in this case because it's been premultiplied by |
+ // alpha. Instead we feed in a non-premultiplied color, and multiply its alpha by |
+ // the mask texture color. The end result is that we get |
+ // mask*paintAlpha*paintColor + (1-mask*paintAlpha)*dstColor |
+ int a = SkColorGetA(fSkPaint.getColor()); |
+ // paintAlpha |
+ drawState.setColor(SkColorSetARGB(a, a, a, a)); |
+ // paintColor |
+ drawState.setBlendConstant(colorNoPreMul); |
+ drawState.setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff); |
} else { |
if (0xFF == GrColorUnpackA(fPaint.getColor())) { |
drawState.setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
} |
+ // set back to normal in case we took LCD path previously. |
+ drawState.setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff()); |
// We're using per-vertex color. |
SkASSERT(drawState.hasColorVertexAttribute()); |
} |