use image::{Rgba, RgbaImage};
use std::path::Path;
#[test]
#[ignore]
fn generate_test_images() {
let inputs_dir = Path::new("tests/inputs");
std::fs::create_dir_all(inputs_dir).unwrap();
generate_square();
generate_circle_gradient();
generate_rectangles();
generate_square_glow();
generate_circle_gradients();
generate_square_gradient();
println!("Test inputs generated in tests/inputs/");
}
fn generate_square() {
let mut img = RgbaImage::new(100, 100);
for pixel in img.pixels_mut() {
*pixel = Rgba([0, 0, 0, 255]);
}
for y in 25..75 {
for x in 25..75 {
img.put_pixel(x, y, Rgba([255, 0, 0, 255]));
}
}
img.save("tests/inputs/square.png").unwrap();
}
fn generate_circle_gradient() {
let mut img = RgbaImage::new(100, 100);
for y in 0..100 {
for x in 0..100 {
let distance = ((x as f32 - 50.0).powi(2) + (y as f32 - 50.0).powi(2)).sqrt();
let alpha = (1.0 - (distance / 50.0)).max(0.0);
let r = 255;
let g = ((1.0 - alpha) * 255.0) as u8;
let b = ((1.0 - alpha) * 255.0) as u8;
img.put_pixel(x, y, Rgba([r, g, b, 255]));
}
}
img.save("tests/inputs/circle-gradient.png").unwrap();
}
fn generate_rectangles() {
let mut img = RgbaImage::new(150, 100);
for pixel in img.pixels_mut() {
*pixel = Rgba([0, 0, 255, 255]);
}
for y in 20..40 {
for x in 20..50 {
img.put_pixel(x, y, Rgba([255, 0, 0, 255]));
}
}
for y in 20..40 {
for x in 60..90 {
img.put_pixel(x, y, Rgba([0, 255, 0, 255]));
}
}
for y in 20..40 {
for x in 100..130 {
img.put_pixel(x, y, Rgba([255, 255, 0, 255]));
}
}
for y in 50..70 {
for x in 20..50 {
img.put_pixel(x, y, Rgba([191, 0, 64, 255]));
}
for x in 60..90 {
img.put_pixel(x, y, Rgba([0, 191, 64, 255]));
}
for x in 100..130 {
img.put_pixel(x, y, Rgba([191, 191, 64, 255]));
}
}
img.save("tests/inputs/rectangles.png").unwrap();
}
fn generate_square_glow() {
let width = 200;
let height = 200;
let mut img = RgbaImage::new(width, height);
for pixel in img.pixels_mut() {
*pixel = Rgba([0, 0, 0, 255]);
}
let glow_center_x = 100.0;
let glow_center_y = 100.0;
let glow_radius = 50.0;
for y in 0..height {
for x in 0..width {
let dx = x as f32 - glow_center_x;
let dy = y as f32 - glow_center_y;
let dist = (dx * dx + dy * dy).sqrt();
if dist < glow_radius {
let intensity = 1.0 - (dist / glow_radius);
let alpha = (intensity * 0.5 * 255.0) as u8;
let existing = img.get_pixel(x, y);
let purple_r = 128;
let purple_g = 0;
let purple_b = 128;
let alpha_f = alpha as f32 / 255.0;
let inv_alpha = 1.0 - alpha_f;
let new_r = (purple_r as f32 * alpha_f + existing[0] as f32 * inv_alpha) as u8;
let new_g = (purple_g as f32 * alpha_f + existing[1] as f32 * inv_alpha) as u8;
let new_b = (purple_b as f32 * alpha_f + existing[2] as f32 * inv_alpha) as u8;
img.put_pixel(x, y, Rgba([new_r, new_g, new_b, 255]));
}
}
}
for y in 75..125 {
for x in 75..125 {
img.put_pixel(x, y, Rgba([255, 0, 0, 255]));
}
}
img.save("tests/inputs/square-glow.png").unwrap();
}
fn generate_circle_gradients() {
let width = 300;
let height = 100;
let mut img = RgbaImage::new(width, height);
for pixel in img.pixels_mut() {
*pixel = Rgba([255, 255, 255, 255]);
}
let red_center_x = 50.0;
let center_y = 50.0;
let radius = 40.0;
let green_center_x = 150.0;
let blue_center_x = 250.0;
for y in 0..height {
for x in 0..width {
let y_f = y as f32;
let x_f = x as f32;
let dist_red = ((x_f - red_center_x).powi(2) + (y_f - center_y).powi(2)).sqrt();
let dist_green = ((x_f - green_center_x).powi(2) + (y_f - center_y).powi(2)).sqrt();
let dist_blue = ((x_f - blue_center_x).powi(2) + (y_f - center_y).powi(2)).sqrt();
let mut r = 255u8;
let mut g = 255u8;
let mut b = 255u8;
if dist_red < radius {
let intensity = 1.0 - (dist_red / radius);
let alpha = intensity;
r = (255.0 * alpha + 255.0 * (1.0 - alpha)) as u8;
g = (0.0 * alpha + 255.0 * (1.0 - alpha)) as u8;
b = (0.0 * alpha + 255.0 * (1.0 - alpha)) as u8;
}
if dist_green < radius {
let intensity = 1.0 - (dist_green / radius);
let alpha = intensity;
let new_r = (0.0 * alpha + 255.0 * (1.0 - alpha)) as u8;
let new_g = (255.0 * alpha + 255.0 * (1.0 - alpha)) as u8;
let new_b = (0.0 * alpha + 255.0 * (1.0 - alpha)) as u8;
if new_r < r || new_b < b {
r = new_r;
g = new_g;
b = new_b;
}
}
if dist_blue < radius {
let intensity = 1.0 - (dist_blue / radius);
let alpha = intensity;
let new_r = (0.0 * alpha + 255.0 * (1.0 - alpha)) as u8;
let new_g = (0.0 * alpha + 255.0 * (1.0 - alpha)) as u8;
let new_b = (255.0 * alpha + 255.0 * (1.0 - alpha)) as u8;
if new_r < r || new_g < g {
r = new_r;
g = new_g;
b = new_b;
}
}
img.put_pixel(x, y, Rgba([r, g, b, 255]));
}
}
img.save("tests/inputs/circle-gradients.png").unwrap();
}
fn generate_square_gradient() {
let mut img = RgbaImage::new(200, 200);
let bg_color = Rgba([20, 25, 30, 255]);
for pixel in img.pixels_mut() {
*pixel = bg_color;
}
let rect_left = 50;
let rect_right = 150;
let rect_top = 50;
let rect_bottom = 150;
let rect_width = rect_right - rect_left;
for y in rect_top..rect_bottom {
for x in rect_left..rect_right {
let gradient_pos = (x - rect_left) as f32 / rect_width as f32;
let cyan = [0.0, 255.0, 255.0];
let magenta = [255.0, 0.0, 255.0];
let fg_r = cyan[0] * (1.0 - gradient_pos) + magenta[0] * gradient_pos;
let fg_g = cyan[1] * (1.0 - gradient_pos) + magenta[1] * gradient_pos;
let fg_b = cyan[2] * (1.0 - gradient_pos) + magenta[2] * gradient_pos;
let opacity = 0.5;
let final_r = (fg_r * opacity + bg_color[0] as f32 * (1.0 - opacity)) as u8;
let final_g = (fg_g * opacity + bg_color[1] as f32 * (1.0 - opacity)) as u8;
let final_b = (fg_b * opacity + bg_color[2] as f32 * (1.0 - opacity)) as u8;
img.put_pixel(x, y, Rgba([final_r, final_g, final_b, 255]));
}
}
img.save("tests/inputs/square-gradient.png").unwrap();
}