Files
lightcraft/crates/scenes/examples/contact_sheet.rs
T

30 lines
1.3 KiB
Rust

//! Render every demo scene into a contact sheet PNG (simple clamp + sRGB encode, no develop).
//! `cargo run --release -p lightcraft-scenes --example contact_sheet -- out.png`
use lightcraft_color::{REC2020, SRGB, transfer::encode_srgb8};
fn main() {
let out = std::env::args().nth(1).unwrap_or_else(|| "contact.png".into());
let lib = lightcraft_scenes::demo_library();
let (cw, ch, cols) = (360usize, 240usize, 6usize);
let rows = lib.len().div_ceil(cols);
let mut sheet = image::RgbImage::new((cw * cols) as u32, (ch * rows) as u32);
let m = REC2020.to_space(&SRGB);
for (i, s) in lib.iter().enumerate() {
let img = s.render_fit(cw.min(ch * 3 / 2).max(ch));
let (ox, oy) = ((i % cols) * cw + (cw - img.width.min(cw)) / 2, (i / cols) * ch + (ch - img.height.min(ch)) / 2);
for y in 0..img.height.min(ch) {
for x in 0..img.width.min(cw) {
let c = m.apply_f32(img.get(x, y));
// simple Reinhard-ish shoulder for preview
let t = |v: f32| {
let v = v.max(0.0);
encode_srgb8(v / (1.0 + v * 0.35))
};
sheet.put_pixel((ox + x) as u32, (oy + y) as u32, image::Rgb([t(c[0]), t(c[1]), t(c[2])]));
}
}
}
sheet.save(&out).unwrap();
println!("{out}");
}