[librsvg: 1/15] Split the render method for filter primitives into its own FilterRender trait




commit 5754a55c1adb4dc9dd2af64744213e151f79f05f
Author: Federico Mena Quintero <federico gnome org>
Date:   Mon Mar 8 13:21:36 2021 -0600

    Split the render method for filter primitives into its own FilterRender trait
    
    Let's see if we can have filter primitive *elements* have a method
    that will generate a struct with the parameters for the primitive,
    without requiring the full node and its children.

 src/filters/blend.rs              | 6 ++++--
 src/filters/color_matrix.rs       | 6 ++++--
 src/filters/component_transfer.rs | 6 ++++--
 src/filters/composite.rs          | 6 ++++--
 src/filters/convolve_matrix.rs    | 6 ++++--
 src/filters/displacement_map.rs   | 6 ++++--
 src/filters/flood.rs              | 6 ++++--
 src/filters/gaussian_blur.rs      | 6 ++++--
 src/filters/image.rs              | 6 ++++--
 src/filters/lighting.rs           | 6 ++++--
 src/filters/merge.rs              | 6 ++++--
 src/filters/mod.rs                | 7 +++++--
 src/filters/morphology.rs         | 6 ++++--
 src/filters/offset.rs             | 6 ++++--
 src/filters/tile.rs               | 6 ++++--
 src/filters/turbulence.rs         | 6 ++++--
 16 files changed, 65 insertions(+), 32 deletions(-)
---
diff --git a/src/filters/blend.rs b/src/filters/blend.rs
index 5f73d6b9..7eac4b59 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, Input, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, FilterRender, Input, PrimitiveWithInput};
 
 /// Enumeration of the possible blending modes.
 #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
@@ -70,7 +70,7 @@ impl SetAttributes for FeBlend {
     }
 }
 
-impl FilterEffect for FeBlend {
+impl FilterRender for FeBlend {
     fn render(
         &self,
         node: &Node,
@@ -97,7 +97,9 @@ impl FilterEffect for FeBlend {
             output: FilterOutput { surface, bounds },
         })
     }
+}
 
+impl FilterEffect for FeBlend {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         true
diff --git a/src/filters/color_matrix.rs b/src/filters/color_matrix.rs
index 87ee3e5b..b6a0a843 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, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, FilterRender, PrimitiveWithInput};
 
 /// Color matrix operation types.
 #[derive(Debug, Clone, Copy, Eq, PartialEq)]
@@ -137,7 +137,7 @@ impl SetAttributes for FeColorMatrix {
     }
 }
 
-impl FilterEffect for FeColorMatrix {
+impl FilterRender for FeColorMatrix {
     fn render(
         &self,
         node: &Node,
@@ -199,7 +199,9 @@ impl FilterEffect for FeColorMatrix {
             },
         })
     }
+}
 
+impl FilterEffect for FeColorMatrix {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         true
diff --git a/src/filters/component_transfer.rs b/src/filters/component_transfer.rs
index 2d073ea7..a0a7186f 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, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, FilterRender, PrimitiveWithInput};
 
 /// The `feComponentTransfer` filter primitive.
 pub struct FeComponentTransfer {
@@ -276,7 +276,7 @@ macro_rules! get_func_x_node {
     };
 }
 
-impl FilterEffect for FeComponentTransfer {
+impl FilterRender for FeComponentTransfer {
     fn render(
         &self,
         node: &Node,
@@ -383,7 +383,9 @@ impl FilterEffect for FeComponentTransfer {
             },
         })
     }
+}
 
+impl FilterEffect for FeComponentTransfer {
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         true
     }
diff --git a/src/filters/composite.rs b/src/filters/composite.rs
index 3f219659..5e001960 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, Input, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, FilterRender, Input, PrimitiveWithInput};
 
 /// Enumeration of the possible compositing operations.
 #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
@@ -70,7 +70,7 @@ impl SetAttributes for FeComposite {
     }
 }
 
-impl FilterEffect for FeComposite {
+impl FilterRender for FeComposite {
     fn render(
         &self,
         node: &Node,
@@ -109,7 +109,9 @@ impl FilterEffect for FeComposite {
             output: FilterOutput { surface, bounds },
         })
     }
+}
 
+impl FilterEffect for FeComposite {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         true
diff --git a/src/filters/convolve_matrix.rs b/src/filters/convolve_matrix.rs
index b333b01c..329254e7 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, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, FilterRender, PrimitiveWithInput};
 
 /// The `feConvolveMatrix` filter primitive.
 pub struct FeConvolveMatrix {
@@ -119,7 +119,7 @@ impl SetAttributes for FeConvolveMatrix {
     }
 }
 
-impl FilterEffect for FeConvolveMatrix {
+impl FilterRender for FeConvolveMatrix {
     fn render(
         &self,
         node: &Node,
@@ -280,7 +280,9 @@ impl FilterEffect for FeConvolveMatrix {
             output: FilterOutput { surface, bounds },
         })
     }
+}
 
