rsvg/filters/
flood.rs

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/// The `feFlood` filter primitive.
18#[derive(Default)]
19pub struct FeFlood {
20    base: Primitive,
21}
22
23/// Resolved `feFlood` primitive for rendering.
24pub 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}