rafx_plugins/assets/font/
assets.rs1use 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>;