lumen_assets/loaders/
svg.rs1use crate::{AssetKind, AssetLoader, LoadContext, LoadErrorKind, LoadedAsset, LoadedSvg, SvgData};
4
5pub const SVG_EXTENSIONS: &[&str] = &["svg"];
7
8pub struct SvgLoader;
15
16impl AssetLoader for SvgLoader {
17 fn extensions(&self) -> &[&str] {
18 SVG_EXTENSIONS
19 }
20
21 fn kind(&self) -> AssetKind {
22 AssetKind::Svg
23 }
24
25 fn load(&self, ctx: &LoadContext<'_>) -> Result<LoadedAsset, LoadErrorKind> {
26 let path = ctx.path();
27 let bytes = ctx.read_bytes()?;
28 let source_bytes = bytes.len();
29 let opt = usvg::Options::default();
30 let tree = usvg::Tree::from_data(&bytes, &opt)
31 .map_err(|e| LoadErrorKind::DecodeFailed(format!("{path:?}: {e}")))?;
32 let size = tree.size();
33 let data = SvgData {
34 intrinsic: glam::Vec2::new(size.width(), size.height()),
35 tree,
36 id: SvgData::next_id(),
37 source_bytes,
38 };
39 Ok(LoadedAsset::Svg(LoadedSvg(data.into())))
40 }
41}