mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
test(02-01): add linear-light correctness unit test to yazi-adapter
This commit is contained in:
parent
189b785cc9
commit
875d9593b6
2 changed files with 52 additions and 3 deletions
|
|
@ -35,7 +35,7 @@ Decimal phases appear between their surrounding integers in numeric order.
|
||||||
**Plans:** 1 plan
|
**Plans:** 1 plan
|
||||||
|
|
||||||
Plans:
|
Plans:
|
||||||
- [ ] 01-01-PLAN.md — Replace resize pipeline with linear-light fast_image_resize (dependency + code + verification)
|
- [x] 01-01-PLAN.md — Replace resize pipeline with linear-light fast_image_resize (dependency + code + verification)
|
||||||
|
|
||||||
### Phase 2: Verification
|
### Phase 2: Verification
|
||||||
**Goal**: The implementation is confirmed correct across all image types, protocols, and edge cases, with at least one automated correctness test
|
**Goal**: The implementation is confirmed correct across all image types, protocols, and edge cases, with at least one automated correctness test
|
||||||
|
|
@ -46,7 +46,10 @@ Plans:
|
||||||
2. RGBA PNG with transparency displays without color fringing on transparent edges in IIP/WezTerm
|
2. RGBA PNG with transparency displays without color fringing on transparent edges in IIP/WezTerm
|
||||||
3. EXIF-rotated JPEG (phone photo) previews with correct orientation and no quality regression
|
3. EXIF-rotated JPEG (phone photo) previews with correct orientation and no quality regression
|
||||||
4. `cargo test --workspace` passes with the new test included
|
4. `cargo test --workspace` passes with the new test included
|
||||||
**Plans**: TBD
|
**Plans:** 1 plan
|
||||||
|
|
||||||
|
Plans:
|
||||||
|
- [ ] 02-01-PLAN.md — Add linear-light correctness unit test and visual verification checklist
|
||||||
|
|
||||||
## Progress
|
## Progress
|
||||||
|
|
||||||
|
|
@ -56,4 +59,4 @@ Phases execute in numeric order: 1 -> 2
|
||||||
| Phase | Plans Complete | Status | Completed |
|
| Phase | Plans Complete | Status | Completed |
|
||||||
|-------|----------------|--------|-----------|
|
|-------|----------------|--------|-----------|
|
||||||
| 1. Implementation | 0/1 | Planned | - |
|
| 1. Implementation | 0/1 | Planned | - |
|
||||||
| 2. Verification | 0/TBD | Not started | - |
|
| 2. Verification | 0/1 | Planned | - |
|
||||||
|
|
|
||||||
|
|
@ -197,3 +197,49 @@ impl Image {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use image::RgbImage;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_linear_light_gray_midpoint() {
|
||||||
|
// 50/50 mix of black and white pixels in a 4x4 checkerboard pattern.
|
||||||
|
// Averaging in sRGB space gives (0+255)/2 = 128.
|
||||||
|
// Averaging in linear-light space gives (0.0+1.0)/2 = 0.5,
|
||||||
|
// which maps back to sRGB ~186 via the gamma curve.
|
||||||
|
let black = image::Rgb([0u8, 0, 0]);
|
||||||
|
let white = image::Rgb([255u8, 255, 255]);
|
||||||
|
let mut img = RgbImage::new(4, 4);
|
||||||
|
for y in 0..4 {
|
||||||
|
for x in 0..4 {
|
||||||
|
let pixel = if (x + y) % 2 == 0 { white } else { black };
|
||||||
|
img.put_pixel(x, y, pixel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let img = DynamicImage::from(img);
|
||||||
|
|
||||||
|
// Downscale to 1x1 using Lanczos3 (default filter)
|
||||||
|
let alg = ResizeAlg::Convolution(fast_image_resize::FilterType::Lanczos3);
|
||||||
|
let result = Image::fir_resize(img, 1, 1, alg).expect("fir_resize should succeed");
|
||||||
|
|
||||||
|
// Extract the single pixel
|
||||||
|
let rgb = result.to_rgb8();
|
||||||
|
let pixel = rgb.get_pixel(0, 0);
|
||||||
|
|
||||||
|
// Linear-light-correct downscaling of a 50/50 black+white checkerboard
|
||||||
|
// should yield ~186, because linear 0.5 maps to sRGB ~186.
|
||||||
|
//
|
||||||
|
// If we got ~128, the linearization pipeline is broken (sRGB-space averaging).
|
||||||
|
let tolerance = 5u8;
|
||||||
|
let expected = 186u8;
|
||||||
|
for (i, &channel) in pixel.0.iter().enumerate() {
|
||||||
|
assert!(
|
||||||
|
channel.abs_diff(expected) <= tolerance,
|
||||||
|
"channel {i}: expected ~{expected} (+/-{tolerance}), got {channel}. \
|
||||||
|
A value near 128 means sRGB linearization is not working."
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue