diff options
author | 2015-12-28 07:14:52 -0800 | |
---|---|---|
committer | 2015-12-28 07:14:52 -0800 | |
commit | 90e293dae4990a86cb952663ccde8fae55112d7d (patch) | |
tree | c205b1cf7dc5f0579bf93c382f97df909b57a26e /src/gpu/text/GrAtlasTextContext.cpp | |
parent | 9a878a00ef2c2eb72628c807be5969e2d8098317 (diff) |
Revert of Make draw* lines responsible for cache management (patchset #1 id:1 of https://codereview.chromium.org/1521613002/ )
Reason for revert:
seeing crashes on android and linux
Original issue's description:
> Make draw* lines responsible for cache management
>
> TBR=bsalomon@google.com
> BUG=skia:
>
> Committed: https://skia.googlesource.com/skia/+/66957946c0c418e71c0f36bb2904cc38c334eba4
TBR=bsalomon@google.com,jvanverth@google.com,joshualitt@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Review URL: https://codereview.chromium.org/1552513003
Diffstat (limited to 'src/gpu/text/GrAtlasTextContext.cpp')
-rw-r--r-- | src/gpu/text/GrAtlasTextContext.cpp | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/src/gpu/text/GrAtlasTextContext.cpp b/src/gpu/text/GrAtlasTextContext.cpp index 37cd53d080..3769b0b439 100644 --- a/src/gpu/text/GrAtlasTextContext.cpp +++ b/src/gpu/text/GrAtlasTextContext.cpp @@ -105,6 +105,15 @@ 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, @@ -282,17 +291,18 @@ 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, dfPaint, color, viewMatrix, + this->internalDrawDFText(cacheBlob, run, cache, 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, dfPaint, color, viewMatrix, + this->internalDrawDFPosText(cacheBlob, run, cache, dfPaint, color, viewMatrix, (const char*)it.glyphs(), textLen, it.pos(), 1, dfOffset, textRatio, runPaint); @@ -300,36 +310,40 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob, } case SkTextBlob::kFull_Positioning: { SkPoint dfOffset = SkPoint::Make(x, y); - this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix, + this->internalDrawDFPosText(cacheBlob, run, cache, 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(), - fSurfaceProps, runPaint, color, viewMatrix, + cache, 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(), - fSurfaceProps, runPaint, color, viewMatrix, + cache, 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(), - fSurfaceProps, runPaint, color, viewMatrix, + cache, runPaint, color, viewMatrix, (const char*)it.glyphs(), textLen, it.pos(), 2, SkPoint::Make(x, y)); break; } + SkGlyphCache::AttachCache(cache); } if (drawFilter) { @@ -408,9 +422,14 @@ 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); - GrTextUtils::DrawBmpPosText(blob, runIndex, fContext->getBatchFontCache(), fSurfaceProps, - skPaint, color, viewMatrix, fallbackTxt.begin(), fallbackTxt.count(), + 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(), fallbackPos.begin(), scalarsPerPosition, offset); + SkGlyphCache::AttachCache(cache); } inline GrAtlasTextBlob* @@ -442,15 +461,19 @@ 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, dfPaint, paint.getColor(), viewMatrix, text, + this->internalDrawDFText(blob, 0, cache, dfPaint, paint.getColor(), viewMatrix, text, byteLength, x, y, textRatio, skPaint); + SkGlyphCache::AttachCache(cache); } else { blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize); blob->fViewMatrix = viewMatrix; - GrTextUtils::DrawBmpText(blob, 0, fContext->getBatchFontCache(), fSurfaceProps, skPaint, + SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMatrix, false); + GrTextUtils::DrawBmpText(blob, 0, fContext->getBatchFontCache(), cache, skPaint, paint.getColor(), viewMatrix, text, byteLength, x, y); + SkGlyphCache::AttachCache(cache); } return blob; } @@ -468,16 +491,20 @@ 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, dfPaint, paint.getColor(), viewMatrix, text, + this->internalDrawDFPosText(blob, 0, cache, 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; - GrTextUtils::DrawBmpPosText(blob, 0, fContext->getBatchFontCache(), fSurfaceProps, skPaint, + SkGlyphCache* cache = this->setupCache(&blob->fRuns[0], skPaint, &viewMatrix, false); + GrTextUtils::DrawBmpPosText(blob, 0, fContext->getBatchFontCache(), cache, skPaint, paint.getColor(), viewMatrix, text, byteLength, pos, scalarsPerPosition, offset); + SkGlyphCache::AttachCache(cache); } return blob; } @@ -512,6 +539,7 @@ 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, @@ -577,11 +605,12 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, y -= alignY; SkPoint offset = SkPoint::Make(x, y); - this->internalDrawDFPosText(blob, runIndex, skPaint, color, viewMatrix, text, byteLength, + this->internalDrawDFPosText(blob, runIndex, cache, 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, @@ -604,7 +633,6 @@ 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); @@ -669,7 +697,6 @@ 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); |