static FontRanges realizeNextFallback(const FontCascadeDescription& description, unsigned& index, FontSelector* fontSelector) { ASSERT(index < description.familyCount()); auto& fontCache = FontCache::singleton(); while (index < description.familyCount()) { const AtomicString& family = description.familyAt(index++); if (family.isEmpty()) continue; if (fontSelector) { auto ranges = fontSelector->fontRangesForFamily(description, family); if (!ranges.isNull()) return ranges; } if (auto font = fontCache.fontForFamily(description, family)) return FontRanges(WTFMove(font)); } // We didn't find a font. Try to find a similar font using our own specific knowledge about our platform. // For example on OS X, we know to map any families containing the words Arabic, Pashto, or Urdu to the // Geeza Pro font. for (auto& family : description.families()) { if (auto font = fontCache.similarFont(description, family)) return FontRanges(WTFMove(font)); } return { }; }
bool CSSFontSelector::resolvesFamilyFor(const FontCascadeDescription& description) const { for (unsigned i = 0; i < description.familyCount(); ++i) { const AtomicString& familyName = description.familyAt(i); if (familyName.isEmpty()) continue; if (m_fontFaces.contains(familyName)) return true; static NeverDestroyed<String> webkitPrefix("-webkit-"); if (familyName.startsWith(webkitPrefix.get())) return true; } return false; }
bool FontCascadeDescription::familiesEqualForTextAutoSizing(const FontCascadeDescription& other) const { unsigned thisFamilyCount = familyCount(); unsigned otherFamilyCount = other.familyCount(); if (thisFamilyCount != otherFamilyCount) return false; for (unsigned i = 0; i < thisFamilyCount; ++i) { if (!equalIgnoringCase(familyAt(i), other.familyAt(i))) return false; } return true; }