#[cfg(feature = "fonts-cjk-shard-latin")]
#[path = "cjk_shard_latin.rs"]
mod cjk_shard_latin;
#[cfg(feature = "fonts-cjk-shard-latin")]
pub use cjk_shard_latin::FONT as LATIN;
#[cfg(feature = "fonts-cjk-shard-symbols")]
#[path = "cjk_shard_symbols.rs"]
mod cjk_shard_symbols;
#[cfg(feature = "fonts-cjk-shard-symbols")]
pub use cjk_shard_symbols::FONT as SYMBOLS;
#[cfg(feature = "fonts-cjk-shard-kana")]
#[path = "cjk_shard_kana.rs"]
mod cjk_shard_kana;
#[cfg(feature = "fonts-cjk-shard-kana")]
pub use cjk_shard_kana::FONT as KANA;
#[cfg(feature = "fonts-cjk-shard-han")]
#[path = "cjk_shard_han.rs"]
mod cjk_shard_han;
#[cfg(feature = "fonts-cjk-shard-han")]
pub use cjk_shard_han::FONT as HAN;
#[cfg(feature = "fonts-cjk-shard-fullwidth")]
#[path = "cjk_shard_fullwidth.rs"]
mod cjk_shard_fullwidth;
#[cfg(feature = "fonts-cjk-shard-fullwidth")]
pub use cjk_shard_fullwidth::FONT as FULLWIDTH;
pub struct Shard {
pub id: &'static str,
pub name: &'static str,
pub bytes: &'static [u8],
pub range: (u32, u32),
}
pub const SHARDS: &[Shard] = &[
Shard {
id: "latin",
name: "Noto Sans SC (latin)",
range: (0x0020, 0x007E),
#[cfg(feature = "fonts-cjk-shard-latin")]
bytes: LATIN,
#[cfg(not(feature = "fonts-cjk-shard-latin"))]
bytes: &[],
},
Shard {
id: "symbols",
name: "Noto Sans SC (symbols)",
range: (0x3000, 0x303F),
#[cfg(feature = "fonts-cjk-shard-symbols")]
bytes: SYMBOLS,
#[cfg(not(feature = "fonts-cjk-shard-symbols"))]
bytes: &[],
},
Shard {
id: "kana",
name: "Noto Sans SC (kana)",
range: (0x3040, 0x30FF),
#[cfg(feature = "fonts-cjk-shard-kana")]
bytes: KANA,
#[cfg(not(feature = "fonts-cjk-shard-kana"))]
bytes: &[],
},
Shard {
id: "han",
name: "Noto Sans SC (han)",
range: (0x4E00, 0x511F),
#[cfg(feature = "fonts-cjk-shard-han")]
bytes: HAN,
#[cfg(not(feature = "fonts-cjk-shard-han"))]
bytes: &[],
},
Shard {
id: "fullwidth",
name: "Noto Sans SC (fullwidth)",
range: (0xFF00, 0xFFEF),
#[cfg(feature = "fonts-cjk-shard-fullwidth")]
bytes: FULLWIDTH,
#[cfg(not(feature = "fonts-cjk-shard-fullwidth"))]
bytes: &[],
},
];
pub fn shard_for(ch: char) -> Option<&'static Shard> {
let codepoint = ch as u32;
SHARDS.iter().find(|shard| {
let (low, high) = shard.range;
codepoint >= low && codepoint <= high
})
}
pub fn active_shards() -> impl Iterator<Item = &'static Shard> {
SHARDS.iter().filter(|shard| !shard.bytes.is_empty())
}
pub const fn total_bytes() -> usize {
let mut total = 0;
let mut index = 0;
while index < SHARDS.len() {
total += SHARDS[index].bytes.len();
index += 1;
}
total
}