CSSSegmentedFontFace* FontFaceCache::get(const FontDescription& fontDescription, const AtomicString& family) { TraitsMap* familyFontFaces = m_fontFaces.get(family); if (!familyFontFaces || familyFontFaces->isEmpty()) return 0; FamilyToTraitsMap::AddResult traitsResult = m_fonts.add(family, nullptr); if (!traitsResult.storedValue->value) traitsResult.storedValue->value = adoptPtr(new TraitsMap); FontTraits traits = fontDescription.traits(); TraitsMap::AddResult faceResult = traitsResult.storedValue->value->add(traits.bitfield(), nullptr); if (!faceResult.storedValue->value) { for (TraitsMap::const_iterator i = familyFontFaces->begin(); i != familyFontFaces->end(); ++i) { CSSSegmentedFontFace* candidate = i->value.get(); FontTraits candidateTraits = candidate->traits(); if (traits.style() == FontStyleNormal && candidateTraits.style() != FontStyleNormal) continue; if (traits.variant() == FontVariantNormal && candidateTraits.variant() != FontVariantNormal) continue; if (!faceResult.storedValue->value || compareFontFaces(candidate, faceResult.storedValue->value.get(), traits)) faceResult.storedValue->value = candidate; } } return faceResult.storedValue->value.get(); }
CSSSegmentedFontFace* FontFaceCache::get(const FontDescription& fontDescription, const AtomicString& family) { TraitsMap* familyFontFaces = m_fontFaces.get(family); if (!familyFontFaces || familyFontFaces->isEmpty()) return nullptr; FamilyToTraitsMap::AddResult traitsResult = m_fonts.add(family, nullptr); if (!traitsResult.storedValue->value) traitsResult.storedValue->value = new TraitsMap; FontTraits traits = fontDescription.traits(); TraitsMap::AddResult faceResult = traitsResult.storedValue->value->add(traits.bitfield(), nullptr); if (!faceResult.storedValue->value) { for (const auto& item : *familyFontFaces) { CSSSegmentedFontFace* candidate = item.value.get(); FontStyleMatcher styleMatcher(traits); if (!faceResult.storedValue->value || styleMatcher.isCandidateBetter(candidate, faceResult.storedValue->value.get())) faceResult.storedValue->value = candidate; } } return faceResult.storedValue->value.get(); }
void FontFaceCache::removeFontFace(FontFace* fontFace, bool cssConnected) { FamilyToTraitsMap::iterator fontFacesIter = m_fontFaces.find(fontFace->family()); if (fontFacesIter == m_fontFaces.end()) return; TraitsMap* familyFontFaces = fontFacesIter->value.get(); TraitsMap::iterator familyFontFacesIter = familyFontFaces->find(fontFace->traits().bitfield()); if (familyFontFacesIter == familyFontFaces->end()) return; RawPtr<CSSSegmentedFontFace> segmentedFontFace = familyFontFacesIter->value; segmentedFontFace->removeFontFace(fontFace); if (segmentedFontFace->isEmpty()) { familyFontFaces->remove(familyFontFacesIter); if (familyFontFaces->isEmpty()) m_fontFaces.remove(fontFacesIter); } m_fonts.remove(fontFace->family()); if (cssConnected) m_cssConnectedFontFaces.remove(fontFace); ++m_version; }