1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
/*
* 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 "GrTHashTable.h"
#include "GrPoint.h"
#include "GrGlyph.h"
#include "GrDrawTarget.h"
#include "GrAtlas.h"
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];
}
// returns true if a plot was removed
bool removeUnusedPlots();
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;
GrMaskFormat fMaskFormat;
#if SK_DISTANCEFIELD_FONTS
bool fUseDistanceField;
#endif
GrAtlas fAtlas;
GrGlyph* generateGlyph(GrGlyph::PackedID packed, GrFontScaler* scaler);
friend class GrFontCache;
};
class GrFontCache {
public:
GrFontCache(GrGpu*);
~GrFontCache();
#if SK_DISTANCEFIELD_FONTS
inline GrTextStrike* getStrike(GrFontScaler*, bool useDistanceField);
#else
inline GrTextStrike* getStrike(GrFontScaler*);
#endif
void freeAll();
void purgeExceptFor(GrTextStrike*);
// remove an unused plot and its strike (if necessary)
void freePlotExceptFor(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;
#else
void validate() const {}
#endif
#ifdef SK_DEVELOPER
void dump() const;
#endif
enum AtlasType {
kA8_AtlasType, //!< 1-byte per pixel
k565_AtlasType, //!< 2-bytes per pixel
k8888_AtlasType, //!< 4-bytes per pixel
kLast_AtlasType = k8888_AtlasType
};
static const int kAtlasCount = kLast_AtlasType + 1;
private:
friend class GrFontPurgeListener;
class Key;
GrTHashTable<GrTextStrike, Key, 8> fCache;
// for LRU
GrTextStrike* fHead;
GrTextStrike* fTail;
GrGpu* fGpu;
GrAtlasMgr* fAtlasMgr[kAtlasCount];
GrTextStrike* generateStrike(GrFontScaler*, const Key&);
inline void detachStrikeFromList(GrTextStrike*);
void purgeStrike(GrTextStrike* strike);
};
#endif
|