| Index: src/gpu/GrBitmapTextContext.cpp
|
| diff --git a/src/gpu/GrBitmapTextContext.cpp b/src/gpu/GrBitmapTextContext.cpp
|
| index fa70d3270ba1fe6999138d63127be59f71b2841d..afecead65d28446d75417663446bf6cbc2c59f51 100755
|
| --- a/src/gpu/GrBitmapTextContext.cpp
|
| +++ b/src/gpu/GrBitmapTextContext.cpp
|
| @@ -47,8 +47,10 @@ extern const GrVertexAttrib gTextVertexWithColorAttribs[] = {
|
| {kVec2f_GrVertexAttribType, sizeof(SkPoint) + sizeof(GrColor), kGeometryProcessor_GrVertexAttribBinding}
|
| };
|
|
|
| -static const size_t kTextVAColorSize = 2 * sizeof(SkPoint) + sizeof(GrColor);
|
| +static const size_t kTextVAColorSize = 2 * sizeof(SkPoint) + sizeof(GrColor);
|
|
|
| +static const int kVerticesPerGlyph = 4;
|
| +static const int kIndicesPerGlyph = 6;
|
| };
|
|
|
| GrBitmapTextContext::GrBitmapTextContext(GrContext* context,
|
| @@ -57,11 +59,12 @@ GrBitmapTextContext::GrBitmapTextContext(GrContext* context,
|
| fStrike = NULL;
|
|
|
| fCurrTexture = NULL;
|
| - fCurrVertex = 0;
|
| fEffectTextureUniqueID = SK_InvalidUniqueID;
|
|
|
| fVertices = NULL;
|
| - fMaxVertices = 0;
|
| + fCurrVertex = 0;
|
| + fAllocVertexCount = 0;
|
| + fTotalVertexCount = 0;
|
|
|
| fVertexBounds.setLargestInverted();
|
| }
|
| @@ -72,7 +75,7 @@ GrBitmapTextContext* GrBitmapTextContext::Create(GrContext* context,
|
| }
|
|
|
| GrBitmapTextContext::~GrBitmapTextContext() {
|
| - this->flush();
|
| + this->finish();
|
| }
|
|
|
| bool GrBitmapTextContext::canDraw(const SkPaint& paint) {
|
| @@ -88,7 +91,8 @@ inline void GrBitmapTextContext::init(const GrPaint& paint, const SkPaint& skPai
|
| fCurrVertex = 0;
|
|
|
| fVertices = NULL;
|
| - fMaxVertices = 0;
|
| + fAllocVertexCount = 0;
|
| + fTotalVertexCount = 0;
|
| }
|
|
|
| void GrBitmapTextContext::onDrawText(const GrPaint& paint, const SkPaint& skPaint,
|
| @@ -118,13 +122,13 @@ void GrBitmapTextContext::onDrawText(const GrPaint& paint, const SkPaint& skPain
|
| }
|
|
|
| // need to measure first
|
| + int numGlyphs;
|
| if (fSkPaint.getTextAlign() != SkPaint::kLeft_Align) {
|
| - SkVector stop;
|
| -
|
| - MeasureText(cache, glyphCacheProc, text, byteLength, &stop);
|
| + SkVector stopVector;
|
| + numGlyphs = MeasureText(cache, glyphCacheProc, text, byteLength, &stopVector);
|
|
|
| - SkScalar stopX = stop.fX;
|
| - SkScalar stopY = stop.fY;
|
| + SkScalar stopX = stopVector.fX;
|
| + SkScalar stopY = stopVector.fY;
|
|
|
| if (fSkPaint.getTextAlign() == SkPaint::kCenter_Align) {
|
| stopX = SkScalarHalf(stopX);
|
| @@ -132,7 +136,10 @@ void GrBitmapTextContext::onDrawText(const GrPaint& paint, const SkPaint& skPain
|
| }
|
| x -= stopX;
|
| y -= stopY;
|
| + } else {
|
| + numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL);
|
| }
|
| + fTotalVertexCount = kVerticesPerGlyph*numGlyphs;
|
|
|
| const char* stop = text + byteLength;
|
|
|
| @@ -207,6 +214,9 @@ void GrBitmapTextContext::onDrawPosText(const GrPaint& paint, const SkPaint& skP
|
| GrContext::AutoMatrix autoMatrix;
|
| autoMatrix.setIdentity(fContext, &fPaint);
|
|
|
| + int numGlyphs = fSkPaint.textToGlyphs(text, byteLength, NULL);
|
| + fTotalVertexCount = kVerticesPerGlyph*numGlyphs;
|
| +
|
| const char* stop = text + byteLength;
|
| SkTextAlignProc alignProc(fSkPaint.getTextAlign());
|
| SkTextMapStateProc tmsProc(ctm, offset, scalarsPerPosition);
|
| @@ -335,6 +345,28 @@ void GrBitmapTextContext::onDrawPosText(const GrPaint& paint, const SkPaint& skP
|
| this->finish();
|
| }
|
|
|
| +static void* alloc_vertices(GrDrawTarget* drawTarget, int numVertices, bool useColorVerts) {
|
| + if (numVertices <= 0) {
|
| + return NULL;
|
| + }
|
| +
|
| + // set up attributes
|
| + if (useColorVerts) {
|
| + drawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>(
|
| + SK_ARRAY_COUNT(gTextVertexWithColorAttribs), kTextVAColorSize);
|
| + } else {
|
| + drawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>(
|
| + SK_ARRAY_COUNT(gTextVertexAttribs), kTextVASize);
|
| + }
|
| + void* vertices = NULL;
|
| + bool success = drawTarget->reserveVertexAndIndexSpace(numVertices,
|
| + 0,
|
| + &vertices,
|
| + NULL);
|
| + GrAlwaysAssert(success);
|
| + return vertices;
|
| +}
|
| +
|
| void GrBitmapTextContext::appendGlyph(GrGlyph::PackedID packed,
|
| SkFixed vx, SkFixed vy,
|
| GrFontScaler* scaler) {
|
| @@ -418,6 +450,9 @@ void GrBitmapTextContext::appendGlyph(GrGlyph::PackedID packed,
|
| am.setPreConcat(fContext, translate, &tmpPaint);
|
| GrStrokeInfo strokeInfo(SkStrokeRec::kFill_InitStyle);
|
| fContext->drawPath(tmpPaint, *glyph->fPath, strokeInfo);
|
| +
|
| + // remove this glyph from the vertices we need to allocate
|
| + fTotalVertexCount -= kVerticesPerGlyph;
|
| return;
|
| }
|
|
|
| @@ -434,7 +469,7 @@ HAS_ATLAS:
|
| GrTexture* texture = glyph->fPlot->texture();
|
| SkASSERT(texture);
|
|
|
| - if (fCurrTexture != texture || fCurrVertex + 4 > fMaxVertices) {
|
| + if (fCurrTexture != texture || fCurrVertex + kVerticesPerGlyph > fAllocVertexCount) {
|
| this->flush();
|
| fCurrTexture = texture;
|
| fCurrTexture->ref();
|
| @@ -444,44 +479,9 @@ HAS_ATLAS:
|
| bool useColorVerts = kA8_GrMaskFormat == fCurrMaskFormat;
|
|
|
| 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;
|
| - if (useColorVerts) {
|
| - fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>(
|
| - SK_ARRAY_COUNT(gTextVertexWithColorAttribs), kTextVAColorSize);
|
| - } else {
|
| - fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>(
|
| - SK_ARRAY_COUNT(gTextVertexAttribs), kTextVASize);
|
| - }
|
| - bool flush = fDrawTarget->geometryHints(&fMaxVertices, NULL);
|
| - if (flush) {
|
| - this->flush();
|
| - fContext->flush();
|
| - if (useColorVerts) {
|
| - fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>(
|
| - SK_ARRAY_COUNT(gTextVertexWithColorAttribs), kTextVAColorSize);
|
| - } else {
|
| - fDrawTarget->drawState()->setVertexAttribs<gTextVertexAttribs>(
|
| - SK_ARRAY_COUNT(gTextVertexAttribs), kTextVASize);
|
| - }
|
| - }
|
| - 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,
|
| - &fVertices,
|
| - NULL);
|
| - GrAlwaysAssert(success);
|
| + int maxQuadVertices = kVerticesPerGlyph * fContext->getQuadIndexBuffer()->maxQuads();
|
| + fAllocVertexCount = SkMin32(fTotalVertexCount, maxQuadVertices);
|
| + fVertices = alloc_vertices(fDrawTarget, fAllocVertexCount, useColorVerts);
|
| }
|
|
|
| SkFixed tx = SkIntToFixed(glyph->fAtlasLocation.fX);
|
| @@ -597,15 +597,17 @@ void GrBitmapTextContext::flush() {
|
| default:
|
| SkFAIL("Unexpected mask format.");
|
| }
|
| - int nGlyphs = fCurrVertex / 4;
|
| + int nGlyphs = fCurrVertex / kVerticesPerGlyph;
|
| fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer());
|
| fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType,
|
| nGlyphs,
|
| - 4, 6, &fVertexBounds);
|
| + kVerticesPerGlyph, kIndicesPerGlyph, &fVertexBounds);
|
|
|
| fDrawTarget->resetVertexSource();
|
| fVertices = NULL;
|
| - fMaxVertices = 0;
|
| + fAllocVertexCount = 0;
|
| + // reset to be those that are left
|
| + fTotalVertexCount -= fCurrVertex;
|
| fCurrVertex = 0;
|
| fVertexBounds.setLargestInverted();
|
| SkSafeSetNull(fCurrTexture);
|
| @@ -614,6 +616,7 @@ void GrBitmapTextContext::flush() {
|
|
|
| inline void GrBitmapTextContext::finish() {
|
| this->flush();
|
| + fTotalVertexCount = 0;
|
|
|
| GrTextContext::finish();
|
| }
|
|
|