Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(269)

Unified Diff: src/gpu/GrTextStrike.cpp

Issue 177463003: New approach for GPU font atlas (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Remove unnecessary reference to GrAtlasMgr Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/GrTextStrike.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/GrTextStrike.cpp
diff --git a/src/gpu/GrTextStrike.cpp b/src/gpu/GrTextStrike.cpp
index c70e822cd9bf6230bc7d86bb5dc4d5a160ab9511..e303a23df8d2b851800d4a2c25b40f84e540894b 100644
--- a/src/gpu/GrTextStrike.cpp
+++ b/src/gpu/GrTextStrike.cpp
@@ -110,47 +110,39 @@ void GrFontCache::purgeStrike(GrTextStrike* strike) {
delete strike;
}
-void GrFontCache::purgeExceptFor(GrTextStrike* preserveStrike) {
+bool GrFontCache::freeUnusedPlot(GrTextStrike* preserveStrike) {
SkASSERT(NULL != preserveStrike);
- GrTextStrike* strike = fTail;
- bool purge = true;
+
+ GrAtlasMgr* atlasMgr = preserveStrike->fAtlasMgr;
+ GrPlot* plot = atlasMgr->getUnusedPlot();
+ if (NULL == plot) {
+ return false;
+ }
+ plot->resetRects();
+
+ GrTextStrike* strike = fHead;
GrMaskFormat maskFormat = preserveStrike->fMaskFormat;
while (strike) {
- if (strike == preserveStrike || maskFormat != strike->fMaskFormat) {
- strike = strike->fPrev;
+ if (maskFormat != strike->fMaskFormat) {
+ strike = strike->fNext;
continue;
}
+
GrTextStrike* strikeToPurge = strike;
- strike = strikeToPurge->fPrev;
- if (purge) {
- // keep purging if we won't free up any atlases with this strike.
- purge = strikeToPurge->fAtlas.isEmpty();
+ strike = strikeToPurge->fNext;
+ strikeToPurge->removePlot(plot);
+
+ // clear out any empty strikes (except this one)
+ if (strikeToPurge != preserveStrike && strikeToPurge->fAtlas.isEmpty()) {
this->purgeStrike(strikeToPurge);
}
}
+
#if FONT_CACHE_STATS
++g_PurgeCount;
#endif
-}
-void GrFontCache::freePlotExceptFor(GrTextStrike* preserveStrike) {
- SkASSERT(NULL != preserveStrike);
- GrTextStrike* strike = fTail;
- GrMaskFormat maskFormat = preserveStrike->fMaskFormat;
- while (strike) {
- if (strike == preserveStrike || maskFormat != strike->fMaskFormat) {
- strike = strike->fPrev;
- continue;
- }
- GrTextStrike* strikeToPurge = strike;
- strike = strikeToPurge->fPrev;
- if (strikeToPurge->removeUnusedPlots()) {
- if (strikeToPurge->fAtlas.isEmpty()) {
- this->purgeStrike(strikeToPurge);
- }
- break;
- }
- }
+ return true;
}
#ifdef SK_DEBUG
@@ -221,7 +213,7 @@ void GrFontCache::dump() const {
GrTextStrike::GrTextStrike(GrFontCache* cache, const GrKey* key,
GrMaskFormat format,
- GrAtlasMgr* atlasMgr) : fPool(64), fAtlas(atlasMgr) {
+ GrAtlasMgr* atlasMgr) : fPool(64) {
fFontScalerKey = key;
fFontScalerKey->ref();
@@ -236,16 +228,10 @@ GrTextStrike::GrTextStrike(GrFontCache* cache, const GrKey* key,
#endif
}
-// these signatures are needed because they're used with
-// SkTDArray::visitAll() (see destructor & removeUnusedAtlases())
+// this signature is needed because it's used with
+// SkTDArray::visitAll() (see destructor)
static void free_glyph(GrGlyph*& glyph) { glyph->free(); }
-static void invalidate_glyph(GrGlyph*& glyph) {
- if (glyph->fPlot && glyph->fPlot->drawToken().isIssued()) {
- glyph->fPlot = NULL;
- }
-}
-
GrTextStrike::~GrTextStrike() {
fFontScalerKey->unref();
fCache.getArray().visitAll(free_glyph);
@@ -278,13 +264,19 @@ GrGlyph* GrTextStrike::generateGlyph(GrGlyph::PackedID packed,
return glyph;
}
-bool GrTextStrike::removeUnusedPlots() {
- fCache.getArray().visitAll(invalidate_glyph);
- return fAtlasMgr->removeUnusedPlots(&fAtlas);
+void GrTextStrike::removePlot(const GrPlot* plot) {
+ SkTDArray<GrGlyph*>& glyphArray = fCache.getArray();
+ for (int i = 0; i < glyphArray.count(); ++i) {
+ if (plot == glyphArray[i]->fPlot) {
+ glyphArray[i]->fPlot = NULL;
+ }
+ }
+
+ fAtlasMgr->removePlot(&fAtlas, plot);
}
-bool GrTextStrike::getGlyphAtlas(GrGlyph* glyph, GrFontScaler* scaler) {
+bool GrTextStrike::addGlyphToAtlas(GrGlyph* glyph, GrFontScaler* scaler) {
#if 0 // testing hack to force us to flush our cache often
static int gCounter;
if ((++gCounter % 10) == 0) return false;
« no previous file with comments | « src/gpu/GrTextStrike.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698