SkTypeface* onLegacyCreateTypeface(const char requestedFamilyName[], SkFontStyle requestedStyle) const override { SkAutoMutexAcquire ama(fMutex); // Check if this request is already in the request cache. using Request = SkFontRequestCache::Request; SkAutoTDelete<Request> request(Request::Create(requestedFamilyName, requestedStyle)); SkTypeface* face = fCache.findAndRef(request); if (face) { return 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, 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 face; }
SkTypeface* SkFontMgr_DirectWrite::createTypefaceFromDWriteFont( IDWriteFontFace* fontFace, IDWriteFont* font, IDWriteFontFamily* fontFamily) const { SkAutoMutexAcquire ama(fTFCacheMutex); ProtoDWriteTypeface spec = { fontFace, font, fontFamily }; SkTypeface* face = fTFCache.findByProcAndRef(FindByDWriteFont, &spec); if (nullptr == face) { face = DWriteFontTypeface::Create(fFactory.get(), fontFace, font, fontFamily); if (face) { fTFCache.add(face); } } return face; }
static int count(skiatest::Reporter* reporter, const SkTypefaceCache& cache) { int count = 0; SkTypeface* none = cache.findByProcAndRef(count_proc, &count); REPORTER_ASSERT(reporter, none == nullptr); return count; }