62 lines
3.1 KiB
Rust
62 lines
3.1 KiB
Rust
|
|
fn main() {
|
||
|
|
let from_hcie = std::fs::read("_images/_psd_stil_test/inner_shadow/black_triangle_green_inner_shadow_normal_blend_from_hcie.psd").unwrap();
|
||
|
|
let orig = std::fs::read("_images/_psd_stil_test/inner_shadow/black_triangle_green_inner_shadow_normal_blend.psd").unwrap();
|
||
|
|
|
||
|
|
// Extract merged image pixels from both
|
||
|
|
let orig_psd = hcie_psd::Psd::from_bytes(&orig).unwrap();
|
||
|
|
let from_psd = hcie_psd::Psd::from_bytes(&from_hcie).unwrap();
|
||
|
|
|
||
|
|
let orig_rgba = orig_psd.rgba();
|
||
|
|
let from_rgba = from_psd.rgba();
|
||
|
|
|
||
|
|
println!("ORIG merged RGBA: {} bytes, non-zero={}", orig_rgba.len(), orig_rgba.iter().filter(|&&b| b > 0).count());
|
||
|
|
println!("FROM merged RGBA: {} bytes, non-zero={}", from_rgba.len(), from_rgba.iter().filter(|&&b| b > 0).count());
|
||
|
|
|
||
|
|
// Compare merged pixels
|
||
|
|
let mut diff_pixels = 0;
|
||
|
|
let mut max_diff: u8 = 0;
|
||
|
|
for i in 0..orig_rgba.len().min(from_rgba.len()) {
|
||
|
|
let d = (orig_rgba[i] as i16 - from_rgba[i] as i16).unsigned_abs() as u8;
|
||
|
|
if d > 0 {
|
||
|
|
diff_pixels += 1;
|
||
|
|
max_diff = max_diff.max(d);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
println!("Merged pixel diff: {} bytes, max={}", diff_pixels, max_diff);
|
||
|
|
|
||
|
|
// Now check individual layer pixels
|
||
|
|
println!("\n=== Layer pixel analysis ===");
|
||
|
|
let orig_layers = hcie_psd::import_psd(std::path::Path::new("_images/_psd_stil_test/inner_shadow/black_triangle_green_inner_shadow_normal_blend.psd")).unwrap();
|
||
|
|
let from_layers = hcie_psd::import_psd(std::path::Path::new("_images/_psd_stil_test/inner_shadow/black_triangle_green_inner_shadow_normal_blend_from_hcie.psd")).unwrap();
|
||
|
|
|
||
|
|
for (i, (ol, fl)) in orig_layers.iter().zip(from_layers.iter()).enumerate() {
|
||
|
|
println!("Layer {}: '{}' ORIG={}x{} FROM={}x{}", i, ol.name, ol.width, ol.height, fl.width, fl.height);
|
||
|
|
// Count non-zero pixels per channel
|
||
|
|
let mut orig_ch = [0u32; 4]; // R, G, B, A non-zero counts
|
||
|
|
let mut from_ch = [0u32; 4];
|
||
|
|
for chunk in ol.pixels.chunks_exact(4) {
|
||
|
|
for c in 0..4 { if chunk[c] > 0 { orig_ch[c] += 1; } }
|
||
|
|
}
|
||
|
|
for chunk in fl.pixels.chunks_exact(4) {
|
||
|
|
for c in 0..4 { if chunk[c] > 0 { from_ch[c] += 1; } }
|
||
|
|
}
|
||
|
|
println!(" ORIG non-zero: R={} G={} B={} A={}", orig_ch[0], orig_ch[1], orig_ch[2], orig_ch[3]);
|
||
|
|
println!(" FROM non-zero: R={} G={} B={} A={}", from_ch[0], from_ch[1], from_ch[2], from_ch[3]);
|
||
|
|
|
||
|
|
// Show unique (R,G,B,A) tuples for first 20 different pixels
|
||
|
|
let mut diff_count = 0;
|
||
|
|
for (j, (op, fp)) in ol.pixels.chunks_exact(4).zip(fl.pixels.chunks_exact(4)).enumerate() {
|
||
|
|
if op != fp {
|
||
|
|
if diff_count < 5 {
|
||
|
|
let x = j % ol.width as usize;
|
||
|
|
let y = j / ol.width as usize;
|
||
|
|
println!(" pixel[{},{}]: ORIG=({},{},{},{}) FROM=({},{},{},{})",
|
||
|
|
x, y, op[0], op[1], op[2], op[3], fp[0], fp[1], fp[2], fp[3]);
|
||
|
|
}
|
||
|
|
diff_count += 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
println!(" Total different pixels: {} / {}", diff_count, ol.pixels.len() / 4);
|
||
|
|
}
|
||
|
|
}
|