freya_core/elements/
svg.rs1use 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}