use valo_dl::{ColorFilter, Image, Paint, Shader};
use valo_geometry::Rect;
use crate::images::IMAGE_FORMAT;
use super::filter_passes::FilterPasses;
use super::Planner;
impl Planner<'_> {
pub(super) fn bake_pattern_colour_filter(&mut self, paint: &Paint) -> Option<Paint> {
let filter = paint.color_filter?;
let Some(Shader::Image {
image,
sampling,
local,
}) = &paint.shader
else {
return None;
};
let baked = Shader::Image {
image: self.bake_filtered_image(image, filter),
sampling: *sampling,
local: *local,
};
Some(Paint {
shader: Some(baked),
color_filter: None,
..paint.clone()
})
}
fn bake_filtered_image(&mut self, source: &Image, filter: ColorFilter) -> Image {
let (filtered, created) = self.tools.emit.filtered_image(source, filter);
if created {
self.filter_passes()
.push_recolour_into(source, filter, &filtered);
}
filtered
}
}
impl FilterPasses<'_, '_> {
fn push_recolour_into(&mut self, source: &Image, filter: ColorFilter, copy: &Image) {
let whole = Rect::new(0.0, 0.0, source.width(), source.height());
let shading = self.emit.bake_shading(source, filter);
self.push_pass(
copy.view().clone(),
IMAGE_FORMAT,
&whole,
source.size(),
shading,
);
}
}