Index: src/gpu/GrAtlasTextContext.cpp |
diff --git a/src/gpu/GrAtlasTextContext.cpp b/src/gpu/GrAtlasTextContext.cpp |
index d7ccce54cf7d5c146497456e9e2eff972b21d1df..615f7091cdbf34ce37a168d619205dc5bfb33561 100644 |
--- a/src/gpu/GrAtlasTextContext.cpp |
+++ b/src/gpu/GrAtlasTextContext.cpp |
@@ -188,99 +188,6 @@ bool GrAtlasTextContext::HasLCD(const SkTextBlob* blob) { |
return false; |
} |
-bool GrAtlasTextContext::MustRegenerateBlob(SkScalar* outTransX, SkScalar* outTransY, |
- const GrAtlasTextBlob& blob, const SkPaint& paint, |
- GrColor color, const SkMaskFilter::BlurRec& blurRec, |
- const SkMatrix& viewMatrix, SkScalar x, SkScalar y) { |
- // If we have LCD text then our canonical color will be set to transparent, in this case we have |
- // to regenerate the blob on any color change |
- // We use the grPaint to get any color filter effects |
- if (blob.fKey.fCanonicalColor == SK_ColorTRANSPARENT && |
- blob.fPaintColor != color) { |
- return true; |
- } |
- |
- if (blob.fViewMatrix.hasPerspective() != viewMatrix.hasPerspective()) { |
- return true; |
- } |
- |
- if (blob.fViewMatrix.hasPerspective() && !blob.fViewMatrix.cheapEqualTo(viewMatrix)) { |
- return true; |
- } |
- |
- // We only cache one masked version |
- if (blob.fKey.fHasBlur && |
- (blob.fBlurRec.fSigma != blurRec.fSigma || |
- blob.fBlurRec.fStyle != blurRec.fStyle || |
- blob.fBlurRec.fQuality != blurRec.fQuality)) { |
- return true; |
- } |
- |
- // Similarly, we only cache one version for each style |
- if (blob.fKey.fStyle != SkPaint::kFill_Style && |
- (blob.fStrokeInfo.fFrameWidth != paint.getStrokeWidth() || |
- blob.fStrokeInfo.fMiterLimit != paint.getStrokeMiter() || |
- blob.fStrokeInfo.fJoin != paint.getStrokeJoin())) { |
- return true; |
- } |
- |
- // Mixed blobs must be regenerated. We could probably figure out a way to do integer scrolls |
- // for mixed blobs if this becomes an issue. |
- if (blob.hasBitmap() && blob.hasDistanceField()) { |
- // Identical viewmatrices and we can reuse in all cases |
- if (blob.fViewMatrix.cheapEqualTo(viewMatrix) && x == blob.fX && y == blob.fY) { |
- return false; |
- } |
- return true; |
- } |
- |
- if (blob.hasBitmap()) { |
- if (blob.fViewMatrix.getScaleX() != viewMatrix.getScaleX() || |
- blob.fViewMatrix.getScaleY() != viewMatrix.getScaleY() || |
- blob.fViewMatrix.getSkewX() != viewMatrix.getSkewX() || |
- blob.fViewMatrix.getSkewY() != viewMatrix.getSkewY()) { |
- return true; |
- } |
- |
- // We can update the positions in the cachedtextblobs without regenerating the whole blob, |
- // but only for integer translations. |
- // This cool bit of math will determine the necessary translation to apply to the already |
- // generated vertex coordinates to move them to the correct position |
- SkScalar transX = viewMatrix.getTranslateX() + |
- viewMatrix.getScaleX() * (x - blob.fX) + |
- viewMatrix.getSkewX() * (y - blob.fY) - |
- blob.fViewMatrix.getTranslateX(); |
- SkScalar transY = viewMatrix.getTranslateY() + |
- viewMatrix.getSkewY() * (x - blob.fX) + |
- viewMatrix.getScaleY() * (y - blob.fY) - |
- blob.fViewMatrix.getTranslateY(); |
- if (!SkScalarIsInt(transX) || !SkScalarIsInt(transY) ) { |
- return true; |
- } |
- |
- (*outTransX) = transX; |
- (*outTransY) = transY; |
- } else if (blob.hasDistanceField()) { |
- // A scale outside of [blob.fMaxMinScale, blob.fMinMaxScale] would result in a different |
- // distance field being generated, so we have to regenerate in those cases |
- SkScalar newMaxScale = viewMatrix.getMaxScale(); |
- SkScalar oldMaxScale = blob.fViewMatrix.getMaxScale(); |
- SkScalar scaleAdjust = newMaxScale / oldMaxScale; |
- if (scaleAdjust < blob.fMaxMinScale || scaleAdjust > blob.fMinMaxScale) { |
- return true; |
- } |
- |
- (*outTransX) = x - blob.fX; |
- (*outTransY) = y - blob.fY; |
- } |
- |
- // It is possible that a blob has neither distanceField nor bitmaptext. This is in the case |
- // when all of the runs inside the blob are drawn as paths. In this case, we always regenerate |
- // the blob anyways at flush time, so no need to regenerate explicitly |
- return false; |
-} |
- |
- |
inline SkGlyphCache* GrAtlasTextContext::setupCache(GrAtlasTextBlob::Run* run, |
const SkPaint& skPaint, |
const SkMatrix* viewMatrix, |
@@ -342,8 +249,8 @@ void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc, |
} |
if (cacheBlob) { |
- if (MustRegenerateBlob(&transX, &transY, *cacheBlob, skPaint, grPaint.getColor(), blurRec, |
- viewMatrix, x, y)) { |
+ if (cacheBlob->mustRegenerate(&transX, &transY, skPaint, grPaint.getColor(), blurRec, |
+ viewMatrix, x, y)) { |
// We have to remake the blob because changes may invalidate our masks. |
// TODO we could probably get away reuse most of the time if the pointer is unique, |
// but we'd have to clear the subrun information |
@@ -353,11 +260,6 @@ void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc, |
this->regenerateTextBlob(cacheBlob, skPaint, grPaint.getColor(), viewMatrix, |
blob, x, y, drawFilter, clip); |
} else { |
- // If we can reuse the blob, then make sure we update the blob's viewmatrix, and x/y |
- // offsets. Note, we offset the vertex bounds right before flushing |
- cacheBlob->fViewMatrix = viewMatrix; |
- cacheBlob->fX = x; |
- cacheBlob->fY = y; |
fCache->makeMRU(cacheBlob); |
#ifdef CACHE_SANITY_CHECK |
{ |