bevy_vello 0.13.1

Render assets and scenes in Bevy with Vello
use bevy::{
    asset::{AssetLoader, LoadContext, io::Reader},
    reflect::TypePath,
};

use super::{context::get_global_font_context, font::VelloFont};
use crate::integrations::{VectorLoaderError, text::context::LOCAL_FONT_CONTEXT};

#[derive(Default, TypePath)]
pub struct VelloFontLoader;

pub(crate) fn load_into_font_context(bytes: Vec<u8>) -> VelloFont {
    LOCAL_FONT_CONTEXT.with_borrow_mut(|font_context| {
        if font_context.is_none() {
            *font_context = Some(get_global_font_context().clone());
        }
        let font_context = font_context.as_mut().unwrap();
        let registered_fonts = font_context
            .collection
            .register_fonts(bytes.clone().into(), None);
        let maybe_font = registered_fonts.first();
        if maybe_font.is_none() {
            tracing::warn!("Failed to register default font");
        }
        let (family_id, _font_info_vec) = maybe_font.unwrap();
        let family_name = font_context.collection.family_name(*family_id).unwrap();
        VelloFont {
            family_name: family_name.to_string(),
            bytes,
        }
    })
}

impl AssetLoader for VelloFontLoader {
    type Asset = VelloFont;

    type Settings = ();

    type Error = VectorLoaderError;

    async fn load(
        &self,
        reader: &mut dyn Reader,
        _settings: &Self::Settings,
        _load_context: &mut LoadContext<'_>,
    ) -> Result<Self::Asset, Self::Error> {
        let mut bytes = Vec::new();
        reader.read_to_end(&mut bytes).await?;
        Ok(load_into_font_context(bytes))
    }

    fn extensions(&self) -> &[&str] {
        &["ttf"]
    }
}