diff --git a/crates/svg-filters/src/tests.rs b/crates/svg-filters/src/tests.rs index c09a957..72b970f 100644 --- a/crates/svg-filters/src/tests.rs +++ b/crates/svg-filters/src/tests.rs @@ -1,10 +1,10 @@ mod color_matrix; +mod blend; mod complex; mod gaussian_blur; mod offset; -mod blend {} mod component_transfer {} mod composite {} mod convolve_matrix {} diff --git a/crates/svg-filters/src/tests/blend.rs b/crates/svg-filters/src/tests/blend.rs new file mode 100644 index 0000000..71aea21 --- /dev/null +++ b/crates/svg-filters/src/tests/blend.rs @@ -0,0 +1,20 @@ +use crate::{ + codegen::SvgDocument, + types::nodes::{primitives::blend::BlendMode, standard_input::StandardInput}, +}; + +#[test] +fn test_offset_blend() { + let mut doc = SvgDocument::new(); + + let blend = doc.create_filter("blend"); + + let offset0 = blend.offset(StandardInput::SourceGraphic, 100., 0.); + let offset1 = blend.offset(StandardInput::SourceGraphic, -100., 0.); + blend.blend(offset0, offset1, BlendMode::Multiply); + + assert_eq!( + doc.generate_svg(), + r#""# + ); +} diff --git a/crates/svg-filters/src/tests/gaussian_blur.rs b/crates/svg-filters/src/tests/gaussian_blur.rs index 5739794..f148684 100644 --- a/crates/svg-filters/src/tests/gaussian_blur.rs +++ b/crates/svg-filters/src/tests/gaussian_blur.rs @@ -9,5 +9,5 @@ fn test_simple_blur() { assert_eq!( doc.generate_svg(), r#""# - ) + ); } diff --git a/crates/svg-filters/src/tests/offset.rs b/crates/svg-filters/src/tests/offset.rs index 4d7319e..380170e 100644 --- a/crates/svg-filters/src/tests/offset.rs +++ b/crates/svg-filters/src/tests/offset.rs @@ -3,12 +3,12 @@ use crate::{codegen::SvgDocument, types::nodes::standard_input::StandardInput}; #[test] fn test_offset_simple() { let mut doc = SvgDocument::new(); - let mut offset = doc.create_filter("offset"); + let offset = doc.create_filter("offset"); offset.offset(StandardInput::SourceGraphic, 25., -25.); assert_eq!( doc.generate_svg(), r#""# - ) + ); } diff --git a/crates/svg-filters/src/types/graph.rs b/crates/svg-filters/src/types/graph.rs index 44281d8..05d63c3 100644 --- a/crates/svg-filters/src/types/graph.rs +++ b/crates/svg-filters/src/types/graph.rs @@ -1,11 +1,9 @@ use std::fmt::{Debug, Display}; -use petgraph::{data::Build, prelude::NodeIndex, prelude::*, visit::IntoNeighborsDirected}; +use petgraph::{prelude::NodeIndex, prelude::*}; use crate::Node; -use self::edge::Edge; - use super::nodes::standard_input::StandardInput; #[derive(Debug)] @@ -141,9 +139,12 @@ impl FilterGraph { } pub mod abstracted_inputs { - use petgraph::{data::Build, prelude::NodeIndex}; + use petgraph::prelude::NodeIndex; - use crate::{types::nodes::primitives::color_matrix::ColorMatrixType, Node}; + use crate::{ + types::nodes::primitives::{blend::BlendMode, color_matrix::ColorMatrixType}, + Node, + }; use super::{FilterGraph, NodeInput}; @@ -178,6 +179,20 @@ pub mod abstracted_inputs { node_idx } + pub fn blend( + &mut self, + r#in: impl Into, + in2: impl Into, + mode: BlendMode, + ) -> NodeIndex { + let node_idx = self.dag.add_node(Node::blend(mode)); + self.dag + .add_edge(self.resolve_input(r#in.into()), node_idx, ()); + self.dag + .add_edge(self.resolve_input(in2.into()), node_idx, ()); + node_idx + } + pub fn composite_arithmetic( &mut self, r#in: impl Into, diff --git a/crates/svg-filters/src/types/nodes/primitives.rs b/crates/svg-filters/src/types/nodes/primitives.rs index c7526fd..7ba1c2d 100644 --- a/crates/svg-filters/src/types/nodes/primitives.rs +++ b/crates/svg-filters/src/types/nodes/primitives.rs @@ -82,7 +82,7 @@ pub enum FePrimitive { impl WriteElement for FePrimitive { fn attrs(&self) -> std::vec::Vec> { match self { - FePrimitive::Blend(_) => todo!(), + FePrimitive::Blend(el) => el.attrs(), FePrimitive::ColorMatrix(el) => el.attrs(), FePrimitive::ComponentTransfer(_) => todo!(), FePrimitive::Composite(el) => el.attrs(), @@ -103,7 +103,7 @@ impl WriteElement for FePrimitive { fn tag_name(&self) -> &'static str { match self { - FePrimitive::Blend(_) => todo!(), + FePrimitive::Blend(el) => el.tag_name(), FePrimitive::ColorMatrix(el) => el.tag_name(), FePrimitive::ComponentTransfer(_) => todo!(), FePrimitive::Composite(el) => el.tag_name(),