2026-07-09 02:59:53 +03:00
|
|
|
fn main() {
|
2026-07-13 14:37:22 +03:00
|
|
|
let base = "_images/_psd_stil_test/sultan_test/sultan";
|
2026-07-09 02:59:53 +03:00
|
|
|
|
|
|
|
|
let layers = hcie_psd::import_psd(std::path::Path::new(&format!("{}/sultan_0003_Layer 2.psd", base))).unwrap();
|
|
|
|
|
let comp_layers: Vec<hcie_composite::Layer> = layers.iter().map(|l| hcie_composite::Layer {
|
|
|
|
|
name: l.name.clone(), layer_type: l.layer_type.clone(), data: l.data.clone(),
|
|
|
|
|
pixels: l.pixels.clone(), width: l.width, height: l.height,
|
|
|
|
|
visible: l.visible, opacity: l.opacity, blend_mode: l.blend_mode.clone(),
|
|
|
|
|
locked: l.locked, dirty: l.dirty, id: l.id, parent_id: l.parent_id,
|
|
|
|
|
styles: l.styles.clone(), clipping_mask: l.clipping_mask, collapsed: l.collapsed,
|
|
|
|
|
adjustment: l.adjustment.clone(), mask_pixels: l.mask_pixels.clone(),
|
|
|
|
|
mask_bounds: l.mask_bounds, mask_default_color: l.mask_default_color,
|
|
|
|
|
curve_points: l.curve_points.clone(), fill_opacity: l.fill_opacity,
|
|
|
|
|
effects: l.effects.clone(),
|
|
|
|
|
effects_dirty: std::sync::atomic::AtomicBool::new(false),
|
|
|
|
|
effects_cache: std::sync::Mutex::new(None),
|
|
|
|
|
adjustment_raw: None,
|
|
|
|
|
is_section_divider: false,
|
|
|
|
|
image_resources_raw: None,
|
|
|
|
|
}).collect();
|
|
|
|
|
let w = comp_layers[0].width;
|
|
|
|
|
let h = comp_layers[0].height;
|
|
|
|
|
let rendered = hcie_composite::composite_layers(&comp_layers, w, h);
|
|
|
|
|
let ref_img = image::open(&format!("{}/Layer 2.png", base)).unwrap().to_rgba8();
|
|
|
|
|
|
|
|
|
|
// Scan the RIGHT edge of the shape to see highlight
|
|
|
|
|
println!("=== Right edge scan at y=620 ===");
|
|
|
|
|
for x in 470..=495 {
|
|
|
|
|
let i = (620 * w + x) as usize * 4;
|
|
|
|
|
let ri = (620 * ref_img.width() + x) as usize * 4;
|
|
|
|
|
let our = &rendered[i..i+4];
|
|
|
|
|
let refv = &ref_img.as_raw()[ri..ri+4];
|
|
|
|
|
let alpha_layer = layers[0].pixels[i+3];
|
|
|
|
|
let diff: f64 = (0..4).map(|c| (our[c] as f64 - refv[c] as f64).abs()).sum();
|
|
|
|
|
println!(" x={}: alpha_orig={} ours=({},{},{},{}) ref=({},{},{},{}) diff={:.0}",
|
|
|
|
|
x, alpha_layer, our[0], our[1], our[2], our[3], refv[0], refv[1], refv[2], refv[3], diff);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scan the LEFT edge of the shape (light-facing side)
|
|
|
|
|
println!("\n=== Left edge scan at y=620 ===");
|
|
|
|
|
for x in 145..=195 {
|
|
|
|
|
let i = (620 * w + x) as usize * 4;
|
|
|
|
|
let ri = (620 * ref_img.width() + x) as usize * 4;
|
|
|
|
|
let our = &rendered[i..i+4];
|
|
|
|
|
let refv = &ref_img.as_raw()[ri..ri+4];
|
|
|
|
|
let alpha_layer = layers[0].pixels[i+3];
|
|
|
|
|
let diff: f64 = (0..4).map(|c| (our[c] as f64 - refv[c] as f64).abs()).sum();
|
|
|
|
|
if alpha_layer > 0 {
|
|
|
|
|
println!(" x={}: alpha_orig={} ours=({},{},{},{}) ref=({},{},{},{}) diff={:.0}",
|
|
|
|
|
x, alpha_layer, our[0], our[1], our[2], our[3], refv[0], refv[1], refv[2], refv[3], diff);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scan at y=200 (upper area)
|
|
|
|
|
println!("\n=== Upper area scan at y=200 ===");
|
|
|
|
|
for x in [100, 150, 200, 250, 300, 350, 400] {
|
|
|
|
|
let i = (200 * w + x) as usize * 4;
|
|
|
|
|
let ri = (200 * ref_img.width() + x) as usize * 4;
|
|
|
|
|
let our = &rendered[i..i+4];
|
|
|
|
|
let refv = &ref_img.as_raw()[ri..ri+4];
|
|
|
|
|
let alpha_layer = layers[0].pixels[i+3];
|
|
|
|
|
let diff: f64 = (0..4).map(|c| (our[c] as f64 - refv[c] as f64).abs()).sum();
|
|
|
|
|
if diff > 5.0 || alpha_layer > 0 {
|
|
|
|
|
println!(" ({},{}) alpha_orig={} ours=({},{},{},{}) ref=({},{},{},{}) diff={:.0}",
|
|
|
|
|
x, 200, alpha_layer, our[0], our[1], our[2], our[3], refv[0], refv[1], refv[2], refv[3], diff);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Scan the FLAT interior to see what the lighting looks like in the middle
|
|
|
|
|
println!("\n=== Flat interior scan at y=620, x=250-350 ===");
|
|
|
|
|
for x in 250..=350 {
|
|
|
|
|
let i = (620 * w + x) as usize * 4;
|
|
|
|
|
let ri = (620 * ref_img.width() + x) as usize * 4;
|
|
|
|
|
let our = &rendered[i..i+4];
|
|
|
|
|
let refv = &ref_img.as_raw()[ri..ri+4];
|
|
|
|
|
if x % 10 == 0 {
|
|
|
|
|
println!(" x={}: ours=({},{},{},{}) ref=({},{},{},{})",
|
|
|
|
|
x, our[0], our[1], our[2], our[3], refv[0], refv[1], refv[2], refv[3]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check what blend modes are used for Bevel/Emboss
|
|
|
|
|
println!("\n=== Effect details ===");
|
|
|
|
|
for e in &layers[0].effects {
|
|
|
|
|
println!(" {:?}", e);
|
|
|
|
|
}
|
|
|
|
|
}
|