xtap-core-lib 0.5.1

星TAP实验室通用 Rust 基座:跨平台路径/IO/硬件/MCP HTTP 服务/egui 主题与字体(features 按需裁剪)
Documentation
#[cfg(feature = "ui")]
use egui::{FontData, FontFamily, FontTweak};
use std::sync::Arc;

pub fn configure_egui_fonts(ctx: &egui::Context) {
    let mut fonts = egui::FontDefinitions::default();
    if let Some(data) = load_zh_font() {
        fonts.font_data.insert(
            "zh".into(),
            Arc::new(FontData::from_owned(data).tweak(FontTweak {
                scale: 1.0,
                y_offset_factor: -0.05,
                ..Default::default()
            })),
        );
        fonts
            .families
            .entry(FontFamily::Proportional)
            .or_default()
            .insert(0, "zh".into());
        fonts
            .families
            .entry(FontFamily::Monospace)
            .or_default()
            .insert(0, "zh".into());
    }
    ctx.set_fonts(fonts);
}

pub fn configure_egui_fonts_with_fallback(ctx: &egui::Context, fallback_font_bytes: &[u8]) {
    let mut fonts = egui::FontDefinitions::default();
    fonts.font_data.insert(
        "zh".into(),
        Arc::new(
            FontData::from_owned(fallback_font_bytes.to_vec()).tweak(FontTweak {
                scale: 1.0,
                y_offset_factor: -0.05,
                ..Default::default()
            }),
        ),
    );
    fonts
        .families
        .entry(FontFamily::Proportional)
        .or_default()
        .insert(0, "zh".into());
    fonts
        .families
        .entry(FontFamily::Monospace)
        .or_default()
        .insert(0, "zh".into());
    ctx.set_fonts(fonts);
}

#[cfg(target_os = "macos")]
fn load_zh_font() -> Option<Vec<u8>> {
    for path in &[
        "/System/Library/Fonts/PingFang.ttc",
        "/System/Library/Fonts/STHeiti Light.ttc",
        "/System/Library/Fonts/Supplemental/Songti.ttc",
        "/System/Library/Fonts/Supplemental/NotoSansCJK-Regular.ttc",
    ] {
        if let Ok(data) = std::fs::read(path) {
            return Some(data);
        }
    }
    None
}

#[cfg(target_os = "windows")]
fn load_zh_font() -> Option<Vec<u8>> {
    let windir = std::env::var("WINDIR").ok()?;
    for path in &[
        format!("{}\\Fonts\\msyh.ttc", windir),
        format!("{}\\Fonts\\msyhbd.ttc", windir),
        format!("{}\\Fonts\\simsun.ttc", windir),
        format!("{}\\Fonts\\simhei.ttf", windir),
    ] {
        if let Ok(data) = std::fs::read(&path) {
            return Some(data);
        }
    }
    None
}

#[cfg(target_os = "linux")]
fn load_zh_font() -> Option<Vec<u8>> {
    for path in &[
        "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
        "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc",
        "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc",
        "/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc",
        "/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf",
        "/usr/share/fonts/truetype/arphic/uming.ttc",
    ] {
        if let Ok(data) = std::fs::read(path) {
            return Some(data);
        }
    }
    None
}

#[cfg(not(any(target_os = "macos", target_os = "windows", target_os = "linux")))]
fn load_zh_font() -> Option<Vec<u8>> {
    None
}