| Index: src/gpu/GrTextContext.cpp
|
| diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp
|
| index 8178032ae7a6351d9e4c714ef05b04cc0f3b5721..363a8177784e9fb90b6dc6a15e8e54084d4065d1 100644
|
| --- a/src/gpu/GrTextContext.cpp
|
| +++ b/src/gpu/GrTextContext.cpp
|
| @@ -6,82 +6,10 @@
|
| */
|
|
|
|
|
| -
|
| #include "GrTextContext.h"
|
| -#include "GrAtlas.h"
|
| -#include "GrContext.h"
|
| -#include "GrDrawTarget.h"
|
| -#include "GrFontScaler.h"
|
| -#include "GrIndexBuffer.h"
|
| -#include "GrTextStrike.h"
|
| -#include "GrTextStrike_impl.h"
|
| -#include "SkPath.h"
|
| -#include "SkRTConf.h"
|
| -#include "SkStrokeRec.h"
|
| -#include "effects/GrCustomCoordsTextureEffect.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.");
|
| -
|
| -void GrTextContext::flushGlyphs() {
|
| - if (NULL == fDrawTarget) {
|
| - return;
|
| - }
|
| -
|
| - GrDrawState* drawState = fDrawTarget->drawState();
|
| - GrDrawState::AutoRestoreEffects are(drawState);
|
| - drawState->setFromPaint(fPaint, SkMatrix::I(), fContext->getRenderTarget());
|
| -
|
| - if (fCurrVertex > 0) {
|
| - // setup our sampler state for our text texture/atlas
|
| - SkASSERT(GrIsALIGN4(fCurrVertex));
|
| - SkASSERT(fCurrTexture);
|
| - GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kNone_FilterMode);
|
| -
|
| - // This effect could be stored with one of the cache objects (atlas?)
|
| - drawState->addCoverageEffect(
|
| - GrCustomCoordsTextureEffect::Create(fCurrTexture, params),
|
| - kGlyphCoordsAttributeIndex)->unref();
|
| -
|
| - if (!GrPixelConfigIsAlphaOnly(fCurrTexture->config())) {
|
| - if (kOne_GrBlendCoeff != fPaint.getSrcBlendCoeff() ||
|
| - kISA_GrBlendCoeff != fPaint.getDstBlendCoeff() ||
|
| - 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());
|
| - 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());
|
| - drawState->setColor(fPaint.getColor());
|
| - }
|
| -
|
| - int nGlyphs = fCurrVertex / 4;
|
| - fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer());
|
| - fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType,
|
| - nGlyphs,
|
| - 4, 6);
|
| - fDrawTarget->resetVertexSource();
|
| - fVertices = NULL;
|
| - fMaxVertices = 0;
|
| - fCurrVertex = 0;
|
| - SkSafeSetNull(fCurrTexture);
|
| - }
|
| -}
|
|
|
| GrTextContext::GrTextContext(GrContext* context, const GrPaint& paint) : fPaint(paint) {
|
| fContext = context;
|
| - fStrike = NULL;
|
| -
|
| - fCurrTexture = NULL;
|
| - fCurrVertex = 0;
|
|
|
| const GrClipData* clipData = context->getClip();
|
|
|
| @@ -95,175 +23,6 @@ GrTextContext::GrTextContext(GrContext* context, const GrPaint& paint) : fPaint(
|
|
|
| devConservativeBound.roundOut(&fClipRect);
|
|
|
| - fAutoMatrix.setIdentity(fContext, &fPaint);
|
| -
|
| fDrawTarget = fContext->getTextTarget();
|
| -
|
| - fVertices = NULL;
|
| - fMaxVertices = 0;
|
| -}
|
| -
|
| -GrTextContext::~GrTextContext() {
|
| - this->flushGlyphs();
|
| }
|
|
|
| -void GrTextContext::flush() {
|
| - this->flushGlyphs();
|
| -}
|
| -
|
| -namespace {
|
| -
|
| -// position + texture coord
|
| -extern const GrVertexAttrib gTextVertexAttribs[] = {
|
| - {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
|
| - {kVec2f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBinding}
|
| -};
|
| -
|
| -};
|
| -
|
| -void GrTextContext::drawPackedGlyph(GrGlyph::PackedID packed,
|
| - GrFixed vx, GrFixed vy,
|
| - GrFontScaler* scaler) {
|
| - if (NULL == fDrawTarget) {
|
| - return;
|
| - }
|
| - if (NULL == fStrike) {
|
| - fStrike = fContext->getFontCache()->getStrike(scaler);
|
| - }
|
| -
|
| - GrGlyph* glyph = fStrike->getGlyph(packed, scaler);
|
| - if (NULL == glyph || glyph->fBounds.isEmpty()) {
|
| - return;
|
| - }
|
| -
|
| - vx += SkIntToFixed(glyph->fBounds.fLeft);
|
| - vy += SkIntToFixed(glyph->fBounds.fTop);
|
| -
|
| - // keep them as ints until we've done the clip-test
|
| - GrFixed width = glyph->fBounds.width();
|
| - GrFixed height = glyph->fBounds.height();
|
| -
|
| - // check if we clipped out
|
| - if (true || NULL == glyph->fPlot) {
|
| - int x = vx >> 16;
|
| - int y = vy >> 16;
|
| - if (fClipRect.quickReject(x, y, x + width, y + height)) {
|
| -// SkCLZ(3); // so we can set a break-point in the debugger
|
| - return;
|
| - }
|
| - }
|
| -
|
| - if (NULL == glyph->fPlot) {
|
| - if (fStrike->getGlyphAtlas(glyph, scaler)) {
|
| - goto HAS_ATLAS;
|
| - }
|
| -
|
| - // try to clear out an unused plot before we flush
|
| - fContext->getFontCache()->freePlotExceptFor(fStrike);
|
| - if (fStrike->getGlyphAtlas(glyph, scaler)) {
|
| - goto HAS_ATLAS;
|
| - }
|
| -
|
| - if (c_DumpFontCache) {
|
| -#ifdef SK_DEVELOPER
|
| - fContext->getFontCache()->dump();
|
| -#endif
|
| - }
|
| -
|
| - // before we purge the cache, we must flush any accumulated draws
|
| - this->flushGlyphs();
|
| - fContext->flush();
|
| -
|
| - // try to purge
|
| - fContext->getFontCache()->purgeExceptFor(fStrike);
|
| - // need to use new flush count here
|
| - if (fStrike->getGlyphAtlas(glyph, scaler)) {
|
| - goto HAS_ATLAS;
|
| - }
|
| -
|
| - if (NULL == glyph->fPath) {
|
| - SkPath* path = SkNEW(SkPath);
|
| - if (!scaler->getGlyphPath(glyph->glyphID(), path)) {
|
| - // flag the glyph as being dead?
|
| - delete path;
|
| - return;
|
| - }
|
| - glyph->fPath = path;
|
| - }
|
| -
|
| - GrContext::AutoMatrix am;
|
| - SkMatrix translate;
|
| - translate.setTranslate(SkFixedToScalar(vx - SkIntToFixed(glyph->fBounds.fLeft)),
|
| - SkFixedToScalar(vy - SkIntToFixed(glyph->fBounds.fTop)));
|
| - GrPaint tmpPaint(fPaint);
|
| - am.setPreConcat(fContext, translate, &tmpPaint);
|
| - SkStrokeRec stroke(SkStrokeRec::kFill_InitStyle);
|
| - fContext->drawPath(tmpPaint, *glyph->fPath, stroke);
|
| - return;
|
| - }
|
| -
|
| -HAS_ATLAS:
|
| - SkASSERT(glyph->fPlot);
|
| - GrDrawTarget::DrawToken drawToken = fDrawTarget->getCurrentDrawToken();
|
| - glyph->fPlot->setDrawToken(drawToken);
|
| -
|
| - // now promote them to fixed (TODO: Rethink using fixed pt).
|
| - width = SkIntToFixed(width);
|
| - height = SkIntToFixed(height);
|
| -
|
| - GrTexture* texture = glyph->fPlot->texture();
|
| - SkASSERT(texture);
|
| -
|
| - if (fCurrTexture != texture || fCurrVertex + 4 > fMaxVertices) {
|
| - this->flushGlyphs();
|
| - fCurrTexture = texture;
|
| - fCurrTexture->ref();
|
| - }
|
| -
|
| - if (NULL == fVertices) {
|
| - // If we need to reserve vertices allow the draw target to suggest
|
| - // a number of verts to reserve and whether to perform a flush.
|
| - fMaxVertices = kMinRequestedVerts;
|
| - fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>(
|
| - SK_ARRAY_COUNT(gTextVertexAttribs));
|
| - bool flush = fDrawTarget->geometryHints(&fMaxVertices, NULL);
|
| - if (flush) {
|
| - this->flushGlyphs();
|
| - fContext->flush();
|
| - fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>(
|
| - SK_ARRAY_COUNT(gTextVertexAttribs));
|
| - }
|
| - fMaxVertices = kDefaultRequestedVerts;
|
| - // ignore return, no point in flushing again.
|
| - fDrawTarget->geometryHints(&fMaxVertices, NULL);
|
| -
|
| - int maxQuadVertices = 4 * fContext->getQuadIndexBuffer()->maxQuads();
|
| - if (fMaxVertices < kMinRequestedVerts) {
|
| - fMaxVertices = kDefaultRequestedVerts;
|
| - } else if (fMaxVertices > maxQuadVertices) {
|
| - // don't exceed the limit of the index buffer
|
| - fMaxVertices = maxQuadVertices;
|
| - }
|
| - bool success = fDrawTarget->reserveVertexAndIndexSpace(fMaxVertices,
|
| - 0,
|
| - GrTCast<void**>(&fVertices),
|
| - NULL);
|
| - GrAlwaysAssert(success);
|
| - SkASSERT(2*sizeof(GrPoint) == fDrawTarget->getDrawState().getVertexSize());
|
| - }
|
| -
|
| - GrFixed tx = SkIntToFixed(glyph->fAtlasLocation.fX);
|
| - GrFixed ty = SkIntToFixed(glyph->fAtlasLocation.fY);
|
| -
|
| - fVertices[2*fCurrVertex].setRectFan(SkFixedToFloat(vx),
|
| - SkFixedToFloat(vy),
|
| - SkFixedToFloat(vx + width),
|
| - SkFixedToFloat(vy + height),
|
| - 2 * sizeof(SkPoint));
|
| - fVertices[2*fCurrVertex+1].setRectFan(SkFixedToFloat(texture->normalizeFixedX(tx)),
|
| - SkFixedToFloat(texture->normalizeFixedY(ty)),
|
| - SkFixedToFloat(texture->normalizeFixedX(tx + width)),
|
| - SkFixedToFloat(texture->normalizeFixedY(ty + height)),
|
| - 2 * sizeof(SkPoint));
|
| - fCurrVertex += 4;
|
| -}
|
|
|