1#[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 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 Script::Common | Script::Inherited | Script::Latin | Script::Cyrillic | Script::Greek => {
71 families.push("Noto Sans");
72 },
73 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 },
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}