Index: src/gpu/GrBitmapTextContext.cpp |
diff --git a/src/gpu/GrBitmapTextContext.cpp b/src/gpu/GrBitmapTextContext.cpp |
index c9cdf2c23f926430d1d06854808cd095d64c287e..9478d0436ceefc926672f8e6c7e62b50449118fe 100755 |
--- a/src/gpu/GrBitmapTextContext.cpp |
+++ b/src/gpu/GrBitmapTextContext.cpp |
@@ -67,99 +67,13 @@ GrBitmapTextContext::GrBitmapTextContext(GrContext* context, |
} |
GrBitmapTextContext::~GrBitmapTextContext() { |
- this->flushGlyphs(); |
+ this->flush(); |
} |
bool GrBitmapTextContext::canDraw(const SkPaint& paint) { |
return !SkDraw::ShouldDrawTextAsPaths(paint, fContext->getMatrix()); |
} |
-static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) { |
- unsigned r = SkColorGetR(c); |
- unsigned g = SkColorGetG(c); |
- unsigned b = SkColorGetB(c); |
- return GrColorPackRGBA(r, g, b, 0xff); |
-} |
- |
-void GrBitmapTextContext::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(SkIsAlign4(fCurrVertex)); |
- SkASSERT(fCurrTexture); |
- GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kNone_FilterMode); |
- |
- uint32_t textureUniqueID = fCurrTexture->getUniqueID(); |
- |
- if (textureUniqueID != fEffectTextureUniqueID) { |
- fCachedGeometryProcessor.reset(GrCustomCoordsTextureEffect::Create(fCurrTexture, |
- params)); |
- fEffectTextureUniqueID = textureUniqueID; |
- } |
- |
- // This effect could be stored with one of the cache objects (atlas?) |
- drawState->setGeometryProcessor(fCachedGeometryProcessor.get()); |
- SkASSERT(fStrike); |
- switch (fStrike->getMaskFormat()) { |
- // Color bitmap text |
- case kARGB_GrMaskFormat: |
- SkASSERT(!drawState->hasColorVertexAttribute()); |
- drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff()); |
- drawState->setColor(0xffffffff); |
- break; |
- // LCD text |
- case kA888_GrMaskFormat: |
- case kA565_GrMaskFormat: { |
- 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 |
- // mask*paintAlpha*paintColor + (1-mask*paintAlpha)*dstColor |
- int a = SkColorGetA(fSkPaint.getColor()); |
- // paintAlpha |
- drawState->setColor(SkColorSetARGB(a, a, a, a)); |
- // paintColor |
- drawState->setBlendConstant(skcolor_to_grcolor_nopremultiply(fSkPaint.getColor())); |
- drawState->setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff); |
- break; |
- } |
- // Grayscale/BW text |
- case kA8_GrMaskFormat: |
- // set back to normal in case we took LCD path previously. |
- drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff()); |
- // We're using per-vertex color. |
- SkASSERT(drawState->hasColorVertexAttribute()); |
- break; |
- default: |
- SkFAIL("Unexepected mask format."); |
- } |
- int nGlyphs = fCurrVertex / 4; |
- fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); |
- fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType, |
- nGlyphs, |
- 4, 6, &fVertexBounds); |
- |
- fDrawTarget->resetVertexSource(); |
- fVertices = NULL; |
- fMaxVertices = 0; |
- fCurrVertex = 0; |
- fVertexBounds.setLargestInverted(); |
- SkSafeSetNull(fCurrTexture); |
- } |
-} |
- |
inline void GrBitmapTextContext::init(const GrPaint& paint, const SkPaint& skPaint) { |
GrTextContext::init(paint, skPaint); |
@@ -172,12 +86,6 @@ inline void GrBitmapTextContext::init(const GrPaint& paint, const SkPaint& skPai |
fMaxVertices = 0; |
} |
-inline void GrBitmapTextContext::finish() { |
- this->flushGlyphs(); |
- |
- GrTextContext::finish(); |
-} |
- |
void GrBitmapTextContext::drawText(const GrPaint& paint, const SkPaint& skPaint, |
const char text[], size_t byteLength, |
SkScalar x, SkScalar y) { |
@@ -254,12 +162,12 @@ void GrBitmapTextContext::drawText(const GrPaint& paint, const SkPaint& skPaint, |
fx += autokern.adjust(glyph); |
if (glyph.fWidth) { |
- this->drawPackedGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
- glyph.getSubXFixed(), |
- glyph.getSubYFixed()), |
- SkFixedFloorToFixed(fx), |
- SkFixedFloorToFixed(fy), |
- fontScaler); |
+ this->appendGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
+ glyph.getSubXFixed(), |
+ glyph.getSubYFixed()), |
+ SkFixedFloorToFixed(fx), |
+ SkFixedFloorToFixed(fy), |
+ fontScaler); |
} |
fx += glyph.fAdvanceX; |
@@ -328,12 +236,12 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai |
fx & fxMask, fy & fyMask); |
if (glyph.fWidth) { |
- this->drawPackedGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
- glyph.getSubXFixed(), |
- glyph.getSubYFixed()), |
- SkFixedFloorToFixed(fx), |
- SkFixedFloorToFixed(fy), |
- fontScaler); |
+ this->appendGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
+ glyph.getSubXFixed(), |
+ glyph.getSubYFixed()), |
+ SkFixedFloorToFixed(fx), |
+ SkFixedFloorToFixed(fy), |
+ fontScaler); |
} |
pos += scalarsPerPosition; |
} |
@@ -361,12 +269,12 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai |
SkASSERT(prevAdvY == glyph.fAdvanceY); |
SkASSERT(glyph.fWidth); |
- this->drawPackedGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
- glyph.getSubXFixed(), |
- glyph.getSubYFixed()), |
- SkFixedFloorToFixed(fx), |
- SkFixedFloorToFixed(fy), |
- fontScaler); |
+ this->appendGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
+ glyph.getSubXFixed(), |
+ glyph.getSubYFixed()), |
+ SkFixedFloorToFixed(fx), |
+ SkFixedFloorToFixed(fy), |
+ fontScaler); |
} |
pos += scalarsPerPosition; |
} |
@@ -384,12 +292,12 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai |
SkFixed fx = SkScalarToFixed(tmsLoc.fX) + SK_FixedHalf; //halfSampleX; |
SkFixed fy = SkScalarToFixed(tmsLoc.fY) + SK_FixedHalf; //halfSampleY; |
- this->drawPackedGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
- glyph.getSubXFixed(), |
- glyph.getSubYFixed()), |
- SkFixedFloorToFixed(fx), |
- SkFixedFloorToFixed(fy), |
- fontScaler); |
+ this->appendGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
+ glyph.getSubXFixed(), |
+ glyph.getSubYFixed()), |
+ SkFixedFloorToFixed(fx), |
+ SkFixedFloorToFixed(fy), |
+ fontScaler); |
} |
pos += scalarsPerPosition; |
} |
@@ -407,12 +315,12 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai |
SkFixed fx = fixedLoc.fX + SK_FixedHalf; //halfSampleX; |
SkFixed fy = fixedLoc.fY + SK_FixedHalf; //halfSampleY; |
- this->drawPackedGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
- glyph.getSubXFixed(), |
- glyph.getSubYFixed()), |
- SkFixedFloorToFixed(fx), |
- SkFixedFloorToFixed(fy), |
- fontScaler); |
+ this->appendGlyph(GrGlyph::Pack(glyph.getGlyphID(), |
+ glyph.getSubXFixed(), |
+ glyph.getSubYFixed()), |
+ SkFixedFloorToFixed(fx), |
+ SkFixedFloorToFixed(fy), |
+ fontScaler); |
} |
pos += scalarsPerPosition; |
} |
@@ -422,9 +330,9 @@ void GrBitmapTextContext::drawPosText(const GrPaint& paint, const SkPaint& skPai |
this->finish(); |
} |
-void GrBitmapTextContext::drawPackedGlyph(GrGlyph::PackedID packed, |
- SkFixed vx, SkFixed vy, |
- GrFontScaler* scaler) { |
+void GrBitmapTextContext::appendGlyph(GrGlyph::PackedID packed, |
+ SkFixed vx, SkFixed vy, |
+ GrFontScaler* scaler) { |
if (NULL == fDrawTarget) { |
return; |
} |
@@ -474,7 +382,7 @@ void GrBitmapTextContext::drawPackedGlyph(GrGlyph::PackedID packed, |
} |
// flush any accumulated draws to allow us to free up a plot |
- this->flushGlyphs(); |
+ this->flush(); |
fContext->flush(); |
// we should have an unused plot now |
@@ -518,7 +426,7 @@ HAS_ATLAS: |
SkASSERT(texture); |
if (fCurrTexture != texture || fCurrVertex + 4 > fMaxVertices) { |
- this->flushGlyphs(); |
+ this->flush(); |
fCurrTexture = texture; |
fCurrTexture->ref(); |
} |
@@ -538,7 +446,7 @@ HAS_ATLAS: |
} |
bool flush = fDrawTarget->geometryHints(&fMaxVertices, NULL); |
if (flush) { |
- this->flushGlyphs(); |
+ this->flush(); |
fContext->flush(); |
if (useColorVerts) { |
fDrawTarget->drawState()->setVertexAttribs<gTextVertexWithColorAttribs>( |
@@ -607,3 +515,96 @@ HAS_ATLAS: |
} |
fCurrVertex += 4; |
} |
+ |
+static inline GrColor skcolor_to_grcolor_nopremultiply(SkColor c) { |
+ unsigned r = SkColorGetR(c); |
+ unsigned g = SkColorGetG(c); |
+ unsigned b = SkColorGetB(c); |
+ return GrColorPackRGBA(r, g, b, 0xff); |
+} |
+ |
+void GrBitmapTextContext::flush() { |
+ 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(SkIsAlign4(fCurrVertex)); |
+ SkASSERT(fCurrTexture); |
+ GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kNone_FilterMode); |
+ |
+ uint32_t textureUniqueID = fCurrTexture->getUniqueID(); |
+ |
+ if (textureUniqueID != fEffectTextureUniqueID) { |
+ fCachedGeometryProcessor.reset(GrCustomCoordsTextureEffect::Create(fCurrTexture, |
+ params)); |
+ fEffectTextureUniqueID = textureUniqueID; |
+ } |
+ |
+ // This effect could be stored with one of the cache objects (atlas?) |
+ drawState->setGeometryProcessor(fCachedGeometryProcessor.get()); |
+ SkASSERT(fStrike); |
+ switch (fStrike->getMaskFormat()) { |
+ // Color bitmap text |
+ case kARGB_GrMaskFormat: |
+ SkASSERT(!drawState->hasColorVertexAttribute()); |
+ drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff()); |
+ drawState->setColor(0xffffffff); |
+ break; |
+ // LCD text |
+ case kA888_GrMaskFormat: |
+ case kA565_GrMaskFormat: { |
+ 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 |
+ // mask*paintAlpha*paintColor + (1-mask*paintAlpha)*dstColor |
+ int a = SkColorGetA(fSkPaint.getColor()); |
+ // paintAlpha |
+ drawState->setColor(SkColorSetARGB(a, a, a, a)); |
+ // paintColor |
+ drawState->setBlendConstant(skcolor_to_grcolor_nopremultiply(fSkPaint.getColor())); |
+ drawState->setBlendFunc(kConstC_GrBlendCoeff, kISC_GrBlendCoeff); |
+ break; |
+ } |
+ // Grayscale/BW text |
+ case kA8_GrMaskFormat: |
+ // set back to normal in case we took LCD path previously. |
+ drawState->setBlendFunc(fPaint.getSrcBlendCoeff(), fPaint.getDstBlendCoeff()); |
+ // We're using per-vertex color. |
+ SkASSERT(drawState->hasColorVertexAttribute()); |
+ break; |
+ default: |
+ SkFAIL("Unexepected mask format."); |
+ } |
+ int nGlyphs = fCurrVertex / 4; |
+ fDrawTarget->setIndexSourceToBuffer(fContext->getQuadIndexBuffer()); |
+ fDrawTarget->drawIndexedInstances(kTriangles_GrPrimitiveType, |
+ nGlyphs, |
+ 4, 6, &fVertexBounds); |
+ |
+ fDrawTarget->resetVertexSource(); |
+ fVertices = NULL; |
+ fMaxVertices = 0; |
+ fCurrVertex = 0; |
+ fVertexBounds.setLargestInverted(); |
+ SkSafeSetNull(fCurrTexture); |
+ } |
+} |
+ |
+inline void GrBitmapTextContext::finish() { |
+ this->flush(); |
+ |
+ GrTextContext::finish(); |
+} |
+ |