Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(388)

Unified Diff: third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp

Issue 1672553004: Use FontFallbackPriority Fonts in FontFallbackIterator (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Column limit Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp
diff --git a/third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp b/third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp
index f13d587b3a6cf07ad0162214af6a87caf8922936..f425e26042a35a570da4d8d5875ff968d9facb2a 100644
--- a/third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp
+++ b/third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp
@@ -13,17 +13,38 @@
namespace blink {
-PassRefPtr<FontFallbackIterator> FontFallbackIterator::create(const FontDescription& description, PassRefPtr<FontFallbackList> fallbackList)
+PassRefPtr<FontFallbackIterator> FontFallbackIterator::create(
+ const FontDescription& description,
+ PassRefPtr<FontFallbackList> fallbackList,
+ FontFallbackPriority fontFallbackPriority)
{
- return adoptRef(new FontFallbackIterator(description, fallbackList));
+ return adoptRef(new FontFallbackIterator(
+ description, fallbackList, fontFallbackPriority));
}
-FontFallbackIterator::FontFallbackIterator(const FontDescription& description, PassRefPtr<FontFallbackList> fallbackList)
+FontFallbackIterator::FontFallbackIterator(const FontDescription& description,
+ PassRefPtr<FontFallbackList> fallbackList,
+ FontFallbackPriority fontFallbackPriority)
: m_fontDescription(description)
, m_fontFallbackList(fallbackList)
, m_currentFontDataIndex(0)
, m_segmentedIndex(0)
- , m_fallbackStage(FontGroupFonts)
+ , m_fallbackStage(
+// Due to crbug.com/322658 we cannot reliably select Emoji fonts on Android at
+// the moment. Disabling this functionality on Android to avoid reports of
+// unreliable behavior until this issue is solved.
+#if !OS(ANDROID)
+ // Currently we have to push the Emoji font to the top of the list
drott 2016/02/05 13:29:18 Looks like the windows failures indicate there is
+ // due to https://github.com/behdad/harfbuzz/issues/217
+ isNonTextFallbackPriority(fontFallbackPriority)
+ ? FallbackPriorityFonts
eae 2016/02/17 18:55:17 Indent line 40 and 41 one more level. isNonTextFa
+ : FontGroupFonts
+#else
+ FontGroupFonts
+#endif
+ )
+ , m_fontFallbackPriority(fontFallbackPriority)
+ , m_symbolsFontCursor(0)
{
}
@@ -71,12 +92,17 @@ const FontDataRange FontFallbackIterator::next(const Vector<UChar32>& hintList)
if (m_fallbackStage == OutOfLuck)
return FontDataRange();
- const FontData* fontData = m_fontFallbackList->fontDataAt(m_fontDescription, m_currentFontDataIndex);
+ if (m_fallbackStage == FallbackPriorityFonts) {
+ FontDataRange fallbackPriorityFont = nextFallbackPriorityFont();
+ if (!fallbackPriorityFont.isNull())
+ return fallbackPriorityFont;
+ // No more prioritized fallback fonts, proceed to processing the CSS
+ // defined fonts.
+ m_fallbackStage = FontGroupFonts;
+ return next(hintList);
+ }
- // If there is no fontData coming from the fallback list, it means
- // we have reached the system fallback stage.
- if (!fontData) {
- m_fallbackStage = SystemFonts;
+ if (m_fallbackStage == SystemFonts) {
// We've reached pref + system fallback.
ASSERT(hintList.size());
RefPtr<SimpleFontData> systemFont = uniqueSystemFontForHint(hintList[0]);
@@ -95,6 +121,19 @@ const FontDataRange FontFallbackIterator::next(const Vector<UChar32>& hintList)
return FontDataRange(lastResort);
}
+ ASSERT(m_fallbackStage == FontGroupFonts
+ || m_fallbackStage == SegmentedFace);
+ const FontData* fontData = m_fontFallbackList->fontDataAt(
+ m_fontDescription, m_currentFontDataIndex);
+
+ if (!fontData) {
+ // If there is no fontData coming from the fallback list, it means
+ // we are now looking at system fonts, either for prioritized symbol
+ // or emoji fonts or by calling system fallback API.
+ m_fallbackStage = SystemFonts;
+ return next(hintList);
+ }
+
// Otherwise we've received a fontData from the font-family: set of fonts,
// and a non-segmented one in this case.
if (!fontData->isSegmented()) {
@@ -137,6 +176,25 @@ const FontDataRange FontFallbackIterator::next(const Vector<UChar32>& hintList)
return next(hintList);
}
+FontDataRange FontFallbackIterator::nextFallbackPriorityFont()
+{
+ ASSERT(m_fontFallbackPriority != FontFallbackPriority::Invalid);
+ FontCache* fontCache = FontCache::fontCache();
+
+ const Vector<AtomicString>* priorityFontList =
+ fontCache->fontListForFallbackPriority(
+ m_fontDescription, m_fontFallbackPriority);
+
+ if (m_symbolsFontCursor == priorityFontList->size())
+ return FontDataRange();
+
+ RefPtr<SimpleFontData> priorityFont = fontCache->getFontData(
+ m_fontDescription,
+ priorityFontList->at(m_symbolsFontCursor));
+ m_symbolsFontCursor++;
+ return FontDataRange(priorityFont);
+}
+
const PassRefPtr<SimpleFontData> FontFallbackIterator::uniqueSystemFontForHint(UChar32 hint)
{
FontCache* fontCache = FontCache::fontCache();

Powered by Google App Engine
This is Rietveld 408576698