Index: src/gpu/GrTextBlobCache.h |
diff --git a/src/gpu/GrTextBlobCache.h b/src/gpu/GrTextBlobCache.h |
deleted file mode 100644 |
index 8eee9d13db0360d1fdc0353bf85d1052b1ab1178..0000000000000000000000000000000000000000 |
--- a/src/gpu/GrTextBlobCache.h |
+++ /dev/null |
@@ -1,158 +0,0 @@ |
-/* |
- * Copyright 2015 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#ifndef GrTextBlobCache_DEFINED |
-#define GrTextBlobCache_DEFINED |
- |
-#include "GrAtlasTextContext.h" |
-#include "SkTDynamicHash.h" |
-#include "SkTextBlobRunIterator.h" |
- |
-class GrTextBlobCache { |
-public: |
- /** |
- * The callback function used by the cache when it is still over budget after a purge. The |
- * passed in 'data' is the same 'data' handed to setOverbudgetCallback. |
- */ |
- typedef void (*PFOverBudgetCB)(void* data); |
- |
- GrTextBlobCache(PFOverBudgetCB cb, void* data) |
- : fPool(kPreAllocSize, kMinGrowthSize) |
- , fCallback(cb) |
- , fData(data) |
- , fBudget(kDefaultBudget) { |
- SkASSERT(cb && data); |
- } |
- ~GrTextBlobCache(); |
- |
- // creates an uncached blob |
- GrAtlasTextBlob* createBlob(int glyphCount, int runCount, size_t maxVASize); |
- GrAtlasTextBlob* createBlob(const SkTextBlob* blob, size_t maxVAStride) { |
- int glyphCount = 0; |
- int runCount = 0; |
- BlobGlyphCount(&glyphCount, &runCount, blob); |
- GrAtlasTextBlob* cacheBlob = this->createBlob(glyphCount, runCount, maxVAStride); |
- return cacheBlob; |
- } |
- |
- static void SetupCacheBlobKey(GrAtlasTextBlob* cacheBlob, |
- const GrAtlasTextBlob::Key& key, |
- const SkMaskFilter::BlurRec& blurRec, |
- const SkPaint& paint) { |
- cacheBlob->fKey = key; |
- if (key.fHasBlur) { |
- cacheBlob->fBlurRec = blurRec; |
- } |
- if (key.fStyle != SkPaint::kFill_Style) { |
- cacheBlob->fStrokeInfo.fFrameWidth = paint.getStrokeWidth(); |
- cacheBlob->fStrokeInfo.fMiterLimit = paint.getStrokeMiter(); |
- cacheBlob->fStrokeInfo.fJoin = paint.getStrokeJoin(); |
- } |
- } |
- |
- GrAtlasTextBlob* createCachedBlob(const SkTextBlob* blob, |
- const GrAtlasTextBlob::Key& key, |
- const SkMaskFilter::BlurRec& blurRec, |
- const SkPaint& paint, |
- size_t maxVAStride) { |
- int glyphCount = 0; |
- int runCount = 0; |
- BlobGlyphCount(&glyphCount, &runCount, blob); |
- GrAtlasTextBlob* cacheBlob = this->createBlob(glyphCount, runCount, maxVAStride); |
- SetupCacheBlobKey(cacheBlob, key, blurRec, paint); |
- this->add(cacheBlob); |
- return cacheBlob; |
- } |
- |
- GrAtlasTextBlob* find(const GrAtlasTextBlob::Key& key) { |
- return fCache.find(key); |
- } |
- |
- void remove(GrAtlasTextBlob* blob) { |
- fCache.remove(blob->fKey); |
- fBlobList.remove(blob); |
- blob->unref(); |
- } |
- |
- void add(GrAtlasTextBlob* blob) { |
- fCache.add(blob); |
- fBlobList.addToHead(blob); |
- |
- this->checkPurge(blob); |
- } |
- |
- void makeMRU(GrAtlasTextBlob* blob) { |
- if (fBlobList.head() == blob) { |
- return; |
- } |
- |
- fBlobList.remove(blob); |
- fBlobList.addToHead(blob); |
- } |
- |
- void freeAll(); |
- |
- // TODO move to SkTextBlob |
- static void BlobGlyphCount(int* glyphCount, int* runCount, const SkTextBlob* blob) { |
- SkTextBlobRunIterator itCounter(blob); |
- for (; !itCounter.done(); itCounter.next(), (*runCount)++) { |
- *glyphCount += itCounter.glyphCount(); |
- } |
- } |
- |
- void setBudget(size_t budget) { |
- fBudget = budget; |
- this->checkPurge(); |
- } |
- |
-private: |
- typedef SkTInternalLList<GrAtlasTextBlob> BitmapBlobList; |
- |
- void checkPurge(GrAtlasTextBlob* blob = nullptr) { |
- // If we are overbudget, then unref until we are below budget again |
- if (fPool.size() > fBudget) { |
- BitmapBlobList::Iter iter; |
- iter.init(fBlobList, BitmapBlobList::Iter::kTail_IterStart); |
- GrAtlasTextBlob* lruBlob = nullptr; |
- while (fPool.size() > fBudget && (lruBlob = iter.get()) && lruBlob != blob) { |
- fCache.remove(lruBlob->fKey); |
- |
- // Backup the iterator before removing and unrefing the blob |
- iter.prev(); |
- fBlobList.remove(lruBlob); |
- lruBlob->unref(); |
- } |
- |
- // If we break out of the loop with lruBlob == blob, then we haven't purged enough |
- // use the call back and try to free some more. If we are still overbudget after this, |
- // then this single textblob is over our budget |
- if (blob && lruBlob == blob) { |
- (*fCallback)(fData); |
- } |
- |
-#ifdef SPEW_BUDGET_MESSAGE |
- if (fPool.size() > fBudget) { |
- SkDebugf("Single textblob is larger than our whole budget"); |
- } |
-#endif |
- } |
- } |
- |
- // Budget was chosen to be ~4 megabytes. The min alloc and pre alloc sizes in the pool are |
- // based off of the largest cached textblob I have seen in the skps(a couple of kilobytes). |
- static const int kPreAllocSize = 1 << 17; |
- static const int kMinGrowthSize = 1 << 17; |
- static const int kDefaultBudget = 1 << 22; |
- BitmapBlobList fBlobList; |
- SkTDynamicHash<GrAtlasTextBlob, GrAtlasTextBlob::Key> fCache; |
- GrMemoryPool fPool; |
- PFOverBudgetCB fCallback; |
- void* fData; |
- size_t fBudget; |
-}; |
- |
-#endif |