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 30 matching lines...) Expand all Loading... |
41 } | 41 } |
42 } | 42 } |
43 #else | 43 #else |
44 #define RecordHashSuccess() (void)0 | 44 #define RecordHashSuccess() (void)0 |
45 #define RecordHashCollisionIf(pred) (void)0 | 45 #define RecordHashCollisionIf(pred) (void)0 |
46 #endif | 46 #endif |
47 #define RecordHashCollision() RecordHashCollisionIf(true) | 47 #define RecordHashCollision() RecordHashCollisionIf(true) |
48 | 48 |
49 /////////////////////////////////////////////////////////////////////////////// | 49 /////////////////////////////////////////////////////////////////////////////// |
50 | 50 |
51 #define kMinGlphAlloc (sizeof(SkGlyph) * 64) | 51 // so we don't grow our arrays a lot |
52 #define kMinImageAlloc (24 * 64) // should be pointsize-dependent | 52 #define kMinGlyphCount 16 |
53 | 53 #define kMinGlyphImageSize (16*2) |
54 #define METRICS_RESERVE_COUNT 128 // so we don't grow this array a lot | 54 #define kMinAllocAmount ((sizeof(SkGlyph) + kMinGlyphImageSize) * kMinGlyphC
ount) |
55 | 55 |
56 SkGlyphCache::SkGlyphCache(SkTypeface* typeface, const SkDescriptor* desc) | 56 SkGlyphCache::SkGlyphCache(SkTypeface* typeface, const SkDescriptor* desc) |
57 : fGlyphAlloc(kMinGlphAlloc) | 57 : fGlyphAlloc(kMinAllocAmount) { |
58 , fImageAlloc(kMinImageAlloc) { | |
59 SkASSERT(typeface); | 58 SkASSERT(typeface); |
60 | 59 |
61 fPrev = fNext = NULL; | 60 fPrev = fNext = NULL; |
62 | 61 |
63 fDesc = desc->copy(); | 62 fDesc = desc->copy(); |
64 fScalerContext = typeface->createScalerContext(desc); | 63 fScalerContext = typeface->createScalerContext(desc); |
65 fScalerContext->getFontMetrics(&fFontMetrics); | 64 fScalerContext->getFontMetrics(&fFontMetrics); |
66 | 65 |
67 // init to 0 so that all of the pointers will be null | 66 // init to 0 so that all of the pointers will be null |
68 memset(fGlyphHash, 0, sizeof(fGlyphHash)); | 67 memset(fGlyphHash, 0, sizeof(fGlyphHash)); |
69 // init with 0xFF so that the charCode field will be -1, which is invalid | 68 // init with 0xFF so that the charCode field will be -1, which is invalid |
70 memset(fCharToGlyphHash, 0xFF, sizeof(fCharToGlyphHash)); | 69 memset(fCharToGlyphHash, 0xFF, sizeof(fCharToGlyphHash)); |
71 | 70 |
72 fMemoryUsed = sizeof(*this) + kMinGlphAlloc + kMinImageAlloc; | 71 fMemoryUsed = sizeof(*this); |
73 | 72 |
74 fGlyphArray.setReserve(METRICS_RESERVE_COUNT); | 73 fGlyphArray.setReserve(kMinGlyphCount); |
75 | 74 |
76 fMetricsCount = 0; | 75 fMetricsCount = 0; |
77 fAdvanceCount = 0; | 76 fAdvanceCount = 0; |
78 fAuxProcList = NULL; | 77 fAuxProcList = NULL; |
79 } | 78 } |
80 | 79 |
81 SkGlyphCache::~SkGlyphCache() { | 80 SkGlyphCache::~SkGlyphCache() { |
| 81 #if 0 |
| 82 { |
| 83 size_t ptrMem = fGlyphArray.count() * sizeof(SkGlyph*); |
| 84 size_t glyphAlloc = fGlyphAlloc.totalCapacity(); |
| 85 size_t glyphHashUsed = 0; |
| 86 size_t uniHashUsed = 0; |
| 87 for (int i = 0; i < kHashCount; ++i) { |
| 88 glyphHashUsed += fGlyphHash[i] ? sizeof(fGlyphHash[0]) : 0; |
| 89 uniHashUsed += fCharToGlyphHash[i].fID != 0xFFFFFFFF ? sizeof(fCharT
oGlyphHash[0]) : 0; |
| 90 } |
| 91 size_t glyphUsed = fGlyphArray.count() * sizeof(SkGlyph); |
| 92 size_t imageUsed = 0; |
| 93 for (int i = 0; i < fGlyphArray.count(); ++i) { |
| 94 const SkGlyph& g = *fGlyphArray[i]; |
| 95 if (g.fImage) { |
| 96 imageUsed += g.fHeight * g.rowBytes(); |
| 97 } |
| 98 } |
| 99 |
| 100 printf("glyphPtrArray,%zu, Alloc,%zu, imageUsed,%zu, glyphUsed,%zu, glyp
hHashAlloc,%zu, glyphHashUsed,%zu, unicharHashAlloc,%zu, unicharHashUsed,%zu\n", |
| 101 ptrMem, glyphAlloc, imageUsed, glyphUsed, sizeof(fGlyphHash), g
lyphHashUsed, sizeof(fCharToGlyphHash), uniHashUsed); |
| 102 |
| 103 } |
| 104 #endif |
82 SkGlyph** gptr = fGlyphArray.begin(); | 105 SkGlyph** gptr = fGlyphArray.begin(); |
83 SkGlyph** stop = fGlyphArray.end(); | 106 SkGlyph** stop = fGlyphArray.end(); |
84 while (gptr < stop) { | 107 while (gptr < stop) { |
85 SkPath* path = (*gptr)->fPath; | 108 SkPath* path = (*gptr)->fPath; |
86 if (path) { | 109 if (path) { |
87 SkDELETE(path); | 110 SkDELETE(path); |
88 } | 111 } |
89 gptr += 1; | 112 gptr += 1; |
90 } | 113 } |
91 SkDescriptor::Free(fDesc); | 114 SkDescriptor::Free(fDesc); |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 fMetricsCount += 1; | 312 fMetricsCount += 1; |
290 } | 313 } |
291 | 314 |
292 return glyph; | 315 return glyph; |
293 } | 316 } |
294 | 317 |
295 const void* SkGlyphCache::findImage(const SkGlyph& glyph) { | 318 const void* SkGlyphCache::findImage(const SkGlyph& glyph) { |
296 if (glyph.fWidth > 0 && glyph.fWidth < kMaxGlyphWidth) { | 319 if (glyph.fWidth > 0 && glyph.fWidth < kMaxGlyphWidth) { |
297 if (glyph.fImage == NULL) { | 320 if (glyph.fImage == NULL) { |
298 size_t size = glyph.computeImageSize(); | 321 size_t size = glyph.computeImageSize(); |
299 const_cast<SkGlyph&>(glyph).fImage = fImageAlloc.alloc(size, | 322 const_cast<SkGlyph&>(glyph).fImage = fGlyphAlloc.alloc(size, |
300 SkChunkAlloc::kReturnNil_AllocFailType); | 323 SkChunkAlloc::kReturnNil_AllocFailType); |
301 // check that alloc() actually succeeded | 324 // check that alloc() actually succeeded |
302 if (glyph.fImage) { | 325 if (glyph.fImage) { |
303 fScalerContext->getImage(glyph); | 326 fScalerContext->getImage(glyph); |
304 // TODO: the scaler may have changed the maskformat during | 327 // TODO: the scaler may have changed the maskformat during |
305 // getImage (e.g. from AA or LCD to BW) which means we may have | 328 // getImage (e.g. from AA or LCD to BW) which means we may have |
306 // overallocated the buffer. Check if the new computedImageSize | 329 // overallocated the buffer. Check if the new computedImageSize |
307 // is smaller, and if so, strink the alloc size in fImageAlloc. | 330 // is smaller, and if so, strink the alloc size in fImageAlloc. |
308 fMemoryUsed += size; | 331 fMemoryUsed += size; |
309 } | 332 } |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 | 724 |
702 #ifdef SK_DEBUG | 725 #ifdef SK_DEBUG |
703 void SkGlyphCache::validate() const { | 726 void SkGlyphCache::validate() const { |
704 #ifdef SK_DEBUG_GLYPH_CACHE | 727 #ifdef SK_DEBUG_GLYPH_CACHE |
705 int count = fGlyphArray.count(); | 728 int count = fGlyphArray.count(); |
706 for (int i = 0; i < count; i++) { | 729 for (int i = 0; i < count; i++) { |
707 const SkGlyph* glyph = fGlyphArray[i]; | 730 const SkGlyph* glyph = fGlyphArray[i]; |
708 SkASSERT(glyph); | 731 SkASSERT(glyph); |
709 SkASSERT(fGlyphAlloc.contains(glyph)); | 732 SkASSERT(fGlyphAlloc.contains(glyph)); |
710 if (glyph->fImage) { | 733 if (glyph->fImage) { |
711 SkASSERT(fImageAlloc.contains(glyph->fImage)); | 734 SkASSERT(fGlyphAlloc.contains(glyph->fImage)); |
712 } | 735 } |
713 } | 736 } |
714 #endif | 737 #endif |
715 } | 738 } |
716 #endif | 739 #endif |
717 | 740 |
718 /////////////////////////////////////////////////////////////////////////////// | 741 /////////////////////////////////////////////////////////////////////////////// |
719 /////////////////////////////////////////////////////////////////////////////// | 742 /////////////////////////////////////////////////////////////////////////////// |
720 | 743 |
721 #include "SkTypefaceCache.h" | 744 #include "SkTypefaceCache.h" |
(...skipping 20 matching lines...) Expand all Loading... |
742 return tls ? tls->getFontCacheLimit() : 0; | 765 return tls ? tls->getFontCacheLimit() : 0; |
743 } | 766 } |
744 | 767 |
745 void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { | 768 void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { |
746 if (0 == bytes) { | 769 if (0 == bytes) { |
747 SkGlyphCache_Globals::DeleteTLS(); | 770 SkGlyphCache_Globals::DeleteTLS(); |
748 } else { | 771 } else { |
749 SkGlyphCache_Globals::GetTLS().setFontCacheLimit(bytes); | 772 SkGlyphCache_Globals::GetTLS().setFontCacheLimit(bytes); |
750 } | 773 } |
751 } | 774 } |
OLD | NEW |