1 2 /* 3 * Copyright 2010 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 11 #ifndef GrTextStrike_impl_DEFINED 12 #define GrTextStrike_impl_DEFINED 13 14 void GrFontCache::detachStrikeFromList(GrTextStrike* strike) { 15 if (strike->fPrev) { 16 SkASSERT(fHead != strike); 17 strike->fPrev->fNext = strike->fNext; 18 } else { 19 SkASSERT(fHead == strike); 20 fHead = strike->fNext; 21 } 22 23 if (strike->fNext) { 24 SkASSERT(fTail != strike); 25 strike->fNext->fPrev = strike->fPrev; 26 } else { 27 SkASSERT(fTail == strike); 28 fTail = strike->fPrev; 29 } 30 } 31 32 GrTextStrike* GrFontCache::getStrike(GrFontScaler* scaler, bool useDistanceField) { 33 this->validate(); 34 35 GrTextStrike* strike = fCache.find(*(scaler->getKey())); 36 if (NULL == strike) { 37 strike = this->generateStrike(scaler); 38 } else if (strike->fPrev) { 39 // Need to put the strike at the head of its dllist, since that is how 40 // we age the strikes for purging (we purge from the back of the list) 41 this->detachStrikeFromList(strike); 42 // attach at the head 43 fHead->fPrev = strike; 44 strike->fNext = fHead; 45 strike->fPrev = NULL; 46 fHead = strike; 47 } 48 strike->fUseDistanceField = useDistanceField; 49 this->validate(); 50 return strike; 51 } 52 53 /////////////////////////////////////////////////////////////////////////////// 54 55 GrGlyph* GrTextStrike::getGlyph(GrGlyph::PackedID packed, 56 GrFontScaler* scaler) { 57 GrGlyph* glyph = fCache.find(packed); 58 if (NULL == glyph) { 59 glyph = this->generateGlyph(packed, scaler); 60 } 61 return glyph; 62 } 63 64 #endif 65