This repository has no description
1use measure_time::debug_time;
2
3use crate::{ColorMapping, Filter, FilterType};
4
5use super::{renderable::SVGRenderable, CSSRenderable};
6
7impl SVGRenderable for Filter {
8 fn render_to_svg(
9 &self,
10 _colormap: crate::ColorMapping,
11 _cell_size: usize,
12 _object_sizes: crate::graphics::objects::ObjectSizes,
13 _id: &str,
14 ) -> anyhow::Result<svg::node::element::Element> {
15 {
16 debug_time!("render_to_svg/filter");
17 Ok(match self.kind {
18 FilterType::Glow => {
19 // format!(
20 // r#"
21 // <filter id="glow">
22 // <feGaussianBlur stdDeviation="{}" result="coloredBlur"/>
23 // <feMerge>
24 // <feMergeNode in="coloredBlur"/>
25 // <feMergeNode in="SourceGraphic"/>
26 // </feMerge>
27 // </filter>
28 // "#,
29 // 2.5
30 // ) // TODO parameterize stdDeviation
31 svg::node::element::Filter::new()
32 .add(
33 // TODO parameterize stdDeviation
34 svg::node::element::FilterEffectGaussianBlur::new()
35 .set("stdDeviation", self.parameter)
36 .set("result", "coloredBlur"),
37 )
38 .add(
39 svg::node::element::FilterEffectMerge::new()
40 .add(
41 svg::node::element::FilterEffectMergeNode::new()
42 .set("in", "coloredBlur"),
43 )
44 .add(
45 svg::node::element::FilterEffectMergeNode::new()
46 .set("in", "SourceGraphic"),
47 ),
48 )
49 }
50 FilterType::NaturalShadow => {
51 /*
52 <filter id="natural-shadow-filter" x="0" y="0" width="2" height="2">
53 <feOffset in="SourceGraphic" dx="3" dy="3" />
54 <feGaussianBlur stdDeviation="12" result="blur" />
55 <feMerge>
56 <feMergeNode in="blur" />
57 <feMergeNode in="SourceGraphic" />
58 </feMerge>
59 </filter>
60 */
61 svg::node::element::Filter::new()
62 .add(
63 svg::node::element::FilterEffectOffset::new()
64 .set("in", "SourceGraphic")
65 .set("dx", self.parameter)
66 .set("dy", self.parameter),
67 )
68 .add(
69 svg::node::element::FilterEffectGaussianBlur::new()
70 .set("stdDeviation", self.parameter * 4.0)
71 .set("result", "blur"),
72 )
73 .add(
74 svg::node::element::FilterEffectMerge::new()
75 .add(
76 svg::node::element::FilterEffectMergeNode::new()
77 .set("in", "blur"),
78 )
79 .add(
80 svg::node::element::FilterEffectMergeNode::new()
81 .set("in", "SourceGraphic"),
82 ),
83 )
84 }
85 FilterType::Saturation => {
86 /*
87 <filter id="saturation">
88 <feColorMatrix type="saturate" values="0.5"/>
89 </filter>
90 */
91 svg::node::element::Filter::new().add(
92 svg::node::element::FilterEffectColorMatrix::new()
93 .set("type", "saturate")
94 .set("values", self.parameter),
95 )
96 }
97 }
98 .set("id", self.id())
99 .set("filterUnit", "userSpaceOnUse")
100 .into())
101 }
102 }
103}
104
105impl CSSRenderable for Filter {
106 fn render_to_css_filled(&self, _colormap: &ColorMapping) -> String {
107 format!("filter: url(#{}); overflow: visible;", self.id())
108 }
109
110 fn render_to_css_stroked(&self, colormap: &ColorMapping) -> String {
111 self.render_to_css_filled(colormap)
112 }
113}