cosmic-text 0.19.0

Pure Rust multi-line text handling
Documentation
// SPDX-License-Identifier: MIT OR Apache-2.0

use unicode_script::Script;

use super::Fallback;

/// A platform-specific font fallback list, for Windows.
#[derive(Debug)]
pub struct PlatformFallback;

impl Fallback for PlatformFallback {
    fn common_fallback(&self) -> &'static [&'static str] {
        common_fallback()
    }

    fn forbidden_fallback(&self) -> &'static [&'static str] {
        forbidden_fallback()
    }

    fn script_fallback(
        &self,
        script: unicode_script::Script,
        locale: &str,
    ) -> &'static [&'static str] {
        script_fallback(script, locale)
    }
}

// Fallbacks to use after any script specific fallbacks
fn common_fallback() -> &'static [&'static str] {
    //TODO: abstract style (sans/serif/monospaced)
    &[
        "Segoe UI",
        "Segoe UI Emoji",
        "Segoe UI Symbol",
        "Segoe UI Historic",
        //TODO: Add CJK script here for doublewides?
    ]
}

// Fallbacks to never use
fn forbidden_fallback() -> &'static [&'static str] {
    &[]
}

fn han_unification(locale: &str) -> &'static [&'static str] {
    //TODO!
    match locale {
        // Japan
        "ja" => &["Yu Gothic"],
        // Korea
        "ko" => &["Malgun Gothic"],
        // Hong Kong"
        "zh-HK" => &["MingLiU_HKSCS"],
        // Taiwan
        "zh-TW" => &["Microsoft JhengHei UI"],
        // Simplified Chinese is the default (also catches "zh-CN" for China)
        _ => &["Microsoft YaHei UI"],
    }
}

// Fallbacks to use per script
fn script_fallback(script: Script, locale: &str) -> &'static [&'static str] {
    //TODO: better match https://github.com/chromium/chromium/blob/master/third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc#L99
    match script {
        Script::Adlam => &["Ebrima"],
        Script::Bengali => &["Nirmala UI"],
        Script::Canadian_Aboriginal => &["Gadugi"],
        Script::Chakma => &["Nirmala UI"],
        Script::Cherokee => &["Gadugi"],
        Script::Devanagari => &["Nirmala UI"],
        Script::Ethiopic => &["Ebrima"],
        Script::Gujarati => &["Nirmala UI"],
        Script::Gurmukhi => &["Nirmala UI"],
        Script::Han => han_unification(locale),
        Script::Hangul => han_unification("ko"),
        Script::Hiragana => han_unification("ja"),
        Script::Javanese => &["Javanese Text"],
        Script::Kannada => &["Nirmala UI"],
        Script::Katakana => han_unification("ja"),
        Script::Khmer => &["Leelawadee UI"],
        Script::Lao => &["Leelawadee UI"],
        Script::Malayalam => &["Nirmala UI"],
        Script::Mongolian => &["Mongolian Baiti"],
        Script::Myanmar => &["Myanmar Text"],
        Script::Oriya => &["Nirmala UI"],
        Script::Sinhala => &["Nirmala UI"],
        Script::Tamil => &["Nirmala UI"],
        Script::Telugu => &["Nirmala UI"],
        Script::Thaana => &["MV Boli"],
        Script::Thai => &["Leelawadee UI"],
        Script::Tibetan => &["Microsoft Himalaya"],
        Script::Tifinagh => &["Ebrima"],
        Script::Vai => &["Ebrima"],
        Script::Yi => &["Microsoft Yi Baiti"],
        _ => &[],
    }
}