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
|
use crate::document::AcquiredNodes;
use crate::drawing_ctx::DrawingCtx;
use crate::element::{ElementResult, SetAttributes};
use crate::node::{CascadedValues, Node};
use crate::paint_server::resolve_color;
use crate::rect::IRect;
use crate::session::Session;
use crate::xml::Attributes;
use super::bounds::BoundsBuilder;
use super::context::{FilterContext, FilterOutput};
use super::{
FilterEffect, FilterError, FilterResolveError, Primitive, PrimitiveParams, ResolvedPrimitive,
};
/// The `feFlood` filter primitive.
#[derive(Default)]
pub struct FeFlood {
base: Primitive,
}
/// Resolved `feFlood` primitive for rendering.
pub struct Flood {
pub color: cssparser::RGBA,
}
impl SetAttributes for FeFlood {
fn set_attributes(&mut self, attrs: &Attributes, session: &Session) -> ElementResult {
self.base.parse_no_inputs(attrs, session)
}
}
impl Flood {
pub fn render(
&self,
bounds_builder: BoundsBuilder,
ctx: &FilterContext,
_acquired_nodes: &mut AcquiredNodes<'_>,
_draw_ctx: &mut DrawingCtx,
) -> Result<FilterOutput, FilterError> {
let bounds: IRect = bounds_builder.compute(ctx).clipped.into();
let surface = ctx.source_graphic().flood(bounds, self.color)?;
Ok(FilterOutput { surface, bounds })
}
}
impl FilterEffect for FeFlood {
fn resolve(
&self,
_acquired_nodes: &mut AcquiredNodes<'_>,
node: &Node,
) -> Result<ResolvedPrimitive, FilterResolveError> {
let cascaded = CascadedValues::new_from_node(node);
let values = cascaded.get();
Ok(ResolvedPrimitive {
primitive: self.base.clone(),
params: PrimitiveParams::Flood(Flood {
color: resolve_color(
&values.flood_color().0,
values.flood_opacity().0,
values.color().0,
),
}),
})
}
}
|