[librsvg: 4/23] New trait method FilterEffect::resolve() -> Result<PrimitiveParams, ...>
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 4/23] New trait method FilterEffect::resolve() -> Result<PrimitiveParams, ...>
- Date: Thu, 11 Mar 2021 23:12:24 +0000 (UTC)
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]