RefPtr<Font> FontCache::systemFallbackForCharacters(const FontDescription& description, const Font* originalFontData, bool, const UChar* characters, unsigned length) { RefPtr<FcPattern> pattern = createFontConfigPatternForCharacters(characters, length); const FontPlatformData& fontData = originalFontData->platformData(); RefPtr<FcPattern> fallbackPattern = findBestFontGivenFallbacks(fontData, pattern.get()); if (fallbackPattern) { FontPlatformData alternateFontData(fallbackPattern.get(), description); return fontForPlatformData(alternateFontData); } FcResult fontConfigResult; RefPtr<FcPattern> resultPattern = adoptRef(FcFontMatch(nullptr, pattern.get(), &fontConfigResult)); if (!resultPattern) return nullptr; FontPlatformData alternateFontData(resultPattern.get(), description); return fontForPlatformData(alternateFontData); }
PassRefPtr<SimpleFontData> FontCache::getFontDataForCharacters(const Font& font, const UChar* characters, int length) { RefPtr<FcPattern> pattern = adoptRef(createFontConfigPatternForCharacters(characters, length)); const FontPlatformData& fontData = font.primaryFont()->platformData(); RefPtr<FcPattern> fallbackPattern = adoptRef(findBestFontGivenFallbacks(fontData, pattern.get())); if (fallbackPattern) { FontPlatformData alternateFontData(fallbackPattern.get(), font.fontDescription()); return getCachedFontData(&alternateFontData, DoNotRetain); } FcResult fontConfigResult; RefPtr<FcPattern> resultPattern = adoptRef(FcFontMatch(0, pattern.get(), &fontConfigResult)); if (!resultPattern) return 0; FontPlatformData alternateFontData(resultPattern.get(), font.fontDescription()); return getCachedFontData(&alternateFontData, DoNotRetain); }
PassRefPtr<SimpleFontData> FontCache::systemFallbackForCharacters(const FontDescription& description, const SimpleFontData* originalFontData, bool, const UChar* characters, int length) { RefPtr<FcPattern> pattern = adoptRef(createFontConfigPatternForCharacters(characters, length)); const FontPlatformData& fontData = originalFontData->platformData(); RefPtr<FcPattern> fallbackPattern = adoptRef(findBestFontGivenFallbacks(fontData, pattern.get())); if (fallbackPattern) { FontPlatformData alternateFontData(fallbackPattern.get(), description); return getCachedFontData(&alternateFontData, DoNotRetain); } FcResult fontConfigResult; RefPtr<FcPattern> resultPattern = adoptRef(FcFontMatch(0, pattern.get(), &fontConfigResult)); if (!resultPattern) return 0; FontPlatformData alternateFontData(resultPattern.get(), description); return getCachedFontData(&alternateFontData, DoNotRetain); }
RefPtr<Font> FontCache::systemFallbackForCharacters(const FontDescription& description, const Font* originalFontData, bool, const UChar* characters, unsigned length) { RefPtr<FcPattern> pattern = createFontConfigPatternForCharacters(characters, length); const FontPlatformData& fontData = originalFontData->platformData(); RefPtr<FcPattern> fallbackPattern = findBestFontGivenFallbacks(fontData, pattern.get()); if (fallbackPattern) { FontPlatformData alternateFontData(fallbackPattern.get(), description); return fontForPlatformData(alternateFontData); } auto addResult = systemFallbackMap().add(FcPatternHash(pattern.get()), nullptr); auto& resultPattern = addResult.iterator->value; if (addResult.isNewEntry) { FcResult fontConfigResult; resultPattern = adoptRef(FcFontMatch(nullptr, pattern.get(), &fontConfigResult)); } if (!resultPattern) return nullptr; FontPlatformData alternateFontData(resultPattern.get(), description); return fontForPlatformData(alternateFontData); }