Index: src/gpu/GrBitmapTextContext.cpp |
diff --git a/src/gpu/GrBitmapTextContext.cpp b/src/gpu/GrBitmapTextContext.cpp |
index 50fe9ca13301beb7af7d6a5609160d5b2613249a..f22b7608a6796d711a82f93bdfe09004663af4f7 100755 |
--- a/src/gpu/GrBitmapTextContext.cpp |
+++ b/src/gpu/GrBitmapTextContext.cpp |
@@ -80,10 +80,6 @@ GrBitmapTextContext* GrBitmapTextContext::Create(GrContext* context, |
return SkNEW_ARGS(GrBitmapTextContext, (context, props)); |
} |
-GrBitmapTextContext::~GrBitmapTextContext() { |
- this->finish(); |
-} |
- |
bool GrBitmapTextContext::canDraw(const SkPaint& paint) { |
return !SkDraw::ShouldDrawTextAsPaths(paint, fContext->getMatrix()); |
} |
@@ -102,8 +98,8 @@ inline void GrBitmapTextContext::init(const GrPaint& paint, const SkPaint& skPai |
} |
void GrBitmapTextContext::onDrawText(const GrPaint& paint, const SkPaint& skPaint, |
- const char text[], size_t byteLength, |
- SkScalar x, SkScalar y) { |
+ const char text[], size_t byteLength, |
+ SkScalar x, SkScalar y) { |
SkASSERT(byteLength == 0 || text != NULL); |
// nothing to draw |
@@ -196,9 +192,9 @@ void GrBitmapTextContext::onDrawText(const GrPaint& paint, const SkPaint& skPain |
} |
void GrBitmapTextContext::onDrawPosText(const GrPaint& paint, const SkPaint& skPaint, |
- const char text[], size_t byteLength, |
- const SkScalar pos[], int scalarsPerPosition, |
- const SkPoint& offset) { |
+ const char text[], size_t byteLength, |
+ const SkScalar pos[], int scalarsPerPosition, |
+ const SkPoint& offset) { |
SkASSERT(byteLength == 0 || text != NULL); |
SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); |
@@ -347,24 +343,41 @@ void GrBitmapTextContext::onDrawPosText(const GrPaint& paint, const SkPaint& skP |
this->finish(); |
} |
-static void* alloc_vertices(GrDrawTarget* drawTarget, int numVertices, GrMaskFormat maskFormat) { |
- if (numVertices <= 0) { |
- return NULL; |
+static size_t get_vertex_stride(GrMaskFormat maskFormat) { |
+ switch (maskFormat) { |
+ case kA8_GrMaskFormat: |
+ return kGrayTextVASize; |
+ case kARGB_GrMaskFormat: |
+ return kColorTextVASize; |
+ default: |
+ return kLCDTextVASize; |
} |
+} |
- // set up attributes |
+static void set_vertex_attributes(GrDrawState* drawState, GrMaskFormat maskFormat) { |
if (kA8_GrMaskFormat == maskFormat) { |
- drawTarget->drawState()->setVertexAttribs<gGrayVertexAttribs>( |
+ drawState->setVertexAttribs<gGrayVertexAttribs>( |
SK_ARRAY_COUNT(gGrayVertexAttribs), kGrayTextVASize); |
} else if (kARGB_GrMaskFormat == maskFormat) { |
- GrDefaultGeoProcFactory::SetAttribs(drawTarget->drawState(), |
+ GrDefaultGeoProcFactory::SetAttribs(drawState, |
GrDefaultGeoProcFactory::kLocalCoord_GPType); |
} else { |
- drawTarget->drawState()->setVertexAttribs<gLCDVertexAttribs>( |
+ drawState->setVertexAttribs<gLCDVertexAttribs>( |
SK_ARRAY_COUNT(gLCDVertexAttribs), kLCDTextVASize); |
} |
+} |
+ |
+static void* alloc_vertices(GrDrawTarget* drawTarget, |
+ int numVertices, |
+ GrMaskFormat maskFormat) { |
+ if (numVertices <= 0) { |
+ return NULL; |
+ } |
+ |
+ // set up attributes |
void* vertices = NULL; |
bool success = drawTarget->reserveVertexAndIndexSpace(numVertices, |
+ get_vertex_stride(maskFormat), |
0, |
&vertices, |
NULL); |
@@ -498,18 +511,7 @@ HAS_ATLAS: |
fVertexBounds.joinNonEmptyArg(r); |
- size_t vertSize; |
- switch (fCurrMaskFormat) { |
- case kA8_GrMaskFormat: |
- vertSize = kGrayTextVASize; |
- break; |
- case kARGB_GrMaskFormat: |
- vertSize = kColorTextVASize; |
- default: |
- vertSize = kLCDTextVASize; |
- } |
- |
- SkASSERT(vertSize == fDrawTarget->getDrawState().getVertexStride()); |
+ size_t vertSize = get_vertex_stride(fCurrMaskFormat); |
SkPoint* positions = reinterpret_cast<SkPoint*>( |
reinterpret_cast<intptr_t>(fVertices) + vertSize * fCurrVertex); |
@@ -524,9 +526,6 @@ HAS_ATLAS: |
SkFixedToFloat(texture->texturePriv().normalizeFixedY(ty + height)), |
vertSize); |
if (kA8_GrMaskFormat == fCurrMaskFormat) { |
- 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) { |
@@ -549,9 +548,10 @@ void GrBitmapTextContext::flush() { |
return; |
} |
- GrDrawState* drawState = fDrawTarget->drawState(); |
- GrDrawState::AutoRestoreEffects are(drawState); |
- drawState->setFromPaint(fPaint, SkMatrix::I(), fContext->getRenderTarget()); |
+ GrDrawState drawState; |
+ drawState.setFromPaint(fPaint, SkMatrix::I(), fContext->getRenderTarget()); |
+ |
+ set_vertex_attributes(&drawState, fCurrMaskFormat); |
if (fCurrVertex > 0) { |
// setup our sampler state for our text texture/atlas |
@@ -561,11 +561,11 @@ void GrBitmapTextContext::flush() { |
// This effect could be stored with one of the cache objects (atlas?) |
if (kARGB_GrMaskFormat == fCurrMaskFormat) { |
- drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(true))->unref(); |
+ drawState.setGeometryProcessor(GrDefaultGeoProcFactory::Create(true))->unref(); |
GrFragmentProcessor* fragProcessor = GrSimpleTextureEffect::Create(fCurrTexture, |
SkMatrix::I(), |
params); |
- drawState->addColorProcessor(fragProcessor)->unref(); |
+ drawState.addColorProcessor(fragProcessor)->unref(); |
} else { |
uint32_t textureUniqueID = fCurrTexture->getUniqueID(); |
if (textureUniqueID != fEffectTextureUniqueID) { |
@@ -574,16 +574,16 @@ void GrBitmapTextContext::flush() { |
fEffectTextureUniqueID = textureUniqueID; |
} |
- drawState->setGeometryProcessor(fCachedGeometryProcessor.get()); |
+ drawState.setGeometryProcessor(fCachedGeometryProcessor.get()); |
} |
SkASSERT(fStrike); |
switch (fCurrMaskFormat) { |
// Color bitmap text |
case kARGB_GrMaskFormat: |
- SkASSERT(!drawState->hasColorVertexAttribute()); |
- drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff()); |
- drawState->setAlpha(fSkPaint.getAlpha()); |
+ SkASSERT(!drawState.hasColorVertexAttribute()); |
+ drawState.setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff()); |
+ drawState.setAlpha(fSkPaint.getAlpha()); |
break; |
// LCD text |
case kA565_GrMaskFormat: { |
@@ -592,34 +592,39 @@ void GrBitmapTextContext::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(skcolor_to_grcolor_nopremultiply(fSkPaint.getColor())); |
- drawState->setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff); |
+ drawState.setBlendConstant(skcolor_to_grcolor_nopremultiply(fSkPaint.getColor())); |
+ drawState.setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff); |
break; |
} |
// Grayscale/BW text |
case kA8_GrMaskFormat: |
+ drawState.setHint(GrDrawState::kVertexColorsAreOpaque_Hint, |
+ 0xFF == GrColorUnpackA(fPaint.getColor())); |
// 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()); |
break; |
default: |
SkFAIL("Unexpected mask format."); |
} |
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; |