agent-image-diff 0.2.4

Structured image diff with JSON output for agent workflows
Documentation
//! Run with: cargo run --example generate_fixtures
//! Generates test fixture images in tests/fixtures/

use image::{Rgba, RgbaImage};
use std::path::Path;

fn main() {
    let dir = Path::new("tests/fixtures");
    std::fs::create_dir_all(dir).unwrap();

    // 100x100 solid blue image
    let mut baseline = RgbaImage::new(100, 100);
    for px in baseline.pixels_mut() {
        *px = Rgba([30, 60, 200, 255]);
    }
    baseline.save(dir.join("baseline.png")).unwrap();

    // Identical copy
    baseline.save(dir.join("identical.png")).unwrap();

    // Small change: 10x10 red square at (20, 30)
    let mut changed_small = baseline.clone();
    for y in 30..40 {
        for x in 20..30 {
            changed_small.put_pixel(x, y, Rgba([255, 0, 0, 255]));
        }
    }
    changed_small.save(dir.join("changed_small.png")).unwrap();

    // Large change: two separate regions
    let mut changed_large = baseline.clone();
    // Region 1: 20x20 green at (5, 5)
    for y in 5..25 {
        for x in 5..25 {
            changed_large.put_pixel(x, y, Rgba([0, 255, 0, 255]));
        }
    }
    // Region 2: 15x10 white at (60, 70)
    for y in 70..80 {
        for x in 60..75 {
            changed_large.put_pixel(x, y, Rgba([255, 255, 255, 255]));
        }
    }
    changed_large.save(dir.join("changed_large.png")).unwrap();

    // Different size: 120x80
    let mut different_size = RgbaImage::new(120, 80);
    for px in different_size.pixels_mut() {
        *px = Rgba([30, 60, 200, 255]);
    }
    different_size.save(dir.join("different_size.png")).unwrap();

    println!("Fixtures generated in tests/fixtures/");
}