[librsvg: 4/23] New trait method FilterEffect::resolve() -> Result<PrimitiveParams, ...>




commit 9354e84ed34e37cb15ee91969cf0f342dc78a3b5
Author: Federico Mena Quintero <federico gnome org>
Date:   Thu Mar 11 12:07:22 2021 -0600

    New trait method FilterEffect::resolve() -> Result<PrimitiveParams, ...>
    
    Each primitive will gather all its parameters with this method.  For
    now they just put a reference to the feFoo node in the enum.

 src/filters/blend.rs              |  8 ++++++--
 src/filters/color_matrix.rs       |  8 ++++++--
 src/filters/component_transfer.rs |  8 ++++++--
 src/filters/composite.rs          |  8 ++++++--
 src/filters/convolve_matrix.rs    |  8 ++++++--
 src/filters/displacement_map.rs   |  8 ++++++--
 src/filters/flood.rs              |  8 ++++++--
 src/filters/gaussian_blur.rs      |  8 ++++++--
 src/filters/image.rs              |  8 ++++++--
 src/filters/lighting.rs           | 14 +++++++++-----
 src/filters/merge.rs              |  8 ++++++--
 src/filters/mod.rs                |  4 +++-
 src/filters/morphology.rs         |  8 ++++++--
 src/filters/offset.rs             |  8 ++++++--
 src/filters/tile.rs               |  8 ++++++--
 src/filters/turbulence.rs         |  8 ++++++--
 16 files changed, 96 insertions(+), 34 deletions(-)
---
diff --git a/src/filters/blend.rs b/src/filters/blend.rs
index 47e13a17..81aa70a8 100755
--- a/src/filters/blend.rs
+++ b/src/filters/blend.rs
@@ -10,7 +10,7 @@ use crate::parsers::{Parse, ParseValue};
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// Enumeration of the possible blending modes.
 #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
@@ -106,7 +106,11 @@ impl FilterRender for FeBlend {
     }
 }
 
-impl FilterEffect for FeBlend {}
+impl FilterEffect for FeBlend {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::Blend(node.clone()))
+    }
+}
 
 impl Parse for Mode {
     fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
diff --git a/src/filters/color_matrix.rs b/src/filters/color_matrix.rs
index 87376fb6..439e67e4 100644
--- a/src/filters/color_matrix.rs
+++ b/src/filters/color_matrix.rs
@@ -15,7 +15,7 @@ use crate::util::clamp;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// Color matrix operation types.
 #[derive(Debug, Clone, Copy, Eq, PartialEq)]
@@ -207,7 +207,11 @@ impl FilterRender for FeColorMatrix {
     }
 }
 
-impl FilterEffect for FeColorMatrix {}
+impl FilterEffect for FeColorMatrix {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::ColorMatrix(node.clone()))
+    }
+}
 
 impl Parse for OperationType {
     fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
diff --git a/src/filters/component_transfer.rs b/src/filters/component_transfer.rs
index 80576939..ac670947 100644
--- a/src/filters/component_transfer.rs
+++ b/src/filters/component_transfer.rs
@@ -16,7 +16,7 @@ use crate::util::clamp;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// The `feComponentTransfer` filter primitive.
 pub struct FeComponentTransfer {
@@ -370,7 +370,11 @@ impl FilterRender for FeComponentTransfer {
     }
 }
 
-impl FilterEffect for FeComponentTransfer {}
+impl FilterEffect for FeComponentTransfer {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::ComponentTransfer(node.clone()))
+    }
+}
 
 /// Takes a feComponentTransfer and walks its children to produce the feFuncX arguments.
 fn get_parameters(node: &Node) -> Result<Functions, FilterError> {
diff --git a/src/filters/composite.rs b/src/filters/composite.rs
index 2aff190f..4efe68f2 100644
--- a/src/filters/composite.rs
+++ b/src/filters/composite.rs
@@ -10,7 +10,7 @@ use crate::parsers::{Parse, ParseValue};
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// Enumeration of the possible compositing operations.
 #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
@@ -118,7 +118,11 @@ impl FilterRender for FeComposite {
     }
 }
 
