aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/gfx/platform/freetype/font_list.rs220
-rw-r--r--components/gfx/platform/macos/font_list.rs118
-rw-r--r--components/gfx/platform/mod.rs236
3 files changed, 247 insertions, 327 deletions
diff --git a/components/gfx/platform/freetype/font_list.rs b/components/gfx/platform/freetype/font_list.rs
index a918c81286a..7fa0187a0cc 100644
--- a/components/gfx/platform/freetype/font_list.rs
+++ b/components/gfx/platform/freetype/font_list.rs
@@ -34,6 +34,7 @@ use unicode_script::Script;
use super::c_str_to_string;
use crate::font::map_platform_values_to_style_values;
use crate::font_template::{FontTemplate, FontTemplateDescriptor};
+use crate::platform::add_noto_fallback_families;
use crate::text::FallbackFontSelectionOptions;
/// An identifier for a local font on systems using Freetype.
@@ -207,226 +208,23 @@ pub fn fallback_font_families(options: FallbackFontSelectionOptions) -> Vec<&'st
families.push("Noto Color Emoji");
}
- let add_chinese_families = |families: &mut Vec<&str>| {
- // TODO: Need to differentiate between traditional and simplified Han here!
- families.push("Noto Sans CJK HK");
- families.push("Noto Sans CJK SC");
- families.push("Noto Sans CJK TC");
- families.push("Noto Sans HK");
- families.push("Noto Sans SC");
- families.push("Noto Sans TC");
+ add_noto_fallback_families(options, &mut families);
+
+ if matches!(
+ Script::from(options.character),
+ Script::Bopomofo | Script::Han
+ ) {
families.push("WenQuanYi Micro Hei");
- };
-
- match Script::from(options.character) {
- // In most cases, COMMON and INHERITED characters will be merged into
- // their context, but if they occur without any specific script context
- // we'll just try common default fonts here.
- Script::Common | Script::Inherited | Script::Latin | Script::Cyrillic | Script::Greek => {
- families.push("Noto Sans");
- },
- // CJK-related script codes are a bit troublesome because of unification;
- // we'll probably just get HAN much of the time, so the choice of which
- // language font to try for fallback is rather arbitrary. Usually, though,
- // we hope that font prefs will have handled this earlier.
- Script::Bopomofo | Script::Han => add_chinese_families(&mut families),
- Script::Hanifi_Rohingya => families.push("Noto Sans Hanifi Rohingya"),
- Script::Wancho => families.push("Noto Sans Wancho"),
- _ => {},
}
if let Some(block) = options.character.block() {
match block {
UnicodeBlock::HalfwidthandFullwidthForms |
- UnicodeBlock::EnclosedIdeographicSupplement => add_chinese_families(&mut families),
- UnicodeBlock::Adlam => families.push("Noto Sans Adlam"),
- UnicodeBlock::Ahom => families.push("Noto Serif Ahom"),
- UnicodeBlock::AnatolianHieroglyphs => families.push("Noto Sans AnatoHiero"),
- UnicodeBlock::Arabic |
- UnicodeBlock::ArabicExtendedA |
- UnicodeBlock::ArabicPresentationFormsA |
- UnicodeBlock::ArabicPresentationFormsB => {
- families.push("Noto Sans Arabic");
- families.push("Noto Naskh Arabic");
- },
- UnicodeBlock::ArabicMathematicalAlphabeticSymbols => {
- families.push("Noto Sans Math");
- },
- UnicodeBlock::Armenian => families.push("Noto Sans Armenian"),
- UnicodeBlock::Avestan => families.push("Noto Sans Avestan"),
- UnicodeBlock::Balinese => families.push("Noto Sans Balinese"),
- UnicodeBlock::Bamum | UnicodeBlock::BamumSupplement => families.push("Noto Sans Bamum"),
- UnicodeBlock::BassaVah => families.push("Noto Sans Bassa Vah"),
- UnicodeBlock::Batak => families.push("Noto Sans Batak"),
- UnicodeBlock::Bengali => families.push("Noto Sans Bengali"),
- UnicodeBlock::Bhaiksuki => families.push("Noto Sans Bhaiksuki"),
- UnicodeBlock::Brahmi => families.push("Noto Sans Brahmi"),
- UnicodeBlock::BraillePatterns => {
- // These characters appear to be in DejaVu Serif.
- },
- UnicodeBlock::Buginese => families.push("Noto Sans Buginese"),
- UnicodeBlock::Buhid => families.push("Noto Sans Buhid"),
- UnicodeBlock::Carian => families.push("Noto Sans Carian"),
- UnicodeBlock::CaucasianAlbanian => families.push("Noto Sans Caucasian Albanian"),
- UnicodeBlock::Chakma => families.push("Noto Sans Chakma"),
- UnicodeBlock::Cham => families.push("Noto Sans Cham"),
- UnicodeBlock::Cherokee | UnicodeBlock::CherokeeSupplement => {
- families.push("Noto Sans Cherokee")
- },
- UnicodeBlock::Coptic => families.push("Noto Sans Coptic"),
- UnicodeBlock::Cuneiform | UnicodeBlock::CuneiformNumbersandPunctuation => {
- families.push("Noto Sans Cuneiform")
- },
- UnicodeBlock::CypriotSyllabary => families.push("Noto Sans Cypriot"),
- UnicodeBlock::Deseret => families.push("Noto Sans Deseret"),
- UnicodeBlock::Devanagari |
- UnicodeBlock::DevanagariExtended |
- UnicodeBlock::CommonIndicNumberForms => families.push("Noto Sans Devanagari"),
- UnicodeBlock::Duployan => families.push("Noto Sans Duployan"),
- UnicodeBlock::EgyptianHieroglyphs => families.push("Noto Sans Egyptian Hieroglyphs"),
- UnicodeBlock::Elbasan => families.push("Noto Sans Elbasan"),
- UnicodeBlock::Ethiopic |
- UnicodeBlock::EthiopicExtended |
- UnicodeBlock::EthiopicExtendedA |
- UnicodeBlock::EthiopicSupplement => families.push("Noto Sans Ethiopic"),
- UnicodeBlock::Georgian | UnicodeBlock::GeorgianSupplement => {
- families.push("Noto Sans Georgian")
- },
- UnicodeBlock::Glagolitic | UnicodeBlock::GlagoliticSupplement => {
- families.push("Noto Sans Glagolitic")
- },
- UnicodeBlock::Gothic => families.push("Noto Sans Gothic"),
- UnicodeBlock::Grantha => families.push("Noto Sans Grantha"),
- UnicodeBlock::Gujarati => families.push("Noto Sans Gujarati"),
- UnicodeBlock::Gurmukhi => families.push("Noto Sans Gurmukhi"),
- UnicodeBlock::HangulCompatibilityJamo |
- UnicodeBlock::HangulJamo |
- UnicodeBlock::HangulJamoExtendedA |
- UnicodeBlock::HangulJamoExtendedB |
- UnicodeBlock::HangulSyllables => {
- families.push("Noto Sans KR");
- families.push("Noto Sans CJK KR");
- },
- UnicodeBlock::Hanunoo => families.push("Noto Sans Hanunoo"),
- UnicodeBlock::Hatran => families.push("Noto Sans Hatran"),
- UnicodeBlock::Hebrew => families.push("Noto Sans Hebrew"),
+ UnicodeBlock::EnclosedIdeographicSupplement => families.push("WenQuanYi Micro Hei"),
UnicodeBlock::Hiragana |
UnicodeBlock::Katakana |
UnicodeBlock::KatakanaPhoneticExtensions => {
families.push("TakaoPGothic");
- families.push("Noto Sans JP");
- families.push("Noto Sans CJK JP");
- },
- UnicodeBlock::ImperialAramaic => families.push("Noto Sans Imperial Aramaic"),
- UnicodeBlock::InscriptionalPahlavi => families.push("Noto Sans Inscriptional Pahlavi"),
- UnicodeBlock::InscriptionalParthian => {
- families.push("Noto Sans Inscriptional Parthian")
- },
- UnicodeBlock::Javanese => families.push("Noto Sans Javanese"),
- UnicodeBlock::Kaithi => families.push("Noto Sans Kaithi"),
- UnicodeBlock::Kannada => families.push("Noto Sans Kannada"),
- UnicodeBlock::KayahLi => families.push("Noto Sans Kayah Li"),
- UnicodeBlock::Kharoshthi => families.push("Noto Sans Kharoshthi"),
- UnicodeBlock::Khmer | UnicodeBlock::KhmerSymbols => families.push("Noto Sans Khmer"),
- UnicodeBlock::Khojki => families.push("Noto Sans Khojki"),
- UnicodeBlock::Khudawadi => families.push("Noto Sans Khudawadi"),
- UnicodeBlock::Lao => families.push("Noto Sans Lao"),
- UnicodeBlock::Lepcha => families.push("Noto Sans Lepcha"),
- UnicodeBlock::Limbu => families.push("Noto Sans Limbu"),
- UnicodeBlock::LinearA => families.push("Noto Sans Linear A"),
- UnicodeBlock::LinearBIdeograms | UnicodeBlock::LinearBSyllabary => {
- families.push("Noto Sans Linear B")
- },
- UnicodeBlock::Lisu => families.push("Noto Sans Lisu"),
- UnicodeBlock::Lycian => families.push("Noto Sans Lycian"),
- UnicodeBlock::Lydian => families.push("Noto Sans Lydian"),
- UnicodeBlock::Mahajani => families.push("Noto Sans Mahajani"),
- UnicodeBlock::Malayalam => families.push("Noto Sans Malayalam"),
- UnicodeBlock::Mandaic => families.push("Noto Sans Mandaic"),
- UnicodeBlock::Manichaean => families.push("Noto Sans Manichaean"),
- UnicodeBlock::Marchen => families.push("Noto Sans Marchen"),
- UnicodeBlock::MeeteiMayek | UnicodeBlock::MeeteiMayekExtensions => {
- families.push("Noto Sans Meetei Mayek")
- },
- UnicodeBlock::MendeKikakui => families.push("Noto Sans Mende Kikakui"),
- UnicodeBlock::MeroiticCursive | UnicodeBlock::MeroiticHieroglyphs => {
- families.push("Noto Sans Meroitic")
- },
- UnicodeBlock::Miao => families.push("Noto Sans Miao"),
- UnicodeBlock::Modi => families.push("Noto Sans Modi"),
- UnicodeBlock::Mongolian | UnicodeBlock::MongolianSupplement => {
- families.push("Noto Sans Mongolian")
- },
- UnicodeBlock::Mro => families.push("Noto Sans Mro"),
- UnicodeBlock::Multani => families.push("Noto Sans Multani"),
- UnicodeBlock::MusicalSymbols => families.push("Noto Music"),
- UnicodeBlock::Myanmar |
- UnicodeBlock::MyanmarExtendedA |
- UnicodeBlock::MyanmarExtendedB => families.push("Noto Sans Myanmar"),
- UnicodeBlock::NKo => families.push("Noto Sans NKo"),
- UnicodeBlock::Nabataean => families.push("Noto Sans Nabataean"),
- UnicodeBlock::NewTaiLue => families.push("Noto Sans New Tai Lue"),
- UnicodeBlock::Newa => families.push("Noto Sans Newa"),
- UnicodeBlock::Ogham => families.push("Noto Sans Ogham"),
- UnicodeBlock::OlChiki => families.push("Noto Sans Ol Chiki"),
- UnicodeBlock::OldHungarian => families.push("Noto Sans Old Hungarian"),
- UnicodeBlock::OldItalic => families.push("Noto Sans Old Italic"),
- UnicodeBlock::OldNorthArabian => families.push("Noto Sans Old North Arabian"),
- UnicodeBlock::OldPermic => families.push("Noto Sans Old Permic"),
- UnicodeBlock::OldPersian => families.push("Noto Sans Old Persian"),
- UnicodeBlock::OldSouthArabian => families.push("Noto Sans Old South Arabian"),
- UnicodeBlock::OldTurkic => families.push("Noto Sans Old Turkic"),
- UnicodeBlock::Oriya => families.push("Noto Sans Oriya"),
- UnicodeBlock::Osage => families.push("Noto Sans Osage"),
- UnicodeBlock::Osmanya => families.push("Noto Sans Osmanya"),
- UnicodeBlock::PahawhHmong => families.push("Noto Sans Pahawh Hmong"),
- UnicodeBlock::Palmyrene => families.push("Noto Sans Palmyrene"),
- UnicodeBlock::PauCinHau => families.push("Noto Sans Pau Cin Hau"),
- UnicodeBlock::Phagspa => families.push("Noto Sans PhagsPa"),
- UnicodeBlock::Phoenician => families.push("Noto Sans Phoenician"),
- UnicodeBlock::PsalterPahlavi => families.push("Noto Sans Psalter Pahlavi"),
- UnicodeBlock::Rejang => families.push("Noto Sans Rejang"),
- UnicodeBlock::Runic => families.push("Noto Sans Runic"),
- UnicodeBlock::Samaritan => families.push("Noto Sans Samaritan"),
- UnicodeBlock::Saurashtra => families.push("Noto Sans Saurashtra"),
- UnicodeBlock::Sharada => families.push("Noto Sans Sharada"),
- UnicodeBlock::Shavian => families.push("Noto Sans Shavian"),
- UnicodeBlock::Siddham => families.push("Noto Sans Siddham"),
- UnicodeBlock::Sinhala | UnicodeBlock::SinhalaArchaicNumbers => {
- families.push("Noto Sans Sinhala")
- },
- UnicodeBlock::SoraSompeng => families.push("Noto Sans Sora Sompeng"),
- UnicodeBlock::Sundanese => families.push("Noto Sans Sundanese"),
- UnicodeBlock::SuttonSignWriting => families.push("Noto Sans SignWrit"),
- UnicodeBlock::SylotiNagri => families.push("Noto Sans Syloti Nagri"),
- UnicodeBlock::Syriac => families.push("Noto Sans Syriac"),
- UnicodeBlock::Tagalog => families.push("Noto Sans Tagalog"),
- UnicodeBlock::Tagbanwa => families.push("Noto Sans Tagbanwa"),
- UnicodeBlock::TaiLe => families.push("Noto Sans Tai Le"),
- UnicodeBlock::TaiTham => families.push("Noto Sans Tai Tham"),
- UnicodeBlock::TaiViet => families.push("Noto Sans Tai Viet"),
- UnicodeBlock::Takri => families.push("Noto Sans Takri"),
- UnicodeBlock::Tamil => families.push("Noto Sans Tamil"),
- UnicodeBlock::Tangut |
- UnicodeBlock::TangutComponents |
- UnicodeBlock::IdeographicSymbolsandPunctuation => families.push("Noto Serif Tangut"),
- UnicodeBlock::Telugu => families.push("Noto Sans Telugu"),
- UnicodeBlock::Thaana => {
- families.push("Noto Sans Thaana");
- },
- UnicodeBlock::Thai => families.push("Noto Sans Thai"),
- UnicodeBlock::Tibetan => families.push("Noto Serif Tibetan"),
- UnicodeBlock::Tifinagh => families.push("Noto Sans Tifinagh"),
- UnicodeBlock::Tirhuta => families.push("Noto Sans Tirhuta"),
- UnicodeBlock::Ugaritic => families.push("Noto Sans Ugaritic"),
- UnicodeBlock::UnifiedCanadianAboriginalSyllabics |
- UnicodeBlock::UnifiedCanadianAboriginalSyllabicsExtended => {
- families.push("Noto Sans Canadian Aboriginal")
- },
- UnicodeBlock::Vai => families.push("Noto Sans Vai"),
- UnicodeBlock::WarangCiti => families.push("Noto Sans Warang Citi"),
- UnicodeBlock::YiSyllables | UnicodeBlock::YiRadicals => {
- families.push("Noto Sans Yi");
},
_ => {},
}
@@ -437,8 +235,6 @@ pub fn fallback_font_families(options: FallbackFontSelectionOptions) -> Vec<&'st
families.push("DejaVu Sans");
families.push("DejaVu Sans Mono");
families.push("FreeSans");
- families.push("Noto Sans Symbols");
- families.push("Noto Sans Symbols2");
families.push("Symbola");
families.push("Droid Sans Fallback");
diff --git a/components/gfx/platform/macos/font_list.rs b/components/gfx/platform/macos/font_list.rs
index 8c22a8424fe..b590058e14b 100644
--- a/components/gfx/platform/macos/font_list.rs
+++ b/components/gfx/platform/macos/font_list.rs
@@ -15,6 +15,7 @@ use unicode_script::Script;
use webrender_api::NativeFontHandle;
use crate::font_template::{FontTemplate, FontTemplateDescriptor};
+use crate::platform::add_noto_fallback_families;
use crate::platform::font::CoreTextFontTraitsMapping;
use crate::text::FallbackFontSelectionOptions;
@@ -147,7 +148,6 @@ pub fn fallback_font_families(options: FallbackFontSelectionOptions) -> Vec<&'st
UnicodeBlock::Armenian => families.push("Mshtakan"),
UnicodeBlock::Bengali => families.push("Bangla Sangam MN"),
UnicodeBlock::Cherokee => families.push("Plantagenet Cherokee"),
- UnicodeBlock::Coptic => families.push("Noto Sans Coptic"),
UnicodeBlock::Deseret => families.push("Baskerville"),
UnicodeBlock::Devanagari | UnicodeBlock::DevanagariExtended => {
families.push("Devanagari Sangam MN")
@@ -157,7 +157,6 @@ pub fn fallback_font_families(options: FallbackFontSelectionOptions) -> Vec<&'st
UnicodeBlock::EthiopicExtendedA |
UnicodeBlock::EthiopicSupplement => families.push("Kefa"),
UnicodeBlock::Georgian | UnicodeBlock::GeorgianSupplement => families.push("Helvetica"),
- UnicodeBlock::Gothic => families.push("Noto Sans Gothic"),
UnicodeBlock::Gujarati => families.push("Gujarati Sangam MN"),
UnicodeBlock::Gurmukhi => families.push("Gurmukhi MN"),
UnicodeBlock::Hebrew => families.push("Lucida Grande"),
@@ -165,24 +164,16 @@ pub fn fallback_font_families(options: FallbackFontSelectionOptions) -> Vec<&'st
UnicodeBlock::Khmer => families.push("Khmer MN"),
UnicodeBlock::Lao => families.push("Lao MN"),
UnicodeBlock::Malayalam => families.push("Malayalam Sangam MN"),
- UnicodeBlock::Mongolian | UnicodeBlock::MongolianSupplement => {
- families.push("Noto Sans Mongolian")
- },
UnicodeBlock::Myanmar |
UnicodeBlock::MyanmarExtendedA |
UnicodeBlock::MyanmarExtendedB => families.push("Myanmar MN"),
- UnicodeBlock::Ogham => families.push("Noto Sans Ogham"),
- UnicodeBlock::OldItalic => families.push("Noto Sans Old Italic"),
UnicodeBlock::Oriya => families.push("Oriya Sangam MN"),
- UnicodeBlock::Runic => families.push("Noto Sans Runic"),
UnicodeBlock::Sinhala | UnicodeBlock::SinhalaArchaicNumbers => {
families.push("Sinhala Sangam MN")
},
- UnicodeBlock::Syriac => families.push("Noto Sans Syriac"),
UnicodeBlock::Tamil => families.push("Tamil MN"),
UnicodeBlock::Telugu => families.push("Telugu MN"),
UnicodeBlock::Thaana => {
- families.push("Noto Sans Thaana");
families.push("Thonburi");
},
UnicodeBlock::Tibetan => families.push("Kailasa"),
@@ -191,118 +182,15 @@ pub fn fallback_font_families(options: FallbackFontSelectionOptions) -> Vec<&'st
families.push("Euphemia UCAS")
},
UnicodeBlock::YiSyllables | UnicodeBlock::YiRadicals => {
- families.push("Noto Sans Yi");
families.push("STHeiti");
},
- UnicodeBlock::Tagalog => families.push("Noto Sans Tagalog"),
- UnicodeBlock::Hanunoo => families.push("Noto Sans Hanunoo"),
- UnicodeBlock::Buhid => families.push("Noto Sans Buhid"),
- UnicodeBlock::Tagbanwa => families.push("Noto Sans Tagbanwa"),
UnicodeBlock::BraillePatterns => families.push("Apple Braille"),
- UnicodeBlock::CypriotSyllabary => families.push("Noto Sans Cypriot"),
- UnicodeBlock::Limbu => families.push("Noto Sans Limbu"),
- UnicodeBlock::LinearBIdeograms | UnicodeBlock::LinearBSyllabary => {
- families.push("Noto Sans Linear B")
- },
- UnicodeBlock::Osmanya => families.push("Noto Sans Osmanya"),
- UnicodeBlock::Shavian => families.push("Noto Sans Shavian"),
- UnicodeBlock::TaiLe => families.push("Noto Sans Tai Le"),
- UnicodeBlock::Ugaritic => families.push("Noto Sans Ugaritic"),
- UnicodeBlock::Buginese => families.push("Noto Sans Buginese"),
- UnicodeBlock::Glagolitic | UnicodeBlock::GlagoliticSupplement => {
- families.push("Noto Sans Glagolitic")
- },
- UnicodeBlock::Kharoshthi => families.push("Noto Sans Kharoshthi"),
- UnicodeBlock::SylotiNagri => families.push("Noto Sans Syloti Nagri"),
- UnicodeBlock::NewTaiLue => families.push("Noto Sans New Tai Lue"),
- UnicodeBlock::Tifinagh => families.push("Noto Sans Tifinagh"),
- UnicodeBlock::OldPersian => families.push("Noto Sans Old Persian"),
- UnicodeBlock::Balinese => families.push("Noto Sans Balinese"),
- UnicodeBlock::Batak => families.push("Noto Sans Batak"),
- UnicodeBlock::Brahmi => families.push("Noto Sans Brahmi"),
- UnicodeBlock::Cham => families.push("Noto Sans Cham"),
- UnicodeBlock::EgyptianHieroglyphs => families.push("Noto Sans Egyptian Hieroglyphs"),
- UnicodeBlock::PahawhHmong => families.push("Noto Sans Pahawh Hmong"),
- UnicodeBlock::OldHungarian => families.push("Noto Sans Old Hungarian"),
- UnicodeBlock::Javanese => families.push("Noto Sans Javanese"),
- UnicodeBlock::KayahLi => families.push("Noto Sans Kayah Li"),
- UnicodeBlock::Lepcha => families.push("Noto Sans Lepcha"),
- UnicodeBlock::LinearA => families.push("Noto Sans Linear A"),
- UnicodeBlock::Mandaic => families.push("Noto Sans Mandaic"),
- UnicodeBlock::NKo => families.push("Noto Sans NKo"),
- UnicodeBlock::OldTurkic => families.push("Noto Sans Old Turkic"),
- UnicodeBlock::OldPermic => families.push("Noto Sans Old Permic"),
- UnicodeBlock::Phagspa => families.push("Noto Sans PhagsPa"),
- UnicodeBlock::Phoenician => families.push("Noto Sans Phoenician"),
- UnicodeBlock::Miao => families.push("Noto Sans Miao"),
- UnicodeBlock::Vai => families.push("Noto Sans Vai"),
- UnicodeBlock::Cuneiform | UnicodeBlock::CuneiformNumbersandPunctuation => {
- families.push("Noto Sans Cuneiform")
- },
- UnicodeBlock::Carian => families.push("Noto Sans Carian"),
- UnicodeBlock::TaiTham => families.push("Noto Sans Tai Tham"),
- UnicodeBlock::Lycian => families.push("Noto Sans Lycian"),
- UnicodeBlock::Lydian => families.push("Noto Sans Lydian"),
- UnicodeBlock::OlChiki => families.push("Noto Sans Ol Chiki"),
- UnicodeBlock::Rejang => families.push("Noto Sans Rejang"),
- UnicodeBlock::Saurashtra => families.push("Noto Sans Saurashtra"),
- UnicodeBlock::Sundanese => families.push("Noto Sans Sundanese"),
- UnicodeBlock::MeeteiMayek | UnicodeBlock::MeeteiMayekExtensions => {
- families.push("Noto Sans Meetei Mayek")
- },
- UnicodeBlock::ImperialAramaic => families.push("Noto Sans Imperial Aramaic"),
- UnicodeBlock::Avestan => families.push("Noto Sans Avestan"),
- UnicodeBlock::Chakma => families.push("Noto Sans Chakma"),
- UnicodeBlock::Kaithi => families.push("Noto Sans Kaithi"),
- UnicodeBlock::Manichaean => families.push("Noto Sans Manichaean"),
- UnicodeBlock::InscriptionalPahlavi => families.push("Noto Sans Inscriptional Pahlavi"),
- UnicodeBlock::PsalterPahlavi => families.push("Noto Sans Psalter Pahlavi"),
- UnicodeBlock::InscriptionalParthian => {
- families.push("Noto Sans Inscriptional Parthian")
- },
- UnicodeBlock::Samaritan => families.push("Noto Sans Samaritan"),
- UnicodeBlock::TaiViet => families.push("Noto Sans Tai Viet"),
- UnicodeBlock::Bamum | UnicodeBlock::BamumSupplement => families.push("Noto Sans Bamum"),
- UnicodeBlock::Lisu => families.push("Noto Sans Lisu"),
- UnicodeBlock::OldSouthArabian => families.push("Noto Sans Old South Arabian"),
- UnicodeBlock::BassaVah => families.push("Noto Sans Bassa Vah"),
- UnicodeBlock::Duployan => families.push("Noto Sans Duployan"),
- UnicodeBlock::Elbasan => families.push("Noto Sans Elbasan"),
- UnicodeBlock::Grantha => families.push("Noto Sans Grantha"),
- UnicodeBlock::MendeKikakui => families.push("Noto Sans Mende Kikakui"),
- UnicodeBlock::MeroiticCursive | UnicodeBlock::MeroiticHieroglyphs => {
- families.push("Noto Sans Meroitic")
- },
- UnicodeBlock::OldNorthArabian => families.push("Noto Sans Old North Arabian"),
- UnicodeBlock::Nabataean => families.push("Noto Sans Nabataean"),
- UnicodeBlock::Palmyrene => families.push("Noto Sans Palmyrene"),
- UnicodeBlock::Khudawadi => families.push("Noto Sans Khudawadi"),
- UnicodeBlock::WarangCiti => families.push("Noto Sans Warang Citi"),
- UnicodeBlock::Mro => families.push("Noto Sans Mro"),
- UnicodeBlock::Sharada => families.push("Noto Sans Sharada"),
- UnicodeBlock::SoraSompeng => families.push("Noto Sans Sora Sompeng"),
- UnicodeBlock::Takri => families.push("Noto Sans Takri"),
- UnicodeBlock::Khojki => families.push("Noto Sans Khojki"),
- UnicodeBlock::Tirhuta => families.push("Noto Sans Tirhuta"),
- UnicodeBlock::CaucasianAlbanian => families.push("Noto Sans Caucasian Albanian"),
- UnicodeBlock::Mahajani => families.push("Noto Sans Mahajani"),
- UnicodeBlock::Ahom => families.push("Noto Serif Ahom"),
- UnicodeBlock::Hatran => families.push("Noto Sans Hatran"),
- UnicodeBlock::Modi => families.push("Noto Sans Modi"),
- UnicodeBlock::Multani => families.push("Noto Sans Multani"),
- UnicodeBlock::PauCinHau => families.push("Noto Sans Pau Cin Hau"),
- UnicodeBlock::Siddham => families.push("Noto Sans Siddham"),
- UnicodeBlock::Adlam => families.push("Noto Sans Adlam"),
- UnicodeBlock::Bhaiksuki => families.push("Noto Sans Bhaiksuki"),
- UnicodeBlock::Marchen => families.push("Noto Sans Marchen"),
- UnicodeBlock::Newa => families.push("Noto Sans Newa"),
- UnicodeBlock::Osage => families.push("Noto Sans Osage"),
- _ if script == Script::Hanifi_Rohingya => families.push("Noto Sans Hanifi Rohingya"),
- _ if script == Script::Wancho => families.push("Noto Sans Wancho"),
_ => {},
}
}
+ add_noto_fallback_families(options, &mut families);
+
// https://en.wikipedia.org/wiki/Plane_(Unicode)#Supplementary_Multilingual_Plane
let unicode_plane = unicode_plane(options.character);
if let 1 = unicode_plane {
diff --git a/components/gfx/platform/mod.rs b/components/gfx/platform/mod.rs
index 7b2efa41671..f445d83e75c 100644
--- a/components/gfx/platform/mod.rs
+++ b/components/gfx/platform/mod.rs
@@ -2,12 +2,16 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+use base::text::{UnicodeBlock, UnicodeBlockMethod};
+use unicode_script::Script;
+
#[cfg(any(target_os = "linux", target_os = "android"))]
pub use crate::platform::freetype::{font, font_list, library_handle};
#[cfg(target_os = "macos")]
pub use crate::platform::macos::{core_text_font_cache, font, font_list};
#[cfg(target_os = "windows")]
pub use crate::platform::windows::{font, font_list};
+use crate::text::FallbackFontSelectionOptions;
#[cfg(any(target_os = "linux", target_os = "android"))]
mod freetype {
@@ -57,3 +61,235 @@ mod windows {
pub mod font;
pub mod font_list;
}
+
+#[cfg(any(target_os = "linux", target_os = "macos"))]
+pub(crate) fn add_noto_fallback_families(
+ options: FallbackFontSelectionOptions,
+ families: &mut Vec<&'static str>,
+) {
+ // TODO: Need to differentiate between traditional and simplified Han here!
+ let add_chinese_families = |families: &mut Vec<&str>| {
+ families.push("Noto Sans CJK HK");
+ families.push("Noto Sans CJK SC");
+ families.push("Noto Sans CJK TC");
+ families.push("Noto Sans HK");
+ families.push("Noto Sans SC");
+ families.push("Noto Sans TC");
+ };
+
+ match Script::from(options.character) {
+ // In most cases, COMMON and INHERITED characters will be merged into
+ // their context, but if they occur without any specific script context
+ // we'll just try common default fonts here.
+ Script::Common | Script::Inherited | Script::Latin | Script::Cyrillic | Script::Greek => {
+ families.push("Noto Sans");
+ },
+ // CJK-related script codes are a bit troublesome because of unification;
+ // we'll probably just get HAN much of the time, so the choice of which
+ // language font to try for fallback is rather arbitrary. Usually, though,
+ // we hope that font prefs will have handled this earlier.
+ Script::Bopomofo | Script::Han => add_chinese_families(families),
+ _ => {},
+ }
+
+ if let Some(block) = options.character.block() {
+ match block {
+ UnicodeBlock::HalfwidthandFullwidthForms |
+ UnicodeBlock::EnclosedIdeographicSupplement => add_chinese_families(families),
+ UnicodeBlock::Adlam => families.push("Noto Sans Adlam"),
+ UnicodeBlock::Ahom => families.push("Noto Serif Ahom"),
+ UnicodeBlock::AnatolianHieroglyphs => families.push("Noto Sans AnatoHiero"),
+ UnicodeBlock::Arabic |
+ UnicodeBlock::ArabicExtendedA |
+ UnicodeBlock::ArabicPresentationFormsA |
+ UnicodeBlock::ArabicPresentationFormsB => {
+ families.push("Noto Sans Arabic");
+ families.push("Noto Naskh Arabic");
+ },
+ UnicodeBlock::ArabicMathematicalAlphabeticSymbols => {
+ families.push("Noto Sans Math");
+ },
+ UnicodeBlock::Armenian => families.push("Noto Sans Armenian"),
+ UnicodeBlock::Avestan => families.push("Noto Sans Avestan"),
+ UnicodeBlock::Balinese => families.push("Noto Sans Balinese"),
+ UnicodeBlock::Bamum | UnicodeBlock::BamumSupplement => families.push("Noto Sans Bamum"),
+ UnicodeBlock::BassaVah => families.push("Noto Sans Bassa Vah"),
+ UnicodeBlock::Batak => families.push("Noto Sans Batak"),
+ UnicodeBlock::Bengali => families.push("Noto Sans Bengali"),
+ UnicodeBlock::Bhaiksuki => families.push("Noto Sans Bhaiksuki"),
+ UnicodeBlock::Brahmi => families.push("Noto Sans Brahmi"),
+ UnicodeBlock::BraillePatterns => {
+ // These characters appear to be in DejaVu Serif.
+ },
+ UnicodeBlock::Buginese => families.push("Noto Sans Buginese"),
+ UnicodeBlock::Buhid => families.push("Noto Sans Buhid"),
+ UnicodeBlock::Carian => families.push("Noto Sans Carian"),
+ UnicodeBlock::CaucasianAlbanian => families.push("Noto Sans Caucasian Albanian"),
+ UnicodeBlock::Chakma => families.push("Noto Sans Chakma"),
+ UnicodeBlock::Cham => families.push("Noto Sans Cham"),
+ UnicodeBlock::Cherokee | UnicodeBlock::CherokeeSupplement => {
+ families.push("Noto Sans Cherokee")
+ },
+ UnicodeBlock::Coptic => families.push("Noto Sans Coptic"),
+ UnicodeBlock::Cuneiform | UnicodeBlock::CuneiformNumbersandPunctuation => {
+ families.push("Noto Sans Cuneiform")
+ },
+ UnicodeBlock::CypriotSyllabary => families.push("Noto Sans Cypriot"),
+ UnicodeBlock::Deseret => families.push("Noto Sans Deseret"),
+ UnicodeBlock::Devanagari |
+ UnicodeBlock::DevanagariExtended |
+ UnicodeBlock::CommonIndicNumberForms => families.push("Noto Sans Devanagari"),
+ UnicodeBlock::Duployan => families.push("Noto Sans Duployan"),
+ UnicodeBlock::EgyptianHieroglyphs => families.push("Noto Sans Egyptian Hieroglyphs"),
+ UnicodeBlock::Elbasan => families.push("Noto Sans Elbasan"),
+ UnicodeBlock::Ethiopic |
+ UnicodeBlock::EthiopicExtended |
+ UnicodeBlock::EthiopicExtendedA |
+ UnicodeBlock::EthiopicSupplement => families.push("Noto Sans Ethiopic"),
+ UnicodeBlock::Georgian | UnicodeBlock::GeorgianSupplement => {
+ families.push("Noto Sans Georgian")
+ },
+ UnicodeBlock::Glagolitic | UnicodeBlock::GlagoliticSupplement => {
+ families.push("Noto Sans Glagolitic")
+ },
+ UnicodeBlock::Gothic => families.push("Noto Sans Gothic"),
+ UnicodeBlock::Grantha => families.push("Noto Sans Grantha"),
+ UnicodeBlock::Gujarati => families.push("Noto Sans Gujarati"),
+ UnicodeBlock::Gurmukhi => families.push("Noto Sans Gurmukhi"),
+ UnicodeBlock::HangulCompatibilityJamo |
+ UnicodeBlock::HangulJamo |
+ UnicodeBlock::HangulJamoExtendedA |
+ UnicodeBlock::HangulJamoExtendedB |
+ UnicodeBlock::HangulSyllables => {
+ families.push("Noto Sans KR");
+ families.push("Noto Sans CJK KR");
+ },
+ UnicodeBlock::HanifiRohingya => families.push("Noto Sans Hanifi Rohingya"),
+ UnicodeBlock::Hanunoo => families.push("Noto Sans Hanunoo"),
+ UnicodeBlock::Hatran => families.push("Noto Sans Hatran"),
+ UnicodeBlock::Hebrew => families.push("Noto Sans Hebrew"),
+ UnicodeBlock::Hiragana |
+ UnicodeBlock::Katakana |
+ UnicodeBlock::KatakanaPhoneticExtensions => {
+ families.push("Noto Sans JP");
+ families.push("Noto Sans CJK JP");
+ },
+ UnicodeBlock::ImperialAramaic => families.push("Noto Sans Imperial Aramaic"),
+ UnicodeBlock::InscriptionalPahlavi => families.push("Noto Sans Inscriptional Pahlavi"),
+ UnicodeBlock::InscriptionalParthian => {
+ families.push("Noto Sans Inscriptional Parthian")
+ },
+ UnicodeBlock::Javanese => families.push("Noto Sans Javanese"),
+ UnicodeBlock::Kaithi => families.push("Noto Sans Kaithi"),
+ UnicodeBlock::Kannada => families.push("Noto Sans Kannada"),
+ UnicodeBlock::KayahLi => families.push("Noto Sans Kayah Li"),
+ UnicodeBlock::Kharoshthi => families.push("Noto Sans Kharoshthi"),
+ UnicodeBlock::Khmer | UnicodeBlock::KhmerSymbols => families.push("Noto Sans Khmer"),
+ UnicodeBlock::Khojki => families.push("Noto Sans Khojki"),
+ UnicodeBlock::Khudawadi => families.push("Noto Sans Khudawadi"),
+ UnicodeBlock::Lao => families.push("Noto Sans Lao"),
+ UnicodeBlock::Lepcha => families.push("Noto Sans Lepcha"),
+ UnicodeBlock::Limbu => families.push("Noto Sans Limbu"),
+ UnicodeBlock::LinearA => families.push("Noto Sans Linear A"),
+ UnicodeBlock::LinearBIdeograms | UnicodeBlock::LinearBSyllabary => {
+ families.push("Noto Sans Linear B")
+ },
+ UnicodeBlock::Lisu => families.push("Noto Sans Lisu"),
+ UnicodeBlock::Lycian => families.push("Noto Sans Lycian"),
+ UnicodeBlock::Lydian => families.push("Noto Sans Lydian"),
+ UnicodeBlock::Mahajani => families.push("Noto Sans Mahajani"),
+ UnicodeBlock::Malayalam => families.push("Noto Sans Malayalam"),
+ UnicodeBlock::Mandaic => families.push("Noto Sans Mandaic"),
+ UnicodeBlock::Manichaean => families.push("Noto Sans Manichaean"),
+ UnicodeBlock::Marchen => families.push("Noto Sans Marchen"),
+ UnicodeBlock::MeeteiMayek | UnicodeBlock::MeeteiMayekExtensions => {
+ families.push("Noto Sans Meetei Mayek")
+ },
+ UnicodeBlock::MendeKikakui => families.push("Noto Sans Mende Kikakui"),
+ UnicodeBlock::MeroiticCursive | UnicodeBlock::MeroiticHieroglyphs => {
+ families.push("Noto Sans Meroitic")
+ },
+ UnicodeBlock::Miao => families.push("Noto Sans Miao"),
+ UnicodeBlock::Modi => families.push("Noto Sans Modi"),
+ UnicodeBlock::Mongolian | UnicodeBlock::MongolianSupplement => {
+ families.push("Noto Sans Mongolian")
+ },
+ UnicodeBlock::Mro => families.push("Noto Sans Mro"),
+ UnicodeBlock::Multani => families.push("Noto Sans Multani"),
+ UnicodeBlock::MusicalSymbols => families.push("Noto Music"),
+ UnicodeBlock::Myanmar |
+ UnicodeBlock::MyanmarExtendedA |
+ UnicodeBlock::MyanmarExtendedB => families.push("Noto Sans Myanmar"),
+ UnicodeBlock::NKo => families.push("Noto Sans NKo"),
+ UnicodeBlock::Nabataean => families.push("Noto Sans Nabataean"),
+ UnicodeBlock::NewTaiLue => families.push("Noto Sans New Tai Lue"),
+ UnicodeBlock::Newa => families.push("Noto Sans Newa"),
+ UnicodeBlock::Ogham => families.push("Noto Sans Ogham"),
+ UnicodeBlock::OlChiki => families.push("Noto Sans Ol Chiki"),
+ UnicodeBlock::OldHungarian => families.push("Noto Sans Old Hungarian"),
+ UnicodeBlock::OldItalic => families.push("Noto Sans Old Italic"),
+ UnicodeBlock::OldNorthArabian => families.push("Noto Sans Old North Arabian"),
+ UnicodeBlock::OldPermic => families.push("Noto Sans Old Permic"),
+ UnicodeBlock::OldPersian => families.push("Noto Sans Old Persian"),
+ UnicodeBlock::OldSouthArabian => families.push("Noto Sans Old South Arabian"),
+ UnicodeBlock::OldTurkic => families.push("Noto Sans Old Turkic"),
+ UnicodeBlock::Oriya => families.push("Noto Sans Oriya"),
+ UnicodeBlock::Osage => families.push("Noto Sans Osage"),
+ UnicodeBlock::Osmanya => families.push("Noto Sans Osmanya"),
+ UnicodeBlock::PahawhHmong => families.push("Noto Sans Pahawh Hmong"),
+ UnicodeBlock::Palmyrene => families.push("Noto Sans Palmyrene"),
+ UnicodeBlock::PauCinHau => families.push("Noto Sans Pau Cin Hau"),
+ UnicodeBlock::Phagspa => families.push("Noto Sans PhagsPa"),
+ UnicodeBlock::Phoenician => families.push("Noto Sans Phoenician"),
+ UnicodeBlock::PsalterPahlavi => families.push("Noto Sans Psalter Pahlavi"),
+ UnicodeBlock::Rejang => families.push("Noto Sans Rejang"),
+ UnicodeBlock::Runic => families.push("Noto Sans Runic"),
+ UnicodeBlock::Samaritan => families.push("Noto Sans Samaritan"),
+ UnicodeBlock::Saurashtra => families.push("Noto Sans Saurashtra"),
+ UnicodeBlock::Sharada => families.push("Noto Sans Sharada"),
+ UnicodeBlock::Shavian => families.push("Noto Sans Shavian"),
+ UnicodeBlock::Siddham => families.push("Noto Sans Siddham"),
+ UnicodeBlock::Sinhala | UnicodeBlock::SinhalaArchaicNumbers => {
+ families.push("Noto Sans Sinhala")
+ },
+ UnicodeBlock::SoraSompeng => families.push("Noto Sans Sora Sompeng"),
+ UnicodeBlock::Sundanese => families.push("Noto Sans Sundanese"),
+ UnicodeBlock::SuttonSignWriting => families.push("Noto Sans SignWrit"),
+ UnicodeBlock::SylotiNagri => families.push("Noto Sans Syloti Nagri"),
+ UnicodeBlock::Syriac => families.push("Noto Sans Syriac"),
+ UnicodeBlock::Tagalog => families.push("Noto Sans Tagalog"),
+ UnicodeBlock::Tagbanwa => families.push("Noto Sans Tagbanwa"),
+ UnicodeBlock::TaiLe => families.push("Noto Sans Tai Le"),
+ UnicodeBlock::TaiTham => families.push("Noto Sans Tai Tham"),
+ UnicodeBlock::TaiViet => families.push("Noto Sans Tai Viet"),
+ UnicodeBlock::Takri => families.push("Noto Sans Takri"),
+ UnicodeBlock::Tamil => families.push("Noto Sans Tamil"),
+ UnicodeBlock::Tangut |
+ UnicodeBlock::TangutComponents |
+ UnicodeBlock::IdeographicSymbolsandPunctuation => families.push("Noto Serif Tangut"),
+ UnicodeBlock::Telugu => families.push("Noto Sans Telugu"),
+ UnicodeBlock::Thaana => {
+ families.push("Noto Sans Thaana");
+ },
+ UnicodeBlock::Thai => families.push("Noto Sans Thai"),
+ UnicodeBlock::Tibetan => families.push("Noto Serif Tibetan"),
+ UnicodeBlock::Tifinagh => families.push("Noto Sans Tifinagh"),
+ UnicodeBlock::Tirhuta => families.push("Noto Sans Tirhuta"),
+ UnicodeBlock::Ugaritic => families.push("Noto Sans Ugaritic"),
+ UnicodeBlock::UnifiedCanadianAboriginalSyllabics |
+ UnicodeBlock::UnifiedCanadianAboriginalSyllabicsExtended => {
+ families.push("Noto Sans Canadian Aboriginal")
+ },
+ UnicodeBlock::Vai => families.push("Noto Sans Vai"),
+ UnicodeBlock::WarangCiti => families.push("Noto Sans Warang Citi"),
+ UnicodeBlock::YiSyllables | UnicodeBlock::YiRadicals => {
+ families.push("Noto Sans Yi");
+ },
+ UnicodeBlock::Wancho => families.push("Noto Sans Wancho"),
+ _ => {},
+ }
+ }
+
+ families.push("Noto Sans Symbols");
+ families.push("Noto Sans Symbols2");
+}