From a41953b92855d4c9a10d4cac6a70929c93d7a19b Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 4 Jan 2023 20:24:00 -0600 Subject: [PATCH] untested luma8 --- src/buffered_image_luminance_source.rs | 2 +- src/luma_luma_source.rs | 30 +++++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/buffered_image_luminance_source.rs b/src/buffered_image_luminance_source.rs index 731f971..49680d8 100644 --- a/src/buffered_image_luminance_source.rs +++ b/src/buffered_image_luminance_source.rs @@ -204,7 +204,7 @@ impl LuminanceSource for BufferedImageLuminanceSource { .collect::>(); // get all the rows we want to look at let data = unmanaged - .chunks(self.image.width() as usize) + .chunks_exact(self.image.width() as usize) .into_iter() // Get rows .flat_map(|f| { f.iter() diff --git a/src/luma_luma_source.rs b/src/luma_luma_source.rs index 1e38869..6347dbc 100644 --- a/src/luma_luma_source.rs +++ b/src/luma_luma_source.rs @@ -1,19 +1,27 @@ use crate::LuminanceSource; +/// A simple luma8 source for bytes, supports cropping but not rotation pub struct Luma8LuminanceSource { + /// image dimension in form (x,y) dimensions: (u32, u32), + /// image origin in the form (x,y) origin: (u32, u32), + /// raw data for luma 8 data: Vec, + /// flag indicating if the underlying data needs to be inverted for use inverted: bool, + /// original dimensions of the data, used to manage crop original_dimension: (u32, u32), } impl LuminanceSource for Luma8LuminanceSource { fn getRow(&self, y: usize) -> Vec { self.data - .chunks_exact(y * self.dimensions.0 as usize) - .skip(y) + .chunks_exact(self.original_dimension.0 as usize) + .skip(y + self.origin.1 as usize) .take(1) .flatten() + .skip(self.origin.0 as usize) + .take(self.dimensions.0 as usize) .map(|byte| Self::invert_if_should(*byte, self.inverted)) .collect() } @@ -21,8 +29,20 @@ impl LuminanceSource for Luma8LuminanceSource { fn getMatrix(&self) -> Vec { self.data .iter() - .map(|byte| Self::invert_if_should(*byte, self.inverted)) - .collect() + .skip((self.original_dimension.0 * self.origin.1) as usize) + .take((self.dimensions.1 * self.original_dimension.0) as usize) + .collect::>() + .chunks_exact(self.original_dimension.0 as usize) + .into_iter() + .flat_map(|f| { + f.iter() + .skip((self.origin.0) as usize) + .take(self.getWidth()) + .copied() + }) // flatten this all out + .copied() // copy it over so that it's u8 + .map(|byte| Self::invert_if_should(byte, self.inverted)) + .collect() // collect into a vec } fn getWidth(&self) -> usize { @@ -38,7 +58,7 @@ impl LuminanceSource for Luma8LuminanceSource { } fn isCropSupported(&self) -> bool { - false + true } fn crop(