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, 33 insertions, 35 deletions
diff --git a/src/gpu/text/GrTextBlobCache.h b/src/gpu/text/GrTextBlobCache.h
index 886a0914ca..af6c7926fa 100644
--- a/src/gpu/text/GrTextBlobCache.h
+++ b/src/gpu/text/GrTextBlobCache.h
@@ -9,6 +9,7 @@
#define GrTextBlobCache_DEFINED
#include "GrAtlasTextContext.h"
+#include "SkRefCnt.h"
#include "SkTArray.h"
#include "SkTextBlobRunIterator.h"
#include "SkTHash.h"
@@ -31,31 +32,28 @@ public:
~GrTextBlobCache();
// creates an uncached blob
- GrAtlasTextBlob* createBlob(int glyphCount, int runCount) {
- return GrAtlasTextBlob::Create(&fPool, glyphCount, runCount);
+ sk_sp<GrAtlasTextBlob> makeBlob(int glyphCount, int runCount) {
+ return GrAtlasTextBlob::Make(&fPool, glyphCount, runCount);
}
- GrAtlasTextBlob* createBlob(const SkTextBlob* blob) {
+
+ sk_sp<GrAtlasTextBlob> makeBlob(const SkTextBlob* blob) {
int glyphCount = 0;
int runCount = 0;
BlobGlyphCount(&glyphCount, &runCount, blob);
- GrAtlasTextBlob* cacheBlob = GrAtlasTextBlob::Create(&fPool, glyphCount, runCount);
- return cacheBlob;
+ return GrAtlasTextBlob::Make(&fPool, glyphCount, runCount);
}
- 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);
+ 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));
cacheBlob->setupKey(key, blurRec, paint);
this->add(cacheBlob);
return cacheBlob;
}
- GrAtlasTextBlob* find(const GrAtlasTextBlob::Key& key) const {
+ sk_sp<GrAtlasTextBlob> find(const GrAtlasTextBlob::Key& key) const {
const auto* idEntry = fBlobIDCache.find(key.fUniqueID);
return idEntry ? idEntry->find(key) : nullptr;
}
@@ -65,26 +63,11 @@ 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) {
@@ -122,12 +105,12 @@ private:
return entry.fID;
}
- void addBlob(GrAtlasTextBlob* blob) {
+ void addBlob(sk_sp<GrAtlasTextBlob> blob) {
SkASSERT(blob);
SkASSERT(GrAtlasTextBlob::GetKey(*blob).fUniqueID == fID);
SkASSERT(!this->find(GrAtlasTextBlob::GetKey(*blob)));
- fBlobs.push_back(blob);
+ fBlobs.emplace_back(std::move(blob));
}
void removeBlob(GrAtlasTextBlob* blob) {
@@ -140,7 +123,7 @@ private:
fBlobs.removeShuffle(index);
}
- GrAtlasTextBlob* find(const GrAtlasTextBlob::Key& key) const {
+ sk_sp<GrAtlasTextBlob> find(const GrAtlasTextBlob::Key& key) const {
auto index = this->findBlobIndex(key);
return index < 0 ? nullptr : fBlobs[index];
}
@@ -157,9 +140,24 @@ 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, GrAtlasTextBlob*, true> fBlobs;
+ SkSTArray<1, sk_sp<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) {
@@ -193,9 +191,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;