diff options
Diffstat (limited to 'src/gpu/text/GrAtlasTextContext.cpp')
-rw-r--r-- | src/gpu/text/GrAtlasTextContext.cpp | 144 |
1 files changed, 71 insertions, 73 deletions
diff --git a/src/gpu/text/GrAtlasTextContext.cpp b/src/gpu/text/GrAtlasTextContext.cpp index 72f5b5b1f7..ad708d7d7f 100644 --- a/src/gpu/text/GrAtlasTextContext.cpp +++ b/src/gpu/text/GrAtlasTextContext.cpp @@ -386,18 +386,20 @@ void GrAtlasTextContext::DrawBmpText(GrAtlasTextBlob* blob, int runIndex, return; } - sk_sp<GrTextStrike> currStrike = nullptr; - auto cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix); + sk_sp<GrTextStrike> currStrike; + SkGlyphCache* cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix); SkFindAndPlaceGlyph::ProcessText(paint.skPaint().getTextEncoding(), text, byteLength, {x, y}, - viewMatrix, paint.skPaint().getTextAlign(), cache.get(), + viewMatrix, paint.skPaint().getTextAlign(), cache, [&](const SkGlyph& glyph, SkPoint position, SkPoint rounding) { position += rounding; BmpAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph, SkScalarFloorToScalar(position.fX), SkScalarFloorToScalar(position.fY), - paint.filteredPremulColor(), cache.get(), + paint.filteredPremulColor(), cache, SK_Scalar1); }); + + SkGlyphCache::AttachCache(cache); } void GrAtlasTextContext::DrawBmpPosText(GrAtlasTextBlob* blob, int runIndex, @@ -424,19 +426,20 @@ void GrAtlasTextContext::DrawBmpPosText(GrAtlasTextBlob* blob, int runIndex, return; } - sk_sp<GrTextStrike> currStrike = nullptr; - - auto cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix); + sk_sp<GrTextStrike> currStrike; + SkGlyphCache* cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix); SkFindAndPlaceGlyph::ProcessPosText( paint.skPaint().getTextEncoding(), text, byteLength, offset, viewMatrix, pos, - scalarsPerPosition, paint.skPaint().getTextAlign(), cache.get(), + scalarsPerPosition, paint.skPaint().getTextAlign(), cache, [&](const SkGlyph& glyph, SkPoint position, SkPoint rounding) { position += rounding; BmpAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph, SkScalarFloorToScalar(position.fX), SkScalarFloorToScalar(position.fY), - paint.filteredPremulColor(), cache.get(), SK_Scalar1); + paint.filteredPremulColor(), cache, SK_Scalar1); }); + + SkGlyphCache::AttachCache(cache); } void GrAtlasTextContext::DrawBmpTextAsPaths(GrAtlasTextBlob* blob, int runIndex, @@ -505,7 +508,7 @@ void GrAtlasTextContext::DrawBmpPosTextAsPaths(GrAtlasTextBlob* blob, int runInd pathPaint.isDevKernText(), true); SkAutoGlyphCache autoCache(pathPaint, &props, nullptr); - SkGlyphCache* cache = autoCache.get(); + SkGlyphCache* cache = autoCache.getCache(); const char* stop = text + byteLength; const char* lastText = text; @@ -690,48 +693,41 @@ void GrAtlasTextContext::drawDFText(GrAtlasTextBlob* blob, int runIndex, // passed-in scaler context flags. (It's only used when we fall-back to bitmap text). SkScalerContext::CreateDescriptorAndEffectsUsingPaint( skPaint, &props, SkScalerContextFlags::kNone, nullptr, &desc, &effects); + auto typeface = SkPaintPriv::GetTypefaceOrDefault(skPaint); + SkGlyphCache* origPaintCache = + SkGlyphCache::DetachCache(typeface, effects, desc.getDesc()); SkTArray<SkScalar> positions; + + const char* textPtr = text; SkScalar stopX = 0; SkScalar stopY = 0; - { - auto tf = SkPaintPriv::GetTypefaceOrDefault(skPaint); - auto origPaintCache = SkGlyphCache::FindOrCreateStrikeExclusive( - *desc.getDesc(), effects, *tf); - - - const char* textPtr = text; - SkScalar origin = 0; - switch (skPaint.getTextAlign()) { - case SkPaint::kRight_Align: - origin = SK_Scalar1; - break; - case SkPaint::kCenter_Align: - origin = SK_ScalarHalf; - break; - case SkPaint::kLeft_Align: - origin = 0; - break; - } + SkScalar origin = 0; + switch (skPaint.getTextAlign()) { + case SkPaint::kRight_Align: origin = SK_Scalar1; break; + case SkPaint::kCenter_Align: origin = SK_ScalarHalf; break; + case SkPaint::kLeft_Align: origin = 0; break; + } - SkAutoKern autokern; - const char* stop = text + byteLength; - while (textPtr < stop) { - // don't need x, y here, since all subpixel variants will have the - // same advance - const SkGlyph& glyph = glyphCacheProc(origPaintCache.get(), &textPtr); + SkAutoKern autokern; + const char* stop = text + byteLength; + while (textPtr < stop) { + // don't need x, y here, since all subpixel variants will have the + // same advance + const SkGlyph& glyph = glyphCacheProc(origPaintCache, &textPtr); - SkScalar width = SkFloatToScalar(glyph.fAdvanceX) + autokern.adjust(glyph); - positions.push_back(stopX + origin * width); + SkScalar width = SkFloatToScalar(glyph.fAdvanceX) + autokern.adjust(glyph); + positions.push_back(stopX + origin * width); - SkScalar height = SkFloatToScalar(glyph.fAdvanceY); - positions.push_back(stopY + origin * height); + SkScalar height = SkFloatToScalar(glyph.fAdvanceY); + positions.push_back(stopY + origin * height); - stopX += width; - stopY += height; - } - SkASSERT(textPtr == stop); + stopX += width; + stopY += height; } + SkASSERT(textPtr == stop); + + SkGlyphCache::AttachCache(origPaintCache); // now adjust starting point depending on alignment SkScalar alignX = stopX; @@ -782,40 +778,40 @@ void GrAtlasTextContext::drawDFPosText(GrAtlasTextBlob* blob, int runIndex, // We apply the fake-gamma by altering the distance in the shader, so we ignore the // passed-in scaler context flags. (It's only used when we fall-back to bitmap text). - { - auto cache = + SkGlyphCache* cache = blob->setupCache(runIndex, props, SkScalerContextFlags::kNone, dfPaint, nullptr); - SkPaint::GlyphCacheProc glyphCacheProc = + SkPaint::GlyphCacheProc glyphCacheProc = SkPaint::GetGlyphCacheProc(dfPaint.getTextEncoding(), dfPaint.isDevKernText(), true); - const char* stop = text + byteLength; + const char* stop = text + byteLength; - SkPaint::Align align = dfPaint.getTextAlign(); - SkScalar alignMul = SkPaint::kCenter_Align == align ? SK_ScalarHalf : - (SkPaint::kRight_Align == align ? SK_Scalar1 : 0); - while (text < stop) { - const char* lastText = text; - // the last 2 parameters are ignored - const SkGlyph& glyph = glyphCacheProc(cache.get(), &text); - - if (glyph.fWidth) { - SkPoint glyphPos(offset); - glyphPos.fX += pos[0] - SkFloatToScalar(glyph.fAdvanceX) * alignMul * textRatio; - glyphPos.fY += (2 == scalarsPerPosition ? pos[1] : 0) - - SkFloatToScalar(glyph.fAdvanceY) * alignMul * textRatio; - - if (glyph.fMaskFormat != SkMask::kARGB32_Format) { - DfAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph, glyphPos.fX, - glyphPos.fY, paint.filteredPremulColor(), cache.get(), textRatio); - } else { - // can't append color glyph to SDF batch, send to fallback - fallbackTextHelper.appendText(glyph, SkToInt(text - lastText), lastText, - glyphPos); - } - pos += scalarsPerPosition; + SkPaint::Align align = dfPaint.getTextAlign(); + SkScalar alignMul = SkPaint::kCenter_Align == align ? SK_ScalarHalf : + (SkPaint::kRight_Align == align ? SK_Scalar1 : 0); + while (text < stop) { + const char* lastText = text; + // the last 2 parameters are ignored + const SkGlyph& glyph = glyphCacheProc(cache, &text); + + if (glyph.fWidth) { + SkPoint glyphPos(offset); + glyphPos.fX += pos[0] - SkFloatToScalar(glyph.fAdvanceX) * alignMul * textRatio; + glyphPos.fY += (2 == scalarsPerPosition ? pos[1] : 0) - + SkFloatToScalar(glyph.fAdvanceY) * alignMul * textRatio; + + if (glyph.fMaskFormat != SkMask::kARGB32_Format) { + DfAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph, glyphPos.fX, + glyphPos.fY, paint.filteredPremulColor(), cache, textRatio); + } else { + // can't append color glyph to SDF batch, send to fallback + fallbackTextHelper.appendText(glyph, SkToInt(text - lastText), lastText, glyphPos); } } + pos += scalarsPerPosition; } + + SkGlyphCache::AttachCache(cache); + fallbackTextHelper.drawText(blob, runIndex, glyphCache, props, paint, scalerContextFlags); } @@ -887,7 +883,7 @@ void GrAtlasTextContext::FallbackTextHelper::drawText(GrAtlasTextBlob* blob, int if (fFallbackTxt.count()) { blob->initOverride(runIndex); blob->setHasBitmap(); - SkExclusiveStrikePtr cache; + SkGlyphCache* cache = nullptr; const SkPaint& skPaint = paint.skPaint(); SkPaint::GlyphCacheProc glyphCacheProc = SkPaint::GetGlyphCacheProc(skPaint.getTextEncoding(), @@ -917,12 +913,14 @@ void GrAtlasTextContext::FallbackTextHelper::drawText(GrAtlasTextBlob* blob, int const char* stop = text + fFallbackTxt.count(); SkPoint* glyphPos = fFallbackPos.begin(); while (text < stop) { - const SkGlyph& glyph = glyphCacheProc(cache.get(), &text); + const SkGlyph& glyph = glyphCacheProc(cache, &text); GrAtlasTextContext::BmpAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph, glyphPos->fX, glyphPos->fY, textColor, - cache.get(), textRatio); + cache, textRatio); glyphPos++; } + + SkGlyphCache::AttachCache(cache); } } |