aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/text/GrTextBlobCache.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/text/GrTextBlobCache.h')
-rw-r--r--src/gpu/text/GrTextBlobCache.h68
1 files changed, 35 insertions, 33 deletions
diff --git a/src/gpu/text/GrTextBlobCache.h b/src/gpu/text/GrTextBlobCache.h
index af6c7926fa..886a0914ca 100644
--- a/src/gpu/text/GrTextBlobCache.h
+++ b/src/gpu/text/GrTextBlobCache.h
@@ -9,7 +9,6 @@
#define GrTextBlobCache_DEFINED
#include "GrAtlasTextContext.h"
-#include "SkRefCnt.h"
#include "SkTArray.h"
#include "SkTextBlobRunIterator.h"
#include "SkTHash.h"
@@ -32,28 +31,31 @@ public:
~GrTextBlobCache();
// creates an uncached blob
- sk_sp<GrAtlasTextBlob> makeBlob(int glyphCount, int runCount) {
- return GrAtlasTextBlob::Make(&fPool, glyphCount, runCount);
+ GrAtlasTextBlob* createBlob(int glyphCount, int runCount) {
+ return GrAtlasTextBlob::Create(&fPool, glyphCount, runCount);
}
-
- sk_sp<GrAtlasTextBlob> makeBlob(const SkTextBlob* blob) {
+ GrAtlasTextBlob* createBlob(const SkTextBlob* blob) {
int glyphCount = 0;
int runCount = 0;
BlobGlyphCount(&glyphCount, &runCount, blob);
- return GrAtlasTextBlob::Make(&fPool, glyphCount, runCount);
+ GrAtlasTextBlob* cacheBlob = GrAtlasTextBlob::Create(&fPool, glyphCount, runCount);
+ return cacheBlob;
}
- sk_sp<GrAtlasTextBlob> makeCachedBlob(const SkTextBlob* blob,
- const GrAtlasTextBlob::Key& key,
- const SkMaskFilter::BlurRec& blurRec,
- const SkPaint& paint) {
- sk_sp<GrAtlasTextBlob> cacheBlob(this->makeBlob(blob));
+ GrAtlasTextBlob* createCachedBlob(const SkTextBlob* blob,
+ const GrAtlasTextBlob::Key& key,
+ const SkMaskFilter::BlurRec& blurRec,
+ const SkPaint& paint) {
+ int glyphCount = 0;
+ int runCount = 0;
+ BlobGlyphCount(&glyphCount, &runCount, blob);
+ GrAtlasTextBlob* cacheBlob = GrAtlasTextBlob::Create(&fPool, glyphCount, runCount);
cacheBlob->setupKey(key, blurRec, paint);
this->add(cacheBlob);
return cacheBlob;
}
- sk_sp<GrAtlasTextBlob> find(const GrAtlasTextBlob::Key& key) const {
+ GrAtlasTextBlob* find(const GrAtlasTextBlob::Key& key) const {
const auto* idEntry = fBlobIDCache.find(key.fUniqueID);
return idEntry ? idEntry->find(key) : nullptr;
}
@@ -63,11 +65,26 @@ public:
auto* idEntry = fBlobIDCache.find(id);
SkASSERT(idEntry);
- fBlobList.remove(blob);
idEntry->removeBlob(blob);
if (idEntry->fBlobs.empty()) {
fBlobIDCache.remove(id);
}
+
+ fBlobList.remove(blob);
+ blob->unref();
+ }
+
+ void add(GrAtlasTextBlob* blob) {
+ auto id = GrAtlasTextBlob::GetKey(*blob).fUniqueID;
+ auto* idEntry = fBlobIDCache.find(id);
+ if (!idEntry) {
+ idEntry = fBlobIDCache.set(id, BlobIDCacheEntry(id));
+ }
+
+ idEntry->addBlob(blob);
+ fBlobList.addToHead(blob);
+
+ this->checkPurge(blob);
}
void makeMRU(GrAtlasTextBlob* blob) {
@@ -105,12 +122,12 @@ private:
return entry.fID;
}
- void addBlob(sk_sp<GrAtlasTextBlob> blob) {
+ void addBlob(GrAtlasTextBlob* blob) {
SkASSERT(blob);
SkASSERT(GrAtlasTextBlob::GetKey(*blob).fUniqueID == fID);
SkASSERT(!this->find(GrAtlasTextBlob::GetKey(*blob)));
- fBlobs.emplace_back(std::move(blob));
+ fBlobs.push_back(blob);
}
void removeBlob(GrAtlasTextBlob* blob) {
@@ -123,7 +140,7 @@ private:
fBlobs.removeShuffle(index);
}
- sk_sp<GrAtlasTextBlob> find(const GrAtlasTextBlob::Key& key) const {
+ GrAtlasTextBlob* find(const GrAtlasTextBlob::Key& key) const {
auto index = this->findBlobIndex(key);
return index < 0 ? nullptr : fBlobs[index];
}
@@ -140,24 +157,9 @@ private:
uint32_t fID;
// Current clients don't generate multiple GrAtlasTextBlobs per SkTextBlob, so an array w/
// linear search is acceptable. If usage changes, we should re-evaluate this structure.
- SkSTArray<1, sk_sp<GrAtlasTextBlob>, true> fBlobs;
+ SkSTArray<1, GrAtlasTextBlob*, true> fBlobs;
};
- void add(sk_sp<GrAtlasTextBlob> blob) {
- auto id = GrAtlasTextBlob::GetKey(*blob).fUniqueID;
- auto* idEntry = fBlobIDCache.find(id);
- if (!idEntry) {
- idEntry = fBlobIDCache.set(id, BlobIDCacheEntry(id));
- }
-
- // Safe to retain a raw ptr temporarily here, because the cache will hold a ref.
- GrAtlasTextBlob* rawBlobPtr = blob.get();
- fBlobList.addToHead(rawBlobPtr);
- idEntry->addBlob(std::move(blob));
-
- this->checkPurge(rawBlobPtr);
- }
-
void checkPurge(GrAtlasTextBlob* blob = nullptr) {
// If we are overbudget, then unref until we are below budget again
if (fPool.size() > fBudget) {
@@ -191,9 +193,9 @@ private:
static const int kPreAllocSize = 1 << 17;
static const int kMinGrowthSize = 1 << 17;
static const int kDefaultBudget = 1 << 22;
- GrMemoryPool fPool;
BitmapBlobList fBlobList;
SkTHashMap<uint32_t, BlobIDCacheEntry> fBlobIDCache;
+ GrMemoryPool fPool;
PFOverBudgetCB fCallback;
void* fData;
size_t fBudget;