| Index: src/gpu/text/GrAtlasTextContext.cpp
|
| diff --git a/src/gpu/text/GrAtlasTextContext.cpp b/src/gpu/text/GrAtlasTextContext.cpp
|
| index 37cd53d08061bc51e8c82e36c29cf9126fd58b70..b6971f0ccd341438abdba5fa557b5c77161963ec 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;
|
|
|