fix to free a plot when purging gr font cache
authorbsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 21 Jun 2011 21:18:25 +0000 (21:18 +0000)
committerbsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 21 Jun 2011 21:18:25 +0000 (21:18 +0000)
Review URL: http://codereview.appspot.com/4645054/

git-svn-id: http://skia.googlecode.com/svn/trunk@1667 2bbb7eff-a529-9590-31e7-b0007b416f81

gpu/src/GrTextStrike.cpp

index 7aae757..455f88a 100644 (file)
@@ -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;
     }
 }