use crate::ComputedTextBlock;
use crate::FontCx;
use bevy_asset::Asset;
use bevy_asset::AssetId;
use bevy_asset::Assets;
use bevy_ecs::system::Local;
use bevy_ecs::system::Query;
use bevy_ecs::system::Res;
use bevy_ecs::system::ResMut;
use bevy_platform::collections::HashSet;
use bevy_reflect::TypePath;
use parley::fontique::Blob;
use parley::fontique::FontInfoOverride;
use smol_str::SmolStr;
#[derive(Debug, TypePath, Clone, Asset)]
pub struct Font {
pub data: Blob<u8>,
pub family_name: SmolStr,
}
impl Font {
pub fn from_bytes(font_data: Vec<u8>, family_name: &str) -> Font {
Self {
data: Blob::from(font_data),
family_name: family_name.into(),
}
}
}
pub fn load_font_assets_into_font_collection(
fonts: Res<Assets<Font>>,
mut loaded_fonts: Local<HashSet<AssetId<Font>>>,
mut font_cx: ResMut<FontCx>,
mut text_block_query: Query<&mut ComputedTextBlock>,
) {
let mut new_fonts_added = false;
loaded_fonts.retain(|id| fonts.contains(*id));
for (id, font) in fonts.iter() {
if loaded_fonts.insert(id) {
font_cx.0.collection.register_fonts(
font.data.clone(),
Some(FontInfoOverride {
family_name: Some(font.family_name.as_str()),
..Default::default()
}),
);
new_fonts_added = true;
}
}
if new_fonts_added {
for mut block in text_block_query.iter_mut() {
block.needs_rerender = true;
}
}
}