freya_core/elements/
svg.rs

1use freya_engine::prelude::*;
2use freya_native_core::real_dom::NodeImmutable;
3use torin::prelude::LayoutNode;
4
5use super::utils::ElementUtils;
6use crate::{
7    dom::{
8        DioxusNode,
9        ImagesCache,
10    },
11    states::{
12        FontStyleState,
13        SvgState,
14    },
15};
16
17pub struct SvgElement;
18
19impl ElementUtils for SvgElement {
20    fn render(
21        self,
22        layout_node: &LayoutNode,
23        node_ref: &DioxusNode,
24        canvas: &Canvas,
25        _font_collection: &mut FontCollection,
26        font_manager: &FontMgr,
27        _default_fonts: &[String],
28        _images_cache: &mut ImagesCache,
29        _scale_factor: f32,
30    ) {
31        let area = layout_node.visible_area();
32        let svg_state = &*node_ref.get::<SvgState>().unwrap();
33        let font_style = &*node_ref.get::<FontStyleState>().unwrap();
34
35        let x = area.min_x();
36        let y = area.min_y();
37        if let Some(svg_data) = &svg_state.svg_data {
38            let resource_provider = LocalResourceProvider::new(font_manager);
39            let svg_dom = svg::Dom::from_bytes(svg_data.as_slice(), resource_provider);
40            if let Ok(mut svg_dom) = svg_dom {
41                canvas.save();
42                canvas.translate((x, y));
43                svg_dom.set_container_size((area.width() as i32, area.height() as i32));
44                let mut root = svg_dom.root();
45                root.set_width(svg::Length::new(100.0, svg::LengthUnit::Percentage));
46                root.set_height(svg::Length::new(100.0, svg::LengthUnit::Percentage));
47                root.set_color(font_style.color);
48                if let Some(paint) = svg_state.svg_fill.as_ref() {
49                    root.set_fill((*paint).into());
50                }
51                if let Some(paint) = svg_state.svg_stroke.as_ref() {
52                    root.set_stroke((*paint).into());
53                }
54                svg_dom.render(canvas);
55                canvas.restore();
56            }
57        }
58    }
59}