diff options
author | joshualitt <joshualitt@chromium.org> | 2016-01-19 06:59:29 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-19 06:59:29 -0800 |
commit | a6bf4c54aaa3c1d1ae33f43af96a294c65bbd8fc (patch) | |
tree | f9d55c1b3f7cec93ad1853add3d6f3be462b14eb /src/gpu/text/GrAtlasTextContext.cpp | |
parent | 973d92cf91b21013361209e8a5c0c4685728847f (diff) |
This CL moves a bit more logic into GrAtlasTextBlob
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1516943004
Review URL: https://codereview.chromium.org/1516943004
Diffstat (limited to 'src/gpu/text/GrAtlasTextContext.cpp')
-rw-r--r-- | src/gpu/text/GrAtlasTextContext.cpp | 119 |
1 files changed, 41 insertions, 78 deletions
diff --git a/src/gpu/text/GrAtlasTextContext.cpp b/src/gpu/text/GrAtlasTextContext.cpp index 37cd53d080..b6971f0ccd 100644 --- a/src/gpu/text/GrAtlasTextContext.cpp +++ b/src/gpu/text/GrAtlasTextContext.cpp @@ -166,7 +166,7 @@ void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc, cacheBlob.reset(SkRef(fCache->createCachedBlob(blob, key, blurRec, skPaint, GrAtlasTextBlob::kGrayTextVASize))); this->regenerateTextBlob(cacheBlob, skPaint, grPaint.getColor(), viewMatrix, - blob, x, y, drawFilter, clip); + blob, x, y, drawFilter); } else { fCache->makeMRU(cacheBlob); #ifdef CACHE_SANITY_CHECK @@ -178,7 +178,7 @@ void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc, kGrayTextVASize)); GrTextBlobCache::SetupCacheBlobKey(sanityBlob, key, blurRec, skPaint); this->regenerateTextBlob(sanityBlob, skPaint, grPaint.getColor(), viewMatrix, - blob, x, y, drawFilter, clip); + blob, x, y, drawFilter); GrAtlasTextBlob::AssertEqual(*sanityBlob, *cacheBlob); } @@ -192,7 +192,7 @@ void GrAtlasTextContext::drawTextBlob(GrDrawContext* dc, cacheBlob.reset(fCache->createBlob(blob, GrAtlasTextBlob::kGrayTextVASize)); } this->regenerateTextBlob(cacheBlob, skPaint, grPaint.getColor(), viewMatrix, - blob, x, y, drawFilter, clip); + blob, x, y, drawFilter); } cacheBlob->flushCached(fContext, dc, blob, fSurfaceProps, fDistanceAdjustTable, skPaint, @@ -242,8 +242,7 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob, const SkPaint& skPaint, GrColor color, const SkMatrix& viewMatrix, const SkTextBlob* blob, SkScalar x, SkScalar y, - SkDrawFilter* drawFilter, - const GrClip& clip) { + SkDrawFilter* drawFilter) { // The color here is the GrPaint color, and it is used to determine whether we // have to regenerate LCD text blobs. // We use this color vs the SkPaint color because it has the colorfilter applied. @@ -274,42 +273,31 @@ void GrAtlasTextContext::regenerateTextBlob(GrAtlasTextBlob* cacheBlob, cacheBlob->push_back_run(run); if (this->canDrawAsDistanceFields(runPaint, viewMatrix)) { - cacheBlob->setHasDistanceField(); - SkPaint dfPaint = runPaint; - SkScalar textRatio; - this->initDistanceFieldPaint(cacheBlob, &dfPaint, &textRatio, viewMatrix); - Run& runIdx = cacheBlob->fRuns[run]; - PerSubRunInfo& subRun = runIdx.fSubRunInfo.back(); - subRun.setUseLCDText(runPaint.isLCDRenderText()); - subRun.setDrawAsDistanceFields(); - switch (it.positioning()) { case SkTextBlob::kDefault_Positioning: { - this->internalDrawDFText(cacheBlob, run, dfPaint, color, viewMatrix, + this->internalDrawDFText(cacheBlob, run, runPaint, color, viewMatrix, (const char *)it.glyphs(), textLen, - x + offset.x(), y + offset.y(), textRatio, runPaint); + x + offset.x(), y + offset.y()); break; } case SkTextBlob::kHorizontal_Positioning: { SkPoint dfOffset = SkPoint::Make(x, y + offset.y()); - this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix, + this->internalDrawDFPosText(cacheBlob, run, runPaint, color, viewMatrix, (const char*)it.glyphs(), textLen, it.pos(), - 1, dfOffset, textRatio, - runPaint); + 1, dfOffset); break; } case SkTextBlob::kFull_Positioning: { SkPoint dfOffset = SkPoint::Make(x, y); - this->internalDrawDFPosText(cacheBlob, run, dfPaint, color, viewMatrix, + this->internalDrawDFPosText(cacheBlob, run, runPaint, color, viewMatrix, (const char*)it.glyphs(), textLen, it.pos(), - 2, dfOffset, textRatio, runPaint); + 2, dfOffset); break; } } } else if (SkDraw::ShouldDrawTextAsPaths(runPaint, viewMatrix)) { cacheBlob->fRuns[run].fDrawAsPaths = true; } else { - cacheBlob->setHasBitmap(); switch (it.positioning()) { case SkTextBlob::kDefault_Positioning: GrTextUtils::DrawBmpText(cacheBlob, run, fContext->getBatchFontCache(), @@ -403,7 +391,6 @@ inline void GrAtlasTextContext::fallbackDrawPosText(GrAtlasTextBlob* blob, int scalarsPerPosition, const SkPoint& offset) { SkASSERT(fallbackTxt.count()); - blob->setHasBitmap(); Run& run = blob->fRuns[runIndex]; // Push back a new subrun to fill and set the override descriptor run.push_back(); @@ -414,41 +401,19 @@ inline void GrAtlasTextContext::fallbackDrawPosText(GrAtlasTextBlob* blob, } inline GrAtlasTextBlob* -GrAtlasTextContext::setupDFBlob(int glyphCount, const SkPaint& origPaint, - const SkMatrix& viewMatrix, SkPaint* dfPaint, - SkScalar* textRatio) { - GrAtlasTextBlob* blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize); - - *dfPaint = origPaint; - this->initDistanceFieldPaint(blob, dfPaint, textRatio, viewMatrix); - blob->fViewMatrix = viewMatrix; - Run& run = blob->fRuns[0]; - PerSubRunInfo& subRun = run.fSubRunInfo.back(); - subRun.setUseLCDText(origPaint.isLCDRenderText()); - subRun.setDrawAsDistanceFields(); - - return blob; -} - -inline GrAtlasTextBlob* GrAtlasTextContext::createDrawTextBlob(const GrPaint& paint, const SkPaint& skPaint, const SkMatrix& viewMatrix, const char text[], size_t byteLength, SkScalar x, SkScalar y) { int glyphCount = skPaint.countText(text, byteLength); - GrAtlasTextBlob* blob; - if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { - SkPaint dfPaint; - SkScalar textRatio; - blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &textRatio); + GrAtlasTextBlob* blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize); + blob->fViewMatrix = viewMatrix; - this->internalDrawDFText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text, - byteLength, x, y, textRatio, skPaint); + if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { + this->internalDrawDFText(blob, 0, skPaint, paint.getColor(), viewMatrix, text, + byteLength, x, y); } else { - blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize); - blob->fViewMatrix = viewMatrix; - GrTextUtils::DrawBmpText(blob, 0, fContext->getBatchFontCache(), fSurfaceProps, skPaint, paint.getColor(), viewMatrix, text, byteLength, x, y); } @@ -463,18 +428,13 @@ GrAtlasTextContext::createDrawPosTextBlob(const GrPaint& paint, const SkPaint& s const SkPoint& offset) { int glyphCount = skPaint.countText(text, byteLength); - GrAtlasTextBlob* blob; - if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { - SkPaint dfPaint; - SkScalar textRatio; - blob = this->setupDFBlob(glyphCount, skPaint, viewMatrix, &dfPaint, &textRatio); + GrAtlasTextBlob* blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize); + blob->fViewMatrix = viewMatrix; - this->internalDrawDFPosText(blob, 0, dfPaint, paint.getColor(), viewMatrix, text, - byteLength, pos, scalarsPerPosition, offset, textRatio, - skPaint); + if (this->canDrawAsDistanceFields(skPaint, viewMatrix)) { + this->internalDrawDFPosText(blob, 0, skPaint, paint.getColor(), viewMatrix, text, + byteLength, pos, scalarsPerPosition, offset); } else { - blob = fCache->createBlob(glyphCount, 1, GrAtlasTextBlob::kGrayTextVASize); - blob->fViewMatrix = viewMatrix; GrTextUtils::DrawBmpPosText(blob, 0, fContext->getBatchFontCache(), fSurfaceProps, skPaint, paint.getColor(), viewMatrix, text, byteLength, pos, scalarsPerPosition, offset); @@ -515,9 +475,7 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, const SkPaint& skPaint, GrColor color, const SkMatrix& viewMatrix, const char text[], size_t byteLength, - SkScalar x, SkScalar y, - SkScalar textRatio, - const SkPaint& origPaint) { + SkScalar x, SkScalar y) { SkASSERT(byteLength == 0 || text != nullptr); // nothing to draw @@ -525,10 +483,10 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, return; } - SkDrawCacheProc glyphCacheProc = origPaint.getDrawCacheProc(); + SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc(); SkAutoDescriptor desc; - origPaint.getScalerContextDescriptor(&desc, fSurfaceProps, nullptr, true); - SkGlyphCache* origPaintCache = SkGlyphCache::DetachCache(origPaint.getTypeface(), + skPaint.getScalerContextDescriptor(&desc, fSurfaceProps, nullptr, true); + SkGlyphCache* origPaintCache = SkGlyphCache::DetachCache(skPaint.getTypeface(), desc.getDesc()); SkTArray<SkScalar> positions; @@ -537,7 +495,7 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, SkFixed stopX = 0; SkFixed stopY = 0; SkFixed origin = 0; - switch (origPaint.getTextAlign()) { + switch (skPaint.getTextAlign()) { case SkPaint::kRight_Align: origin = SK_Fixed1; break; case SkPaint::kCenter_Align: origin = SK_FixedHalf; break; case SkPaint::kLeft_Align: origin = 0; break; @@ -566,10 +524,10 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, // now adjust starting point depending on alignment SkScalar alignX = SkFixedToScalar(stopX); SkScalar alignY = SkFixedToScalar(stopY); - if (origPaint.getTextAlign() == SkPaint::kCenter_Align) { + if (skPaint.getTextAlign() == SkPaint::kCenter_Align) { alignX = SkScalarHalf(alignX); alignY = SkScalarHalf(alignY); - } else if (origPaint.getTextAlign() == SkPaint::kLeft_Align) { + } else if (skPaint.getTextAlign() == SkPaint::kLeft_Align) { alignX = 0; alignY = 0; } @@ -578,18 +536,16 @@ void GrAtlasTextContext::internalDrawDFText(GrAtlasTextBlob* blob, int runIndex, SkPoint offset = SkPoint::Make(x, y); this->internalDrawDFPosText(blob, runIndex, skPaint, color, viewMatrix, text, byteLength, - positions.begin(), 2, offset, textRatio, origPaint); + positions.begin(), 2, offset); } void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runIndex, - const SkPaint& skPaint, + const SkPaint& origPaint, GrColor color, const SkMatrix& viewMatrix, const char text[], size_t byteLength, const SkScalar pos[], int scalarsPerPosition, - const SkPoint& offset, - SkScalar textRatio, - const SkPaint& origPaint) { + const SkPoint& offset) { SkASSERT(byteLength == 0 || text != nullptr); SkASSERT(1 == scalarsPerPosition || 2 == scalarsPerPosition); @@ -602,15 +558,22 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd SkTDArray<char> fallbackTxt; SkTDArray<SkScalar> fallbackPos; + // Setup distance field paint and text ratio + SkScalar textRatio; + SkPaint dfPaint(origPaint); + this->initDistanceFieldPaint(blob, &dfPaint, &textRatio, viewMatrix); + blob->setHasDistanceField(); + blob->setSubRunHasDistanceFields(runIndex, origPaint.isLCDRenderText()); + fCurrStrike = nullptr; - SkGlyphCache* cache = blob->setupCache(runIndex, fSurfaceProps, skPaint, nullptr, true); - SkDrawCacheProc glyphCacheProc = skPaint.getDrawCacheProc(); + SkGlyphCache* cache = blob->setupCache(runIndex, fSurfaceProps, dfPaint, nullptr, true); + SkDrawCacheProc glyphCacheProc = dfPaint.getDrawCacheProc(); GrFontScaler* fontScaler = GetGrFontScaler(cache); const char* stop = text + byteLength; - if (SkPaint::kLeft_Align == skPaint.getTextAlign()) { + if (SkPaint::kLeft_Align == dfPaint.getTextAlign()) { while (text < stop) { const char* lastText = text; // the last 2 parameters are ignored @@ -636,7 +599,7 @@ void GrAtlasTextContext::internalDrawDFPosText(GrAtlasTextBlob* blob, int runInd pos += scalarsPerPosition; } } else { - SkScalar alignMul = SkPaint::kCenter_Align == skPaint.getTextAlign() ? SK_ScalarHalf + SkScalar alignMul = SkPaint::kCenter_Align == dfPaint.getTextAlign() ? SK_ScalarHalf : SK_Scalar1; while (text < stop) { const char* lastText = text; |