png-diff.rs raw

//! Compare two PNGs with the cross-renderer tolerance; exits nonzero on
//! mismatch. Used by scripts that compare vello and software screenshots of
//! the same scene.

use guiduck_render_tinyskia::diff::{DiffTolerance, compare};
use tiny_skia::Pixmap;

fn main() {
    let args: Vec<String> = std::env::args().collect();
    let [_, a_path, b_path] = args.as_slice() else {
        eprintln!("usage: png-diff <a.png> <b.png>");
        std::process::exit(2);
    };
    let a = Pixmap::load_png(a_path).unwrap_or_else(|e| {
        eprintln!("failed to load {a_path}: {e}");
        std::process::exit(2);
    });
    let b = Pixmap::load_png(b_path).unwrap_or_else(|e| {
        eprintln!("failed to load {b_path}: {e}");
        std::process::exit(2);
    });
    match compare(&a, &b, DiffTolerance::CROSS_RENDERER) {
        None => {
            eprintln!(
                "size mismatch: {}x{} vs {}x{}",
                a.width(),
                a.height(),
                b.width(),
                b.height()
            );
            std::process::exit(1);
        }
        Some((stats, passes)) => {
            println!(
                "differing: {:.4}%  max channel diff: {}  mean: {:.4}",
                stats.differing_fraction * 100.0,
                stats.max_channel_diff,
                stats.mean_channel_diff
            );
            std::process::exit(if passes { 0 } else { 1 });
        }
    }
}