use std::path::Path; fn main() { let orig_path = Path::new("/mnt/extra/00_PROJECTS/hcie-rust-_images/_test_images/example3/Example3-mini.psd"); let saved_path = Path::new("/mnt/extra/00_PROJECTS/hcie-rust-v4/_tmp/Example3-mini-roundtrip.psd"); let orig_layers = hcie_psd::import_psd(orig_path).unwrap(); let saved_layers = hcie_psd::import_psd(saved_path).unwrap(); let orig_db = orig_layers.iter().find(|l| l.name == "D&B with Retouch4me").unwrap(); let saved_db = saved_layers.iter().find(|l| l.name == "D&B with Retouch4me").unwrap(); println!("=== Original D&B layer ==="); println!(" Width: {}, Height: {}", orig_db.width, orig_db.height); println!(" Pixel buffer len: {}", orig_db.pixels.len()); println!(" Mask bounds: {:?}", orig_db.mask_bounds); println!(" Mask default color: {}", orig_db.mask_default_color); if let Some(ref mask) = orig_db.mask_pixels { println!(" Mask pixels len: {}", mask.len()); let mut zero_count = 0; let mut non_zero_count = 0; for &v in mask { if v == 0 { zero_count += 1; } else { non_zero_count += 1; } } println!(" Mask pixels (0 vs non-zero): {} vs {}", zero_count, non_zero_count); } else { println!(" No mask pixels"); } let mut o_alpha_counts = [0usize; 256]; for chunk in orig_db.pixels.chunks_exact(4) { o_alpha_counts[chunk[3] as usize] += 1; } println!(" Alpha distribution (0, 1..254, 255): {}, {}, {}", o_alpha_counts[0], o_alpha_counts[1..255].iter().sum::(), o_alpha_counts[255] ); println!("=== Saved D&B layer ==="); println!(" Width: {}, Height: {}", saved_db.width, saved_db.height); println!(" Pixel buffer len: {}", saved_db.pixels.len()); println!(" Mask bounds: {:?}", saved_db.mask_bounds); println!(" Mask default color: {}", saved_db.mask_default_color); if let Some(ref mask) = saved_db.mask_pixels { println!(" Mask pixels len: {}", mask.len()); let mut zero_count = 0; let mut non_zero_count = 0; for &v in mask { if v == 0 { zero_count += 1; } else { non_zero_count += 1; } } println!(" Mask pixels (0 vs non-zero): {} vs {}", zero_count, non_zero_count); } else { println!(" No mask pixels"); } let mut s_alpha_counts = [0usize; 256]; for chunk in saved_db.pixels.chunks_exact(4) { s_alpha_counts[chunk[3] as usize] += 1; } println!(" Alpha distribution (0, 1..254, 255): {}, {}, {}", s_alpha_counts[0], s_alpha_counts[1..255].iter().sum::(), s_alpha_counts[255] ); // Dump raw mask data bytes println!("\n=== Raw Mask Section Comparison ==="); dump_raw_mask_bytes("Original", orig_path); dump_raw_mask_bytes("Saved", saved_path); } fn dump_raw_mask_bytes(label: &str, path: &Path) { let bytes = std::fs::read(path).unwrap(); let mut r = hcie_psd::psd_reader::PsdReader::new(&bytes); r.read(26).unwrap(); let color_mode_len = r.read_u32().unwrap() as usize; r.read(color_mode_len).unwrap(); let img_res_len = r.read_u32().unwrap() as usize; r.read(img_res_len).unwrap(); let _lmi_len = r.read_u32().unwrap(); let _li_len = r.read_u32().unwrap(); let layer_count_raw = r.read_i16().unwrap(); let layer_count = layer_count_raw.abs() as usize; let mut layers_meta = Vec::new(); for _ in 0..layer_count { let _top = r.read_i32().unwrap(); let _left = r.read_i32().unwrap(); let _bottom = r.read_i32().unwrap(); let _right = r.read_i32().unwrap(); let channel_count = r.read_u16().unwrap() as usize; for _ in 0..channel_count { let _id = r.read_i16().unwrap(); let _len = r.read_u32().unwrap(); } r.read(4).unwrap(); // sig r.read(4).unwrap(); // blend r.read_u8().unwrap(); // opacity r.read_u8().unwrap(); // clipping r.read_u8().unwrap(); // flags r.read(1).unwrap(); // filler let extra_data_len = r.read_u32().unwrap() as usize; let start = r.pos(); let mask_len = r.read_u32().unwrap() as usize; let mask_bytes = r.read(mask_len).unwrap().to_vec(); r.read(extra_data_len - 4 - mask_len).unwrap(); // skip rest of extra data // read name to find layer let mut sub_r = hcie_psd::psd_reader::PsdReader::new(&bytes[start + 4 + mask_len..]); let _blending_ranges_len = sub_r.read_u32().unwrap() as usize; sub_r.read(_blending_ranges_len).unwrap(); let name_len = sub_r.read_u8().unwrap() as usize; let name_bytes = sub_r.read(name_len).unwrap(); let name = String::from_utf8_lossy(name_bytes).to_string(); layers_meta.push((name, mask_len, mask_bytes)); } if let Some((name, mask_len, mask_bytes)) = layers_meta.iter().find(|(name, _, _)| name == "D&B with Retouch4me") { println!("{}: Layer '{}' mask_len={} bytes={:?}", label, name, mask_len, mask_bytes); } else { println!("{}: D&B with Retouch4me layer not found", label); } }