| Index: src/core/SkGlyphCache.cpp
|
| diff --git a/src/core/SkGlyphCache.cpp b/src/core/SkGlyphCache.cpp
|
| index 1cbfcd8e6e9fa235610a0c459b469a1e8a4ff718..a26e9f5cd0a83cf770225946deb85ff3237cf1ee 100755
|
| --- a/src/core/SkGlyphCache.cpp
|
| +++ b/src/core/SkGlyphCache.cpp
|
| @@ -1,4 +1,3 @@
|
| -
|
| /*
|
| * Copyright 2006 The Android Open Source Project
|
| *
|
| @@ -6,7 +5,6 @@
|
| * found in the LICENSE file.
|
| */
|
|
|
| -
|
| #include "SkGlyphCache.h"
|
| #include "SkGlyphCache_Globals.h"
|
| #include "SkGraphics.h"
|
| @@ -18,7 +16,6 @@
|
| #include "SkTypeface.h"
|
|
|
| //#define SPEW_PURGE_STATUS
|
| -//#define RECORD_HASH_EFFICIENCY
|
|
|
| namespace {
|
|
|
| @@ -43,26 +40,12 @@ static SkGlyphCache_Globals& getGlobals() {
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| -#ifdef RECORD_HASH_EFFICIENCY
|
| - static uint32_t gHashSuccess;
|
| - static uint32_t gHashCollision;
|
| -
|
| - static void RecordHashSuccess() {
|
| - gHashSuccess += 1;
|
| - }
|
| -
|
| - static void RecordHashCollisionIf(bool pred) {
|
| - if (pred) {
|
| - gHashCollision += 1;
|
| -
|
| - uint32_t total = gHashSuccess + gHashCollision;
|
| - SkDebugf("Font Cache Hash success rate: %d%%\n",
|
| - 100 * gHashSuccess / total);
|
| - }
|
| - }
|
| +#ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
|
| + #define RecordHashSuccess() fHashHitCount += 1
|
| + #define RecordHashCollisionIf(pred) do { if (pred) fHashMissCount += 1; } while (0)
|
| #else
|
| - #define RecordHashSuccess() (void)0
|
| - #define RecordHashCollisionIf(pred) (void)0
|
| + #define RecordHashSuccess() (void)0
|
| + #define RecordHashCollisionIf(pred) (void)0
|
| #endif
|
| #define RecordHashCollision() RecordHashCollisionIf(true)
|
|
|
| @@ -94,6 +77,10 @@ SkGlyphCache::SkGlyphCache(SkTypeface* typeface, const SkDescriptor* desc, SkSca
|
| fGlyphArray.setReserve(kMinGlyphCount);
|
|
|
| fAuxProcList = NULL;
|
| +
|
| +#ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
|
| + fHashHitCount = fHashMissCount = 0;
|
| +#endif
|
| }
|
|
|
| SkGlyphCache::~SkGlyphCache() {
|
| @@ -260,8 +247,7 @@ const SkGlyph& SkGlyphCache::getGlyphIDMetrics(uint16_t glyphID) {
|
| return *glyph;
|
| }
|
|
|
| -const SkGlyph& SkGlyphCache::getGlyphIDMetrics(uint16_t glyphID,
|
| - SkFixed x, SkFixed y) {
|
| +const SkGlyph& SkGlyphCache::getGlyphIDMetrics(uint16_t glyphID, SkFixed x, SkFixed y) {
|
| VALIDATE();
|
| uint32_t id = SkGlyph::MakeID(glyphID, x, y);
|
| unsigned index = ID2HashIndex(id);
|
| @@ -364,6 +350,29 @@ const SkPath* SkGlyphCache::findPath(const SkGlyph& glyph) {
|
| return glyph.fPath;
|
| }
|
|
|
| +void SkGlyphCache::dump() const {
|
| + const SkTypeface* face = fScalerContext->getTypeface();
|
| + const SkScalerContextRec& rec = fScalerContext->getRec();
|
| + SkMatrix matrix;
|
| + rec.getSingleMatrix(&matrix);
|
| + matrix.preScale(SkScalarInvert(rec.fTextSize), SkScalarInvert(rec.fTextSize));
|
| + SkString name;
|
| + face->getFamilyName(&name);
|
| +
|
| + SkString msg;
|
| + msg.printf("cache typeface:%x %25s:%d size:%2g [%g %g %g %g] lum:%02X devG:%d pntG:%d cntr:%d glyphs:%3d",
|
| + face->uniqueID(), name.c_str(), face->style(), rec.fTextSize,
|
| + matrix[SkMatrix::kMScaleX], matrix[SkMatrix::kMSkewX],
|
| + matrix[SkMatrix::kMSkewY], matrix[SkMatrix::kMScaleY],
|
| + rec.fLumBits & 0xFF, rec.fDeviceGamma, rec.fPaintGamma, rec.fContrast,
|
| + fGlyphArray.count());
|
| +#ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
|
| + const int sum = SkTMax(fHashHitCount + fHashMissCount, 1); // avoid divide-by-zero
|
| + msg.appendf(" hash:%2d\n", 100 * fHashHitCount / sum);
|
| +#endif
|
| + SkDebugf("%s\n", msg.c_str());
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| bool SkGlyphCache::getAuxProcData(void (*proc)(void*), void** dataPtr) const {
|
| @@ -520,6 +529,33 @@ void SkGlyphCache::AttachCache(SkGlyphCache* cache) {
|
| getGlobals().attachCacheToHead(cache);
|
| }
|
|
|
| +void SkGlyphCache::Dump() {
|
| + SkGlyphCache_Globals& globals = getGlobals();
|
| + SkAutoMutexAcquire ac(globals.fMutex);
|
| + SkGlyphCache* cache;
|
| +
|
| + globals.validate();
|
| +
|
| + SkDebugf("SkGlyphCache strikes:%d memory:%d\n",
|
| + globals.getCacheCountUsed(), (int)globals.getTotalMemoryUsed());
|
| +
|
| +#ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
|
| + int hitCount = 0;
|
| + int missCount = 0;
|
| +#endif
|
| +
|
| + for (cache = globals.internalGetHead(); cache != NULL; cache = cache->fNext) {
|
| +#ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
|
| + hitCount += cache->fHashHitCount;
|
| + missCount += cache->fHashMissCount;
|
| +#endif
|
| + cache->dump();
|
| + }
|
| +#ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
|
| + SkDebugf("Hash hit percent:%2d\n", 100 * hitCount / (hitCount + missCount));
|
| +#endif
|
| +}
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| void SkGlyphCache_Globals::attachCacheToHead(SkGlyphCache* cache) {
|
|
|