| Index: src/gpu/GrBitmapTextContext.cpp
|
| diff --git a/src/gpu/GrBitmapTextContext.cpp b/src/gpu/GrBitmapTextContext.cpp
|
| index 7a99f093e5149108163a402a2aa9ee7788dc1f47..737e24baa1fcce416f2c5b902a5e521dba5dfec4 100755
|
| --- a/src/gpu/GrBitmapTextContext.cpp
|
| +++ b/src/gpu/GrBitmapTextContext.cpp
|
| @@ -12,6 +12,7 @@
|
| #include "GrIndexBuffer.h"
|
| #include "GrTextStrike.h"
|
| #include "GrTextStrike_impl.h"
|
| +#include "SkColorPriv.h"
|
| #include "SkPath.h"
|
| #include "SkRTConf.h"
|
| #include "SkStrokeRec.h"
|
| @@ -22,10 +23,13 @@ static const int kGlyphCoordsAttributeIndex = 1;
|
| SK_CONF_DECLARE(bool, c_DumpFontCache, "gpu.dumpFontCache", false,
|
| "Dump the contents of the font cache before every purge.");
|
|
|
| -GrBitmapTextContext::GrBitmapTextContext(GrContext* context, const GrPaint& paint) :
|
| +GrBitmapTextContext::GrBitmapTextContext(GrContext* context, const GrPaint& paint,
|
| + SkColor color) :
|
| GrTextContext(context, paint) {
|
| fAutoMatrix.setIdentity(fContext, &fPaint);
|
|
|
| + fSkPaintColor = color;
|
| +
|
| fStrike = NULL;
|
|
|
| fCurrTexture = NULL;
|
| @@ -39,6 +43,13 @@ GrBitmapTextContext::~GrBitmapTextContext() {
|
| this->flushGlyphs();
|
| }
|
|
|
| +static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) {
|
| + unsigned r = SkColorGetR(c);
|
| + unsigned g = SkColorGetG(c);
|
| + unsigned b = SkColorGetB(c);
|
| + return GrColorPackRGBA(r, g, b, 0xff);
|
| +}
|
| +
|
| void GrBitmapTextContext::flushGlyphs() {
|
| if (NULL == fDrawTarget) {
|
| return;
|
| @@ -65,12 +76,16 @@ void GrBitmapTextContext::flushGlyphs() {
|
| fPaint.numColorStages()) {
|
| GrPrintf("LCD Text will not draw correctly.\n");
|
| }
|
| - // setup blend so that we get mask * paintColor + (1-mask)*dstColor
|
| - drawState->setBlendConstant(fPaint.getColor());
|
| + // 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(fSkPaintColor);
|
| + // paintAlpha
|
| + drawState->setColor(SkColorSetARGB(a, a, a, a));
|
| + // paintColor
|
| + drawState->setBlendConstant(skcolor_to_grcolor_nopremultiply(fSkPaintColor));
|
| drawState->setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff);
|
| - // don't modulate by the paint's color in the frag since we're
|
| - // already doing it via the blend const.
|
| - drawState->setColor(0xffffffff);
|
| } else {
|
| // set back to normal in case we took LCD path previously.
|
| drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff());
|
| @@ -82,6 +97,7 @@ void GrBitmapTextContext::flushGlyphs() {
|
| fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType,
|
| nGlyphs,
|
| 4, 6);
|
| +
|
| fDrawTarget->resetVertexSource();
|
| fVertices = NULL;
|
| fMaxVertices = 0;
|
|
|