diff --git a/src/inpaint.rs b/src/inpaint.rs index a96c39b..4f65aca 100644 --- a/src/inpaint.rs +++ b/src/inpaint.rs @@ -2,14 +2,16 @@ use crate::{enums, error, image::Image, imagebuffer::ImageBuffer, stats}; +use itertools::iproduct; + #[cfg(rayon)] use rayon::prelude::*; #[derive(Debug, Clone)] -struct Point { - x: usize, - y: usize, - score: u32, +pub struct Point { + pub x: usize, + pub y: usize, + pub score: u32, } struct RgbVec { @@ -78,30 +80,24 @@ fn get_num_good_neighbors(mask: &ImageBuffer, x: i32, y: i32) -> u32 { } #[cfg(rayon)] -fn find_starting_point(mask: &ImageBuffer) -> Option { +pub fn find_starting_point(mask: &ImageBuffer) -> Option { let height_iter = (0..mask.height.clone()).into_par_iter(); - height_iter.for_each(|y| { - (0..mask.width).for_each(|x| { - if mask.get(x, y) > 0.0 { - Some(Point { x, y, score: 0 }); - } else { - } - }); - }); + for (y, x) in iproduct!(height_iter, (0..mask.width)) { + if mask.get(x, y) > 0.0 { + return Some(Point { x, y, score: 0 }); + } + } None } #[cfg(not(rayon))] -fn find_starting_point(mask: &ImageBuffer) -> Option { - (0..mask.height).for_each(|y| { - (0..mask.width).for_each(|x| { - if mask.get(x, y) > 0.0 { - Some(Point { x, y, score: 0 }); - } else { - } - }); - }); +pub fn find_starting_point(mask: &ImageBuffer) -> Option { + for (y, x) in iproduct!((0..mask.height), (0..mask.width)) { + if mask.get(x, y) > 0.0 { + return Some(Point { x, y, score: 0 }); + } + } None } diff --git a/src/util.rs b/src/util.rs index 98ed246..084177b 100644 --- a/src/util.rs +++ b/src/util.rs @@ -86,7 +86,7 @@ pub fn replace_image_extension(input_file: &str, append: &str) -> String { pub fn vec_to_str(v: &[f64]) -> String { let mut b = Builder::default(); - v.into_iter().for_each(|item| { + v.iter().for_each(|item| { b.append(format!("{},", item)); }); diff --git a/tests/inpaint.rs b/tests/inpaint.rs new file mode 100644 index 0000000..459991d --- /dev/null +++ b/tests/inpaint.rs @@ -0,0 +1,17 @@ +use sciimg::{imagebuffer::ImageBuffer, inpaint}; + +const INPAINT_TEST_IMAGE: &str = "tests/testdata/MSL_MAHLI_INPAINT_Sol2904_V1.png"; + +#[test] +fn test_find_starting_point() { + let inpaint_mask = ImageBuffer::from_file(&String::from(INPAINT_TEST_IMAGE)).unwrap(); + + let start_point = inpaint::find_starting_point(&inpaint_mask); + + assert!(start_point.is_some()); + + let start = start_point.unwrap(); + assert_eq!(1581, start.x); + assert_eq!(15, start.y); + assert_eq!(0, start.score); +} diff --git a/tests/testdata/MSL_MAHLI_INPAINT_Sol2904_V1.png b/tests/testdata/MSL_MAHLI_INPAINT_Sol2904_V1.png new file mode 100644 index 0000000..fb9ef94 Binary files /dev/null and b/tests/testdata/MSL_MAHLI_INPAINT_Sol2904_V1.png differ