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

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

Issue 877113002: use murmur3 finisher to improve font hash efficiency (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: add CheapMix helper" 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 | « src/core/SkChecksum.h ('k') | 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
2 /* 1 /*
3 * Copyright 2006 The Android Open Source Project 2 * Copyright 2006 The Android Open Source Project
4 * 3 *
5 * 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
6 * found in the LICENSE file. 5 * found in the LICENSE file.
7 */ 6 */
8 7
9
10 #ifndef SkGlyphCache_DEFINED 8 #ifndef SkGlyphCache_DEFINED
11 #define SkGlyphCache_DEFINED 9 #define SkGlyphCache_DEFINED
12 10
13 #include "SkBitmap.h" 11 #include "SkBitmap.h"
12 #include "SkChecksum.h"
14 #include "SkChunkAlloc.h" 13 #include "SkChunkAlloc.h"
15 #include "SkDescriptor.h" 14 #include "SkDescriptor.h"
16 #include "SkGlyph.h" 15 #include "SkGlyph.h"
17 #include "SkScalerContext.h" 16 #include "SkScalerContext.h"
18 #include "SkTemplates.h" 17 #include "SkTemplates.h"
19 #include "SkTDArray.h" 18 #include "SkTDArray.h"
20 19
21 struct SkDeviceProperties; 20 struct SkDeviceProperties;
22 class SkPaint; 21 class SkPaint;
23 22
24 class SkGlyphCache_Globals; 23 class SkGlyphCache_Globals;
25 24
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
26 /** \class SkGlyphCache 29 /** \class SkGlyphCache
27 30
28 This class represents a strike: a specific combination of typeface, size, 31 This class represents a strike: a specific combination of typeface, size,
29 matrix, etc., and holds the glyphs for that strike. Calling any of the 32 matrix, etc., and holds the glyphs for that strike. Calling any of the
30 getUnichar.../getGlyphID... methods will return the requested glyph, 33 getUnichar.../getGlyphID... methods will return the requested glyph,
31 either instantly if it is already cached, or by first generating it and then 34 either instantly if it is already cached, or by first generating it and then
32 adding it to the strike. 35 adding it to the strike.
33 36
34 The strikes are held in a global list, available to all threads. To interact 37 The strikes are held in a global list, available to all threads. To interact
35 with one, call either VisitCache() or DetachCache(). 38 with one, call either VisitCache() or DetachCache().
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 const SkDescriptor& getDescriptor() const { return *fDesc; } 97 const SkDescriptor& getDescriptor() const { return *fDesc; }
95 98
96 SkMask::Format getMaskFormat() const { 99 SkMask::Format getMaskFormat() const {
97 return fScalerContext->getMaskFormat(); 100 return fScalerContext->getMaskFormat();
98 } 101 }
99 102
100 bool isSubpixel() const { 103 bool isSubpixel() const {
101 return fScalerContext->isSubpixel(); 104 return fScalerContext->isSubpixel();
102 } 105 }
103 106
107 void dump() const;
108
104 /* AuxProc/Data allow a client to associate data with this cache entry. 109 /* AuxProc/Data allow a client to associate data with this cache entry.
105 Multiple clients can use this, as their data is keyed with a function 110 Multiple clients can use this, as their data is keyed with a function
106 pointer. In addition to serving as a key, the function pointer is called 111 pointer. In addition to serving as a key, the function pointer is called
107 with the data when the glyphcache object is deleted, so the client can 112 with the data when the glyphcache object is deleted, so the client can
108 cleanup their data as well. NOTE: the auxProc must not try to access 113 cleanup their data as well. NOTE: the auxProc must not try to access
109 this glyphcache in any way, since it may be in the process of being 114 this glyphcache in any way, since it may be in the process of being
110 deleted. 115 deleted.
111 */ 116 */
112 117
113 //! If the proc is found, return true and set *dataPtr to its data 118 //! If the proc is found, return true and set *dataPtr to its data
(...skipping 24 matching lines...) Expand all
138 a different strike will be generated. This is fine. It does mean we 143 a different strike will be generated. This is fine. It does mean we
139 can have more than 1 strike for the same descriptor, but that will 144 can have more than 1 strike for the same descriptor, but that will
140 eventually get purged, and the win is that different thread will never 145 eventually get purged, and the win is that different thread will never
141 block each other while a strike is being used. 146 block each other while a strike is being used.
142 */ 147 */
143 static SkGlyphCache* DetachCache(SkTypeface* typeface, 148 static SkGlyphCache* DetachCache(SkTypeface* typeface,
144 const SkDescriptor* desc) { 149 const SkDescriptor* desc) {
145 return VisitCache(typeface, desc, DetachProc, NULL); 150 return VisitCache(typeface, desc, DetachProc, NULL);
146 } 151 }
147 152
153 static void Dump();
154
148 #ifdef SK_DEBUG 155 #ifdef SK_DEBUG
149 void validate() const; 156 void validate() const;
150 #else 157 #else
151 void validate() const {} 158 void validate() const {}
152 #endif 159 #endif
153 160
154 class AutoValidate : SkNoncopyable { 161 class AutoValidate : SkNoncopyable {
155 public: 162 public:
156 AutoValidate(const SkGlyphCache* cache) : fCache(cache) { 163 AutoValidate(const SkGlyphCache* cache) : fCache(cache) {
157 if (fCache) { 164 if (fCache) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 SkTDArray<SkGlyph*> fGlyphArray; 204 SkTDArray<SkGlyph*> fGlyphArray;
198 SkChunkAlloc fGlyphAlloc; 205 SkChunkAlloc fGlyphAlloc;
199 206
200 struct CharGlyphRec { 207 struct CharGlyphRec {
201 uint32_t fID; // unichar + subpixel 208 uint32_t fID; // unichar + subpixel
202 SkGlyph* fGlyph; 209 SkGlyph* fGlyph;
203 }; 210 };
204 // no reason to use the same kHashCount as fGlyphHash, but we do for now 211 // no reason to use the same kHashCount as fGlyphHash, but we do for now
205 CharGlyphRec fCharToGlyphHash[kHashCount]; 212 CharGlyphRec fCharToGlyphHash[kHashCount];
206 213
207 static inline unsigned ID2HashIndex(uint32_t id) { 214 static inline unsigned ID2HashIndex(uint32_t h) {
208 id ^= id >> 16; 215 return SkChecksum::CheapMix(h) & kHashMask;
209 id ^= id >> 8;
210 return id & kHashMask;
211 } 216 }
212 217
213 // used to track (approx) how much ram is tied-up in this cache 218 // used to track (approx) how much ram is tied-up in this cache
214 size_t fMemoryUsed; 219 size_t fMemoryUsed;
215 220
221
222 #ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
223 int fHashHitCount;
224 int fHashMissCount;
225 #endif
226
216 struct AuxProcRec { 227 struct AuxProcRec {
217 AuxProcRec* fNext; 228 AuxProcRec* fNext;
218 void (*fProc)(void*); 229 void (*fProc)(void*);
219 void* fData; 230 void* fData;
220 }; 231 };
221 AuxProcRec* fAuxProcList; 232 AuxProcRec* fAuxProcList;
222 void invokeAndRemoveAuxProcs(); 233 void invokeAndRemoveAuxProcs();
223 234
224 inline static SkGlyphCache* FindTail(SkGlyphCache* head); 235 inline static SkGlyphCache* FindTail(SkGlyphCache* head);
225 236
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 const SkMatrix* matrix) { 301 const SkMatrix* matrix) {
291 fCache = paint.detachCache(deviceProperties, matrix, true); 302 fCache = paint.detachCache(deviceProperties, matrix, true);
292 } 303 }
293 304
294 private: 305 private:
295 SkAutoGlyphCacheNoGamma() : SkAutoGlyphCacheBase() {} 306 SkAutoGlyphCacheNoGamma() : SkAutoGlyphCacheBase() {}
296 }; 307 };
297 #define SkAutoGlyphCacheNoGamma(...) SK_REQUIRE_LOCAL_VAR(SkAutoGlyphCacheNoGamm a) 308 #define SkAutoGlyphCacheNoGamma(...) SK_REQUIRE_LOCAL_VAR(SkAutoGlyphCacheNoGamm a)
298 309
299 #endif 310 #endif
OLDNEW
« no previous file with comments | « src/core/SkChecksum.h ('k') | src/core/SkGlyphCache.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698