bool GrFontCache::freeUnusedPlot(GrTextStrike* preserveStrike, const GrGlyph* glyph) { SkASSERT(preserveStrike); int index = mask_format_to_atlas_index(glyph->fMaskFormat); GrAtlas* atlas = fAtlases[index]; GrPlot* plot = atlas->getUnusedPlot(); if (NULL == plot) { return false; } plot->resetRects(); GrTextStrike* strike = fHead; while (strike) { GrTextStrike* strikeToPurge = strike; strike = strikeToPurge->fNext; strikeToPurge->removePlot(plot); // clear out any empty strikes (except this one) if (strikeToPurge != preserveStrike && strikeToPurge->fPlotUsage.isEmpty()) { this->purgeStrike(strikeToPurge); } } #if FONT_CACHE_STATS ++g_PurgeCount; #endif return true; }
bool GrFontCache::freeUnusedPlot(GrTextStrike* preserveStrike) { SkASSERT(preserveStrike); GrAtlas* atlas = preserveStrike->fAtlas; GrPlot* plot = atlas->getUnusedPlot(); if (NULL == plot) { return false; } plot->resetRects(); GrTextStrike* strike = fHead; GrMaskFormat maskFormat = preserveStrike->fMaskFormat; while (strike) { if (maskFormat != strike->fMaskFormat) { strike = strike->fNext; continue; } GrTextStrike* strikeToPurge = strike; strike = strikeToPurge->fNext; strikeToPurge->removePlot(plot); // clear out any empty strikes (except this one) if (strikeToPurge != preserveStrike && strikeToPurge->fPlotUsage.isEmpty()) { this->purgeStrike(strikeToPurge); } } #if FONT_CACHE_STATS ++g_PurgeCount; #endif return true; }