blob: a5abde6fac4d2ca31120087e00d840816be93f07 [file] [log] [blame]
* 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"
#include "GrDrawTarget.h"
class GrAtlasMgr;
class GrFontCache;
class GrGpu;
class GrFontPurgeListener;
* The textcache maps a hostfontscaler instance to a dictionary of
* glyphid->strike
class GrTextStrike {
GrTextStrike(GrFontCache*, const GrKey* fontScalerKey, GrMaskFormat,
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*, GrDrawTarget::DrawToken currentDrawToken);
// testing
int countGlyphs() const { return fCache.getArray().count(); }
const GrGlyph* glyphAt(int index) const {
return fCache.getArray()[index];
GrAtlas* getAtlas() const { return fAtlas; }
// returns true if an atlas was removed
bool removeUnusedAtlases();
// for LRU
GrTextStrike* fPrev;
GrTextStrike* fNext;
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 {
inline GrTextStrike* getStrike(GrFontScaler*);
void freeAll();
void purgeExceptFor(GrTextStrike*);
// remove an unused atlas and its strike (if necessary)
void freeAtlasExceptFor(GrTextStrike*);
// testing
int countStrikes() const { return fCache.getArray().count(); }
const GrTextStrike* strikeAt(int index) const {
return fCache.getArray()[index];
GrTextStrike* getHeadStrike() const { return fHead; }
#ifdef SK_DEBUG
void validate() const;
void validate() const {}
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*);