FontRanges CSSSegmentedFontFace::fontRanges(const FontDescription& fontDescription) { if (!isValid()) return FontRanges(); FontTraitsMask desiredTraitsMask = fontDescription.traitsMask(); unsigned hashKey = ((fontDescription.computedPixelSize() + 1) << (FontTraitsMaskWidth + FontWidthVariantWidth + 1)) | ((fontDescription.orientation() == Vertical ? 1 : 0) << (FontTraitsMaskWidth + FontWidthVariantWidth)) | fontDescription.widthVariant() << FontTraitsMaskWidth | desiredTraitsMask; auto addResult = m_descriptionToRangesMap.add(hashKey, FontRanges()); auto& fontRanges = addResult.iterator->value; if (addResult.isNewEntry) { for (auto& face : m_fontFaces) { if (!face->isValid()) continue; FontTraitsMask traitsMask = face->traitsMask(); bool syntheticBold = !(traitsMask & (FontWeight600Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask)) && (desiredTraitsMask & (FontWeight600Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask)); bool syntheticItalic = !(traitsMask & FontStyleItalicMask) && (desiredTraitsMask & FontStyleItalicMask); if (RefPtr<Font> faceFont = face->font(fontDescription, syntheticBold, syntheticItalic)) appendFontWithInvalidUnicodeRangeIfLoading(fontRanges, faceFont.releaseNonNull(), face->ranges()); } } return fontRanges; }
FontRanges CSSSegmentedFontFace::fontRanges(const FontDescription& fontDescription) { FontTraitsMask desiredTraitsMask = fontDescription.traitsMask(); auto addResult = m_cache.add(FontDescriptionKey(fontDescription), FontRanges()); auto& fontRanges = addResult.iterator->value; if (addResult.isNewEntry) { for (auto& face : m_fontFaces) { if (face->allSourcesFailed()) continue; FontTraitsMask traitsMask = face->traitsMask(); bool syntheticBold = (fontDescription.fontSynthesis() & FontSynthesisWeight) && !(traitsMask & (FontWeight600Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask)) && (desiredTraitsMask & (FontWeight600Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask)); bool syntheticItalic = (fontDescription.fontSynthesis() & FontSynthesisStyle) && !(traitsMask & FontStyleItalicMask) && (desiredTraitsMask & FontStyleItalicMask); if (RefPtr<Font> faceFont = face->font(fontDescription, syntheticBold, syntheticItalic)) appendFontWithInvalidUnicodeRangeIfLoading(fontRanges, faceFont.releaseNonNull(), face->ranges()); } } return fontRanges; }