| 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" |
| 11 #include "SkGraphics.h" | 11 #include "SkGraphics.h" |
| 12 #include "SkPaint.h" | 12 #include "SkPaint.h" |
| 13 #include "SkPath.h" | 13 #include "SkPath.h" |
| 14 #include "SkTemplates.h" | 14 #include "SkTemplates.h" |
| 15 #include "SkTLS.h" | 15 #include "SkTLS.h" |
| 16 #include "SkTypeface.h" |
| 16 | 17 |
| 17 //#define SPEW_PURGE_STATUS | 18 //#define SPEW_PURGE_STATUS |
| 18 //#define USE_CACHE_HASH | 19 //#define USE_CACHE_HASH |
| 19 //#define RECORD_HASH_EFFICIENCY | 20 //#define RECORD_HASH_EFFICIENCY |
| 20 | 21 |
| 21 bool gSkSuppressFontCachePurgeSpew; | 22 bool gSkSuppressFontCachePurgeSpew; |
| 22 | 23 |
| 23 /////////////////////////////////////////////////////////////////////////////// | 24 /////////////////////////////////////////////////////////////////////////////// |
| 24 | 25 |
| 25 #ifdef RECORD_HASH_EFFICIENCY | 26 #ifdef RECORD_HASH_EFFICIENCY |
| (...skipping 19 matching lines...) Expand all Loading... |
| 45 #endif | 46 #endif |
| 46 #define RecordHashCollision() RecordHashCollisionIf(true) | 47 #define RecordHashCollision() RecordHashCollisionIf(true) |
| 47 | 48 |
| 48 /////////////////////////////////////////////////////////////////////////////// | 49 /////////////////////////////////////////////////////////////////////////////// |
| 49 | 50 |
| 50 #define kMinGlphAlloc (sizeof(SkGlyph) * 64) | 51 #define kMinGlphAlloc (sizeof(SkGlyph) * 64) |
| 51 #define kMinImageAlloc (24 * 64) // should be pointsize-dependent | 52 #define kMinImageAlloc (24 * 64) // should be pointsize-dependent |
| 52 | 53 |
| 53 #define METRICS_RESERVE_COUNT 128 // so we don't grow this array a lot | 54 #define METRICS_RESERVE_COUNT 128 // so we don't grow this array a lot |
| 54 | 55 |
| 55 SkGlyphCache::SkGlyphCache(const SkDescriptor* desc) | 56 SkGlyphCache::SkGlyphCache(SkTypeface* typeface, const SkDescriptor* desc) |
| 56 : fGlyphAlloc(kMinGlphAlloc), fImageAlloc(kMinImageAlloc) { | 57 : fGlyphAlloc(kMinGlphAlloc) |
| 58 , fImageAlloc(kMinImageAlloc) { |
| 59 SkASSERT(typeface); |
| 60 |
| 57 fPrev = fNext = NULL; | 61 fPrev = fNext = NULL; |
| 58 | 62 |
| 59 fDesc = desc->copy(); | 63 fDesc = desc->copy(); |
| 60 fScalerContext = SkScalerContext::Create(desc); | 64 fScalerContext = typeface->createScalerContext(desc); |
| 61 fScalerContext->getFontMetrics(NULL, &fFontMetricsY); | 65 fScalerContext->getFontMetrics(NULL, &fFontMetricsY); |
| 62 | 66 |
| 63 // init to 0 so that all of the pointers will be null | 67 // init to 0 so that all of the pointers will be null |
| 64 memset(fGlyphHash, 0, sizeof(fGlyphHash)); | 68 memset(fGlyphHash, 0, sizeof(fGlyphHash)); |
| 65 // init with 0xFF so that the charCode field will be -1, which is invalid | 69 // init with 0xFF so that the charCode field will be -1, which is invalid |
| 66 memset(fCharToGlyphHash, 0xFF, sizeof(fCharToGlyphHash)); | 70 memset(fCharToGlyphHash, 0xFF, sizeof(fCharToGlyphHash)); |
| 67 | 71 |
| 68 fMemoryUsed = sizeof(*this) + kMinGlphAlloc + kMinImageAlloc; | 72 fMemoryUsed = sizeof(*this) + kMinGlphAlloc + kMinImageAlloc; |
| 69 | 73 |
| 70 fGlyphArray.setReserve(METRICS_RESERVE_COUNT); | 74 fGlyphArray.setReserve(METRICS_RESERVE_COUNT); |
| (...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 | 520 |
| 517 globals.validate(); | 521 globals.validate(); |
| 518 } | 522 } |
| 519 | 523 |
| 520 /* This guy calls the visitor from within the mutext lock, so the visitor | 524 /* This guy calls the visitor from within the mutext lock, so the visitor |
| 521 cannot: | 525 cannot: |
| 522 - take too much time | 526 - take too much time |
| 523 - try to acquire the mutext again | 527 - try to acquire the mutext again |
| 524 - call a fontscaler (which might call into the cache) | 528 - call a fontscaler (which might call into the cache) |
| 525 */ | 529 */ |
| 526 SkGlyphCache* SkGlyphCache::VisitCache(const SkDescriptor* desc, | 530 SkGlyphCache* SkGlyphCache::VisitCache(SkTypeface* typeface, |
| 531 const SkDescriptor* desc, |
| 527 bool (*proc)(const SkGlyphCache*, void*), | 532 bool (*proc)(const SkGlyphCache*, void*), |
| 528 void* context) { | 533 void* context) { |
| 534 if (!typeface) { |
| 535 typeface = SkTypeface::GetDefaultTypeface(); |
| 536 } |
| 529 SkASSERT(desc); | 537 SkASSERT(desc); |
| 530 | 538 |
| 531 SkGlyphCache_Globals& globals = getGlobals(); | 539 SkGlyphCache_Globals& globals = getGlobals(); |
| 532 SkAutoMutexAcquire ac(globals.fMutex); | 540 SkAutoMutexAcquire ac(globals.fMutex); |
| 533 SkGlyphCache* cache; | 541 SkGlyphCache* cache; |
| 534 bool insideMutex = true; | 542 bool insideMutex = true; |
| 535 | 543 |
| 536 globals.validate(); | 544 globals.validate(); |
| 537 | 545 |
| 538 #ifdef USE_CACHE_HASH | 546 #ifdef USE_CACHE_HASH |
| (...skipping 12 matching lines...) Expand all Loading... |
| 551 goto FOUND_IT; | 559 goto FOUND_IT; |
| 552 } | 560 } |
| 553 } | 561 } |
| 554 | 562 |
| 555 /* Release the mutex now, before we create a new entry (which might have | 563 /* Release the mutex now, before we create a new entry (which might have |
| 556 side-effects like trying to access the cache/mutex (yikes!) | 564 side-effects like trying to access the cache/mutex (yikes!) |
| 557 */ | 565 */ |
| 558 ac.release(); // release the mutex now | 566 ac.release(); // release the mutex now |
| 559 insideMutex = false; // can't use globals anymore | 567 insideMutex = false; // can't use globals anymore |
| 560 | 568 |
| 561 cache = SkNEW_ARGS(SkGlyphCache, (desc)); | 569 cache = SkNEW_ARGS(SkGlyphCache, (typeface, desc)); |
| 562 | 570 |
| 563 FOUND_IT: | 571 FOUND_IT: |
| 564 | 572 |
| 565 AutoValidate av(cache); | 573 AutoValidate av(cache); |
| 566 | 574 |
| 567 if (proc(cache, context)) { // stay detached | 575 if (proc(cache, context)) { // stay detached |
| 568 if (insideMutex) { | 576 if (insideMutex) { |
| 569 SkASSERT(globals.fTotalMemoryUsed >= cache->fMemoryUsed); | 577 SkASSERT(globals.fTotalMemoryUsed >= cache->fMemoryUsed); |
| 570 globals.fTotalMemoryUsed -= cache->fMemoryUsed; | 578 globals.fTotalMemoryUsed -= cache->fMemoryUsed; |
| 571 #ifdef USE_CACHE_HASH | 579 #ifdef USE_CACHE_HASH |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 return tls ? tls->getFontCacheLimit() : 0; | 742 return tls ? tls->getFontCacheLimit() : 0; |
| 735 } | 743 } |
| 736 | 744 |
| 737 void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { | 745 void SkGraphics::SetTLSFontCacheLimit(size_t bytes) { |
| 738 if (0 == bytes) { | 746 if (0 == bytes) { |
| 739 SkGlyphCache_Globals::DeleteTLS(); | 747 SkGlyphCache_Globals::DeleteTLS(); |
| 740 } else { | 748 } else { |
| 741 SkGlyphCache_Globals::GetTLS().setFontCacheLimit(bytes); | 749 SkGlyphCache_Globals::GetTLS().setFontCacheLimit(bytes); |
| 742 } | 750 } |
| 743 } | 751 } |
| OLD | NEW |