+impl FilterEffect for FeConvolveMatrix {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         true
diff --git a/src/filters/displacement_map.rs b/src/filters/displacement_map.rs
index ab7c38a5..95c8b884 100644
--- a/src/filters/displacement_map.rs
+++ b/src/filters/displacement_map.rs
@@ -11,7 +11,7 @@ use crate::surface_utils::{iterators::Pixels, shared_surface::ExclusiveImageSurf
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, FilterRender, Input, PrimitiveWithInput};
 
 /// Enumeration of the color channels the displacement map can source.
 #[derive(Clone, Copy)]
@@ -67,7 +67,7 @@ impl SetAttributes for FeDisplacementMap {
     }
 }
 
-impl FilterEffect for FeDisplacementMap {
+impl FilterRender for FeDisplacementMap {
     fn render(
         &self,
         node: &Node,
@@ -135,7 +135,9 @@ impl FilterEffect for FeDisplacementMap {
             },
         })
     }
+}
 
+impl FilterEffect for FeDisplacementMap {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         // Performance TODO: this converts in back and forth to linear RGB while technically it's
diff --git a/src/filters/flood.rs b/src/filters/flood.rs
index 89c19bfd..1cbd1e77 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, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Primitive};
 
 /// The `feFlood` filter primitive.
 pub struct FeFlood {
@@ -28,7 +28,7 @@ impl SetAttributes for FeFlood {
     }
 }
 
-impl FilterEffect for FeFlood {
+impl FilterRender for FeFlood {
     fn render(
         &self,
         node: &Node,
@@ -57,7 +57,9 @@ impl FilterEffect for FeFlood {
             output: FilterOutput { surface, bounds },
         })
     }
+}
 
+impl FilterEffect for FeFlood {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         false
diff --git a/src/filters/gaussian_blur.rs b/src/filters/gaussian_blur.rs
index 8f296fe7..cdbee9e8 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, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, FilterRender, PrimitiveWithInput};
 
 /// The maximum gaussian blur kernel size.
 ///
@@ -185,7 +185,7 @@ fn gaussian_blur(
     )?)
 }
 
-impl FilterEffect for FeGaussianBlur {
+impl FilterRender for FeGaussianBlur {
     fn render(
         &self,
         node: &Node,
@@ -239,7 +239,9 @@ impl FilterEffect for FeGaussianBlur {
             },
         })
     }
+}
 
+impl FilterEffect for FeGaussianBlur {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         true
diff --git a/src/filters/image.rs b/src/filters/image.rs
index 0bb82226..cce27e4c 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, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Primitive};
 
 /// The `feImage` filter primitive.
 pub struct FeImage {
@@ -118,7 +118,7 @@ impl SetAttributes for FeImage {
     }
 }
 
-impl FilterEffect for FeImage {
+impl FilterRender for FeImage {
     fn render(
         &self,
         node: &Node,
@@ -153,7 +153,9 @@ impl FilterEffect for FeImage {
             },
         })
     }
+}
 
+impl FilterEffect for FeImage {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         false
diff --git a/src/filters/lighting.rs b/src/filters/lighting.rs
index a7ccbf59..48708d70 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, PrimitiveWithInput,
+    FilterEffect, FilterError, FilterRender, PrimitiveWithInput,
 };
 use crate::node::{CascadedValues, Node, NodeBorrow};
 use crate::parsers::{NonNegative, NumberOptionalNumber, ParseValue};
