diff options
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/text/GrAtlasTextBlob.cpp | 13 | ||||
-rw-r--r-- | src/gpu/text/GrAtlasTextBlob.h | 12 | ||||
-rw-r--r-- | src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp | 3 | ||||
-rw-r--r-- | src/gpu/text/GrAtlasTextContext.cpp | 144 | ||||
-rw-r--r-- | src/gpu/text/GrTextUtils.cpp | 2 |
5 files changed, 89 insertions, 85 deletions
diff --git a/src/gpu/text/GrAtlasTextBlob.cpp b/src/gpu/text/GrAtlasTextBlob.cpp index b4404c3ef9..dfe3312f99 100644 --- a/src/gpu/text/GrAtlasTextBlob.cpp +++ b/src/gpu/text/GrAtlasTextBlob.cpp @@ -55,11 +55,11 @@ sk_sp<GrAtlasTextBlob> GrAtlasTextBlob::Make(GrMemoryPool* pool, int glyphCount, return cacheBlob; } -SkGlyphCache* GrAtlasTextBlob::setupCache(int runIndex, - const SkSurfaceProps& props, - SkScalerContextFlags scalerContextFlags, - const SkPaint& skPaint, - const SkMatrix* viewMatrix) { +SkExclusiveStrikePtr GrAtlasTextBlob::setupCache(int runIndex, + const SkSurfaceProps& props, + SkScalerContextFlags scalerContextFlags, + const SkPaint& skPaint, + const SkMatrix* viewMatrix) { GrAtlasTextBlob::Run* run = &fRuns[runIndex]; // if we have an override descriptor for the run, then we should use that @@ -71,7 +71,8 @@ SkGlyphCache* GrAtlasTextBlob::setupCache(int runIndex, run->fTypeface = SkPaintPriv::RefTypefaceOrDefault(skPaint); run->fPathEffect = sk_ref_sp(effects.fPathEffect); run->fMaskFilter = sk_ref_sp(effects.fMaskFilter); - return SkGlyphCache::DetachCache(run->fTypeface.get(), effects, desc->getDesc()); + return SkGlyphCache::FindOrCreateStrikeExclusive( + *desc->getDesc(), effects, *run->fTypeface.get()); } void GrAtlasTextBlob::appendGlyph(int runIndex, diff --git a/src/gpu/text/GrAtlasTextBlob.h b/src/gpu/text/GrAtlasTextBlob.h index b4a11a496d..e5a931d3cf 100644 --- a/src/gpu/text/GrAtlasTextBlob.h +++ b/src/gpu/text/GrAtlasTextBlob.h @@ -170,11 +170,11 @@ public: run.fOverrideDescriptor.reset(new SkAutoDescriptor); } - SkGlyphCache* setupCache(int runIndex, - const SkSurfaceProps& props, - SkScalerContextFlags scalerContextFlags, - const SkPaint& skPaint, - const SkMatrix* viewMatrix); + SkExclusiveStrikePtr setupCache(int runIndex, + const SkSurfaceProps& props, + SkScalerContextFlags scalerContextFlags, + const SkPaint& skPaint, + const SkMatrix* viewMatrix); // Appends a glyph to the blob. If the glyph is too large, the glyph will be appended // as a path. @@ -607,7 +607,7 @@ private: GrDeferredUploadTarget* fUploadTarget; GrGlyphCache* fGlyphCache; GrAtlasManager* fFullAtlasManager; - SkAutoGlyphCache* fLazyCache; + SkExclusiveStrikePtr* fLazyCache; Run* fRun; Run::SubRunInfo* fSubRun; GrColor fColor; diff --git a/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp b/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp index 296df22f51..188f34c461 100644 --- a/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp +++ b/src/gpu/text/GrAtlasTextBlobVertexRegenerator.cpp @@ -244,7 +244,8 @@ Regenerator::Result Regenerator::doRegen() { SkScalerContextEffects effects; effects.fPathEffect = fRun->fPathEffect.get(); effects.fMaskFilter = fRun->fMaskFilter.get(); - fLazyCache->reset(SkGlyphCache::DetachCache(fRun->fTypeface.get(), effects, desc)); + *fLazyCache = + SkGlyphCache::FindOrCreateStrikeExclusive(*desc, effects, *fRun->fTypeface.get()); } if (regenGlyphs) { diff --git a/src/gpu/text/GrAtlasTextContext.cpp b/src/gpu/text/GrAtlasTextContext.cpp index ad708d7d7f..72f5b5b1f7 100644 --- a/src/gpu/text/GrAtlasTextContext.cpp +++ b/src/gpu/text/GrAtlasTextContext.cpp @@ -386,20 +386,18 @@ void GrAtlasTextContext::DrawBmpText(GrAtlasTextBlob* blob, int runIndex, return; } - sk_sp<GrTextStrike> currStrike; - SkGlyphCache* cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix); + sk_sp<GrTextStrike> currStrike = nullptr; + auto cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix); SkFindAndPlaceGlyph::ProcessText(paint.skPaint().getTextEncoding(), text, byteLength, {x, y}, - viewMatrix, paint.skPaint().getTextAlign(), cache, + viewMatrix, paint.skPaint().getTextAlign(), cache.get(), [&](const SkGlyph& glyph, SkPoint position, SkPoint rounding) { position += rounding; BmpAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph, SkScalarFloorToScalar(position.fX), SkScalarFloorToScalar(position.fY), - paint.filteredPremulColor(), cache, + paint.filteredPremulColor(), cache.get(), SK_Scalar1); }); - - SkGlyphCache::AttachCache(cache); } void GrAtlasTextContext::DrawBmpPosText(GrAtlasTextBlob* blob, int runIndex, @@ -426,20 +424,19 @@ void GrAtlasTextContext::DrawBmpPosText(GrAtlasTextBlob* blob, int runIndex, return; } - sk_sp<GrTextStrike> currStrike; - SkGlyphCache* cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix); + sk_sp<GrTextStrike> currStrike = nullptr; + + auto cache = blob->setupCache(runIndex, props, scalerContextFlags, paint, &viewMatrix); SkFindAndPlaceGlyph::ProcessPosText( paint.skPaint().getTextEncoding(), text, byteLength, offset, viewMatrix, pos, - scalarsPerPosition, paint.skPaint().getTextAlign(), cache, + scalarsPerPosition, paint.skPaint().getTextAlign(), cache.get(), [&](const SkGlyph& glyph, SkPoint position, SkPoint rounding) { position += rounding; BmpAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph, SkScalarFloorToScalar(position.fX), SkScalarFloorToScalar(position.fY), - paint.filteredPremulColor(), cache, SK_Scalar1); + paint.filteredPremulColor(), cache.get(), SK_Scalar1); }); - - SkGlyphCache::AttachCache(cache); } void GrAtlasTextContext::DrawBmpTextAsPaths(GrAtlasTextBlob* blob, int runIndex, @@ -508,7 +505,7 @@ void GrAtlasTextContext::DrawBmpPosTextAsPaths(GrAtlasTextBlob* blob, int runInd pathPaint.isDevKernText(), true); SkAutoGlyphCache autoCache(pathPaint, &props, nullptr); - SkGlyphCache* cache = autoCache.getCache(); + SkGlyphCache* cache = autoCache.get(); const char* stop = text + byteLength; const char* lastText = text; @@ -693,41 +690,48 @@ 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; - 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; - } + { + 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; + } - 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); + 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); - 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; + stopX += width; + stopY += height; + } + SkASSERT(textPtr == stop); } - SkASSERT(textPtr == stop); - - SkGlyphCache::AttachCache(origPaintCache); // now adjust starting point depending on alignment SkScalar alignX = stopX; @@ -778,40 +782,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). - SkGlyphCache* cache = + { + auto 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, &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); + 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; } } - pos += scalarsPerPosition; } - - SkGlyphCache::AttachCache(cache); - fallbackTextHelper.drawText(blob, runIndex, glyphCache, props, paint, scalerContextFlags); } @@ -883,7 +887,7 @@ void GrAtlasTextContext::FallbackTextHelper::drawText(GrAtlasTextBlob* blob, int if (fFallbackTxt.count()) { blob->initOverride(runIndex); blob->setHasBitmap(); - SkGlyphCache* cache = nullptr; + SkExclusiveStrikePtr cache; const SkPaint& skPaint = paint.skPaint(); SkPaint::GlyphCacheProc glyphCacheProc = SkPaint::GetGlyphCacheProc(skPaint.getTextEncoding(), @@ -913,14 +917,12 @@ 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, &text); + const SkGlyph& glyph = glyphCacheProc(cache.get(), &text); GrAtlasTextContext::BmpAppendGlyph(blob, runIndex, glyphCache, &currStrike, glyph, glyphPos->fX, glyphPos->fY, textColor, - cache, textRatio); + cache.get(), textRatio); glyphPos++; } - - SkGlyphCache::AttachCache(cache); } } diff --git a/src/gpu/text/GrTextUtils.cpp b/src/gpu/text/GrTextUtils.cpp index 680e262766..7d693d1e29 100644 --- a/src/gpu/text/GrTextUtils.cpp +++ b/src/gpu/text/GrTextUtils.cpp @@ -81,7 +81,7 @@ bool GrTextUtils::PathTextIter::next(const SkGlyph** skGlyph, const SkPath** pat SkASSERT(path); SkASSERT(xpos); if (fText < fStop) { - const SkGlyph& glyph = fGlyphCacheProc(fCache, &fText); + const SkGlyph& glyph = fGlyphCacheProc(fCache.get(), &fText); fXPos += (fPrevAdvance + fAutoKern.adjust(glyph)) * fScale; SkASSERT(0 == fXYIndex || 1 == fXYIndex); |