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

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

Issue 881953002: patch from issue 885453002 at patchset 20001 (http://crrev.com/885453002#ps20001) (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 11 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/SkGlyphCache.h ('k') | no next file » | 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 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkGlyphCache.h" 10 #include "SkGlyphCache.h"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 SkASSERT(desc); 79 SkASSERT(desc);
80 SkASSERT(ctx); 80 SkASSERT(ctx);
81 81
82 fPrev = fNext = NULL; 82 fPrev = fNext = NULL;
83 83
84 fDesc = desc->copy(); 84 fDesc = desc->copy();
85 fScalerContext->getFontMetrics(&fFontMetrics); 85 fScalerContext->getFontMetrics(&fFontMetrics);
86 86
87 // init to 0 so that all of the pointers will be null 87 // init to 0 so that all of the pointers will be null
88 memset(fGlyphHash, 0, sizeof(fGlyphHash)); 88 memset(fGlyphHash, 0, sizeof(fGlyphHash));
89 // init with 0xFF so that the charCode field will be -1, which is invalid 89
90 memset(fCharToGlyphHash, 0xFF, sizeof(fCharToGlyphHash));
91
92 fMemoryUsed = sizeof(*this); 90 fMemoryUsed = sizeof(*this);
93 91
94 fGlyphArray.setReserve(kMinGlyphCount); 92 fGlyphArray.setReserve(kMinGlyphCount);
95 93
96 fAuxProcList = NULL; 94 fAuxProcList = NULL;
97 } 95 }
98 96
99 SkGlyphCache::~SkGlyphCache() { 97 SkGlyphCache::~SkGlyphCache() {
100 #if 0 98 #if 0
101 { 99 {
102 size_t ptrMem = fGlyphArray.count() * sizeof(SkGlyph*); 100 size_t ptrMem = fGlyphArray.count() * sizeof(SkGlyph*);
103 size_t glyphAlloc = fGlyphAlloc.totalCapacity(); 101 size_t glyphAlloc = fGlyphAlloc.totalCapacity();
104 size_t glyphHashUsed = 0; 102 size_t glyphHashUsed = 0;
105 size_t uniHashUsed = 0; 103 size_t uniHashUsed = 0;
106 for (int i = 0; i < kHashCount; ++i) { 104 for (int i = 0; i < kHashCount; ++i) {
107 glyphHashUsed += fGlyphHash[i] ? sizeof(fGlyphHash[0]) : 0; 105 glyphHashUsed += fGlyphHash[i] ? sizeof(fGlyphHash[0]) : 0;
108 uniHashUsed += fCharToGlyphHash[i].fID != 0xFFFFFFFF ? sizeof(fCharT oGlyphHash[0]) : 0; 106 uniHashUsed += fCharToGlyphHash[i].fID != 0xFFFFFFFF ? sizeof(fCharT oGlyphHash[0]) : 0;
109 } 107 }
110 size_t glyphUsed = fGlyphArray.count() * sizeof(SkGlyph); 108 size_t glyphUsed = fGlyphArray.count() * sizeof(SkGlyph);
111 size_t imageUsed = 0; 109 size_t imageUsed = 0;
112 for (int i = 0; i < fGlyphArray.count(); ++i) { 110 for (int i = 0; i < fGlyphArray.count(); ++i) {
113 const SkGlyph& g = *fGlyphArray[i]; 111 const SkGlyph& g = *fGlyphArray[i];
114 if (g.fImage) { 112 if (g.fImage) {
115 imageUsed += g.fHeight * g.rowBytes(); 113 imageUsed += g.fHeight * g.rowBytes();
116 } 114 }
117 } 115 }
118 116
119 printf("glyphPtrArray,%zu, Alloc,%zu, imageUsed,%zu, glyphUsed,%zu, glyp hHashAlloc,%zu, glyphHashUsed,%zu, unicharHashAlloc,%zu, unicharHashUsed,%zu\n", 117 SkDebugf("glyphPtrArray,%zu, Alloc,%zu, imageUsed,%zu, glyphUsed,%zu, gl yphHashAlloc,%zu, glyphHashUsed,%zu, unicharHashAlloc,%zu, unicharHashUsed,%zu\n ",
120 ptrMem, glyphAlloc, imageUsed, glyphUsed, sizeof(fGlyphHash), g lyphHashUsed, sizeof(fCharToGlyphHash), uniHashUsed); 118 ptrMem, glyphAlloc, imageUsed, glyphUsed, sizeof(fGlyphHash), g lyphHashUsed, sizeof(CharGlyphRec) * kHashCount, uniHashUsed);
121 119
122 } 120 }
123 #endif 121 #endif
124 SkGlyph** gptr = fGlyphArray.begin(); 122 SkGlyph** gptr = fGlyphArray.begin();
125 SkGlyph** stop = fGlyphArray.end(); 123 SkGlyph** stop = fGlyphArray.end();
126 while (gptr < stop) { 124 while (gptr < stop) {
127 SkPath* path = (*gptr)->fPath; 125 SkPath* path = (*gptr)->fPath;
128 if (path) { 126 if (path) {
129 SkDELETE(path); 127 SkDELETE(path);
130 } 128 }
131 gptr += 1; 129 gptr += 1;
132 } 130 }
133 SkDescriptor::Free(fDesc); 131 SkDescriptor::Free(fDesc);
134 SkDELETE(fScalerContext); 132 SkDELETE(fScalerContext);
135 this->invokeAndRemoveAuxProcs(); 133 this->invokeAndRemoveAuxProcs();
136 } 134 }
137 135
136 SkGlyphCache::CharGlyphRec* SkGlyphCache::getCharGlyphRec(uint32_t id) {
137 if (NULL == fCharToGlyphHash) {
138 fCharToGlyphHash.reset(new CharGlyphRec[kHashCount]);
139 // init with 0xFF so that the charCode field will be -1, which is invali d
140 memset(fCharToGlyphHash, 0xFF, sizeof(CharGlyphRec) * kHashCount);
141 }
142
143 return &fCharToGlyphHash[ID2HashIndex(id)];
144 }
145
138 /////////////////////////////////////////////////////////////////////////////// 146 ///////////////////////////////////////////////////////////////////////////////
139 147
140 #ifdef SK_DEBUG 148 #ifdef SK_DEBUG
141 #define VALIDATE() AutoValidate av(this) 149 #define VALIDATE() AutoValidate av(this)
142 #else 150 #else
143 #define VALIDATE() 151 #define VALIDATE()
144 #endif 152 #endif
145 153
146 uint16_t SkGlyphCache::unicharToGlyph(SkUnichar charCode) { 154 uint16_t SkGlyphCache::unicharToGlyph(SkUnichar charCode) {
147 VALIDATE(); 155 VALIDATE();
148 uint32_t id = SkGlyph::MakeID(charCode); 156 uint32_t id = SkGlyph::MakeID(charCode);
149 const CharGlyphRec& rec = fCharToGlyphHash[ID2HashIndex(id)]; 157 const CharGlyphRec& rec = *this->getCharGlyphRec(id);
150 158
151 if (rec.fID == id) { 159 if (rec.fID == id) {
152 return rec.fGlyph->getGlyphID(); 160 return rec.fGlyph->getGlyphID();
153 } else { 161 } else {
154 return fScalerContext->charToGlyphID(charCode); 162 return fScalerContext->charToGlyphID(charCode);
155 } 163 }
156 } 164 }
157 165
158 SkUnichar SkGlyphCache::glyphToUnichar(uint16_t glyphID) { 166 SkUnichar SkGlyphCache::glyphToUnichar(uint16_t glyphID) {
159 return fScalerContext->glyphIDToChar(glyphID); 167 return fScalerContext->glyphIDToChar(glyphID);
160 } 168 }
161 169
162 unsigned SkGlyphCache::getGlyphCount() { 170 unsigned SkGlyphCache::getGlyphCount() {
163 return fScalerContext->getGlyphCount(); 171 return fScalerContext->getGlyphCount();
164 } 172 }
165 173
166 /////////////////////////////////////////////////////////////////////////////// 174 ///////////////////////////////////////////////////////////////////////////////
167 175
168 const SkGlyph& SkGlyphCache::getUnicharAdvance(SkUnichar charCode) { 176 const SkGlyph& SkGlyphCache::getUnicharAdvance(SkUnichar charCode) {
169 VALIDATE(); 177 VALIDATE();
170 uint32_t id = SkGlyph::MakeID(charCode); 178 uint32_t id = SkGlyph::MakeID(charCode);
171 CharGlyphRec* rec = &fCharToGlyphHash[ID2HashIndex(id)]; 179 CharGlyphRec* rec = this->getCharGlyphRec(id);
172 180
173 if (rec->fID != id) { 181 if (rec->fID != id) {
174 // this ID is based on the UniChar 182 // this ID is based on the UniChar
175 rec->fID = id; 183 rec->fID = id;
176 // this ID is based on the glyph index 184 // this ID is based on the glyph index
177 id = SkGlyph::MakeID(fScalerContext->charToGlyphID(charCode)); 185 id = SkGlyph::MakeID(fScalerContext->charToGlyphID(charCode));
178 rec->fGlyph = this->lookupMetrics(id, kJustAdvance_MetricsType); 186 rec->fGlyph = this->lookupMetrics(id, kJustAdvance_MetricsType);
179 } 187 }
180 return *rec->fGlyph; 188 return *rec->fGlyph;
181 } 189 }
182 190
183 const SkGlyph& SkGlyphCache::getGlyphIDAdvance(uint16_t glyphID) { 191 const SkGlyph& SkGlyphCache::getGlyphIDAdvance(uint16_t glyphID) {
184 VALIDATE(); 192 VALIDATE();
185 uint32_t id = SkGlyph::MakeID(glyphID); 193 uint32_t id = SkGlyph::MakeID(glyphID);
186 unsigned index = ID2HashIndex(id); 194 unsigned index = ID2HashIndex(id);
187 SkGlyph* glyph = fGlyphHash[index]; 195 SkGlyph* glyph = fGlyphHash[index];
188 196
189 if (NULL == glyph || glyph->fID != id) { 197 if (NULL == glyph || glyph->fID != id) {
190 glyph = this->lookupMetrics(glyphID, kJustAdvance_MetricsType); 198 glyph = this->lookupMetrics(glyphID, kJustAdvance_MetricsType);
191 fGlyphHash[index] = glyph; 199 fGlyphHash[index] = glyph;
192 } 200 }
193 return *glyph; 201 return *glyph;
194 } 202 }
195 203
196 /////////////////////////////////////////////////////////////////////////////// 204 ///////////////////////////////////////////////////////////////////////////////
197 205
198 const SkGlyph& SkGlyphCache::getUnicharMetrics(SkUnichar charCode) { 206 const SkGlyph& SkGlyphCache::getUnicharMetrics(SkUnichar charCode) {
199 VALIDATE(); 207 VALIDATE();
200 uint32_t id = SkGlyph::MakeID(charCode); 208 uint32_t id = SkGlyph::MakeID(charCode);
201 CharGlyphRec* rec = &fCharToGlyphHash[ID2HashIndex(id)]; 209 CharGlyphRec* rec = this->getCharGlyphRec(id);
202 210
203 if (rec->fID != id) { 211 if (rec->fID != id) {
204 RecordHashCollisionIf(rec->fGlyph != NULL); 212 RecordHashCollisionIf(rec->fGlyph != NULL);
205 // this ID is based on the UniChar 213 // this ID is based on the UniChar
206 rec->fID = id; 214 rec->fID = id;
207 // this ID is based on the glyph index 215 // this ID is based on the glyph index
208 id = SkGlyph::MakeID(fScalerContext->charToGlyphID(charCode)); 216 id = SkGlyph::MakeID(fScalerContext->charToGlyphID(charCode));
209 rec->fGlyph = this->lookupMetrics(id, kFull_MetricsType); 217 rec->fGlyph = this->lookupMetrics(id, kFull_MetricsType);
210 } else { 218 } else {
211 RecordHashSuccess(); 219 RecordHashSuccess();
212 if (rec->fGlyph->isJustAdvance()) { 220 if (rec->fGlyph->isJustAdvance()) {
213 fScalerContext->getMetrics(rec->fGlyph); 221 fScalerContext->getMetrics(rec->fGlyph);
214 } 222 }
215 } 223 }
216 SkASSERT(rec->fGlyph->isFullMetrics()); 224 SkASSERT(rec->fGlyph->isFullMetrics());
217 return *rec->fGlyph; 225 return *rec->fGlyph;
218 } 226 }
219 227
220 const SkGlyph& SkGlyphCache::getUnicharMetrics(SkUnichar charCode, 228 const SkGlyph& SkGlyphCache::getUnicharMetrics(SkUnichar charCode,
221 SkFixed x, SkFixed y) { 229 SkFixed x, SkFixed y) {
222 VALIDATE(); 230 VALIDATE();
223 uint32_t id = SkGlyph::MakeID(charCode, x, y); 231 uint32_t id = SkGlyph::MakeID(charCode, x, y);
224 CharGlyphRec* rec = &fCharToGlyphHash[ID2HashIndex(id)]; 232 CharGlyphRec* rec = this->getCharGlyphRec(id);
225 233
226 if (rec->fID != id) { 234 if (rec->fID != id) {
227 RecordHashCollisionIf(rec->fGlyph != NULL); 235 RecordHashCollisionIf(rec->fGlyph != NULL);
228 // this ID is based on the UniChar 236 // this ID is based on the UniChar
229 rec->fID = id; 237 rec->fID = id;
230 // this ID is based on the glyph index 238 // this ID is based on the glyph index
231 id = SkGlyph::MakeID(fScalerContext->charToGlyphID(charCode), x, y); 239 id = SkGlyph::MakeID(fScalerContext->charToGlyphID(charCode), x, y);
232 rec->fGlyph = this->lookupMetrics(id, kFull_MetricsType); 240 rec->fGlyph = this->lookupMetrics(id, kFull_MetricsType);
233 } else { 241 } else {
234 RecordHashSuccess(); 242 RecordHashSuccess();
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 return tls ? tls->getCacheSizeLimit() : 0; 709 return tls ? tls->getCacheSizeLimit() : 0;
702 } 710 }
703 711
704 void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { 712 void SkGraphics::SetTLSFontCacheLimit(size_t bytes) {
705 if (0 == bytes) { 713 if (0 == bytes) {
706 SkGlyphCache_Globals::DeleteTLS(); 714 SkGlyphCache_Globals::DeleteTLS();
707 } else { 715 } else {
708 SkGlyphCache_Globals::GetTLS().setCacheSizeLimit(bytes); 716 SkGlyphCache_Globals::GetTLS().setCacheSizeLimit(bytes);
709 } 717 }
710 } 718 }
OLDNEW
« no previous file with comments | « src/core/SkGlyphCache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698