/* * 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 fCache; const GrKey* fFontScalerKey; GrTAllocPool 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 fCache; // for LRU GrTextStrike* fHead; GrTextStrike* fTail; GrGpu* fGpu; GrAtlasMgr* fAtlasMgr; GrTextStrike* generateStrike(GrFontScaler*, const Key&); inline void detachStrikeFromList(GrTextStrike*); }; #endif