fonts/platform/
mod.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5#[cfg(all(
6    any(target_os = "linux", target_os = "macos"),
7    not(target_os = "android"),
8    not(target_env = "ohos")
9))]
10use base::text::{UnicodeBlock, UnicodeBlockMethod};
11#[cfg(all(
12    any(target_os = "linux", target_os = "macos"),
13    not(target_os = "android"),
14    not(target_env = "ohos")
15))]
16use unicode_script::Script;
17
18#[cfg(all(
19    any(target_os = "linux", target_os = "macos"),
20    not(target_os = "android"),
21    not(target_env = "ohos")
22))]
23use crate::FallbackFontSelectionOptions;
24#[cfg(any(target_os = "linux", target_os = "android"))]
25pub use crate::platform::freetype::{font, font_list};
26#[cfg(target_os = "macos")]
27pub use crate::platform::macos::{core_text_font_cache, font, font_list};
28#[cfg(target_os = "windows")]
29pub use crate::platform::windows::{font, font_list};
30
31#[cfg(any(target_os = "linux", target_os = "android"))]
32pub mod freetype;
33
34#[cfg(target_os = "macos")]
35mod macos {
36    pub mod core_text_font_cache;
37    pub mod font;
38    pub mod font_list;
39}
40
41#[cfg(target_os = "windows")]
42mod windows {
43    pub mod font;
44    pub mod font_list;
45}
46
47#[cfg(all(
48    any(target_os = "linux", target_os = "macos"),
49    not(target_os = "android"),
50    not(target_env = "ohos")
51))]
52pub(crate) fn add_noto_fallback_families(
53    options: FallbackFontSelectionOptions,
54    families: &mut Vec<&'static str>,
55) {
56    // TODO: Need to differentiate between traditional and simplified Han here!
57    let add_chinese_families = |families: &mut Vec<&str>| {
58        families.push("Noto Sans CJK HK");
59        families.push("Noto Sans CJK SC");
60        families.push("Noto Sans CJK TC");
61        families.push("Noto Sans HK");
62        families.push("Noto Sans SC");
63        families.push("Noto Sans TC");
64    };
65
66    match Script::from(options.character) {
67        // In most cases, COMMON and INHERITED characters will be merged into
68        // their context, but if they occur without any specific script context
69        // we'll just try common default fonts here.
70        Script::Common | Script::Inherited | Script::Latin | Script::Cyrillic | Script::Greek => {
71            families.push("Noto Sans");
72        },
73        // CJK-related script codes are a bit troublesome because of unification;
74        // we'll probably just get HAN much of the time, so the choice of which
75        // language font to try for fallback is rather arbitrary. Usually, though,
76        // we hope that font prefs will have handled this earlier.
77        Script::Bopomofo | Script::Han => add_chinese_families(families),
78        _ => {},
79    }
80
81    if let Some(block) = options.character.block() {
82        match block {
83            UnicodeBlock::HalfwidthandFullwidthForms |
84            UnicodeBlock::EnclosedIdeographicSupplement => add_chinese_families(families),
85            UnicodeBlock::Adlam => families.push("Noto Sans Adlam"),
86            UnicodeBlock::Ahom => families.push("Noto Serif Ahom"),
87            UnicodeBlock::AnatolianHieroglyphs => families.push("Noto Sans AnatoHiero"),
88            UnicodeBlock::Arabic |
89            UnicodeBlock::ArabicExtendedA |
90            UnicodeBlock::ArabicPresentationFormsA |
91            UnicodeBlock::ArabicPresentationFormsB => {
92                families.push("Noto Sans Arabic");
93                families.push("Noto Naskh Arabic");
94            },
95            UnicodeBlock::ArabicMathematicalAlphabeticSymbols => {
96                families.push("Noto Sans Math");
97            },
98            UnicodeBlock::Armenian => families.push("Noto Sans Armenian"),
99            UnicodeBlock::Avestan => families.push("Noto Sans Avestan"),
100            UnicodeBlock::Balinese => families.push("Noto Sans Balinese"),
101            UnicodeBlock::Bamum | UnicodeBlock::BamumSupplement => families.push("Noto Sans Bamum"),
102            UnicodeBlock::BassaVah => families.push("Noto Sans Bassa Vah"),
103            UnicodeBlock::Batak => families.push("Noto Sans Batak"),
104            UnicodeBlock::Bengali => families.push("Noto Sans Bengali"),
105            UnicodeBlock::Bhaiksuki => families.push("Noto Sans Bhaiksuki"),
106            UnicodeBlock::Brahmi => families.push("Noto Sans Brahmi"),
107            UnicodeBlock::BraillePatterns => {
108                // These characters appear to be in DejaVu Serif.
109            },
110            UnicodeBlock::Buginese => families.push("Noto Sans Buginese"),
111            UnicodeBlock::Buhid => families.push("Noto Sans Buhid"),
112            UnicodeBlock::Carian => families.push("Noto Sans Carian"),
113            UnicodeBlock::CaucasianAlbanian => families.push("Noto Sans Caucasian Albanian"),
114            UnicodeBlock::Chakma => families.push("Noto Sans Chakma"),
115            UnicodeBlock::Cham => families.push("Noto Sans Cham"),
116            UnicodeBlock::Cherokee | UnicodeBlock::CherokeeSupplement => {
117                families.push("Noto Sans Cherokee")
118            },
119            UnicodeBlock::Coptic => families.push("Noto Sans Coptic"),
120            UnicodeBlock::Cuneiform | UnicodeBlock::CuneiformNumbersandPunctuation => {
121                families.push("Noto Sans Cuneiform")
122            },
123            UnicodeBlock::CypriotSyllabary => families.push("Noto Sans Cypriot"),
124            UnicodeBlock::Deseret => families.push("Noto Sans Deseret"),
125            UnicodeBlock::Devanagari |
126            UnicodeBlock::DevanagariExtended |
127            UnicodeBlock::CommonIndicNumberForms => families.push("Noto Sans Devanagari"),
128            UnicodeBlock::Duployan => families.push("Noto Sans Duployan"),
129            UnicodeBlock::EgyptianHieroglyphs => families.push("Noto Sans Egyptian Hieroglyphs"),
130            UnicodeBlock::Elbasan => families.push("Noto Sans Elbasan"),
131            UnicodeBlock::Ethiopic |
132            UnicodeBlock::EthiopicExtended |
133            UnicodeBlock::EthiopicExtendedA |
134            UnicodeBlock::EthiopicSupplement => families.push("Noto Sans Ethiopic"),
135            UnicodeBlock::Georgian | UnicodeBlock::GeorgianSupplement => {
136                families.push("Noto Sans Georgian")
137            },
138            UnicodeBlock::Glagolitic | UnicodeBlock::GlagoliticSupplement => {
139                families.push("Noto Sans Glagolitic")
140            },
141            UnicodeBlock::Gothic => families.push("Noto Sans Gothic"),
142            UnicodeBlock::Grantha => families.push("Noto Sans Grantha"),
143            UnicodeBlock::Gujarati => families.push("Noto Sans Gujarati"),
144            UnicodeBlock::Gurmukhi => families.push("Noto Sans Gurmukhi"),
145            UnicodeBlock::HangulCompatibilityJamo |
146            UnicodeBlock::HangulJamo |
147            UnicodeBlock::HangulJamoExtendedA |
148            UnicodeBlock::HangulJamoExtendedB |
149            UnicodeBlock::HangulSyllables => {
150                families.push("Noto Sans KR");
151                families.push("Noto Sans CJK KR");
152            },
153            UnicodeBlock::HanifiRohingya => families.push("Noto Sans Hanifi Rohingya"),
154            UnicodeBlock::Hanunoo => families.push("Noto Sans Hanunoo"),
155            UnicodeBlock::Hatran => families.push("Noto Sans Hatran"),
156            UnicodeBlock::Hebrew => families.push("Noto Sans Hebrew"),
157            UnicodeBlock::Hiragana |
158            UnicodeBlock::Katakana |
159            UnicodeBlock::KatakanaPhoneticExtensions => {
160                families.push("Noto Sans JP");
161                families.push("Noto Sans CJK JP");
162            },
163            UnicodeBlock::ImperialAramaic => families.push("Noto Sans Imperial Aramaic"),
164            UnicodeBlock::InscriptionalPahlavi => families.push("Noto Sans Inscriptional Pahlavi"),
165            UnicodeBlock::InscriptionalParthian => {
166                families.push("Noto Sans Inscriptional Parthian")
167            },
168            UnicodeBlock::Javanese => families.push("Noto Sans Javanese"),
169            UnicodeBlock::Kaithi => families.push("Noto Sans Kaithi"),
170            UnicodeBlock::Kannada => families.push("Noto Sans Kannada"),
171            UnicodeBlock::KayahLi => families.push("Noto Sans Kayah Li"),
172            UnicodeBlock::Kharoshthi => families.push("Noto Sans Kharoshthi"),
173            UnicodeBlock::Khmer | UnicodeBlock::KhmerSymbols => families.push("Noto Sans Khmer"),
174            UnicodeBlock::Khojki => families.push("Noto Sans Khojki"),
175            UnicodeBlock::Khudawadi => families.push("Noto Sans Khudawadi"),
176            UnicodeBlock::Lao => families.push("Noto Sans Lao"),
177            UnicodeBlock::Lepcha => families.push("Noto Sans Lepcha"),
178            UnicodeBlock::Limbu => families.push("Noto Sans Limbu"),
179            UnicodeBlock::LinearA => families.push("Noto Sans Linear A"),
180            UnicodeBlock::LinearBIdeograms | UnicodeBlock::LinearBSyllabary => {
181                families.push("Noto Sans Linear B")
182            },
183            UnicodeBlock::Lisu => families.push("Noto Sans Lisu"),
184            UnicodeBlock::Lycian => families.push("Noto Sans Lycian"),
185            UnicodeBlock::Lydian => families.push("Noto Sans Lydian"),
186            UnicodeBlock::Mahajani => families.push("Noto Sans Mahajani"),
187            UnicodeBlock::Malayalam => families.push("Noto Sans Malayalam"),
188            UnicodeBlock::Mandaic => families.push("Noto Sans Mandaic"),
189            UnicodeBlock::Manichaean => families.push("Noto Sans Manichaean"),
190            UnicodeBlock::Marchen => families.push("Noto Sans Marchen"),
191            UnicodeBlock::MeeteiMayek | UnicodeBlock::MeeteiMayekExtensions => {
192                families.push("Noto Sans Meetei Mayek")
193            },
194            UnicodeBlock::MendeKikakui => families.push("Noto Sans Mende Kikakui"),
195            UnicodeBlock::MeroiticCursive | UnicodeBlock::MeroiticHieroglyphs => {
196                families.push("Noto Sans Meroitic")
197            },
198            UnicodeBlock::Miao => families.push("Noto Sans Miao"),
199            UnicodeBlock::Modi => families.push("Noto Sans Modi"),
200            UnicodeBlock::Mongolian | UnicodeBlock::MongolianSupplement => {
201                families.push("Noto Sans Mongolian")
202            },
203            UnicodeBlock::Mro => families.push("Noto Sans Mro"),
204            UnicodeBlock::Multani => families.push("Noto Sans Multani"),
205            UnicodeBlock::MusicalSymbols => families.push("Noto Music"),
206            UnicodeBlock::Myanmar |
207            UnicodeBlock::MyanmarExtendedA |
208            UnicodeBlock::MyanmarExtendedB => families.push("Noto Sans Myanmar"),
209            UnicodeBlock::NKo => families.push("Noto Sans NKo"),
210            UnicodeBlock::Nabataean => families.push("Noto Sans Nabataean"),
211            UnicodeBlock::NewTaiLue => families.push("Noto Sans New Tai Lue"),
212            UnicodeBlock::Newa => families.push("Noto Sans Newa"),
213            UnicodeBlock::Ogham => families.push("Noto Sans Ogham"),
214            UnicodeBlock::OlChiki => families.push("Noto Sans Ol Chiki"),
215            UnicodeBlock::OldHungarian => families.push("Noto Sans Old Hungarian"),
216            UnicodeBlock::OldItalic => families.push("Noto Sans Old Italic"),
217            UnicodeBlock::OldNorthArabian => families.push("Noto Sans Old North Arabian"),
218            UnicodeBlock::OldPermic => families.push("Noto Sans Old Permic"),
219            UnicodeBlock::OldPersian => families.push("Noto Sans Old Persian"),
220            UnicodeBlock::OldSouthArabian => families.push("Noto Sans Old South Arabian"),
221            UnicodeBlock::OldTurkic => families.push("Noto Sans Old Turkic"),
222            UnicodeBlock::Oriya => families.push("Noto Sans Oriya"),
223            UnicodeBlock::Osage => families.push("Noto Sans Osage"),
224            UnicodeBlock::Osmanya => families.push("Noto Sans Osmanya"),
225            UnicodeBlock::PahawhHmong => families.push("Noto Sans Pahawh Hmong"),
226            UnicodeBlock::Palmyrene => families.push("Noto Sans Palmyrene"),
227            UnicodeBlock::PauCinHau => families.push("Noto Sans Pau Cin Hau"),
228            UnicodeBlock::Phagspa => families.push("Noto Sans PhagsPa"),
229            UnicodeBlock::Phoenician => families.push("Noto Sans Phoenician"),
230            UnicodeBlock::PsalterPahlavi => families.push("Noto Sans Psalter Pahlavi"),
231            UnicodeBlock::Rejang => families.push("Noto Sans Rejang"),
232            UnicodeBlock::Runic => families.push("Noto Sans Runic"),
233            UnicodeBlock::Samaritan => families.push("Noto Sans Samaritan"),
234            UnicodeBlock::Saurashtra => families.push("Noto Sans Saurashtra"),
235            UnicodeBlock::Sharada => families.push("Noto Sans Sharada"),
236            UnicodeBlock::Shavian => families.push("Noto Sans Shavian"),
237            UnicodeBlock::Siddham => families.push("Noto Sans Siddham"),
238            UnicodeBlock::Sinhala | UnicodeBlock::SinhalaArchaicNumbers => {
239                families.push("Noto Sans Sinhala")
240            },
241            UnicodeBlock::SoraSompeng => families.push("Noto Sans Sora Sompeng"),
242            UnicodeBlock::Sundanese => families.push("Noto Sans Sundanese"),
243            UnicodeBlock::SuttonSignWriting => families.push("Noto Sans SignWrit"),
244            UnicodeBlock::SylotiNagri => families.push("Noto Sans Syloti Nagri"),
245            UnicodeBlock::Syriac => families.push("Noto Sans Syriac"),
246            UnicodeBlock::Tagalog => families.push("Noto Sans Tagalog"),
247            UnicodeBlock::Tagbanwa => families.push("Noto Sans Tagbanwa"),
248            UnicodeBlock::TaiLe => families.push("Noto Sans Tai Le"),
249            UnicodeBlock::TaiTham => families.push("Noto Sans Tai Tham"),
250            UnicodeBlock::TaiViet => families.push("Noto Sans Tai Viet"),
251            UnicodeBlock::Takri => families.push("Noto Sans Takri"),
252            UnicodeBlock::Tamil => families.push("Noto Sans Tamil"),
253            UnicodeBlock::Tangut |
254            UnicodeBlock::TangutComponents |
255            UnicodeBlock::IdeographicSymbolsandPunctuation => families.push("Noto Serif Tangut"),
256            UnicodeBlock::Telugu => families.push("Noto Sans Telugu"),
257            UnicodeBlock::Thaana => {
258                families.push("Noto Sans Thaana");
259            },
260            UnicodeBlock::Thai => families.push("Noto Sans Thai"),
261            UnicodeBlock::Tibetan => families.push("Noto Serif Tibetan"),
262            UnicodeBlock::Tifinagh => families.push("Noto Sans Tifinagh"),
263            UnicodeBlock::Tirhuta => families.push("Noto Sans Tirhuta"),
264            UnicodeBlock::Ugaritic => families.push("Noto Sans Ugaritic"),
265            UnicodeBlock::UnifiedCanadianAboriginalSyllabics |
266            UnicodeBlock::UnifiedCanadianAboriginalSyllabicsExtended => {
267                families.push("Noto Sans Canadian Aboriginal")
268            },
269            UnicodeBlock::Vai => families.push("Noto Sans Vai"),
270            UnicodeBlock::WarangCiti => families.push("Noto Sans Warang Citi"),
271            UnicodeBlock::YiSyllables | UnicodeBlock::YiRadicals => {
272                families.push("Noto Sans Yi");
273            },
274            UnicodeBlock::Wancho => families.push("Noto Sans Wancho"),
275            _ => {},
276        }
277    }
278
279    families.push("Noto Sans Symbols");
280    families.push("Noto Sans Symbols2");
281}