-impl FilterEffect for FeComposite {}
+impl FilterEffect for FeComposite {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::Composite(node.clone()))
+    }
+}
 
 impl Parse for Operator {
     fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
diff --git a/src/filters/convolve_matrix.rs b/src/filters/convolve_matrix.rs
index 8d5ec68a..be66d3dd 100644
--- a/src/filters/convolve_matrix.rs
+++ b/src/filters/convolve_matrix.rs
@@ -20,7 +20,7 @@ use crate::util::clamp;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// The `feConvolveMatrix` filter primitive.
 pub struct FeConvolveMatrix {
@@ -288,7 +288,11 @@ impl FilterRender for FeConvolveMatrix {
     }
 }
 
-impl FilterEffect for FeConvolveMatrix {}
+impl FilterEffect for FeConvolveMatrix {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::ConvolveMatrix(node.clone()))
+    }
+}
 
 impl Parse for EdgeMode {
     fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
diff --git a/src/filters/displacement_map.rs b/src/filters/displacement_map.rs
index 92570406..9641fd5a 100644
--- a/src/filters/displacement_map.rs
+++ b/src/filters/displacement_map.rs
@@ -12,7 +12,7 @@ use crate::surface_utils::{iterators::Pixels, shared_surface::ExclusiveImageSurf
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// Enumeration of the color channels the displacement map can source.
 #[derive(Clone, Copy)]
@@ -156,7 +156,11 @@ impl FilterRender for FeDisplacementMap {
     }
 }
 
-impl FilterEffect for FeDisplacementMap {}
+impl FilterEffect for FeDisplacementMap {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::DisplacementMap(node.clone()))
+    }
+}
 
 impl Parse for ColorChannel {
     fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
diff --git a/src/filters/flood.rs b/src/filters/flood.rs
index 7d5a54c8..b4ac7925 100644
--- a/src/filters/flood.rs
+++ b/src/filters/flood.rs
@@ -5,7 +5,7 @@ use crate::node::{CascadedValues, Node};
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Primitive, PrimitiveParams};
 
 /// The `feFlood` filter primitive.
 pub struct FeFlood {
@@ -56,4 +56,8 @@ impl FilterRender for FeFlood {
     }
 }
 
-impl FilterEffect for FeFlood {}
+impl FilterEffect for FeFlood {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::Flood(node.clone()))
+    }
+}
diff --git a/src/filters/gaussian_blur.rs b/src/filters/gaussian_blur.rs
index 834087ab..4df2a86b 100644
--- a/src/filters/gaussian_blur.rs
+++ b/src/filters/gaussian_blur.rs
@@ -17,7 +17,7 @@ use crate::surface_utils::{
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// The maximum gaussian blur kernel size.
 ///
@@ -247,4 +247,8 @@ impl FilterRender for FeGaussianBlur {
     }
 }
 
-impl FilterEffect for FeGaussianBlur {}
+impl FilterEffect for FeGaussianBlur {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::GaussianBlur(node.clone()))
+    }
+}
diff --git a/src/filters/image.rs b/src/filters/image.rs
index c0eb8292..ddb6aca4 100644
--- a/src/filters/image.rs
+++ b/src/filters/image.rs
@@ -13,7 +13,7 @@ use crate::viewbox::ViewBox;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Primitive, PrimitiveParams};
 
 /// The `feImage` filter primitive.
 pub struct FeImage {
@@ -155,4 +155,8 @@ impl FilterRender for FeImage {
     }
 }
 
-impl FilterEffect for FeImage {}
+impl FilterEffect for FeImage {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::Image(node.clone()))
+    }
+}
diff --git a/src/filters/lighting.rs b/src/filters/lighting.rs
index 217feb07..eb4a34bd 100644
--- a/src/filters/lighting.rs
+++ b/src/filters/lighting.rs
@@ -12,7 +12,7 @@ use crate::drawing_ctx::DrawingCtx;
 use crate::element::{Draw, Element, ElementResult, SetAttributes};
 use crate::filters::{
     context::{FilterContext, FilterOutput, FilterResult},
-    FilterEffect, FilterError, FilterRender, Input, Primitive,
+    FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams,
 };
 use crate::node::{CascadedValues, Node, NodeBorrow};
 use crate::parsers::{NonNegative, NumberOptionalNumber, ParseValue};
