| 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 9b3283cb4f48c5ddb5a9c25e4253bc0b2ea130ed..0f9fa07fca42181f828e4f65b15d784faeb697e8 100644
|
| --- a/third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp
|
| +++ b/third_party/WebKit/Source/platform/fonts/FontFallbackIterator.cpp
|
| @@ -99,8 +99,7 @@ PassRefPtr<FontDataForRangeSet> FontFallbackIterator::next(
|
|
|
| if (m_fallbackStage == SystemFonts) {
|
| // We've reached pref + system fallback.
|
| - ASSERT(hintList.size());
|
| - RefPtr<SimpleFontData> systemFont = uniqueSystemFontForHint(hintList[0]);
|
| + RefPtr<SimpleFontData> systemFont = uniqueSystemFontForHintList(hintList);
|
| if (systemFont) {
|
| // Fallback fonts are not retained in the FontDataCache.
|
| return uniqueOrNext(adoptRef(new FontDataForRangeSet(systemFont)),
|
| @@ -193,15 +192,47 @@ PassRefPtr<SimpleFontData> FontFallbackIterator::fallbackPriorityFont(
|
| m_fontFallbackPriority);
|
| }
|
|
|
| -PassRefPtr<SimpleFontData> FontFallbackIterator::uniqueSystemFontForHint(
|
| - UChar32 hint) {
|
| +static inline unsigned chooseHintIndex(const Vector<UChar32>& hintList) {
|
| + // crbug.com/618178 has a test case where no Myanmar font is ever found,
|
| + // because the run starts with a punctuation character with a script value of
|
| + // common. Our current font fallback code does not find a very meaningful
|
| + // result for this.
|
| + // TODO crbug.com/668706 - Improve this situation.
|
| + // So if we have multiple hint characters (which indicates that a
|
| + // multi-character grapheme or more failed to shape, then we can try to be
|
| + // smarter and select the first character that has an actual script value.
|
| + DCHECK(hintList.size());
|
| + if (hintList.size() <= 1)
|
| + return 0;
|
| +
|
| + UErrorCode err = U_ZERO_ERROR;
|
| + UScriptCode hintCharScript = uscript_getScript(hintList[0], &err);
|
| + if (!U_SUCCESS(err) || hintCharScript > USCRIPT_INHERITED)
|
| + return 0;
|
| +
|
| + for (size_t i = 1; i < hintList.size(); ++i) {
|
| + UScriptCode newHintScript = uscript_getScript(hintList[i], &err);
|
| + if (!U_SUCCESS(err))
|
| + return 0;
|
| + if (newHintScript > USCRIPT_INHERITED)
|
| + return i;
|
| + }
|
| + return 0;
|
| +}
|
| +
|
| +PassRefPtr<SimpleFontData> FontFallbackIterator::uniqueSystemFontForHintList(
|
| + const Vector<UChar32>& hintList) {
|
| // When we're asked for a fallback for the same characters again, we give up
|
| // because the shaper must have previously tried shaping with the font
|
| // already.
|
| - if (!hint || m_previouslyAskedForHint.contains(hint))
|
| + if (!hintList.size())
|
| return nullptr;
|
|
|
| FontCache* fontCache = FontCache::fontCache();
|
| + UChar32 hint = hintList[chooseHintIndex(hintList)];
|
| +
|
| + if (!hint || m_previouslyAskedForHint.contains(hint))
|
| + return nullptr;
|
| m_previouslyAskedForHint.add(hint);
|
| return fontCache->fallbackFontForCharacter(
|
| m_fontDescription, hint,
|
|
|