diff options
author | Federico Mena Quintero <federico@gnome.org> | 2023-02-09 13:23:20 -0600 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2023-02-09 13:23:20 -0600 |
commit | 3a309538c35701be765a814dd4f9dbd27103cac0 (patch) | |
tree | 6cbf39f30d6ceffb2d842781767bdab4003c4850 | |
parent | d312b73e22d8738d23eadfa68ede084cc5d550ff (diff) | |
download | librsvg-3a309538c35701be765a814dd4f9dbd27103cac0.tar.gz |
Extract function to create the primitives for a drop-shadow effect
Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/793>
-rw-r--r-- | src/filter_func.rs | 115 |
1 files changed, 65 insertions, 50 deletions
diff --git a/src/filter_func.rs b/src/filter_func.rs index d0670253..a3f8cbf6 100644 --- a/src/filter_func.rs +++ b/src/filter_func.rs @@ -364,6 +364,70 @@ impl Contrast { } } +/// Creates the filter primitives required for a `feDropShadow` effect. +/// +/// Both the `drop-shadow()` filter function and the `feDropShadow` element need to create +/// a sequence of filter primitives (blur, offset, etc.) to build the drop shadow. This +/// function builds that sequence. +pub fn drop_shadow_primitives( + dx: f64, + dy: f64, + std_deviation: NumberOptionalNumber<f64>, + color: RGBA, +) -> Vec<ResolvedPrimitive> { + let offsetblur = CustomIdent("offsetblur".to_string()); + + let gaussian_blur = ResolvedPrimitive { + primitive: Primitive::default(), + params: PrimitiveParams::GaussianBlur(GaussianBlur { + in1: Input::SourceAlpha, + std_deviation, + ..GaussianBlur::default() + }), + }; + + let offset = ResolvedPrimitive { + primitive: Primitive { + result: Some(offsetblur.clone()), + ..Primitive::default() + }, + params: PrimitiveParams::Offset(Offset { + in1: Input::default(), + dx, + dy, + }), + }; + + let flood = ResolvedPrimitive { + primitive: Primitive::default(), + params: PrimitiveParams::Flood(Flood { color }), + }; + + let composite = ResolvedPrimitive { + primitive: Primitive::default(), + params: PrimitiveParams::Composite(Composite { + in2: Input::FilterOutput(offsetblur), + operator: Operator::In, + ..Composite::default() + }), + }; + + let merge = ResolvedPrimitive { + primitive: Primitive::default(), + params: PrimitiveParams::Merge(Merge { + merge_nodes: vec![ + MergeNode::default(), + MergeNode { + in1: Input::SourceGraphic, + ..MergeNode::default() + }, + ], + }), + }; + + vec![gaussian_blur, offset, flood, composite, merge] +} + impl DropShadow { /// Converts a DropShadow into the set of filter element primitives. /// @@ -380,57 +444,8 @@ impl DropShadow { .map(|c| resolve_color(c, UnitInterval::clamp(1.0), default_color)) .unwrap_or(default_color); - let offsetblur = CustomIdent("offsetblur".to_string()); - - let gaussian_blur = ResolvedPrimitive { - primitive: Primitive::default(), - params: PrimitiveParams::GaussianBlur(GaussianBlur { - in1: Input::SourceAlpha, - std_deviation, - ..GaussianBlur::default() - }), - }; - - let offset = ResolvedPrimitive { - primitive: Primitive { - result: Some(offsetblur.clone()), - ..Primitive::default() - }, - params: PrimitiveParams::Offset(Offset { - in1: Input::default(), - dx, - dy, - }), - }; - - let flood = ResolvedPrimitive { - primitive: Primitive::default(), - params: PrimitiveParams::Flood(Flood { color }), - }; - - let composite = ResolvedPrimitive { - primitive: Primitive::default(), - params: PrimitiveParams::Composite(Composite { - in2: Input::FilterOutput(offsetblur), - operator: Operator::In, - ..Composite::default() - }), - }; - - let merge = ResolvedPrimitive { - primitive: Primitive::default(), - params: PrimitiveParams::Merge(Merge { - merge_nodes: vec![ - MergeNode::default(), - MergeNode { - in1: Input::SourceGraphic, - ..MergeNode::default() - }, - ], - }), - }; + let resolved_primitives = drop_shadow_primitives(dx, dy, std_deviation, color); - let resolved_primitives = vec![gaussian_blur, offset, flood, composite, merge]; let primitives = resolved_primitives .into_iter() .map(|p| p.into_user_space(params)) |