use ab_glyph::{FontArc, FontVec, InvalidFont, OutlinedGlyph}; use bevy_reflect::TypeUuid; use bevy_render::texture::{Extent3d, Texture, TextureDimension, TextureFormat}; #[derive(Debug, TypeUuid)] #[uuid = "97059ac6-c9ba-4da9-95b6-bed82c3ce198"] pub struct Font { pub font: FontArc, } impl Font { pub fn try_from_bytes(font_data: Vec) -> Result { let font = FontVec::try_from_vec(font_data)?; let font = FontArc::new(font); Ok(Font { font }) } pub fn get_outlined_glyph_texture(outlined_glyph: OutlinedGlyph) -> Texture { let bounds = outlined_glyph.px_bounds(); let width = bounds.width() as usize; let height = bounds.height() as usize; let mut alpha = vec![0.0; width * height]; outlined_glyph.draw(|x, y, v| { alpha[y as usize * width + x as usize] = v; }); // TODO: make this texture grayscale Texture::new( Extent3d::new(width as u32, height as u32, 1), TextureDimension::D2, alpha .iter() .map(|a| vec![255, 255, 255, (*a * 255.0) as u8]) .flatten() .collect::>(), TextureFormat::Rgba8UnormSrgb, ) } }