Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: src/core/SkGlyphCache.h

Issue 912983002: Use SkTHashMap in SkGlyphCache. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/core/SkGlyphCache.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkGlyphCache_DEFINED 8 #ifndef SkGlyphCache_DEFINED
9 #define SkGlyphCache_DEFINED 9 #define SkGlyphCache_DEFINED
10 10
11 #include "SkBitmap.h" 11 #include "SkBitmap.h"
12 #include "SkChecksum.h" 12 #include "SkChecksum.h"
13 #include "SkChunkAlloc.h" 13 #include "SkChunkAlloc.h"
14 #include "SkDescriptor.h" 14 #include "SkDescriptor.h"
15 #include "SkGlyph.h" 15 #include "SkGlyph.h"
16 #include "SkScalerContext.h" 16 #include "SkScalerContext.h"
17 #include "SkTDArray.h"
18 #include "SkTHash.h"
17 #include "SkTemplates.h" 19 #include "SkTemplates.h"
18 #include "SkTDArray.h"
19 20
20 struct SkDeviceProperties; 21 struct SkDeviceProperties;
21 class SkPaint; 22 class SkPaint;
22 23
23 class SkGlyphCache_Globals; 24 class SkGlyphCache_Globals;
24 25
25 // Enable this locally to add stats for hash-table hit rates. It also extends th e dump()
26 // output to show those stats.
27 //#define SK_GLYPHCACHE_TRACK_HASH_STATS
28
29 /** \class SkGlyphCache 26 /** \class SkGlyphCache
30 27
31 This class represents a strike: a specific combination of typeface, size, 28 This class represents a strike: a specific combination of typeface, size,
32 matrix, etc., and holds the glyphs for that strike. Calling any of the 29 matrix, etc., and holds the glyphs for that strike. Calling any of the
33 getUnichar.../getGlyphID... methods will return the requested glyph, 30 getUnichar.../getGlyphID... methods will return the requested glyph,
34 either instantly if it is already cached, or by first generating it and then 31 either instantly if it is already cached, or by first generating it and then
35 adding it to the strike. 32 adding it to the strike.
36 33
37 The strikes are held in a global list, available to all threads. To interact 34 The strikes are held in a global list, available to all threads. To interact
38 with one, call either VisitCache() or DetachCache(). 35 with one, call either VisitCache() or DetachCache().
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 }; 185 };
189 186
190 SkGlyph* lookupMetrics(uint32_t id, MetricsType); 187 SkGlyph* lookupMetrics(uint32_t id, MetricsType);
191 static bool DetachProc(const SkGlyphCache*, void*) { return true; } 188 static bool DetachProc(const SkGlyphCache*, void*) { return true; }
192 189
193 SkGlyphCache* fNext, *fPrev; 190 SkGlyphCache* fNext, *fPrev;
194 SkDescriptor* fDesc; 191 SkDescriptor* fDesc;
195 SkScalerContext* fScalerContext; 192 SkScalerContext* fScalerContext;
196 SkPaint::FontMetrics fFontMetrics; 193 SkPaint::FontMetrics fFontMetrics;
197 194
198 enum { 195 static uint32_t HashGlyphID(uint32_t glyphID) { return SkChecksum::CheapMix (glyphID); }
199 kHashBits = 8, 196 static uint32_t HashUnichar(SkUnichar unichar) { return SkChecksum::CheapMix (unichar); }
200 kHashCount = 1 << kHashBits,
201 kHashMask = kHashCount - 1
202 };
203 SkGlyph* fGlyphHash[kHashCount];
204 SkTDArray<SkGlyph*> fGlyphArray;
205 SkChunkAlloc fGlyphAlloc;
206 197
207 struct CharGlyphRec { 198 SkTHashMap<uint32_t, SkGlyph, HashGlyphID> fGlyphs;
208 uint32_t fID; // unichar + subpixel 199 SkTHashMap<SkUnichar, uint16_t, HashUnichar> fCharToGlyphID;
209 SkGlyph* fGlyph;
210 };
211 // no reason to use the same kHashCount as fGlyphHash, but we do for now
212 // Dynamically allocated when chars are encountered.
213 SkAutoTArray<CharGlyphRec> fCharToGlyphHash;
214
215 CharGlyphRec* getCharGlyphRec(uint32_t id);
216 200
217 static inline unsigned ID2HashIndex(uint32_t h) { 201 SkChunkAlloc fAlloc;
218 return SkChecksum::CheapMix(h) & kHashMask;
219 }
220 202
221 // used to track (approx) how much ram is tied-up in this cache 203 // used to track (approx) how much ram is tied-up in this cache
222 size_t fMemoryUsed; 204 size_t fMemoryUsed;
223 205
224
225 #ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
226 int fHashHitCount;
227 int fHashMissCount;
228 #endif
229
230 struct AuxProcRec { 206 struct AuxProcRec {
231 AuxProcRec* fNext; 207 AuxProcRec* fNext;
232 void (*fProc)(void*); 208 void (*fProc)(void*);
233 void* fData; 209 void* fData;
234 }; 210 };
235 AuxProcRec* fAuxProcList; 211 AuxProcRec* fAuxProcList;
236 void invokeAndRemoveAuxProcs(); 212 void invokeAndRemoveAuxProcs();
237 213
238 inline static SkGlyphCache* FindTail(SkGlyphCache* head); 214 inline static SkGlyphCache* FindTail(SkGlyphCache* head);
239 215
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 const SkMatrix* matrix) { 280 const SkMatrix* matrix) {
305 fCache = paint.detachCache(deviceProperties, matrix, true); 281 fCache = paint.detachCache(deviceProperties, matrix, true);
306 } 282 }
307 283
308 private: 284 private:
309 SkAutoGlyphCacheNoGamma() : SkAutoGlyphCacheBase() {} 285 SkAutoGlyphCacheNoGamma() : SkAutoGlyphCacheBase() {}
310 }; 286 };
311 #define SkAutoGlyphCacheNoGamma(...) SK_REQUIRE_LOCAL_VAR(SkAutoGlyphCacheNoGamm a) 287 #define SkAutoGlyphCacheNoGamma(...) SK_REQUIRE_LOCAL_VAR(SkAutoGlyphCacheNoGamm a)
312 288
313 #endif 289 #endif
OLDNEW
« no previous file with comments | « no previous file | src/core/SkGlyphCache.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698