cosmic_text/font/fallback/
unix.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2
3use unicode_script::Script;
4
5use super::Fallback;
6
7/// A platform-specific font fallback list, for Unix.
8#[derive(Debug)]
9pub struct PlatformFallback;
10
11impl Fallback for PlatformFallback {
12    fn common_fallback(&self) -> &'static [&'static str] {
13        common_fallback()
14    }
15
16    fn forbidden_fallback(&self) -> &'static [&'static str] {
17        forbidden_fallback()
18    }
19
20    fn script_fallback(
21        &self,
22        script: unicode_script::Script,
23        locale: &str,
24    ) -> &'static [&'static str] {
25        script_fallback(script, locale)
26    }
27}
28
29// Fallbacks to use after any script specific fallbacks
30fn common_fallback() -> &'static [&'static str] {
31    //TODO: abstract style (sans/serif/monospaced)
32    &[
33        /* Sans-serif fallbacks */
34        "Noto Sans",
35        /* More sans-serif fallbacks */
36        "DejaVu Sans",
37        "FreeSans",
38        /* Mono fallbacks */
39        "Noto Sans Mono",
40        "DejaVu Sans Mono",
41        "FreeMono",
42        /* Symbols fallbacks */
43        "Noto Sans Symbols",
44        "Noto Sans Symbols2",
45        /* Emoji fallbacks*/
46        "Noto Color Emoji",
47        //TODO: Add CJK script here for doublewides?
48    ]
49}
50
51// Fallbacks to never use
52fn forbidden_fallback() -> &'static [&'static str] {
53    &[]
54}
55
56fn han_unification(locale: &str) -> &'static [&'static str] {
57    match locale {
58        // Japan
59        "ja" => &["Noto Sans CJK JP"],
60        // Korea
61        "ko" => &["Noto Sans CJK KR"],
62        // Hong Kong
63        "zh-HK" => &["Noto Sans CJK HK"],
64        // Taiwan
65        "zh-TW" => &["Noto Sans CJK TC"],
66        // Simplified Chinese is the default (also catches "zh-CN" for China)
67        _ => &["Noto Sans CJK SC"],
68    }
69}
70
71// Fallbacks to use per script
72fn script_fallback(script: Script, locale: &str) -> &'static [&'static str] {
73    //TODO: abstract style (sans/serif/monospaced)
74    match script {
75        Script::Adlam => &["Noto Sans Adlam", "Noto Sans Adlam Unjoined"],
76        Script::Arabic => &["Noto Sans Arabic"],
77        Script::Armenian => &["Noto Sans Armenian"],
78        Script::Bengali => &["Noto Sans Bengali"],
79        Script::Bopomofo => han_unification(locale),
80        //TODO: DejaVu Sans would typically be selected for braille characters,
81        // but this breaks alignment when used alongside monospaced text.
82        // By requesting the use of FreeMono first, this issue can be avoided.
83        Script::Braille => &["FreeMono"],
84        Script::Buhid => &["Noto Sans Buhid"],
85        Script::Chakma => &["Noto Sans Chakma"],
86        Script::Cherokee => &["Noto Sans Cherokee"],
87        Script::Deseret => &["Noto Sans Deseret"],
88        Script::Devanagari => &["Noto Sans Devanagari"],
89        Script::Ethiopic => &["Noto Sans Ethiopic"],
90        Script::Georgian => &["Noto Sans Georgian"],
91        Script::Gothic => &["Noto Sans Gothic"],
92        Script::Grantha => &["Noto Sans Grantha"],
93        Script::Gujarati => &["Noto Sans Gujarati"],
94        Script::Gurmukhi => &["Noto Sans Gurmukhi"],
95        Script::Han => han_unification(locale),
96        Script::Hangul => han_unification("ko"),
97        Script::Hanunoo => &["Noto Sans Hanunoo"],
98        Script::Hebrew => &["Noto Sans Hebrew"],
99        Script::Hiragana => han_unification("ja"),
100        Script::Javanese => &["Noto Sans Javanese"],
101        Script::Kannada => &["Noto Sans Kannada"],
102        Script::Katakana => han_unification("ja"),
103        Script::Khmer => &["Noto Sans Khmer"],
104        Script::Lao => &["Noto Sans Lao"],
105        Script::Malayalam => &["Noto Sans Malayalam"],
106        Script::Mongolian => &["Noto Sans Mongolian"],
107        Script::Myanmar => &["Noto Sans Myanmar"],
108        Script::Oriya => &["Noto Sans Oriya"],
109        Script::Runic => &["Noto Sans Runic"],
110        Script::Sinhala => &["Noto Sans Sinhala"],
111        Script::Syriac => &["Noto Sans Syriac"],
112        Script::Tagalog => &["Noto Sans Tagalog"],
113        Script::Tagbanwa => &["Noto Sans Tagbanwa"],
114        Script::Tai_Le => &["Noto Sans Tai Le"],
115        Script::Tai_Tham => &["Noto Sans Tai Tham"],
116        Script::Tai_Viet => &["Noto Sans Tai Viet"],
117        Script::Tamil => &["Noto Sans Tamil"],
118        Script::Telugu => &["Noto Sans Telugu"],
119        Script::Thaana => &["Noto Sans Thaana"],
120        Script::Thai => &["Noto Sans Thai"],
121        //TODO: no sans script?
122        Script::Tibetan => &["Noto Serif Tibetan"],
123        Script::Tifinagh => &["Noto Sans Tifinagh"],
124        Script::Vai => &["Noto Sans Vai"],
125        //TODO: Use han_unification?
126        Script::Yi => &["Noto Sans Yi", "Noto Sans CJK SC"],
127        _ => &[],
128    }
129}