1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
use markup5ever::{expanded_name, local_name, namespace_url, ns};
use crate::document::AcquiredNodes;
use crate::element::{set_attribute, ElementTrait};
use crate::filter_func::drop_shadow_primitives;
use crate::node::{CascadedValues, Node};
use crate::paint_server::resolve_color;
use crate::parsers::{NumberOptionalNumber, ParseValue};
use crate::session::Session;
use crate::xml::Attributes;
use super::{FilterEffect, FilterResolveError, Input, Primitive, ResolvedPrimitive};
/// The `feDropShadow` element.
#[derive(Default)]
pub struct FeDropShadow {
base: Primitive,
params: DropShadow,
}
/// Resolved `feDropShadow` parameters for rendering.
#[derive(Clone)]
pub struct DropShadow {
pub in1: Input,
pub dx: f64,
pub dy: f64,
pub std_deviation: NumberOptionalNumber<f64>,
}
impl Default for DropShadow {
/// Defaults come from https://www.w3.org/TR/filter-effects/#feDropShadowElement
fn default() -> Self {
Self {
in1: Default::default(),
dx: 2.0,
dy: 2.0,
std_deviation: NumberOptionalNumber(2.0, 2.0),
}
}
}
impl ElementTrait for FeDropShadow {
fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
self.params.in1 = self.base.parse_one_input(attrs, session);
for (attr, value) in attrs.iter() {
match attr.expanded() {
expanded_name!("", "dx") => {
set_attribute(&mut self.params.dx, attr.parse(value), session);
}
expanded_name!("", "dy") => {
set_attribute(&mut self.params.dy, attr.parse(value), session);
}
expanded_name!("", "stdDeviation") => {
set_attribute(&mut self.params.std_deviation, attr.parse(value), session);
}
_ => (),
}
}
}
}
impl FilterEffect for FeDropShadow {
fn resolve(
&self,
_acquired_nodes: &mut AcquiredNodes<'_>,
node: &Node,
) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
let cascaded = CascadedValues::new_from_node(node);
let values = cascaded.get();
let color = resolve_color(
&values.flood_color().0,
values.flood_opacity().0,
values.color().0,
);
Ok(drop_shadow_primitives(
self.params.dx,
self.params.dy,
self.params.std_deviation,
color,
))
}
}
|