Split getOrCreateCache into a SkFont and descriptor based calles

Change-Id: Ie4724137baf3d355b94bd9966cc381a688c465fb
Reviewed-on: https://skia-review.googlesource.com/c/190671
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Herb Derby <herb@google.com>
This commit is contained in:
Herb Derby 2019-02-08 13:17:59 -05:00 committed by Skia Commit-Bot
parent 37064c1739
commit c6dde3bc69
2 changed files with 24 additions and 16 deletions

View File

@ -309,14 +309,19 @@ SkStrikeServer::SkGlyphCacheState* SkStrikeServer::getOrCreateCache(
SkAutoDescriptor descStorage;
auto desc = create_descriptor(paint, font, matrix, props, flags, &descStorage, effects);
SkTypeface* typeface = font.getTypefaceOrDefault();
return this->getOrCreateCache(*desc, *font.getTypefaceOrDefault(), *effects);
}
SkStrikeServer::SkGlyphCacheState* SkStrikeServer::getOrCreateCache(
const SkDescriptor& desc, const SkTypeface& typeface, SkScalerContextEffects effects) {
// In cases where tracing is turned off, make sure not to get an unused function warning.
// Lambdaize the function.
TRACE_EVENT1("skia", "RecForDesc", "rec",
TRACE_STR_COPY(
[desc](){
auto ptr = desc->findEntry(kRec_SkDescriptorTag, nullptr);
[&desc](){
auto ptr = desc.findEntry(kRec_SkDescriptorTag, nullptr);
SkScalerContextRec rec;
std::memcpy(&rec, ptr, sizeof(rec));
return rec.dump();
@ -325,22 +330,22 @@ SkStrikeServer::SkGlyphCacheState* SkStrikeServer::getOrCreateCache(
);
// Already locked.
if (fLockedDescs.find(desc) != fLockedDescs.end()) {
auto it = fRemoteGlyphStateMap.find(desc);
if (fLockedDescs.find(&desc) != fLockedDescs.end()) {
auto it = fRemoteGlyphStateMap.find(&desc);
SkASSERT(it != fRemoteGlyphStateMap.end());
SkGlyphCacheState* cache = it->second.get();
cache->setTypefaceAndEffects(typeface, *effects);
cache->setTypefaceAndEffects(&typeface, effects);
return cache;
}
// Try to lock.
auto it = fRemoteGlyphStateMap.find(desc);
auto it = fRemoteGlyphStateMap.find(&desc);
if (it != fRemoteGlyphStateMap.end()) {
SkGlyphCacheState* cache = it->second.get();
bool locked = fDiscardableHandleManager->lockHandle(it->second->discardableHandleId());
if (locked) {
fLockedDescs.insert(it->first);
cache->setTypefaceAndEffects(typeface, *effects);
cache->setTypefaceAndEffects(&typeface, effects);
return cache;
}
@ -349,21 +354,20 @@ SkStrikeServer::SkGlyphCacheState* SkStrikeServer::getOrCreateCache(
fRemoteGlyphStateMap.erase(it);
}
const SkFontID typefaceId = typeface->uniqueID();
const SkFontID typefaceId = typeface.uniqueID();
if (!fCachedTypefaces.contains(typefaceId)) {
fCachedTypefaces.add(typefaceId);
fTypefacesToSend.emplace_back(typefaceId,
typeface->countGlyphs(),
typeface->fontStyle(),
typeface->isFixedPitch());
fTypefacesToSend.emplace_back(typefaceId, typeface.countGlyphs(),
typeface.fontStyle(),
typeface.isFixedPitch());
}
auto context = typeface->createScalerContext(*effects, desc);
auto context = typeface.createScalerContext(effects, &desc);
// Create a new cache state and insert it into the map.
auto newHandle = fDiscardableHandleManager->createHandle();
auto cacheState = skstd::make_unique<SkGlyphCacheState>(
*desc, std::move(context), newHandle);
desc, std::move(context), newHandle);
auto* cacheStatePtr = cacheState.get();
@ -372,7 +376,7 @@ SkStrikeServer::SkGlyphCacheState* SkStrikeServer::getOrCreateCache(
checkForDeletedEntries();
cacheStatePtr->setTypefaceAndEffects(typeface, *effects);
cacheStatePtr->setTypefaceAndEffects(&typeface, effects);
return cacheStatePtr;
}

View File

@ -132,6 +132,10 @@ public:
SkScalerContextFlags flags,
SkScalerContextEffects* effects);
SkGlyphCacheState* getOrCreateCache(const SkDescriptor& desc,
const SkTypeface& typeface,
SkScalerContextEffects effects);
void setMaxEntriesInDescriptorMapForTesting(size_t count) {
fMaxEntriesInDescriptorMap = count;
}