| Index: src/gpu/text/GrAtlasTextContext.cpp | 
| diff --git a/src/gpu/text/GrAtlasTextContext.cpp b/src/gpu/text/GrAtlasTextContext.cpp | 
| index 3769b0b439b0af840a4f11948d5930673321bf02..37cd53d08061bc51e8c82e36c29cf9126fd58b70 100644 | 
| --- a/src/gpu/text/GrAtlasTextContext.cpp | 
| +++ b/src/gpu/text/GrAtlasTextContext.cpp | 
| @@ -105,15 +105,6 @@ bool GrAtlasTextContext::HasLCD(const SkTextBlob* blob) { | 
| return false; | 
| } | 
|  | 
| -inline SkGlyphCache* GrAtlasTextContext::setupCache(GrAtlasTextBlob::Run* run, | 
| -                                                    const SkPaint& skPaint, | 
| -                                                    const SkMatrix* viewMatrix, | 
| -                                                    bool noGamma) { | 
| -    skPaint.getScalerContextDescriptor(&run->fDescriptor, fSurfaceProps, viewMatrix, noGamma); | 
| -    run->fTypeface.reset(SkSafeRef(skPaint.getTypeface())); | 
| -    return SkGlyphCache::DetachCache(run->fTypeface, run->fDescriptor.getDesc()); | 
| -} | 
| - | 
| void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc, | 
| const GrClip& clip, const SkPaint& skPaint, | 
| const SkMatrix& viewMatrix, const SkTextBlob* blob, | 
| @@ -291,18 +282,17 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob, | 
| PerSubRunInfo& subRun = runIdx.fSubRunInfo.back(); | 
| subRun.setUseLCDText(runPaint.isLCDRenderText()); | 
| subRun.setDrawAsDistanceFields(); | 
| -            SkGlyphCache* cache = this->setupCache(&cacheBlob->fRuns[run], dfPaint, nullptr, true); | 
|  | 
| switch (it.positioning()) { | 
| case SkTextBlob::kDefault_Positioning: { | 
| -                    this->internalDrawDFText(cacheBlob, run, cache, dfPaint, color, viewMatrix, | 
| +                    this->internalDrawDFText(cacheBlob, run, dfPaint, color, viewMatrix, | 
| (const char *)it.glyphs(), textLen, | 
| x + offset.x(), y + offset.y(), textRatio, runPaint); | 
| break; | 
| } | 
| case SkTextBlob::kHorizontal_Positioning: { | 
| SkPoint dfOffset = SkPoint::Make(x, y + offset.y()); | 
| -                    this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint, color, viewMatrix, | 
| +                    this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix, | 
| (const char*)it.glyphs(), textLen, it.pos(), | 
| 1, dfOffset, textRatio, | 
| runPaint); | 
| @@ -310,40 +300,36 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob, | 
| } | 
| case SkTextBlob::kFull_Positioning: { | 
| SkPoint dfOffset = SkPoint::Make(x, y); | 
| -                    this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint, color, viewMatrix, | 
| +                    this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix, | 
| (const char*)it.glyphs(), textLen, it.pos(), | 
| 2, dfOffset, textRatio, runPaint); | 
| break; | 
| } | 
| } | 
| -            SkGlyphCache::AttachCache(cache); | 
| } else if (SkDraw::ShouldDrawTextAsPaths(runPaint, viewMatrix)) { | 
| cacheBlob->fRuns[run].fDrawAsPaths = true; | 
| } else { | 
| cacheBlob->setHasBitmap(); | 
| -            SkGlyphCache* cache = this->setupCache(&cacheBlob->fRuns[run], runPaint, &viewMatrix, | 
| -                                                   false); | 
| switch (it.positioning()) { | 
| case SkTextBlob::kDefault_Positioning: | 
| GrTextUtils::DrawBmpText(cacheBlob, run, fContext->getBatchFontCache(), | 
| -                                             cache, runPaint, color, viewMatrix, | 
| +                                             fSurfaceProps, runPaint, color, viewMatrix, | 
| (const char *)it.glyphs(), textLen, | 
| x + offset.x(), y + offset.y()); | 
| break; | 
| case SkTextBlob::kHorizontal_Positioning: | 
| GrTextUtils::DrawBmpPosText(cacheBlob, run, fContext->getBatchFontCache(), | 
| -                                                cache, runPaint, color, viewMatrix, | 
| +                                                fSurfaceProps, runPaint, color, viewMatrix, | 
| (const char*)it.glyphs(), textLen, it.pos(), 1, | 
| SkPoint::Make(x, y + offset.y())); | 
| break; | 
| case SkTextBlob::kFull_Positioning: | 
| GrTextUtils::DrawBmpPosText(cacheBlob, run, fContext->getBatchFontCache(), | 
| -                                                cache, runPaint, color, viewMatrix, | 
| +                                                fSurfaceProps, runPaint, color, viewMatrix, | 
| (const char*)it.glyphs(), textLen, it.pos(), 2, | 
| SkPoint::Make(x, y)); | 
| break; | 
| } | 
| -            SkGlyphCache::AttachCache(cache); | 
| } | 
|  | 
| if (drawFilter) { | 
| @@ -422,14 +408,9 @@ inline void GrAtlasTextContext::fallbackDrawPosText(GrAtlasTextBlob* blob, | 
| // Push back a new subrun to fill and set the override descriptor | 
| run.push_back(); | 
| run.fOverrideDescriptor.reset(new SkAutoDescriptor); | 
| -    skPaint.getScalerContextDescriptor(run.fOverrideDescriptor, | 
| -                                       fSurfaceProps, &viewMatrix, false); | 
| -    SkGlyphCache* cache = SkGlyphCache::DetachCache(run.fTypeface, | 
| -                                                    run.fOverrideDescriptor->getDesc()); | 
| -    GrTextUtils::DrawBmpPosText(blob, runIndex, fContext->getBatchFontCache(), cache, skPaint, | 
| -                                color, viewMatrix, fallbackTxt.begin(), fallbackTxt.count(), | 
| +    GrTextUtils::DrawBmpPosText(blob, runIndex, fContext->getBatchFontCache(), fSurfaceProps, | 
| +                                skPaint, color, viewMatrix, fallbackTxt.begin(), fallbackTxt.count(), | 
| fallbackPos.begin(), scalarsPerPosition, offset); | 
| -    SkGlyphCache::AttachCache(cache); | 
| } | 
|  | 
| inline GrAtlasTextBlob* | 
| @@ -461,19 +442,15 @@ GrAtlasTextContext::createDrawTextBlob(const GrPaint& paint, const SkPaint& skPa | 
| SkPaint dfPaint; | 
| SkScalar textRatio; | 
| blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &textRatio); | 
| -        SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], dfPaint, nullptr, true); | 
|  | 
| -        this->internalDrawDFText(blob, 0, cache, dfPaint, paint.getColor(), viewMatrix, text, | 
| +        this->internalDrawDFText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text, | 
| byteLength, x, y, textRatio, skPaint); | 
| -        SkGlyphCache::AttachCache(cache); | 
| } else { | 
| blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize); | 
| blob->fViewMatrix = viewMatrix; | 
|  | 
| -        SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMatrix, false); | 
| -        GrTextUtils::DrawBmpText(blob, 0, fContext->getBatchFontCache(), cache, skPaint, | 
| +        GrTextUtils::DrawBmpText(blob, 0, fContext->getBatchFontCache(), fSurfaceProps, skPaint, | 
| paint.getColor(), viewMatrix, text, byteLength, x, y); | 
| -        SkGlyphCache::AttachCache(cache); | 
| } | 
| return blob; | 
| } | 
| @@ -491,20 +468,16 @@ GrAtlasTextContext::createDrawPosTextBlob(const GrPaint& paint, const SkPaint& s | 
| SkPaint dfPaint; | 
| SkScalar textRatio; | 
| blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &textRatio); | 
| -        SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], dfPaint, nullptr, true); | 
|  | 
| -        this->internalDrawDFPosText(blob, 0, cache, dfPaint, paint.getColor(), viewMatrix, text, | 
| +        this->internalDrawDFPosText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text, | 
| byteLength, pos, scalarsPerPosition, offset, textRatio, | 
| skPaint); | 
| -        SkGlyphCache::AttachCache(cache); | 
| } else { | 
| blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize); | 
| blob->fViewMatrix = viewMatrix; | 
| -        SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMatrix, false); | 
| -        GrTextUtils::DrawBmpPosText(blob, 0, fContext->getBatchFontCache(), cache, skPaint, | 
| +        GrTextUtils::DrawBmpPosText(blob, 0, fContext->getBatchFontCache(), fSurfaceProps, skPaint, | 
| paint.getColor(), viewMatrix, text, | 
| byteLength, pos, scalarsPerPosition, offset); | 
| -        SkGlyphCache::AttachCache(cache); | 
| } | 
| return blob; | 
| } | 
| @@ -539,7 +512,6 @@ void GrAtlasTextContext::onDrawPosText(GrDrawContext* dc, | 
| } | 
|  | 
| void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, | 
| -                                            SkGlyphCache* cache, | 
| const SkPaint& skPaint, GrColor color, | 
| const SkMatrix& viewMatrix, | 
| const char text[], size_t byteLength, | 
| @@ -605,12 +577,11 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, | 
| y -= alignY; | 
| SkPoint offset = SkPoint::Make(x, y); | 
|  | 
| -    this->internalDrawDFPosText(blob, runIndex, cache, skPaint, color, viewMatrix, text, byteLength, | 
| +    this->internalDrawDFPosText(blob, runIndex, skPaint, color, viewMatrix, text, byteLength, | 
| positions.begin(), 2, offset, textRatio, origPaint); | 
| } | 
|  | 
| void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runIndex, | 
| -                                               SkGlyphCache* cache, | 
| const SkPaint& skPaint, | 
| GrColor color, | 
| const SkMatrix& viewMatrix, | 
| @@ -633,6 +604,7 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd | 
|  | 
| fCurrStrike = nullptr; | 
|  | 
| +    SkGlyphCache* cache = blob->setupCache(runIndex, fSurfaceProps, skPaint, nullptr, true); | 
| SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc(); | 
| GrFontScaler* fontScaler = GetGrFontScaler(cache); | 
|  | 
| @@ -697,6 +669,7 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd | 
| } | 
| } | 
|  | 
| +    SkGlyphCache::AttachCache(cache); | 
| if (fallbackTxt.count()) { | 
| this->fallbackDrawPosText(blob, runIndex, origPaint.getColor(), origPaint, viewMatrix, | 
| fallbackTxt, fallbackPos, scalarsPerPosition, offset); | 
|  |