sk_sp<SkTypeface> onLegacyMakeTypeface(const char requestedFamilyName[], SkFontStyle requestedStyle) const override { SkAutoMutexAcquire ama(fMutex); // Check if this request is already in the request cache. using Request = SkFontRequestCache::Request; std::unique_ptr<Request> request(Request::Create(requestedFamilyName, requestedStyle)); SkTypeface* face = fCache.findAndRef(request.get()); if (face) { return sk_sp<SkTypeface>(face); } SkFontConfigInterface::FontIdentity identity; SkString outFamilyName; SkFontStyle outStyle; if (!fFCI->matchFamilyName(requestedFamilyName, requestedStyle, &identity, &outFamilyName, &outStyle)) { return nullptr; } // Check if a typeface with this FontIdentity is already in the FontIdentity cache. face = fTFCache.findByProcAndRef(find_by_FontIdentity, &identity); if (!face) { face = SkTypeface_FCI::Create(fFCI, identity, std::move(outFamilyName), outStyle); // Add this FontIdentity to the FontIdentity cache. fTFCache.add(face); } // Add this request to the request cache. fCache.add(face, request.release()); return sk_sp<SkTypeface>(face); }