diff options
Diffstat (limited to 'src/gpu/GrTextStrike.h')
-rw-r--r-- | src/gpu/GrTextStrike.h | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/gpu/GrTextStrike.h b/src/gpu/GrTextStrike.h new file mode 100644 index 0000000..701acea --- /dev/null +++ b/src/gpu/GrTextStrike.h @@ -0,0 +1,115 @@ + +/* + * 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_DEFINED +#define GrTextStrike_DEFINED + +#include "GrAllocPool.h" +#include "GrFontScaler.h" +#include "GrTHashCache.h" +#include "GrPoint.h" +#include "GrGlyph.h" + +class GrAtlasMgr; +class GrFontCache; +class GrGpu; +class GrFontPurgeListener; + +/** + * The textcache maps a hostfontscaler instance to a dictionary of + * glyphid->strike + */ +class GrTextStrike { +public: + GrTextStrike(GrFontCache*, const GrKey* fontScalerKey, GrMaskFormat, + GrAtlasMgr*); + ~GrTextStrike(); + + const GrKey* getFontScalerKey() const { return fFontScalerKey; } + GrFontCache* getFontCache() const { return fFontCache; } + GrMaskFormat getMaskFormat() const { return fMaskFormat; } + + inline GrGlyph* getGlyph(GrGlyph::PackedID, GrFontScaler*); + bool getGlyphAtlas(GrGlyph*, GrFontScaler*); + + // testing + int countGlyphs() const { return fCache.getArray().count(); } + const GrGlyph* glyphAt(int index) const { + return fCache.getArray()[index]; + } + GrAtlas* getAtlas() const { return fAtlas; } + +public: + // for LRU + GrTextStrike* fPrev; + GrTextStrike* fNext; + +private: + class Key; + GrTHashTable<GrGlyph, Key, 7> fCache; + const GrKey* fFontScalerKey; + GrTAllocPool<GrGlyph> fPool; + + GrFontCache* fFontCache; + GrAtlasMgr* fAtlasMgr; + GrAtlas* fAtlas; // linklist + + GrMaskFormat fMaskFormat; + + GrGlyph* generateGlyph(GrGlyph::PackedID packed, GrFontScaler* scaler); + // returns true if after the purge, the strike is empty + bool purgeAtlasAtY(GrAtlas* atlas, int yCoord); + + friend class GrFontCache; +}; + +class GrFontCache { +public: + GrFontCache(GrGpu*); + ~GrFontCache(); + + inline GrTextStrike* getStrike(GrFontScaler*); + + void freeAll(); + + void purgeExceptFor(GrTextStrike*); + + // testing + int countStrikes() const { return fCache.getArray().count(); } + const GrTextStrike* strikeAt(int index) const { + return fCache.getArray()[index]; + } + GrTextStrike* getHeadStrike() const { return fHead; } + +#if GR_DEBUG + void validate() const; +#else + void validate() const {} +#endif + +private: + friend class GrFontPurgeListener; + + class Key; + GrTHashTable<GrTextStrike, Key, 8> fCache; + // for LRU + GrTextStrike* fHead; + GrTextStrike* fTail; + + GrGpu* fGpu; + GrAtlasMgr* fAtlasMgr; + + + GrTextStrike* generateStrike(GrFontScaler*, const Key&); + inline void detachStrikeFromList(GrTextStrike*); +}; + +#endif + |