@@ -423,7 +423,7 @@ impl FeSpecularLighting {
 // not want to make the Lighting trait public, so we use a macro
 macro_rules! impl_lighting_filter {
     ($lighting_type:ty, $alpha_func:ident) => {
-        impl FilterEffect for $lighting_type {
+        impl FilterRender for $lighting_type {
             fn render(
                 &self,
                 node: &Node,
@@ -634,7 +634,9 @@ macro_rules! impl_lighting_filter {
                     output: FilterOutput { surface, bounds },
                 })
             }
+        }
 
+        impl FilterEffect for $lighting_type {
             #[inline]
             fn is_affected_by_color_interpolation_filters(&self) -> bool {
                 true
diff --git a/src/filters/merge.rs b/src/filters/merge.rs
index edf667a6..29e8ec3a 100644
--- a/src/filters/merge.rs
+++ b/src/filters/merge.rs
@@ -10,7 +10,7 @@ use crate::surface_utils::shared_surface::{SharedImageSurface, SurfaceType};
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, Input, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Input, Primitive};
 
 /// The `feMerge` filter primitive.
 pub struct FeMerge {
@@ -75,7 +75,7 @@ impl FeMergeNode {
     }
 }
 
-impl FilterEffect for FeMerge {
+impl FilterRender for FeMerge {
     fn render(
         &self,
         node: &Node,
@@ -124,7 +124,9 @@ impl FilterEffect for FeMerge {
             output: FilterOutput { surface, bounds },
         })
     }
+}
 
+impl FilterEffect for FeMerge {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         true
diff --git a/src/filters/mod.rs b/src/filters/mod.rs
index 2cd66bd4..7f3d9017 100644
--- a/src/filters/mod.rs
+++ b/src/filters/mod.rs
@@ -29,8 +29,8 @@ use self::context::{FilterContext, FilterInput, FilterResult};
 mod error;
 use self::error::FilterError;
 
-/// A filter primitive interface.
-pub trait FilterEffect: SetAttributes + Draw {
+/// Trait to render filter effect primitives.
+pub trait FilterRender {
     /// Renders this filter primitive.
     ///
     /// If this filter primitive can't be rendered for whatever reason (for instance, a required
@@ -42,7 +42,10 @@ pub trait FilterEffect: SetAttributes + Draw {
         acquired_nodes: &mut AcquiredNodes<'_>,
         draw_ctx: &mut DrawingCtx,
     ) -> Result<FilterResult, FilterError>;
+}
 
+/// A filter primitive interface.
+pub trait FilterEffect: SetAttributes + Draw + FilterRender {
     /// Returns `true` if this filter primitive is affected by the `color-interpolation-filters`
     /// property.
     ///
diff --git a/src/filters/morphology.rs b/src/filters/morphology.rs
index e64c07b2..f60611d9 100644
--- a/src/filters/morphology.rs
+++ b/src/filters/morphology.rs
@@ -18,7 +18,7 @@ use crate::surface_utils::{
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, FilterRender, PrimitiveWithInput};
 
 /// Enumeration of the possible morphology operations.
 enum Operator {
@@ -64,7 +64,7 @@ impl SetAttributes for FeMorphology {
     }
 }
 
-impl FilterEffect for FeMorphology {
+impl FilterRender for FeMorphology {
     fn render(
         &self,
         node: &Node,
@@ -140,7 +140,9 @@ impl FilterEffect for FeMorphology {
             },
         })
     }
+}
 
+impl FilterEffect for FeMorphology {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         false
diff --git a/src/filters/offset.rs b/src/filters/offset.rs
index b4c2e89b..4fdc6c85 100644
--- a/src/filters/offset.rs
+++ b/src/filters/offset.rs
@@ -8,7 +8,7 @@ use crate::parsers::ParseValue;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, FilterRender, PrimitiveWithInput};
 
 /// The `feOffset` filter primitive.
 pub struct FeOffset {
@@ -45,7 +45,7 @@ impl SetAttributes for FeOffset {
     }
 }
 
-impl FilterEffect for FeOffset {
+impl FilterRender for FeOffset {
     fn render(
         &self,
         node: &Node,
@@ -69,7 +69,9 @@ impl FilterEffect for FeOffset {
             output: FilterOutput { surface, bounds },
         })
     }
+}
 
+impl FilterEffect for FeOffset {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         false
diff --git a/src/filters/tile.rs b/src/filters/tile.rs
index 2e7466f8..98ac37e1 100644
--- a/src/filters/tile.rs
+++ b/src/filters/tile.rs
@@ -5,7 +5,7 @@ use crate::node::Node;
 use crate::xml::Attributes;
 
 use super::context::{FilterContext, FilterInput, FilterOutput, FilterResult};
-use super::{FilterEffect, FilterError, PrimitiveWithInput};
+use super::{FilterEffect, FilterError, FilterRender, PrimitiveWithInput};
 
 /// The `feTile` filter primitive.
 pub struct FeTile {
@@ -28,7 +28,7 @@ impl SetAttributes for FeTile {
     }
 }
 
-impl FilterEffect for FeTile {
+impl FilterRender for FeTile {
     fn render(
         &self,
         node: &Node,
@@ -66,7 +66,9 @@ impl FilterEffect for FeTile {
             output: FilterOutput { surface, bounds },
         })
     }
+}
 
+impl FilterEffect for FeTile {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         false
diff --git a/src/filters/turbulence.rs b/src/filters/turbulence.rs
index 583fc49a..99567cb9 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, Primitive};
+use super::{FilterEffect, FilterError, FilterRender, Primitive};
 
 /// Enumeration of the tile stitching modes.
 #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)]
@@ -323,7 +323,7 @@ impl NoiseGenerator {
     }
 }
 
-impl FilterEffect for FeTurbulence {
+impl FilterRender for FeTurbulence {
     fn render(
         &self,
         node: &Node,
@@ -403,7 +403,9 @@ impl FilterEffect for FeTurbulence {
             },
         })
     }
+}
 
+impl FilterEffect for FeTurbulence {
     #[inline]
     fn is_affected_by_color_interpolation_filters(&self) -> bool {
         true


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