FJVNPRZD2CQHHDZMFTPW57J3QR3HOF7B5ONBDTPGRBGNJOXU36WAC RPA2OBNNQJLENPANGYEYR2O6DDKH2P35UU4FXVV2MYIDE2SAIHQAC LBHZM2SE7L7M7KML6DN5HP65HP2XRKJBOHHH3IRX4RCLRNYS7CWAC KLGRQAFUQPJP75NVLS5MZZ3CY4TGNVGB4K2YHQSLYVGAPKCLBLUAC I3F42XELTBNGNFJGKEDBRYU75HHQX2CHMWPEIEMXAGU2FFHQVHKAC 2NFFH775XBXGXBJYGTGUAUH45T5ZI6FFJXHFGUQQS324XEAFKT7AC SDFC64IQZWAAG36UV4GVSAER5S3FISBQEE2NVGI4G6ODD6CCGBIAC 5S34ANJMEKYNSGROMFRDP22UA2FK2ENSGOBB4MPSHS7PG2BW6DLAC YR6S4ANJ34M45KU6BU5RRJWI5AW5SSFPCDLH4KUO55DICUK5LQ4QC PTQ26KY65NDVZ35EG66SARWRGGYKDJ2BT3EVK4RJFS2J5AQUX6OQC CTPHEJ2S7MMSZTNVO4LFEYHMMTKYWB5PC54RMVJHMATN5TY45GPQC V2265WPBM2LBE4BGEFB3HYCZXA5C5MJKQ5IVPFWY3ARCVIAYBZGQC 576YRB7XSKS6Q265TEJQS7HUGMKSGHGDRGVP6WBZS7XMK6RVJRNQC XKAEHFMZP4PDXPJ2GZTRAJL7SCHJAH7EXRG2TWEBOFVOFUFJQ6RAC AFZQUL4VKEEDRSA5CV6YXN7PMX6PQ2PMLECTG53S4HZKTNCAIMXQC T5T2PZSJVBHIPHG7VRXZSH36WGSTR4I44BOI335X4F637E7GUWHAC L5ZNI6R53WDZIOXNECV262TURPIPWL522TVF25U5RYHOTSY7BHZAC X6QJYZJZSS7YSRCDOPQ2I2Y7U7VJA4HE5P74ZYENROR7FRUPPXWQC DZSYKTTKQ6DUGPMCPS7FQRSE5FO4FEHY2L3UWB73A7Y7Y6GDHWCAC 4HTJHGHFPLGVXGAEKLBNPMTGWVVMYIL67JOTWB2DREGO6L3ENYMQC let mut shaper = Shaper::default();let mut rasterizer = Rasterizer::default();for font in ["Iosevka", "Manjari"] {let id = fontdb.query(&fontdb::Query {families: &[fontdb::Family::Name(font)],..Default::default()}).ok_or("Unknown font")?;fontdb.with_face_data(id, |data, _| {let data = data.to_vec();let rb_face = rustybuzz::Face::from_slice(unsafe { &*(data.as_slice() as *const [u8]) },0,).ok_or("Failed to load rustybuzz font")?;let fd_face =fontdue::Font::from_bytes(data.as_slice(), FontSettings::default())?;shaper.fonts.push((data, rb_face));rasterizer.fonts.push(fd_face);Ok(())}).ok_or("Failed to load font").flatten()?;}
let shaper = Shaper::default();let rasterizer = Rasterizer::default();
pub fn configure(&mut self, config: &Config) -> Result<(), Box<dyn Error>> {self.font_size = config.mosham_font_size.parse().expect("Invalid font size");self.shaper.fonts = Vec::new();self.rasterizer.fonts = Vec::new();for font in &config.mosham_fonts {let property = if font == "monospace" {FontPropertyBuilder::new().monospace().build()} else {FontPropertyBuilder::new().family(font).build()};let (data, _) = system_fonts::get(&property).expect("Failed to load font");let rb_face =rustybuzz::Face::from_slice(unsafe { &*(data.as_slice() as *const [u8]) }, 0).ok_or("Failed to load rustybuzz font")?;let fd_face = fontdue::Font::from_bytes(data.as_slice(), FontSettings::default())?;self.shaper.fonts.push((data, rb_face));self.rasterizer.fonts.push(fd_face);}self.shaper.cache = HashMap::new();self.rasterizer.cache = HashMap::new();Ok(())}
pub fn render(&mut self, ui: &Ui) -> Result<(), Box<dyn Error>> {let bg = ui.default_face.bg.to_rgba([0, 0, 0, 255]);
pub fn render(&mut self, ui: &Ui, config: &Config) -> Result<(), Box<dyn Error>> {let bg = ui.default_face.bg.to_rgba(config.mosham_black.0, config);
BuiltinColor::Black => [0, 0, 0, 255],BuiltinColor::Red => [255, 0, 0, 255],BuiltinColor::Green => [0, 255, 0, 255],BuiltinColor::Yellow => [255, 255, 0, 255],BuiltinColor::Blue => [0, 0, 255, 0],BuiltinColor::Magenta => [255, 0, 255, 255],BuiltinColor::Cyan => [0, 255, 255, 255],BuiltinColor::White => [255, 255, 255, 255],BuiltinColor::BrightBlack => [0, 0, 0, 255],BuiltinColor::BrightRed => [255, 0, 0, 255],BuiltinColor::BrightGreen => [0, 255, 0, 255],BuiltinColor::BrightYellow => [255, 255, 0, 255],BuiltinColor::BrightBlue => [0, 0, 255, 0],BuiltinColor::BrightMagenta => [255, 0, 255, 255],BuiltinColor::BrightCyan => [0, 255, 255, 255],BuiltinColor::BrightWhite => [255, 255, 255, 255],
BuiltinColor::Black => config.mosham_black.0,BuiltinColor::Red => config.mosham_red.0,BuiltinColor::Green => config.mosham_green.0,BuiltinColor::Yellow => config.mosham_yellow.0,BuiltinColor::Blue => config.mosham_blue.0,BuiltinColor::Magenta => config.mosham_magenta.0,BuiltinColor::Cyan => config.mosham_cyan.0,BuiltinColor::White => config.mosham_white.0,BuiltinColor::BrightBlack => config.mosham_bright_black.0,BuiltinColor::BrightRed => config.mosham_bright_red.0,BuiltinColor::BrightGreen => config.mosham_bright_green.0,BuiltinColor::BrightYellow => config.mosham_bright_yellow.0,BuiltinColor::BrightBlue => config.mosham_bright_blue.0,BuiltinColor::BrightMagenta => config.mosham_bright_magenta.0,BuiltinColor::BrightCyan => config.mosham_bright_cyan.0,BuiltinColor::BrightWhite => config.mosham_bright_white.0,
}fn default_font() -> Vec<String> {vec![String::from("serif")]}fn default_font_size() -> String {String::from("14")}fn black() -> RgbaColor {RgbaColor([0, 0, 0, 255])}fn red() -> RgbaColor {RgbaColor([255, 0, 0, 255])}fn green() -> RgbaColor {RgbaColor([0, 255, 0, 255])}fn yellow() -> RgbaColor {RgbaColor([255, 255, 0, 255])}fn blue() -> RgbaColor {RgbaColor([0, 0, 255, 0])}fn magenta() -> RgbaColor {RgbaColor([255, 0, 255, 255])}fn cyan() -> RgbaColor {RgbaColor([0, 255, 255, 255])}fn white() -> RgbaColor {RgbaColor([255, 255, 255, 255])}fn bright_black() -> RgbaColor {RgbaColor([0, 0, 0, 255])}fn bright_red() -> RgbaColor {RgbaColor([255, 0, 0, 255])}fn bright_green() -> RgbaColor {RgbaColor([0, 255, 0, 255])}fn bright_yellow() -> RgbaColor {RgbaColor([255, 255, 0, 255])}fn bright_blue() -> RgbaColor {RgbaColor([0, 0, 255, 0])}fn bright_magenta() -> RgbaColor {RgbaColor([255, 0, 255, 255])}fn bright_cyan() -> RgbaColor {RgbaColor([0, 255, 255, 255])}fn bright_white() -> RgbaColor {RgbaColor([255, 255, 255, 255])}struct CommaListVisitor;impl<'de> Visitor<'de> for CommaListVisitor {type Value = Vec<String>;fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {formatter.write_str("A list of comma seperated fonts")}fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>whereE: serde::de::Error,{Ok(v.split(',').map(String::from).collect())}}fn comma_list_deserialize<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>whereD: Deserializer<'de>,{deserializer.deserialize_string(CommaListVisitor)}#[derive(Debug, PartialEq, Eq, Deserialize)]pub struct Config {#[serde(default = "default_font", deserialize_with = "comma_list_deserialize")]pub mosham_fonts: Vec<String>,#[serde(default = "default_font_size")]pub mosham_font_size: String,#[serde(default = "black")]pub mosham_black: RgbaColor,#[serde(default = "red")]pub mosham_red: RgbaColor,#[serde(default = "green")]pub mosham_green: RgbaColor,#[serde(default = "yellow")]pub mosham_yellow: RgbaColor,#[serde(default = "blue")]pub mosham_blue: RgbaColor,#[serde(default = "magenta")]pub mosham_magenta: RgbaColor,#[serde(default = "cyan")]pub mosham_cyan: RgbaColor,#[serde(default = "white")]pub mosham_white: RgbaColor,#[serde(default = "bright_black")]pub mosham_bright_black: RgbaColor,#[serde(default = "bright_red")]pub mosham_bright_red: RgbaColor,#[serde(default = "bright_green")]pub mosham_bright_green: RgbaColor,#[serde(default = "bright_yellow")]pub mosham_bright_yellow: RgbaColor,#[serde(default = "bright_blue")]pub mosham_bright_blue: RgbaColor,#[serde(default = "bright_magenta")]pub mosham_bright_magenta: RgbaColor,#[serde(default = "bright_cyan")]pub mosham_bright_cyan: RgbaColor,#[serde(default = "bright_white")]pub mosham_bright_white: RgbaColor,
version = "0.22.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb"dependencies = ["bitflags 1.3.2","core-foundation","core-graphics-types","foreign-types 0.3.2","libc",][[package]]name = "core-graphics"
"roxmltree",][[package]]name = "fontdb"version = "0.23.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905"dependencies = ["fontconfig-parser","log","memmap2","slotmap","tinyvec","ttf-parser 0.25.1",
"core-foundation","core-text","libc","servo-fontconfig","winapi",
name = "tinyvec"version = "1.10.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"dependencies = ["tinyvec_macros",][[package]]name = "tinyvec_macros"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"[[package]]