Add the GeglOperation code with Bloom and Cartoon to begin with.
This commit is contained in:
parent
036bbfb697
commit
deba03b83f
|
@ -0,0 +1,45 @@
|
||||||
|
//! # GEGL
|
||||||
|
//!
|
||||||
|
//! > **Ad-hoc GEGL data structure library for Rust.**
|
||||||
|
|
||||||
|
mod operations;
|
||||||
|
|
||||||
|
pub use operations::*;
|
||||||
|
|
||||||
|
pub use indexmap::indexmap;
|
||||||
|
|
||||||
|
/// Type alias for a [`indexmap::IndexMap`] with static [`str`] keys and
|
||||||
|
/// [`String`] values. The reason for [`indexmap`] is to preserve insertion
|
||||||
|
/// order for simpler testing.
|
||||||
|
pub type GeglData = indexmap::IndexMap<&'static str, String>;
|
||||||
|
|
||||||
|
/// The [`GeglOperation`] trait defines a set of common functions for the
|
||||||
|
/// individual operations to implement so they can be used with the GEGL CLI.
|
||||||
|
pub trait GeglOperation: Default + std::fmt::Debug {
|
||||||
|
/// Some GEGL operations will run infinitely unless you limit the buffer in
|
||||||
|
/// some way, so all operations must indicate whether or not they should be
|
||||||
|
/// followed by a crop operation.
|
||||||
|
fn append_crop_operation(&self) -> bool;
|
||||||
|
|
||||||
|
/// Creates the parameters for the graph to be used with the GEGL CLI.
|
||||||
|
fn graph(&self, include_default_values: bool) -> Vec<String> {
|
||||||
|
let mut graph = vec![self.name().to_string()];
|
||||||
|
let defaults = Self::default().values();
|
||||||
|
|
||||||
|
for (key, value) in self.values() {
|
||||||
|
if !include_default_values && defaults.get(key) == Some(&value) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
graph.push(format!("{key}={value}"));
|
||||||
|
}
|
||||||
|
|
||||||
|
graph
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the name of the operation, starting with `gegl:`.
|
||||||
|
fn name(&self) -> &'static str;
|
||||||
|
|
||||||
|
/// Returns the set of configured values for this operation.
|
||||||
|
fn values(&self) -> GeglData;
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
//! Macro-based [`crate::GeglOperation`] struct generator.
|
||||||
|
|
||||||
|
/// A macro to generate a struct that implements [`crate::GeglOperation`].
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! gegl_operation {
|
||||||
|
(
|
||||||
|
struct_name: $struct_name:ident,
|
||||||
|
gegl_name: $gegl_name:expr,
|
||||||
|
append_crop: $append_crop:expr,
|
||||||
|
values: ($($key:ident: $key_type:ty, $key_default:expr, $key_doc:expr),*,),
|
||||||
|
) => {
|
||||||
|
#[doc = concat!(" The `gegl:", $gegl_name, "` operation.")]
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct $struct_name {
|
||||||
|
$(
|
||||||
|
#[doc = concat!(" ", $key_doc)]
|
||||||
|
pub $key: $key_type,
|
||||||
|
)*
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for $struct_name {
|
||||||
|
fn default() -> $struct_name {
|
||||||
|
$struct_name {
|
||||||
|
$($key: $key_default,)*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl $crate::GeglOperation for $struct_name {
|
||||||
|
fn append_crop_operation(&self) -> bool {
|
||||||
|
$append_crop
|
||||||
|
}
|
||||||
|
|
||||||
|
fn name(&self) -> &'static str {
|
||||||
|
concat!("gegl:", $gegl_name)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn values(&self) -> $crate::GeglData {
|
||||||
|
$crate::indexmap! {
|
||||||
|
$(stringify!($key) => self.$key.to_string(),)*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
//! All supported GEGL operations.
|
||||||
|
|
||||||
|
mod generator;
|
||||||
|
|
||||||
|
pub use crate::gegl_operation;
|
||||||
|
|
||||||
|
gegl_operation!(
|
||||||
|
struct_name: Bloom,
|
||||||
|
gegl_name: "bloom",
|
||||||
|
append_crop: false,
|
||||||
|
values: (
|
||||||
|
limit_exposure: bool, false, "Don't over-expose highlights.",
|
||||||
|
radius: f64, 10.0, "Glow radius.",
|
||||||
|
softness: f64, 25.0, "Glow-area edge softness.",
|
||||||
|
strength: f64, 50.0, "Glow strength.",
|
||||||
|
threshold: f64, 50.0, "Glow-area brightness threshold.",
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
gegl_operation!(
|
||||||
|
struct_name: Cartoon,
|
||||||
|
gegl_name: "cartoon",
|
||||||
|
append_crop: true,
|
||||||
|
values: (
|
||||||
|
mask_radius: f64, 7.0, "The mask radius.",
|
||||||
|
pct_black: f64, 0.2, "The percentage of black.",
|
||||||
|
),
|
||||||
|
);
|
Loading…
Reference in New Issue