Stable pointers for SkRemoteGlyphCache
Change-Id: I123fcf7da32f0e5e5a14aec95bea684c9190d096
Reviewed-on: https://skia-review.googlesource.com/c/183100
Auto-Submit: Herb Derby <herb@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Herb Derby <herb@google.com>
diff --git a/src/core/SkRemoteGlyphCache.cpp b/src/core/SkRemoteGlyphCache.cpp
index 2871c5e..01d0de7 100644
--- a/src/core/SkRemoteGlyphCache.cpp
+++ b/src/core/SkRemoteGlyphCache.cpp
@@ -498,14 +498,15 @@
}
const SkGlyph& SkStrikeServer::SkGlyphCacheState::findGlyph(SkPackedGlyphID glyphID) {
- auto* glyph = fGlyphMap.find(glyphID);
- if (glyph == nullptr) {
+ SkGlyph* glyphPtr = fGlyphMap.findOrNull(glyphID);
+ if (glyphPtr == nullptr) {
+ glyphPtr = fAlloc.make<SkGlyph>(glyphID);
+ fGlyphMap.set(glyphPtr);
this->ensureScalerContext();
- glyph = fGlyphMap.set(glyphID, SkGlyph{glyphID});
- fContext->getMetrics(glyph);
+ fContext->getMetrics(glyphPtr);
}
- return *glyph;
+ return *glyphPtr;
}
void SkStrikeServer::SkGlyphCacheState::ensureScalerContext() {
diff --git a/src/core/SkRemoteGlyphCacheImpl.h b/src/core/SkRemoteGlyphCacheImpl.h
index 82a6eb9..d7858d4 100644
--- a/src/core/SkRemoteGlyphCacheImpl.h
+++ b/src/core/SkRemoteGlyphCacheImpl.h
@@ -86,9 +86,19 @@
const SkFont* fFont{nullptr};
SkScalerContextEffects fEffects;
+ class GlyphMapHashTraits {
+ public:
+ static SkPackedGlyphID GetKey(const SkGlyph* glyph) {
+ return glyph->getPackedID();
+ }
+ static uint32_t Hash(SkPackedGlyphID glyphId) {
+ return glyphId.hash();
+ }
+ };
+
// FallbackTextHelper cases require glyph metrics when analyzing a glyph run, in which case
// we cache them here.
- SkTHashMap<SkPackedGlyphID, SkGlyph> fGlyphMap;
+ SkTHashTable<SkGlyph*, SkPackedGlyphID, GlyphMapHashTraits> fGlyphMap;
SkArenaAlloc fAlloc{256};
};