forked from katzen-cafe/iowo
svg-filters: add nice abstractions for component transfer
This commit is contained in:
parent
9727ef82ca
commit
9ae8c2fbd3
4 changed files with 135 additions and 14 deletions
|
@ -139,10 +139,12 @@ impl FilterGraph {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod abstracted_inputs {
|
pub mod abstracted_inputs {
|
||||||
use petgraph::prelude::NodeIndex;
|
use petgraph::{data::Build, prelude::NodeIndex};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
types::nodes::primitives::{blend::BlendMode, color_matrix::ColorMatrixType},
|
types::nodes::primitives::{
|
||||||
|
blend::BlendMode, color_matrix::ColorMatrixType, component_transfer::TransferFn,
|
||||||
|
},
|
||||||
Node,
|
Node,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -211,6 +213,82 @@ pub mod abstracted_inputs {
|
||||||
.add_edge(self.resolve_input(in2.into()), node_idx, ());
|
.add_edge(self.resolve_input(in2.into()), node_idx, ());
|
||||||
node_idx
|
node_idx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn component_transfer_rgba(
|
||||||
|
&mut self,
|
||||||
|
r#in: impl Into<NodeInput>,
|
||||||
|
r: TransferFn,
|
||||||
|
g: TransferFn,
|
||||||
|
b: TransferFn,
|
||||||
|
a: TransferFn,
|
||||||
|
) -> NodeIndex {
|
||||||
|
let node_idx = self.dag.add_node(Node::component_transfer_rgba(r, g, b, a));
|
||||||
|
self.dag
|
||||||
|
.add_edge(self.resolve_input(r#in.into()), node_idx, ());
|
||||||
|
node_idx
|
||||||
|
}
|
||||||
|
pub fn component_transfer_rgb(
|
||||||
|
&mut self,
|
||||||
|
r#in: impl Into<NodeInput>,
|
||||||
|
r: TransferFn,
|
||||||
|
g: TransferFn,
|
||||||
|
b: TransferFn,
|
||||||
|
) -> NodeIndex {
|
||||||
|
let node_idx = self.dag.add_node(Node::component_transfer_rgb(r, g, b));
|
||||||
|
self.dag
|
||||||
|
.add_edge(self.resolve_input(r#in.into()), node_idx, ());
|
||||||
|
node_idx
|
||||||
|
}
|
||||||
|
pub fn component_transfer_r(
|
||||||
|
&mut self,
|
||||||
|
r#in: impl Into<NodeInput>,
|
||||||
|
func: TransferFn,
|
||||||
|
) -> NodeIndex {
|
||||||
|
let node_idx = self.dag.add_node(Node::component_transfer_r(func));
|
||||||
|
self.dag
|
||||||
|
.add_edge(self.resolve_input(r#in.into()), node_idx, ());
|
||||||
|
node_idx
|
||||||
|
}
|
||||||
|
pub fn component_transfer_g(
|
||||||
|
&mut self,
|
||||||
|
r#in: impl Into<NodeInput>,
|
||||||
|
func: TransferFn,
|
||||||
|
) -> NodeIndex {
|
||||||
|
let node_idx = self.dag.add_node(Node::component_transfer_g(func));
|
||||||
|
self.dag
|
||||||
|
.add_edge(self.resolve_input(r#in.into()), node_idx, ());
|
||||||
|
node_idx
|
||||||
|
}
|
||||||
|
pub fn component_transfer_b(
|
||||||
|
&mut self,
|
||||||
|
r#in: impl Into<NodeInput>,
|
||||||
|
func: TransferFn,
|
||||||
|
) -> NodeIndex {
|
||||||
|
let node_idx = self.dag.add_node(Node::component_transfer_b(func));
|
||||||
|
self.dag
|
||||||
|
.add_edge(self.resolve_input(r#in.into()), node_idx, ());
|
||||||
|
node_idx
|
||||||
|
}
|
||||||
|
pub fn component_transfer_a(
|
||||||
|
&mut self,
|
||||||
|
r#in: impl Into<NodeInput>,
|
||||||
|
func: TransferFn,
|
||||||
|
) -> NodeIndex {
|
||||||
|
let node_idx = self.dag.add_node(Node::component_transfer_a(func));
|
||||||
|
self.dag
|
||||||
|
.add_edge(self.resolve_input(r#in.into()), node_idx, ());
|
||||||
|
node_idx
|
||||||
|
}
|
||||||
|
pub fn component_transfer_single(
|
||||||
|
&mut self,
|
||||||
|
r#in: impl Into<NodeInput>,
|
||||||
|
func: TransferFn,
|
||||||
|
) -> NodeIndex {
|
||||||
|
let node_idx = self.dag.add_node(Node::component_transfer_single(func));
|
||||||
|
self.dag
|
||||||
|
.add_edge(self.resolve_input(r#in.into()), node_idx, ());
|
||||||
|
node_idx
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -150,4 +150,48 @@ impl Node {
|
||||||
func_a: a,
|
func_a: a,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn component_transfer_rgb(r: TransferFn, g: TransferFn, b: TransferFn) -> Self {
|
||||||
|
Self::component_transfer_rgba(r, g, b, TransferFn::Identity)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn component_transfer_r(func: TransferFn) -> Self {
|
||||||
|
Self::component_transfer_rgba(
|
||||||
|
func,
|
||||||
|
TransferFn::Identity,
|
||||||
|
TransferFn::Identity,
|
||||||
|
TransferFn::Identity,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn component_transfer_g(func: TransferFn) -> Self {
|
||||||
|
Self::component_transfer_rgba(
|
||||||
|
TransferFn::Identity,
|
||||||
|
func,
|
||||||
|
TransferFn::Identity,
|
||||||
|
TransferFn::Identity,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn component_transfer_b(func: TransferFn) -> Self {
|
||||||
|
Self::component_transfer_rgba(
|
||||||
|
TransferFn::Identity,
|
||||||
|
TransferFn::Identity,
|
||||||
|
func,
|
||||||
|
TransferFn::Identity,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn component_transfer_a(func: TransferFn) -> Self {
|
||||||
|
Self::component_transfer_rgba(
|
||||||
|
TransferFn::Identity,
|
||||||
|
TransferFn::Identity,
|
||||||
|
TransferFn::Identity,
|
||||||
|
func,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn component_transfer_single(func: TransferFn) -> Self {
|
||||||
|
Self::component_transfer_rgb(func.clone(), func.clone(), func)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
use std::convert::Into;
|
|
||||||
|
|
||||||
use quick_xml::{events::attributes::Attribute, ElementWriter, Writer};
|
use quick_xml::{events::attributes::Attribute, ElementWriter, Writer};
|
||||||
|
use std::convert::Into;
|
||||||
|
|
||||||
use super::CommonAttrs;
|
use super::CommonAttrs;
|
||||||
|
|
||||||
|
@ -86,18 +85,18 @@ impl WriteElement for FePrimitive {
|
||||||
FePrimitive::ColorMatrix(el) => el.attrs(),
|
FePrimitive::ColorMatrix(el) => el.attrs(),
|
||||||
FePrimitive::ComponentTransfer(el) => el.attrs(),
|
FePrimitive::ComponentTransfer(el) => el.attrs(),
|
||||||
FePrimitive::Composite(el) => el.attrs(),
|
FePrimitive::Composite(el) => el.attrs(),
|
||||||
|
FePrimitive::GaussianBlur(el) => el.attrs(),
|
||||||
|
FePrimitive::Offset(el) => el.attrs(),
|
||||||
|
FePrimitive::Turbulence(el) => el.attrs(),
|
||||||
FePrimitive::ConvolveMatrix(_) => todo!(),
|
FePrimitive::ConvolveMatrix(_) => todo!(),
|
||||||
FePrimitive::DiffuseLighting(_) => todo!(),
|
FePrimitive::DiffuseLighting(_) => todo!(),
|
||||||
FePrimitive::DisplacementMap(_) => todo!(),
|
FePrimitive::DisplacementMap(_) => todo!(),
|
||||||
FePrimitive::Flood(_) => todo!(),
|
FePrimitive::Flood(_) => todo!(),
|
||||||
FePrimitive::GaussianBlur(el) => el.attrs(),
|
|
||||||
FePrimitive::Image(_) => todo!(),
|
FePrimitive::Image(_) => todo!(),
|
||||||
FePrimitive::Merge(_) => todo!(),
|
FePrimitive::Merge(_) => todo!(),
|
||||||
FePrimitive::Morphology(_) => todo!(),
|
FePrimitive::Morphology(_) => todo!(),
|
||||||
FePrimitive::Offset(el) => el.attrs(),
|
|
||||||
FePrimitive::SpecularLighting(_) => todo!(),
|
FePrimitive::SpecularLighting(_) => todo!(),
|
||||||
FePrimitive::Tile(_) => todo!(),
|
FePrimitive::Tile(_) => todo!(),
|
||||||
FePrimitive::Turbulence(el) => el.attrs(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,18 +106,18 @@ impl WriteElement for FePrimitive {
|
||||||
FePrimitive::ColorMatrix(el) => el.tag_name(),
|
FePrimitive::ColorMatrix(el) => el.tag_name(),
|
||||||
FePrimitive::ComponentTransfer(el) => el.tag_name(),
|
FePrimitive::ComponentTransfer(el) => el.tag_name(),
|
||||||
FePrimitive::Composite(el) => el.tag_name(),
|
FePrimitive::Composite(el) => el.tag_name(),
|
||||||
|
FePrimitive::GaussianBlur(el) => el.tag_name(),
|
||||||
|
FePrimitive::Offset(el) => el.tag_name(),
|
||||||
|
FePrimitive::Turbulence(el) => el.tag_name(),
|
||||||
FePrimitive::ConvolveMatrix(_) => todo!(),
|
FePrimitive::ConvolveMatrix(_) => todo!(),
|
||||||
FePrimitive::DiffuseLighting(_) => todo!(),
|
FePrimitive::DiffuseLighting(_) => todo!(),
|
||||||
FePrimitive::DisplacementMap(_) => todo!(),
|
FePrimitive::DisplacementMap(_) => todo!(),
|
||||||
FePrimitive::Flood(_) => todo!(),
|
FePrimitive::Flood(_) => todo!(),
|
||||||
FePrimitive::GaussianBlur(el) => el.tag_name(),
|
|
||||||
FePrimitive::Image(_) => todo!(),
|
FePrimitive::Image(_) => todo!(),
|
||||||
FePrimitive::Merge(_) => todo!(),
|
FePrimitive::Merge(_) => todo!(),
|
||||||
FePrimitive::Morphology(_) => todo!(),
|
FePrimitive::Morphology(_) => todo!(),
|
||||||
FePrimitive::Offset(el) => el.tag_name(),
|
|
||||||
FePrimitive::SpecularLighting(_) => todo!(),
|
FePrimitive::SpecularLighting(_) => todo!(),
|
||||||
FePrimitive::Tile(_) => todo!(),
|
FePrimitive::Tile(_) => todo!(),
|
||||||
FePrimitive::Turbulence(el) => el.tag_name(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,18 +133,18 @@ impl WriteElement for FePrimitive {
|
||||||
FePrimitive::ColorMatrix(el) => el.element_writer(writer, common, inputs, output),
|
FePrimitive::ColorMatrix(el) => el.element_writer(writer, common, inputs, output),
|
||||||
FePrimitive::ComponentTransfer(el) => el.element_writer(writer, common, inputs, output),
|
FePrimitive::ComponentTransfer(el) => el.element_writer(writer, common, inputs, output),
|
||||||
FePrimitive::Composite(el) => el.element_writer(writer, common, inputs, output),
|
FePrimitive::Composite(el) => el.element_writer(writer, common, inputs, output),
|
||||||
|
FePrimitive::Turbulence(el) => el.element_writer(writer, common, inputs, output),
|
||||||
|
FePrimitive::GaussianBlur(el) => el.element_writer(writer, common, inputs, output),
|
||||||
|
FePrimitive::Offset(el) => el.element_writer(writer, common, inputs, output),
|
||||||
FePrimitive::ConvolveMatrix(_) => todo!(),
|
FePrimitive::ConvolveMatrix(_) => todo!(),
|
||||||
FePrimitive::DiffuseLighting(_) => todo!(),
|
FePrimitive::DiffuseLighting(_) => todo!(),
|
||||||
FePrimitive::DisplacementMap(_) => todo!(),
|
FePrimitive::DisplacementMap(_) => todo!(),
|
||||||
FePrimitive::Flood(_) => todo!(),
|
FePrimitive::Flood(_) => todo!(),
|
||||||
FePrimitive::GaussianBlur(el) => el.element_writer(writer, common, inputs, output),
|
|
||||||
FePrimitive::Image(_) => todo!(),
|
FePrimitive::Image(_) => todo!(),
|
||||||
FePrimitive::Merge(_) => todo!(),
|
FePrimitive::Merge(_) => todo!(),
|
||||||
FePrimitive::Morphology(_) => todo!(),
|
FePrimitive::Morphology(_) => todo!(),
|
||||||
FePrimitive::Offset(el) => el.element_writer(writer, common, inputs, output),
|
|
||||||
FePrimitive::SpecularLighting(_) => todo!(),
|
FePrimitive::SpecularLighting(_) => todo!(),
|
||||||
FePrimitive::Tile(_) => todo!(),
|
FePrimitive::Tile(_) => todo!(),
|
||||||
FePrimitive::Turbulence(el) => el.element_writer(writer, common, inputs, output),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ impl WriteElement for ComponentTransfer {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// [transfer functions](https://www.w3.org/TR/SVG11/filters.html#transferFuncElements)
|
/// [transfer functions](https://www.w3.org/TR/SVG11/filters.html#transferFuncElements)
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum TransferFn {
|
pub enum TransferFn {
|
||||||
Identity,
|
Identity,
|
||||||
Table {
|
Table {
|
||||||
|
|
Loading…
Reference in a new issue