• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 class GrFontCache::Key {
15 public:
Key(const GrKey * fontScalarKey)16     explicit Key(const GrKey* fontScalarKey) {
17         fFontScalerKey = fontScalarKey;
18     }
19 
getHash()20     intptr_t getHash() const { return fFontScalerKey->getHash(); }
21 
LessThan(const GrTextStrike & strike,const Key & key)22     static bool LessThan(const GrTextStrike& strike, const Key& key) {
23         return *strike.getFontScalerKey() < *key.fFontScalerKey;
24     }
Equals(const GrTextStrike & strike,const Key & key)25     static bool Equals(const GrTextStrike& strike, const Key& key) {
26         return *strike.getFontScalerKey() == *key.fFontScalerKey;
27     }
28 
29 private:
30     const GrKey* fFontScalerKey;
31 };
32 
detachStrikeFromList(GrTextStrike * strike)33 void GrFontCache::detachStrikeFromList(GrTextStrike* strike) {
34     if (strike->fPrev) {
35         SkASSERT(fHead != strike);
36         strike->fPrev->fNext = strike->fNext;
37     } else {
38         SkASSERT(fHead == strike);
39         fHead = strike->fNext;
40     }
41 
42     if (strike->fNext) {
43         SkASSERT(fTail != strike);
44         strike->fNext->fPrev = strike->fPrev;
45     } else {
46         SkASSERT(fTail == strike);
47         fTail = strike->fPrev;
48     }
49 }
50 
getStrike(GrFontScaler * scaler,bool useDistanceField)51 GrTextStrike* GrFontCache::getStrike(GrFontScaler* scaler, bool useDistanceField) {
52     this->validate();
53 
54     const Key key(scaler->getKey());
55     GrTextStrike* strike = fCache.find(key);
56     if (NULL == strike) {
57         strike = this->generateStrike(scaler, key);
58     } else if (strike->fPrev) {
59         // Need to put the strike at the head of its dllist, since that is how
60         // we age the strikes for purging (we purge from the back of the list)
61         this->detachStrikeFromList(strike);
62         // attach at the head
63         fHead->fPrev = strike;
64         strike->fNext = fHead;
65         strike->fPrev = NULL;
66         fHead = strike;
67     }
68     strike->fUseDistanceField = useDistanceField;
69     this->validate();
70     return strike;
71 }
72 
73 ///////////////////////////////////////////////////////////////////////////////
74 
75 /**
76  *  This Key just wraps a glyphID, and matches the protocol need for
77  *  GrTHashTable
78  */
79 class GrTextStrike::Key {
80 public:
Key(GrGlyph::PackedID id)81     Key(GrGlyph::PackedID id) : fPackedID(id) {}
82 
getHash()83     uint32_t getHash() const { return fPackedID; }
84 
LessThan(const GrGlyph & glyph,const Key & key)85     static bool LessThan(const GrGlyph& glyph, const Key& key) {
86         return glyph.fPackedID < key.fPackedID;
87     }
Equals(const GrGlyph & glyph,const Key & key)88     static bool Equals(const GrGlyph& glyph, const Key& key) {
89         return glyph.fPackedID == key.fPackedID;
90     }
91 
92 private:
93     GrGlyph::PackedID fPackedID;
94 };
95 
getGlyph(GrGlyph::PackedID packed,GrFontScaler * scaler)96 GrGlyph* GrTextStrike::getGlyph(GrGlyph::PackedID packed,
97                                 GrFontScaler* scaler) {
98     GrGlyph* glyph = fCache.find(packed);
99     if (NULL == glyph) {
100         glyph = this->generateGlyph(packed, scaler);
101     }
102     return glyph;
103 }
104 
105 #endif
106