1use crate::color::{resolve_color, Color};
2use crate::document::AcquiredNodes;
3use crate::element::ElementTrait;
4use crate::node::{CascadedValues, Node};
5use crate::rect::IRect;
6use crate::rsvg_log;
7use crate::session::Session;
8use crate::xml::Attributes;
9
10use super::bounds::BoundsBuilder;
11use super::context::{FilterContext, FilterOutput};
12use super::{
13 FilterEffect, FilterError, FilterResolveError, InputRequirements, Primitive, PrimitiveParams,
14 ResolvedPrimitive,
15};
16
17#[derive(Default)]
19pub struct FeFlood {
20 base: Primitive,
21}
22
23pub struct Flood {
25 pub color: Color,
26}
27
28impl ElementTrait for FeFlood {
29 fn set_attributes(&mut self, attrs: &Attributes, session: &Session) {
30 self.base.parse_no_inputs(attrs, session);
31 }
32}
33
34impl Flood {
35 pub fn render(
36 &self,
37 bounds_builder: BoundsBuilder,
38 ctx: &FilterContext,
39 ) -> Result<FilterOutput, FilterError> {
40 let bounds: IRect = bounds_builder.compute(ctx).clipped.into();
41 rsvg_log!(ctx.session(), "(feFlood bounds={:?}", bounds);
42
43 let surface = ctx.source_graphic().flood(bounds, self.color)?;
44
45 Ok(FilterOutput { surface, bounds })
46 }
47
48 pub fn get_input_requirements(&self) -> InputRequirements {
49 InputRequirements::default()
50 }
51}
52
53impl FilterEffect for FeFlood {
54 fn resolve(
55 &self,
56 _acquired_nodes: &mut AcquiredNodes<'_>,
57 node: &Node,
58 ) -> Result<Vec<ResolvedPrimitive>, FilterResolveError> {
59 let cascaded = CascadedValues::new_from_node(node);
60 let values = cascaded.get();
61
62 Ok(vec![ResolvedPrimitive {
63 primitive: self.base.clone(),
64 params: PrimitiveParams::Flood(Flood {
65 color: resolve_color(
66 &values.flood_color().0,
67 values.flood_opacity().0,
68 &values.color().0,
69 ),
70 }),
71 }])
72 }
73}