FontCacheKey FontDescription::cacheKey(const FontFaceCreationParams& creationParams, FontTraits desiredTraits) const { FontTraits fontTraits = desiredTraits.bitfield() ? desiredTraits : traits(); unsigned options = static_cast<unsigned>(m_syntheticItalic) << 5 | // bit 6 static_cast<unsigned>(m_syntheticBold) << 4 | // bit 5 static_cast<unsigned>(m_textRendering) << 2 | // bits 3-4 static_cast<unsigned>(m_orientation) << 1 | // bit 2 static_cast<unsigned>(m_subpixelTextPosition); // bit 1 return FontCacheKey(creationParams, effectiveFontSize(), options | fontTraits.bitfield() << 8); }
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(); }