mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-17 23:38:06 +08:00
* Delete dead code function * Add a Gradient Interpolation axis with Stepped, Linear, and Smooth paths through the stops * Keep the gradient interpolation attached when dragging stops in the picker * Give the gradient popover's dropdowns the same tooltips as their row labels * Order the gradient popover with Intrp. above Space * Hold gradient stops in place when the cyclic flag is toggled * Fix wrong Smooth gradient colors around stops sitting on the ramp boundaries * Consolidate gradient settings plumbing and fix bugs * Bundle whole-ramp gradient settings into GradientSettings across the editor plumbing * Name the Smooth gradient interpolation's spline type in its tooltip * Linearize the gamma hex stop colors recovered from imported Graphite SVGs * Code review * Aim the Smooth bake's seam subdivision at the copied boundary color * Add GradientEvaluator to build gradient sampling state once per loop instead of per sample * Correct the gradient evaluator's documented setup cost to O(n log n)
37 lines
1.2 KiB
Rust
37 lines
1.2 KiB
Rust
//! Not immediately shader compatible due to needing [`Gradient`] as a param, which needs [`Vec`]
|
|
|
|
use crate::adjust::Adjust;
|
|
use core_types::list::Item;
|
|
use core_types::{Color, Ctx};
|
|
use raster_types::{CPU, Raster};
|
|
use vector_types::Gradient;
|
|
|
|
// Aims for interoperable compatibility with:
|
|
// https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=%27grdm%27%20%3D%20Gradient%20Map
|
|
// https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=Gradient%20settings%20(Photoshop%206.0)
|
|
#[node_macro::node(category("Raster: Adjustment"))]
|
|
async fn gradient_map<T: Adjust<Color> + Send>(
|
|
_: impl Ctx,
|
|
#[implementations(
|
|
Raster<CPU>,
|
|
Color,
|
|
Gradient,
|
|
)]
|
|
image: Item<T>,
|
|
#[default(Color::BLACK, Color::WHITE)] gradient: Item<Gradient>,
|
|
reverse: Item<bool>,
|
|
) -> Item<T> {
|
|
let mut image = image;
|
|
let settings = vector_types::GradientSettings::from(&gradient);
|
|
let evaluator = gradient.into_element().evaluator(settings);
|
|
let reverse = reverse.into_element();
|
|
|
|
image.element_mut().adjust(|color| {
|
|
let intensity = color.luminance_rec_709();
|
|
let intensity = if reverse { 1. - intensity } else { intensity };
|
|
evaluator.evaluate(intensity as f64)
|
|
});
|
|
|
|
image
|
|
}
|