add new_colored_luminance_map method
This commit is contained in:
parent
9cac8d2500
commit
d6e05c7e3a
|
@ -76,6 +76,41 @@ impl BlendMap {
|
||||||
blend_map
|
blend_map
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates and returns a new [`BlendMap`] which can be used to blend source colors together
|
||||||
|
/// with the destination using a colorization effect based on a function providing a custom
|
||||||
|
/// calculation combining the source and destination color luminance values to return a weight
|
||||||
|
/// into the gradient range given.
|
||||||
|
pub fn new_colored_luminance_map(
|
||||||
|
gradient_start: u8,
|
||||||
|
gradient_end: u8,
|
||||||
|
palette: &Palette,
|
||||||
|
f: impl Fn(f32, f32) -> f32
|
||||||
|
) -> BlendMap {
|
||||||
|
let (gradient_start, gradient_end) = if gradient_start > gradient_end {
|
||||||
|
(gradient_end, gradient_start)
|
||||||
|
} else {
|
||||||
|
(gradient_start, gradient_end)
|
||||||
|
};
|
||||||
|
let gradient_size = gradient_end - gradient_start + 1;
|
||||||
|
|
||||||
|
let mut blend_map = BlendMap::new(0, 255);
|
||||||
|
for source_color in 0..=255 {
|
||||||
|
let (r, g, b) = from_rgb32(palette[source_color]);
|
||||||
|
let source_luminance = luminance(r, g, b);
|
||||||
|
for dest_color in 0..=255 {
|
||||||
|
let (r, g, b) = from_rgb32(palette[dest_color]);
|
||||||
|
let destination_luminance = luminance(r, g, b);
|
||||||
|
let weight = (f(source_luminance, destination_luminance) * 255.0) as u8;
|
||||||
|
blend_map.set_mapping(
|
||||||
|
source_color,
|
||||||
|
dest_color,
|
||||||
|
(gradient_size - 1).wrapping_sub(weight / (256 / gradient_size as u32) as u8) + gradient_start
|
||||||
|
).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
blend_map
|
||||||
|
}
|
||||||
|
|
||||||
/// Creates and returns a new [`BlendMap`] which can be used to blend all 256 colors together
|
/// Creates and returns a new [`BlendMap`] which can be used to blend all 256 colors together
|
||||||
/// with every other color, weighting the blending based on the ratios given where 0.0 will
|
/// with every other color, weighting the blending based on the ratios given where 0.0 will
|
||||||
/// result in that component being totally transparent and 1.0, totally opaque.
|
/// result in that component being totally transparent and 1.0, totally opaque.
|
||||||
|
|
Loading…
Reference in a new issue