| Index: src/gpu/GrDistanceFieldTextContext.cpp
|
| diff --git a/src/gpu/GrDistanceFieldTextContext.cpp b/src/gpu/GrDistanceFieldTextContext.cpp
|
| index 58c8121cd9d645ce0f2a7409b27d84a75f0f159c..db98238a0ed70801bbd4e5aa161da9943f8f3ca9 100755
|
| --- a/src/gpu/GrDistanceFieldTextContext.cpp
|
| +++ b/src/gpu/GrDistanceFieldTextContext.cpp
|
| @@ -96,7 +96,6 @@ GrDistanceFieldTextContext* GrDistanceFieldTextContext::Create(GrContext* contex
|
| }
|
|
|
| GrDistanceFieldTextContext::~GrDistanceFieldTextContext() {
|
| - this->finish();
|
| SkSafeSetNull(fGammaTexture);
|
| }
|
|
|
| @@ -382,21 +381,21 @@ static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) {
|
| return GrColorPackRGBA(r, g, b, 0xff);
|
| }
|
|
|
| -static void* alloc_vertices(GrDrawTarget* drawTarget, int numVertices, bool useColorVerts) {
|
| +static size_t get_vertex_stride(bool useColorVerts) {
|
| + return useColorVerts ? (2 * sizeof(SkPoint) + sizeof(GrColor)) :
|
| + (2 * sizeof(SkPoint));
|
| +}
|
| +
|
| +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,
|
| + get_vertex_stride(useColorVerts),
|
| 0,
|
| &vertices,
|
| NULL);
|
| @@ -578,7 +577,9 @@ HAS_ATLAS:
|
| if (NULL == fVertices) {
|
| int maxQuadVertices = kVerticesPerGlyph * fContext->getQuadIndexBuffer()->maxQuads();
|
| fAllocVertexCount = SkMin32(fTotalVertexCount, maxQuadVertices);
|
| - fVertices = alloc_vertices(fDrawTarget, fAllocVertexCount, useColorVerts);
|
| + fVertices = alloc_vertices(fDrawTarget,
|
| + fAllocVertexCount,
|
| + useColorVerts);
|
| }
|
|
|
| SkFixed tx = SkIntToFixed(glyph->fAtlasLocation.fX + SK_DistanceFieldInset);
|
| @@ -588,10 +589,7 @@ HAS_ATLAS:
|
|
|
| fVertexBounds.joinNonEmptyArg(glyphRect);
|
|
|
| - size_t vertSize = fUseLCDText ? (2 * sizeof(SkPoint))
|
| - : (2 * sizeof(SkPoint) + sizeof(GrColor));
|
| -
|
| - SkASSERT(vertSize == fDrawTarget->getDrawState().getVertexStride());
|
| + size_t vertSize = get_vertex_stride(useColorVerts);
|
|
|
| SkPoint* positions = reinterpret_cast<SkPoint*>(
|
| reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex);
|
| @@ -607,9 +605,6 @@ HAS_ATLAS:
|
| SkFixedToFloat(texture->texturePriv().normalizeFixedY(ty + th)),
|
| vertSize);
|
| if (useColorVerts) {
|
| - if (0xFF == GrColorUnpackA(fPaint.getColor())) {
|
| - fDrawTarget->drawState()->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
|
| - }
|
| // color comes after position.
|
| GrColor* colors = reinterpret_cast<GrColor*>(positions + 1);
|
| for (int i = 0; i < 4; ++i) {
|
| @@ -623,15 +618,27 @@ HAS_ATLAS:
|
| return true;
|
| }
|
|
|
| +// We use color vertices if we aren't drawing LCD text
|
| +static void set_vertex_attributes(GrDrawState* drawState, bool useColorVerts) {
|
| + // set up attributes
|
| + if (useColorVerts) {
|
| + drawState->setVertexAttribs<gTextVertexWithColorAttribs>(
|
| + SK_ARRAY_COUNT(gTextVertexWithColorAttribs), kTextVAColorSize);
|
| + } else {
|
| + drawState->setVertexAttribs<gTextVertexAttribs>(
|
| + SK_ARRAY_COUNT(gTextVertexAttribs), kTextVASize);
|
| + }
|
| +}
|
| +
|
| void GrDistanceFieldTextContext::flush() {
|
| if (NULL == fDrawTarget) {
|
| return;
|
| }
|
|
|
| - GrDrawState* drawState = fDrawTarget->drawState();
|
| - GrDrawState::AutoRestoreEffects are(drawState);
|
| -
|
| - drawState->setFromPaint(fPaint, fContext->getMatrix(), fContext->getRenderTarget());
|
| + GrDrawState drawState;
|
| + drawState.setFromPaint(fPaint, fContext->getMatrix(), fContext->getRenderTarget());
|
| + bool useColorVerts = !fUseLCDText;
|
| + set_vertex_attributes(&drawState, useColorVerts);
|
|
|
| if (fCurrVertex > 0) {
|
| // setup our sampler state for our text texture/atlas
|
| @@ -648,7 +655,7 @@ void GrDistanceFieldTextContext::flush() {
|
| this->setupCoverageEffect(filteredColor);
|
|
|
| // Effects could be stored with one of the cache objects (atlas?)
|
| - drawState->setGeometryProcessor(fCachedGeometryProcessor.get());
|
| + drawState.setGeometryProcessor(fCachedGeometryProcessor.get());
|
|
|
| // Set draw state
|
| if (fUseLCDText) {
|
| @@ -658,28 +665,34 @@ void GrDistanceFieldTextContext::flush() {
|
| fPaint.numColorStages()) {
|
| SkDebugf("LCD Text will not draw correctly.\n");
|
| }
|
| - SkASSERT(!drawState->hasColorVertexAttribute());
|
| + 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));
|
| + drawState.setColor(SkColorSetARGB(a, a, a, a));
|
| // paintColor
|
| - drawState->setBlendConstant(colorNoPreMul);
|
| - drawState->setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff);
|
| + 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());
|
| + drawState.setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff());
|
| // We're using per-vertex color.
|
| - SkASSERT(drawState->hasColorVertexAttribute());
|
| + SkASSERT(drawState.hasColorVertexAttribute());
|
| }
|
| int nGlyphs = fCurrVertex / kVerticesPerGlyph;
|
| fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer());
|
| - fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType,
|
| + fDrawTarget->drawIndexedInstances(&drawState,
|
| + kTriangles_GrPrimitiveType,
|
| nGlyphs,
|
| - kVerticesPerGlyph, kIndicesPerGlyph, &fVertexBounds);
|
| + kVerticesPerGlyph,
|
| + kIndicesPerGlyph,
|
| + &fVertexBounds);
|
| fDrawTarget->resetVertexSource();
|
| fVertices = NULL;
|
| fTotalVertexCount -= fCurrVertex;
|
|
|