| Index: src/gpu/text/GrAtlasTextBlob_regenInBatch.cpp
|
| diff --git a/src/gpu/text/GrAtlasTextBlob_regenInBatch.cpp b/src/gpu/text/GrAtlasTextBlob_regenInBatch.cpp
|
| index e5a8956517cad675758ae5cec291c23608b5bfdf..28d32198ded9da74215a46c24bb2ccfc6721d46e 100644
|
| --- a/src/gpu/text/GrAtlasTextBlob_regenInBatch.cpp
|
| +++ b/src/gpu/text/GrAtlasTextBlob_regenInBatch.cpp
|
| @@ -142,35 +142,27 @@ void GrAtlasTextBlob::regenInBatch(GrDrawBatch::Target* target,
|
| GrBatchFontCache* fontCache,
|
| GrBlobRegenHelper *helper,
|
| Run* run,
|
| - Run::SubRunInfo* info, SkGlyphCache** cache,
|
| - SkTypeface** typeface,
|
| - const SkDescriptor** desc,
|
| + Run::SubRunInfo* info,
|
| + SkAutoGlyphCache* lazyCache,
|
| int glyphCount, size_t vertexStride,
|
| GrColor color, SkScalar transX,
|
| SkScalar transY) const {
|
| + SkASSERT(lazyCache);
|
| static_assert(!regenGlyphs || regenTexCoords, "must regenTexCoords along regenGlyphs");
|
| GrBatchTextStrike* strike = nullptr;
|
| if (regenTexCoords) {
|
| info->resetBulkUseToken();
|
|
|
| - // We can reuse if we have a valid strike and our descriptors / typeface are the
|
| - // same. The override descriptor is only for the non distance field text within
|
| - // a run
|
| - const SkDescriptor* newDesc = (run->fOverrideDescriptor && !info->drawAsDistanceFields()) ?
|
| - run->fOverrideDescriptor->getDesc() :
|
| - run->fDescriptor.getDesc();
|
| - if (!*cache || !SkTypeface::Equal(*typeface, run->fTypeface) ||
|
| - !(**desc == *newDesc)) {
|
| - if (*cache) {
|
| - SkGlyphCache::AttachCache(*cache);
|
| - }
|
| - *desc = newDesc;
|
| - *cache = SkGlyphCache::DetachCache(run->fTypeface, run->fEffects, *desc);
|
| - *typeface = run->fTypeface;
|
| + const SkDescriptor* desc = (run->fOverrideDescriptor && !info->drawAsDistanceFields())
|
| + ? run->fOverrideDescriptor->getDesc()
|
| + : run->fDescriptor.getDesc();
|
| +
|
| + if (!*lazyCache || (*lazyCache)->getDescriptor() != *desc) {
|
| + lazyCache->reset(SkGlyphCache::DetachCache(run->fTypeface, run->fEffects, desc));
|
| }
|
|
|
| if (regenGlyphs) {
|
| - strike = fontCache->getStrike(*cache);
|
| + strike = fontCache->getStrike(lazyCache->get());
|
| } else {
|
| strike = info->strike();
|
| }
|
| @@ -187,20 +179,20 @@ void GrAtlasTextBlob::regenInBatch(GrDrawBatch::Target* target,
|
| // Get the id from the old glyph, and use the new strike to lookup
|
| // the glyph.
|
| GrGlyph::PackedID id = fGlyphs[glyphOffset]->fPackedID;
|
| - fGlyphs[glyphOffset] = strike->getGlyph(id, info->maskFormat(), *cache);
|
| + fGlyphs[glyphOffset] = strike->getGlyph(id, info->maskFormat(), lazyCache->get());
|
| SkASSERT(id == fGlyphs[glyphOffset]->fPackedID);
|
| }
|
| glyph = fGlyphs[glyphOffset];
|
| SkASSERT(glyph && glyph->fMaskFormat == info->maskFormat());
|
|
|
| if (!fontCache->hasGlyph(glyph) &&
|
| - !strike->addGlyphToAtlas(target, glyph, *cache, info->maskFormat())) {
|
| + !strike->addGlyphToAtlas(target, glyph, lazyCache->get(), info->maskFormat())) {
|
| helper->flush();
|
| brokenRun = glyphIdx > 0;
|
|
|
| SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(target,
|
| glyph,
|
| - *cache,
|
| + lazyCache->get(),
|
| info->maskFormat());
|
| SkASSERT(success);
|
| }
|
| @@ -238,7 +230,7 @@ enum RegenMask {
|
| kRegenGlyph = 0x8 | kRegenTex, // we have to regenerate the texture coords when we regen glyphs
|
|
|
| // combinations
|
| - kRegenPosCol = kRegenPos | kRegenCol,
|
| + kRegenPosCol = kRegenPos | kRegenCol,
|
| kRegenPosTex = kRegenPos | kRegenTex,
|
| kRegenPosTexGlyph = kRegenPos | kRegenGlyph,
|
| kRegenPosColTex = kRegenPos | kRegenCol | kRegenTex,
|
| @@ -247,14 +239,13 @@ enum RegenMask {
|
| kRegenColTexGlyph = kRegenCol | kRegenGlyph,
|
| };
|
|
|
| -#define REGEN_ARGS target, fontCache, helper, &run, &info, cache, typeface, desc, \
|
| +#define REGEN_ARGS target, fontCache, helper, &run, &info, lazyCache, \
|
| *glyphCount, vertexStride, color, transX, transY
|
|
|
| void GrAtlasTextBlob::regenInBatch(GrDrawBatch::Target* target,
|
| GrBatchFontCache* fontCache,
|
| GrBlobRegenHelper *helper,
|
| - int runIndex, int subRunIndex, SkGlyphCache** cache,
|
| - SkTypeface** typeface, const SkDescriptor** desc,
|
| + int runIndex, int subRunIndex, SkAutoGlyphCache* lazyCache,
|
| size_t vertexStride, const SkMatrix& viewMatrix,
|
| SkScalar x, SkScalar y, GrColor color,
|
| void** vertices, size_t* byteCount, int* glyphCount) {
|
|
|