@@ -450,7 +450,7 @@ impl FeSpecularLighting {
 }
 
 macro_rules! impl_lighting_filter {
-    ($lighting_type:ty, $alpha_func:ident) => {
+    ($lighting_type:ty, $params_name:ident, $alpha_func:ident) => {
         impl FilterRender for $lighting_type {
             fn render(
                 &self,
@@ -668,7 +668,11 @@ macro_rules! impl_lighting_filter {
             }
         }
 
-        impl FilterEffect for $lighting_type {}
+        impl FilterEffect for $lighting_type {
+            fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+                Ok(PrimitiveParams::$params_name(node.clone()))
+            }
+        }
     };
 }
 
@@ -680,8 +684,8 @@ fn specular_alpha(r: u8, g: u8, b: u8) -> u8 {
     max(max(r, g), b)
 }
 
-impl_lighting_filter!(FeDiffuseLighting, diffuse_alpha);
-impl_lighting_filter!(FeSpecularLighting, specular_alpha);
+impl_lighting_filter!(FeDiffuseLighting, DiffuseLighting, diffuse_alpha);
+impl_lighting_filter!(FeSpecularLighting, SpecularLighting, specular_alpha);
 
 /// 2D normal and factor stored separately.
 ///
diff --git a/src/filters/merge.rs b/src/filters/merge.rs
index 7c56de08..d235b4d6 100644
--- a/src/filters/merge.rs
+++ b/src/filters/merge.rs
@@ -11,7 +11,7 @@ use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// The `feMerge` filter primitive.
 pub struct FeMerge {
@@ -131,7 +131,11 @@ impl FilterRender for FeMerge {
     }
 }
 
-impl FilterEffect for FeMerge {}
+impl FilterEffect for FeMerge {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::Merge(node.clone()))
+    }
+}
 
 /// Takes a feMerge and walks its children to produce a list of feMergeNode arguments.
 fn get_parameters(node: &Node) -> Result<Vec<FeMergeNode>, FilterError> {
diff --git a/src/filters/mod.rs b/src/filters/mod.rs
index 856b43a9..3d6145e9 100644
--- a/src/filters/mod.rs
+++ b/src/filters/mod.rs
@@ -44,7 +44,9 @@ pub trait FilterRender {
 }
 
 /// A filter primitive interface.
-pub trait FilterEffect: SetAttributes + Draw + FilterRender {}
+pub trait FilterEffect: SetAttributes + Draw + FilterRender {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError>;
+}
 
 // Filter Effects do not need to draw themselves
 impl<T: FilterEffect> Draw for T {}
diff --git a/src/filters/morphology.rs b/src/filters/morphology.rs
index 65771222..b45fe5d1 100644
--- a/src/filters/morphology.rs
+++ b/src/filters/morphology.rs
@@ -19,7 +19,7 @@ use crate::surface_utils::{
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// Enumeration of the possible morphology operations.
 enum Operator {
@@ -161,7 +161,11 @@ impl FilterRender for FeMorphology {
     }
 }
 
-impl FilterEffect for FeMorphology {}
+impl FilterEffect for FeMorphology {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::Morphology(node.clone()))
+    }
+}
 
 impl Parse for Operator {
     fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {
diff --git a/src/filters/offset.rs b/src/filters/offset.rs
index 94823106..f661d8c1 100644
--- a/src/filters/offset.rs
+++ b/src/filters/offset.rs
@@ -9,7 +9,7 @@ use crate::property_defs::ColorInterpolationFilters;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// The `feOffset` filter primitive.
 pub struct FeOffset {
@@ -86,4 +86,8 @@ impl FilterRender for FeOffset {
     }
 }
 
-impl FilterEffect for FeOffset {}
+impl FilterEffect for FeOffset {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::Offset(node.clone()))
+    }
+}
diff --git a/src/filters/tile.rs b/src/filters/tile.rs
index df6bde12..0b15126a 100644
--- a/src/filters/tile.rs
+++ b/src/filters/tile.rs
@@ -6,7 +6,7 @@ use crate::property_defs::ColorInterpolationFilters;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterInput, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive, PrimitiveParams};
 
 /// The `feTile` filter primitive.
 pub struct FeTile {
@@ -81,4 +81,8 @@ impl FilterRender for FeTile {
     }
 }
 
-impl FilterEffect for FeTile {}
+impl FilterEffect for FeTile {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::Tile(node.clone()))
+    }
+}
diff --git a/src/filters/turbulence.rs b/src/filters/turbulence.rs
index f20fd860..13c30fa9 100644
--- a/src/filters/turbulence.rs
+++ b/src/filters/turbulence.rs
@@ -15,7 +15,7 @@ use crate::util::clamp;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, FilterRender, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Primitive, PrimitiveParams};
 
 /// Enumeration of the tile stitching modes.
 #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
@@ -402,7 +402,11 @@ impl FilterRender for FeTurbulence {
     }
 }
 
-impl FilterEffect for FeTurbulence {}
+impl FilterEffect for FeTurbulence {
+    fn resolve(&self, node: &Node) -> Result<PrimitiveParams, FilterError> {
+        Ok(PrimitiveParams::Turbulence(node.clone()))
+    }
+}
 
 impl Parse for StitchTiles {
     fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<Self, ParseError<'i>> {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]