| Index: src/core/SkGlyphCache.cpp
|
| diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp
|
| index a1f738e81bd3a1092c0078666ae6932aa485e144..8d9fb039ffde4b6a81bae23f82793c6f612d8375 100644
|
| --- a/src/core/SkGlyphCache.cpp
|
| +++ b/src/core/SkGlyphCache.cpp
|
| @@ -48,14 +48,13 @@ bool gSkSuppressFontCachePurgeSpew;
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| -#define kMinGlphAlloc (sizeof(SkGlyph) * 64)
|
| -#define kMinImageAlloc (24 * 64) // should be pointsize-dependent
|
| -
|
| -#define METRICS_RESERVE_COUNT 128 // so we don't grow this array a lot
|
| +// so we don't grow our arrays a lot
|
| +#define kMinGlyphCount 16
|
| +#define kMinGlyphImageSize (16*2)
|
| +#define kMinAllocAmount ((sizeof(SkGlyph) + kMinGlyphImageSize) * kMinGlyphCount)
|
|
|
| SkGlyphCache::SkGlyphCache(SkTypeface* typeface, const SkDescriptor* desc)
|
| - : fGlyphAlloc(kMinGlphAlloc)
|
| - , fImageAlloc(kMinImageAlloc) {
|
| + : fGlyphAlloc(kMinAllocAmount) {
|
| SkASSERT(typeface);
|
|
|
| fPrev = fNext = NULL;
|
| @@ -69,9 +68,9 @@ SkGlyphCache::SkGlyphCache(SkTypeface* typeface, const SkDescriptor* desc)
|
| // init with 0xFF so that the charCode field will be -1, which is invalid
|
| memset(fCharToGlyphHash, 0xFF, sizeof(fCharToGlyphHash));
|
|
|
| - fMemoryUsed = sizeof(*this) + kMinGlphAlloc + kMinImageAlloc;
|
| + fMemoryUsed = sizeof(*this);
|
|
|
| - fGlyphArray.setReserve(METRICS_RESERVE_COUNT);
|
| + fGlyphArray.setReserve(kMinGlyphCount);
|
|
|
| fMetricsCount = 0;
|
| fAdvanceCount = 0;
|
| @@ -79,6 +78,30 @@ SkGlyphCache::SkGlyphCache(SkTypeface* typeface, const SkDescriptor* desc)
|
| }
|
|
|
| SkGlyphCache::~SkGlyphCache() {
|
| +#if 0
|
| + {
|
| + size_t ptrMem = fGlyphArray.count() * sizeof(SkGlyph*);
|
| + size_t glyphAlloc = fGlyphAlloc.totalCapacity();
|
| + size_t glyphHashUsed = 0;
|
| + size_t uniHashUsed = 0;
|
| + for (int i = 0; i < kHashCount; ++i) {
|
| + glyphHashUsed += fGlyphHash[i] ? sizeof(fGlyphHash[0]) : 0;
|
| + uniHashUsed += fCharToGlyphHash[i].fID != 0xFFFFFFFF ? sizeof(fCharToGlyphHash[0]) : 0;
|
| + }
|
| + size_t glyphUsed = fGlyphArray.count() * sizeof(SkGlyph);
|
| + size_t imageUsed = 0;
|
| + for (int i = 0; i < fGlyphArray.count(); ++i) {
|
| + const SkGlyph& g = *fGlyphArray[i];
|
| + if (g.fImage) {
|
| + imageUsed += g.fHeight * g.rowBytes();
|
| + }
|
| + }
|
| +
|
| + printf("glyphPtrArray,%zu, Alloc,%zu, imageUsed,%zu, glyphUsed,%zu, glyphHashAlloc,%zu, glyphHashUsed,%zu, unicharHashAlloc,%zu, unicharHashUsed,%zu\n",
|
| + ptrMem, glyphAlloc, imageUsed, glyphUsed, sizeof(fGlyphHash), glyphHashUsed, sizeof(fCharToGlyphHash), uniHashUsed);
|
| +
|
| + }
|
| +#endif
|
| SkGlyph** gptr = fGlyphArray.begin();
|
| SkGlyph** stop = fGlyphArray.end();
|
| while (gptr < stop) {
|
| @@ -296,7 +319,7 @@ const void* SkGlyphCache::findImage(const SkGlyph& glyph) {
|
| if (glyph.fWidth > 0 && glyph.fWidth < kMaxGlyphWidth) {
|
| if (glyph.fImage == NULL) {
|
| size_t size = glyph.computeImageSize();
|
| - const_cast<SkGlyph&>(glyph).fImage = fImageAlloc.alloc(size,
|
| + const_cast<SkGlyph&>(glyph).fImage = fGlyphAlloc.alloc(size,
|
| SkChunkAlloc::kReturnNil_AllocFailType);
|
| // check that alloc() actually succeeded
|
| if (glyph.fImage) {
|
| @@ -708,7 +731,7 @@ void SkGlyphCache::validate() const {
|
| SkASSERT(glyph);
|
| SkASSERT(fGlyphAlloc.contains(glyph));
|
| if (glyph->fImage) {
|
| - SkASSERT(fImageAlloc.contains(glyph->fImage));
|
| + SkASSERT(fGlyphAlloc.contains(glyph->fImage));
|
| }
|
| }
|
| #endif
|
|
|