Index: src/gpu/batches/GrAtlasTextBatch.cpp |
diff --git a/src/gpu/batches/GrAtlasTextBatch.cpp b/src/gpu/batches/GrAtlasTextBatch.cpp |
index 685cddcf0cb0ad268c9cb76e6d24c0deb71a0efc..b1ec1f8ef5fada21903083d212ebe40f4c670a83 100644 |
--- a/src/gpu/batches/GrAtlasTextBatch.cpp |
+++ b/src/gpu/batches/GrAtlasTextBatch.cpp |
@@ -312,10 +312,12 @@ |
return; |
} |
+ bool usesDistanceFields = this->usesDistanceFields(); |
GrMaskFormat maskFormat = this->maskFormat(); |
+ bool isLCD = this->isLCD(); |
SkAutoTUnref<const GrGeometryProcessor> gp; |
- if (this->usesDistanceFields()) { |
+ if (usesDistanceFields) { |
gp.reset(this->setupDfProcessor(this->viewMatrix(), fFilteredColor, this->color(), |
texture)); |
} else { |
@@ -331,7 +333,9 @@ |
FlushInfo flushInfo; |
flushInfo.fGlyphsToFlush = 0; |
size_t vertexStride = gp->getVertexStride(); |
- SkASSERT(vertexStride == GetVertexStride(maskFormat)); |
+ SkASSERT(vertexStride == (usesDistanceFields ? |
+ GetVertexStrideDf(maskFormat, isLCD) : |
+ GetVertexStride(maskFormat))); |
target->initDraw(gp, this->pipeline()); |
@@ -377,8 +381,12 @@ |
bool regenerateGlyphs = info.strike()->isAbandoned(); |
bool regenerateTextureCoords = info.atlasGeneration() != currentAtlasGen || |
regenerateGlyphs; |
- bool regenerateColors = kARGB_GrMaskFormat != maskFormat && |
- run.fColor != args.fColor; |
+ bool regenerateColors; |
+ if (usesDistanceFields) { |
+ regenerateColors = !isLCD && run.fColor != args.fColor; |
+ } else { |
+ regenerateColors = kA8_GrMaskFormat == maskFormat && run.fColor != args.fColor; |
+ } |
bool regeneratePositions = args.fTransX != 0.f || args.fTransY != 0.f; |
int glyphCount = info.glyphCount(); |
@@ -451,7 +459,9 @@ |
} |
if (!this->usesDistanceFields()) { |
- if (kColorBitmapMask_MaskType == fMaskType && this->color() != that->color()) { |
+ // TODO we can often batch across LCD text if we have dual source blending and don't |
+ // have to use the blend constant |
+ if (kGrayscaleCoverageMask_MaskType != fMaskType && this->color() != that->color()) { |
return false; |
} |
if (this->usesLocalCoords() && !this->viewMatrix().cheapEqualTo(that->viewMatrix())) { |
@@ -467,6 +477,11 @@ |
} |
if (fUseBGR != that->fUseBGR) { |
+ return false; |
+ } |
+ |
+ // TODO see note above |
+ if (kLCDDistanceField_MaskType == fMaskType && this->color() != that->color()) { |
return false; |
} |
} |
@@ -515,7 +530,6 @@ |
flags |= kUseLCD_DistanceFieldEffectFlag; |
flags |= viewMatrix.rectStaysRect() ? kRectToRect_DistanceFieldEffectFlag : 0; |
flags |= fUseBGR ? kBGR_DistanceFieldEffectFlag : 0; |
- flags |= kColorAttr_DistanceFieldEffectFlag; |
GrColor colorNoPreMul = skcolor_to_grcolor_nopremultiply(filteredColor); |