summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2023-02-09 13:23:20 -0600
committerFederico Mena Quintero <federico@gnome.org>2023-02-09 13:23:20 -0600
commit3a309538c35701be765a814dd4f9dbd27103cac0 (patch)
tree6cbf39f30d6ceffb2d842781767bdab4003c4850
parentd312b73e22d8738d23eadfa68ede084cc5d550ff (diff)
downloadlibrsvg-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.rs115
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))