diff options
author | Derek Sollenberger <djsollen@google.com> | 2012-01-18 08:56:56 -0500 |
---|---|---|
committer | Derek Sollenberger <derek@android.com> | 2012-02-06 14:14:40 -0500 |
commit | 1cab2921ab279367f8206cdadc9259d12e603548 (patch) | |
tree | 2852f9dc2481f639122e18fc7831ae6ca43d6d5a /src/gpu/GrTextStrike_impl.h | |
parent | d7176fd5571bc9878d3cdac8696eaa35ec170d9d (diff) | |
download | external_skia-1cab2921ab279367f8206cdadc9259d12e603548.zip external_skia-1cab2921ab279367f8206cdadc9259d12e603548.tar.gz external_skia-1cab2921ab279367f8206cdadc9259d12e603548.tar.bz2 |
Skia merge (revision 3022)
This CL has companion changes to account for API updates in...
(1) frameworks/base
(2) external/webkit
Change-Id: Ibb989e76e8bd24313849f9631dbef42cdef9eb7d
Diffstat (limited to 'src/gpu/GrTextStrike_impl.h')
-rw-r--r-- | src/gpu/GrTextStrike_impl.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/gpu/GrTextStrike_impl.h b/src/gpu/GrTextStrike_impl.h new file mode 100644 index 0000000..1b6392c --- /dev/null +++ b/src/gpu/GrTextStrike_impl.h @@ -0,0 +1,106 @@ + +/* + * Copyright 2010 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + + +#ifndef GrTextStrike_impl_DEFINED +#define GrTextStrike_impl_DEFINED + +class GrFontCache::Key { +public: + Key(GrFontScaler* scaler) { + fFontScalerKey = scaler->getKey(); + } + + uint32_t getHash() const { return fFontScalerKey->getHash(); } + + static bool LT(const GrTextStrike& strike, const Key& key) { + return *strike.getFontScalerKey() < *key.fFontScalerKey; + } + static bool EQ(const GrTextStrike& strike, const Key& key) { + return *strike.getFontScalerKey() == *key.fFontScalerKey; + } + +private: + const GrKey* fFontScalerKey; +}; + +void GrFontCache::detachStrikeFromList(GrTextStrike* strike) { + if (strike->fPrev) { + GrAssert(fHead != strike); + strike->fPrev->fNext = strike->fNext; + } else { + GrAssert(fHead == strike); + fHead = strike->fNext; + } + + if (strike->fNext) { + GrAssert(fTail != strike); + strike->fNext->fPrev = strike->fPrev; + } else { + GrAssert(fTail == strike); + fTail = strike->fPrev; + } +} + +GrTextStrike* GrFontCache::getStrike(GrFontScaler* scaler) { + this->validate(); + + Key key(scaler); + GrTextStrike* strike = fCache.find(key); + if (NULL == strike) { + strike = this->generateStrike(scaler, key); + } else if (strike->fPrev) { + // Need to put the strike at the head of its dllist, since that is how + // we age the strikes for purging (we purge from the back of the list + this->detachStrikeFromList(strike); + // attach at the head + fHead->fPrev = strike; + strike->fNext = fHead; + strike->fPrev = NULL; + fHead = strike; + } + + this->validate(); + return strike; +} + +/////////////////////////////////////////////////////////////////////////////// + +/** + * This Key just wraps a glyphID, and matches the protocol need for + * GrTHashTable + */ +class GrTextStrike::Key { +public: + Key(GrGlyph::PackedID id) : fPackedID(id) {} + + uint32_t getHash() const { return fPackedID; } + + static bool LT(const GrGlyph& glyph, const Key& key) { + return glyph.fPackedID < key.fPackedID; + } + static bool EQ(const GrGlyph& glyph, const Key& key) { + return glyph.fPackedID == key.fPackedID; + } + +private: + GrGlyph::PackedID fPackedID; +}; + +GrGlyph* GrTextStrike::getGlyph(GrGlyph::PackedID packed, + GrFontScaler* scaler) { + GrGlyph* glyph = fCache.find(packed); + if (NULL == glyph) { + glyph = this->generateGlyph(packed, scaler); + } + return glyph; +} + +#endif + |