| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |