This repository has no description
1use itertools::Itertools;
2use measure_time::debug_time;
3
4use crate::Object;
5
6use super::{
7 CSSRenderable, SVGAttributesRenderable, renderable::SVGRenderable, svg,
8};
9
10impl SVGRenderable for Object {
11 fn render_to_svg(
12 &self,
13 colormap: crate::ColorMapping,
14 cell_size: usize,
15 object_sizes: crate::graphics::objects::ObjectSizes,
16 id: &str,
17 ) -> anyhow::Result<svg::Node> {
18 debug_time!("render_to_svg/colored_object");
19 let plain_obj = self.shape.render_to_svg(
20 colormap.clone(),
21 cell_size,
22 object_sizes,
23 id,
24 )?;
25
26 let mut css = self
27 .fill
28 .render_to_css(&colormap.clone(), !self.shape.fillable());
29
30 let object_svg = if !self.transformations.is_empty()
31 || !self.filters.is_empty()
32 {
33 // transform-box is not supported by resvg yet
34 // css += "transform-box: fill-box; transform-origin: 50% 50%;";
35
36 let (center_x, center_y) =
37 self.shape.region().center_coords(cell_size);
38
39 css += &format!("transform-origin: {center_x}px {center_y}px;");
40
41 css += self
42 .filters
43 .iter()
44 .map(|f| f.render_to_css_filled(&colormap))
45 .join(" ")
46 .as_ref();
47
48 svg::tag("g")
49 .dataset("object", id)
50 .with_attributes(self.transformations.render_to_svg_attributes(
51 colormap,
52 cell_size,
53 object_sizes,
54 id,
55 )?)
56 .wrapping(vec![plain_obj])
57 .attr("style", &css)
58 .into()
59 } else {
60 match plain_obj {
61 svg::Node::Element(el) => el.attr("style", &css).into(),
62 _ => plain_obj,
63 }
64 };
65
66 if let Some(region) = &self.clip_to {
67 Ok(svg::tag("g")
68 .attr("clip-path", region.clip_path_id())
69 .child(object_svg)
70 .into())
71 } else {
72 Ok(object_svg)
73 }
74 }
75}