diff options
author | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-06-21 21:18:25 +0000 |
---|---|---|
committer | bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-06-21 21:18:25 +0000 |
commit | 7359eae7c6fce8cb88ae28ca7048283b77535db4 (patch) | |
tree | 3168d1ffa7c9ea3a1b66e7561a9598f32ebd2be8 | |
parent | e03c652478aba1f632d5bf7c966617621be84155 (diff) |
fix to free a plot when purging gr font cache
Review URL: http://codereview.appspot.com/4645054/
git-svn-id: http://skia.googlecode.com/svn/trunk@1667 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | gpu/src/GrTextStrike.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/gpu/src/GrTextStrike.cpp b/gpu/src/GrTextStrike.cpp index 7aae7571a3..455f88a7bb 100644 --- a/gpu/src/GrTextStrike.cpp +++ b/gpu/src/GrTextStrike.cpp @@ -68,15 +68,19 @@ void GrFontCache::freeAll() { void GrFontCache::purgeExceptFor(GrTextStrike* preserveStrike) { GrTextStrike* strike = fTail; - if (strike == preserveStrike) { - strike = strike->fPrev; - } - if (strike) { - int index = fCache.slowFindIndex(strike); + while (strike) { + if (strike == preserveStrike) { + strike = strike->fPrev; + continue; + } + GrTextStrike* strikeToPurge = strike; + // keep going if we won't free up any atlases with this strike. + strike = (NULL == strikeToPurge->fAtlas) ? strikeToPurge->fPrev : NULL; + int index = fCache.slowFindIndex(strikeToPurge); GrAssert(index >= 0); - fCache.removeAt(index, strike->fFontScalerKey->getHash()); - this->detachStrikeFromList(strike); - delete strike; + fCache.removeAt(index, strikeToPurge->fFontScalerKey->getHash()); + this->detachStrikeFromList(strikeToPurge); + delete strikeToPurge; } } |