| Index: src/gpu/GrDistanceFieldTextContext.cpp
|
| diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp
|
| index 8827382b75dff8fc1612c5e8cbabd36c43be9b51..0ef596a27ba0ef8ebea604127018d056c3bc7313 100755
|
| --- a/src/gpu/GrDistanceFieldTextContext.cpp
|
| +++ b/src/gpu/GrDistanceFieldTextContext.cpp
|
| @@ -25,7 +25,11 @@
|
| #include "SkStrokeRec.h"
|
| #include "effects/GrDistanceFieldTextureEffect.h"
|
|
|
| -static const int kGlyphCoordsAttributeIndex = 1;
|
| +SK_CONF_DECLARE(bool, c_DumpFontCache, "gpu.dumpFontCache", false,
|
| + "Dump the contents of the font cache before every purge.");
|
| +
|
| +static const int kGlyphCoordsNoColorAttributeIndex = 1;
|
| +static const int kGlyphCoordsWithColorAttributeIndex = 2;
|
|
|
| static const int kSmallDFFontSize = 32;
|
| static const int kSmallDFFontLimit = 32;
|
| @@ -33,8 +37,21 @@ static const int kMediumDFFontSize = 64;
|
| static const int kMediumDFFontLimit = 64;
|
| static const int kLargeDFFontSize = 128;
|
|
|
| -SK_CONF_DECLARE(bool, c_DumpFontCache, "gpu.dumpFontCache", false,
|
| - "Dump the contents of the font cache before every purge.");
|
| +namespace {
|
| +// position + texture coord
|
| +extern const GrVertexAttrib gTextVertexAttribs[] = {
|
| + {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
|
| + {kVec2f_GrVertexAttribType, sizeof(SkPoint) , kEffect_GrVertexAttribBinding}
|
| +};
|
| +
|
| +// position + color + texture coord
|
| +extern const GrVertexAttrib gTextVertexWithColorAttribs[] = {
|
| + {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
|
| + {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVertexAttribBinding},
|
| + {kVec2f_GrVertexAttribType, sizeof(SkPoint) + sizeof(GrColor), kEffect_GrVertexAttribBinding}
|
| +};
|
| +
|
| +};
|
|
|
| GrDistanceFieldTextContext::GrDistanceFieldTextContext(GrContext* context,
|
| const SkDeviceProperties& properties,
|
| @@ -112,6 +129,8 @@ void GrDistanceFieldTextContext::flushGlyphs() {
|
| 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) {
|
| @@ -132,13 +151,14 @@ void GrDistanceFieldTextContext::flushGlyphs() {
|
| fContext->getMatrix().rectStaysRect() &&
|
| fContext->getMatrix().isSimilarity(),
|
| useBGR),
|
| - kGlyphCoordsAttributeIndex)->unref();
|
| + coordsIdx)->unref();
|
|
|
| if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() ||
|
| kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() ||
|
| fPaint.numColorStages()) {
|
| GrPrintf("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
|
| @@ -158,18 +178,20 @@ void GrDistanceFieldTextContext::flushGlyphs() {
|
| fGammaTexture, gammaParams,
|
| lum/255.f,
|
| fContext->getMatrix().isSimilarity()),
|
| - kGlyphCoordsAttributeIndex)->unref();
|
| + coordsIdx)->unref();
|
| #else
|
| drawState->addCoverageEffect(GrDistanceFieldTextureEffect::Create(
|
| currTexture, params,
|
| fContext->getMatrix().isSimilarity()),
|
| - kGlyphCoordsAttributeIndex)->unref();
|
| + coordsIdx)->unref();
|
| #endif
|
| // set back to normal in case we took LCD path previously.
|
| drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff());
|
| - drawState->setColor(fPaint.getColor());
|
| + //drawState->setColor(fPaint.getColor());
|
| + // We're using per-vertex color.
|
| + SkASSERT(drawState->hasColorVertexAttribute());
|
| + drawState->setColor(0xFFFFFFFF);
|
| }
|
| -
|
| int nGlyphs = fCurrVertex / 4;
|
| fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer());
|
| fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType,
|
| @@ -181,16 +203,6 @@ void GrDistanceFieldTextContext::flushGlyphs() {
|
| fVertices = NULL;
|
| }
|
|
|
| -namespace {
|
| -
|
| -// position + texture coord
|
| -extern const GrVertexAttrib gTextVertexAttribs[] = {
|
| - {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
|
| - {kVec2f_GrVertexAttribType, sizeof(SkPoint), kEffect_GrVertexAttribBinding}
|
| -};
|
| -
|
| -};
|
| -
|
| void GrDistanceFieldTextContext::drawPackedGlyph(GrGlyph::PackedID packed,
|
| SkFixed vx, SkFixed vy,
|
| GrFontScaler* scaler) {
|
| @@ -294,21 +306,32 @@ HAS_ATLAS:
|
| SkFixed tw = SkIntToFixed(glyph->fBounds.width() - 2*SK_DistanceFieldInset);
|
| SkFixed th = SkIntToFixed(glyph->fBounds.height() - 2*SK_DistanceFieldInset);
|
|
|
| - static const size_t kVertexSize = 2 * sizeof(SkPoint);
|
| + size_t vertSize = fUseLCDText ? (2 * sizeof(SkPoint))
|
| + : (2 * sizeof(SkPoint) + sizeof(GrColor));
|
| +
|
| + SkASSERT(vertSize == fDrawTarget->getDrawState().getVertexSize());
|
| +
|
| SkPoint* positions = reinterpret_cast<SkPoint*>(
|
| - reinterpret_cast<intptr_t>(fVertices) + kVertexSize * fCurrVertex);
|
| - positions->setRectFan(sx,
|
| - sy,
|
| - sx + width,
|
| - sy + height,
|
| - kVertexSize);
|
| + reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex);
|
| + positions->setRectFan(sx, sy, sx + width, sy + height, vertSize);
|
| +
|
| + // The texture coords are last in both the with and without color vertex layouts.
|
| SkPoint* textureCoords = reinterpret_cast<SkPoint*>(
|
| - reinterpret_cast<intptr_t>(positions) + kVertexSize - sizeof(SkPoint));
|
| + reinterpret_cast<intptr_t>(positions) + vertSize - sizeof(SkPoint));
|
| textureCoords->setRectFan(SkFixedToFloat(texture->normalizeFixedX(tx)),
|
| - SkFixedToFloat(texture->normalizeFixedY(ty)),
|
| - SkFixedToFloat(texture->normalizeFixedX(tx + tw)),
|
| - SkFixedToFloat(texture->normalizeFixedY(ty + th)),
|
| - kVertexSize);
|
| + SkFixedToFloat(texture->normalizeFixedY(ty)),
|
| + SkFixedToFloat(texture->normalizeFixedX(tx + tw)),
|
| + SkFixedToFloat(texture->normalizeFixedY(ty + th)),
|
| + vertSize);
|
| + if (!fUseLCDText) {
|
| + // color comes after position.
|
| + GrColor* colors = reinterpret_cast<GrColor*>(positions + 1);
|
| + for (int i = 0; i < 4; ++i) {
|
| + *colors = fPaint.getColor();
|
| + colors = reinterpret_cast<GrColor*>(reinterpret_cast<intptr_t>(colors) + vertSize);
|
| + }
|
| + }
|
| +
|
| fCurrVertex += 4;
|
| }
|
|
|
| @@ -342,7 +365,7 @@ inline void GrDistanceFieldTextContext::init(const GrPaint& paint, const SkPaint
|
| }
|
|
|
| inline void GrDistanceFieldTextContext::finish() {
|
| - flushGlyphs();
|
| + this->flushGlyphs();
|
|
|
| GrTextContext::finish();
|
| }
|
| @@ -419,8 +442,13 @@ void GrDistanceFieldTextContext::drawText(const GrPaint& paint, const SkPaint& s
|
|
|
| // allocate vertices
|
| SkASSERT(NULL == fVertices);
|
| - fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>(
|
| - SK_ARRAY_COUNT(gTextVertexAttribs));
|
| + if (!fUseLCDText) {
|
| + fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>(
|
| + SK_ARRAY_COUNT(gTextVertexWithColorAttribs));
|
| + } else {
|
| + fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>(
|
| + SK_ARRAY_COUNT(gTextVertexAttribs));
|
| + }
|
| int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL);
|
| bool success = fDrawTarget->reserveVertexAndIndexSpace(4*numGlyphs,
|
| 0,
|
| @@ -510,8 +538,13 @@ void GrDistanceFieldTextContext::drawPosText(const GrPaint& paint, const SkPaint
|
|
|
| // allocate vertices
|
| SkASSERT(NULL == fVertices);
|
| - fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>(
|
| - SK_ARRAY_COUNT(gTextVertexAttribs));
|
| + if (!fUseLCDText) {
|
| + fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>(
|
| + SK_ARRAY_COUNT(gTextVertexWithColorAttribs));
|
| + } else {
|
| + fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>(
|
| + SK_ARRAY_COUNT(gTextVertexAttribs));
|
| + }
|
| int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL);
|
| bool success = fDrawTarget->reserveVertexAndIndexSpace(4*numGlyphs,
|
| 0,
|
|
|