rafx_plugins/assets/font/
assets.rs

1use fontdue::FontSettings;
2use hydrate_base::LoadHandle;
3use rafx::api::RafxResult;
4use rafx::assets::{AssetManager, DefaultAssetTypeHandler, DefaultAssetTypeLoadHandler};
5use serde::{Deserialize, Serialize};
6use std::sync::Arc;
7use type_uuid::*;
8
9#[derive(TypeUuid, Serialize, Deserialize, Clone)]
10#[uuid = "197bfd7a-3df9-4440-86f0-8e10756c714e"]
11pub struct FontAssetData {
12    pub data_hash: u64,
13    #[serde(with = "serde_bytes")]
14    pub data: Vec<u8>,
15    pub scale: f32,
16}
17
18pub struct FontAssetInner {
19    pub data_hash: u64,
20    pub font: fontdue::Font,
21    pub scale: f32,
22}
23
24#[derive(TypeUuid, Clone)]
25#[uuid = "398689ef-4bf1-42ad-8fc4-5080c1b8293a"]
26pub struct FontAsset {
27    pub inner: Arc<FontAssetInner>,
28}
29
30pub struct FontLoadHandler;
31
32impl DefaultAssetTypeLoadHandler<FontAssetData, FontAsset> for FontLoadHandler {
33    #[profiling::function]
34    fn load(
35        _asset_manager: &mut AssetManager,
36        font_asset: FontAssetData,
37        _load_handle: LoadHandle,
38    ) -> RafxResult<FontAsset> {
39        let settings = FontSettings::default();
40        let font = fontdue::Font::from_bytes(font_asset.data.as_slice(), settings)
41            .map_err(|x| x.to_string())?;
42
43        let inner = FontAssetInner {
44            font,
45            data_hash: font_asset.data_hash,
46            scale: font_asset.scale,
47        };
48
49        Ok(FontAsset {
50            inner: Arc::new(inner),
51        })
52    }
53}
54
55pub type FontAssetType = DefaultAssetTypeHandler<FontAssetData, FontAsset, FontLoadHandler>;