seru 0.1.0

simple image renderer
Documentation
use std::rc::Rc;

use skia_safe::{Data, Image};

use crate::{
    assets::AssetProvider,
    core::{ImageWrap, Value},
    render::{self, RenderNode, args::Args, context::RenderContext, styles::*},
};

pub fn image_func(
    _name: &str,
    mut args: Args,
    children: Vec<RenderNode>,
    render_context: &RenderContext,
) -> anyhow::Result<RenderNode> {
    let common_style = CommonStyle::take_from(&mut args)?;
    let image_style = ImageStyle::take_from(&mut args)?;

    let src = args.take_required("src")?;
    args.finish()?;

    let image = match src {
        Value::String(src) => {
            let image = load_image(&render_context.asset_provider, &src);
            if image.is_none() {
                eprintln!("image not loaded: {}", src);
            }

            image
        }
        Value::Image(ImageWrap(image)) => Some(image),
        _ => anyhow::bail!(""),
    };

    Ok(RenderNode {
        kind: render::RenderNodeKind::Image {
            style: image_style,
            image,
        },
        children,
        style: common_style,
    })
}

fn load_image(asset_provider: &Rc<dyn AssetProvider>, src: &str) -> Option<Image> {
    let image = asset_provider.load(&src).ok()?;
    Image::from_encoded(Data::new_copy(&image))
}