diff --git a/Cargo.toml b/Cargo.toml index f9f97ee..0b612a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rxing" -version = "0.3.2" +version = "0.4.1" description="A rust port of the zxing barcode library." license="Apache-2.0" repository="https://github.com/rxing-core/rxing" @@ -25,7 +25,7 @@ image = {version = "0.24", optional = true} imageproc = {version = "0.23", optional = true} unicode-segmentation = "1.10" codepage-437 = "0.1.0" -rxing-one-d-proc-derive = {version = "0.3", path ="./crates/one-d-proc-derive"} +rxing-one-d-proc-derive = {version = "0.4", path ="./crates/one-d-proc-derive"} num = "0.4.0" svg = {version = "0.13", optional = true} resvg = {version = "0.28.0", optional = true, default-features=false} diff --git a/README.md b/README.md index b6b02e6..1b993f1 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,13 @@ fn main() { ``` ## Latest Release Notes +* *v0.4.0* -> Rewrite of the API to implement generics. This largely eliminates dynamic dispatch from the library. + + This release has many under-the-hood changes: better Point class, better Error handling, improved API + ergonomics with dynamics. For an understanding of how the new API works check out the `helper` functions. + This release was made possible with PRs from Asha20 and SteveCookTU. A big thanks to them. This release does + not have the improved QRCode support from the ZXing-CPP library, as that port is still in progress. + * *v0.3.1* -> Support for closures in NEEDS_RESULT_CALLBACK. Numerous code cleanups were performed between *v0.3.0* and *v.0.3.1* rxing has moved to https://github.com/rxing-core/rxing. * *v0.2.21* -> Adds partial support for detecting and decoding rotated MaxiCode symbols. Adds support for basic serialization of many public facing datatypes using serde (gated behind `serde` feature). diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index c3a098f..45e3d1f 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rxing-cli" -version = "0.1.12" +version = "0.1.13" edition = "2021" description = "A command line interface for rxing supporting encoding and decoding of multiple barcode formats" license="Apache-2.0" @@ -11,4 +11,4 @@ keywords = ["barcode", "2d_barcode", "1d_barcode", "barcode_reader", "barcode_wr [dependencies] clap = { version = "4.1.1", features = ["derive"] } -rxing = {path = "../../", version = "~0.3.2", features = ["image", "svg_read", "svg_write"] } +rxing = {path = "../../", version = "~0.4.0", features = ["image", "svg_read", "svg_write"] } diff --git a/crates/one-d-proc-derive/Cargo.toml b/crates/one-d-proc-derive/Cargo.toml index ae28a96..f55fa5a 100644 --- a/crates/one-d-proc-derive/Cargo.toml +++ b/crates/one-d-proc-derive/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "rxing-one-d-proc-derive" repository = "https://github.com/rxing-core/rxing/tree/main/crates/one-d-proc-derive" -version = "0.3.1" +version = "0.4.0" edition = "2021" description = "proc macros to simplify the development of one-d barcode symbologies in rxing (https://github.com/rxing-core/rxing)" license = "Apache-2.0" diff --git a/src/luma_luma_source.rs b/src/luma_luma_source.rs index 0526a92..12e4ec4 100644 --- a/src/luma_luma_source.rs +++ b/src/luma_luma_source.rs @@ -98,20 +98,22 @@ impl LuminanceSource for Luma8LuminanceSource { impl Luma8LuminanceSource { fn reverseColumns(&mut self) { - for i in 0..self.get_width() { - let mut j = 0; - let mut k = self.get_width() - 1; - while j < k { - let offset_a = (self.get_width() * i) + j; - let offset_b = (self.get_width() * i) + k; + for col in 0..(self.get_width()) { + let mut a = 0; + let mut b = self.get_height() - 1; + while a < b { + let offset_a = a * self.get_width() + col; + let offset_b = b * self.get_width() + col; self.data.swap(offset_a, offset_b); - j += 1; - k -= 1; + + a += 1; + b -= 1; } } + // print_matrix(&self.data, self.get_width(), self.get_height()); } - fn transpose(&mut self) { + fn transpose_square(&mut self) { for i in 0..self.get_height() { for j in i..self.get_width() { let offset_a = (self.get_width() * i) + j; @@ -120,6 +122,30 @@ impl Luma8LuminanceSource { } } } + + fn transpose_rect(&mut self) { + let mut new_data = vec![0; self.data.len()]; + let new_dim = (self.dimensions.1, self.dimensions.0); + for i in 0..self.get_height() { + for j in 0..self.get_width() { + let offset_a = (self.get_width() * i) + j; + let offset_b = (self.get_height() * j) + i; + new_data[offset_b] = self.data[offset_a]; + } + } + self.data = new_data; + self.dimensions = new_dim; + self.original_dimension = (self.original_dimension.1, self.original_dimension.0); + } + + fn transpose(&mut self) { + if self.get_width() == self.get_height() { + self.transpose_square() + } else { + self.transpose_rect() + } + // print_matrix(&self.data, self.get_width(), self.get_height()); + } } impl Luma8LuminanceSource { @@ -142,3 +168,57 @@ impl Luma8LuminanceSource { } } } + +#[cfg(test)] +mod tests { + use crate::{Luma8LuminanceSource, LuminanceSource}; + + #[test] + fn test_rotate() { + let src_square = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; + + let src_rect = vec![0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0]; + + let square = Luma8LuminanceSource::new(src_square, 3, 3); + let rect_tall = Luma8LuminanceSource::new(src_rect.clone(), 3, 4); + let rect_wide = Luma8LuminanceSource::new(src_rect.clone(), 4, 3); + + let rotated_square = square.rotate_counter_clockwise().expect("rotate"); + // print_matrix(&src_rect, 4, 3); + let rotated_wide_rect = rect_wide.rotate_counter_clockwise().expect("rotate"); + // print_matrix(&src_rect, 3, 4); + let rotated_tall_rect = rect_tall.rotate_counter_clockwise().expect("rotate"); + + assert_eq!(rotated_square.dimensions, square.dimensions); + assert_eq!( + rotated_tall_rect.dimensions, + (rect_tall.dimensions.1, rect_tall.dimensions.0) + ); + assert_eq!( + rotated_wide_rect.dimensions, + (rect_wide.dimensions.1, rect_wide.dimensions.0) + ); + + assert_eq!(rotated_square.data, vec![3, 6, 9, 2, 5, 8, 1, 4, 7]); + + assert_eq!( + rotated_wide_rect.data, + vec![1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1] + ); + + assert_eq!( + rotated_tall_rect.data, + vec![0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0] + ); + } +} + +// fn print_matrix(matrix: &[u8], width: usize, height: usize) { +// for y in 0..height { +// for x in 0..width { +// print!("{}, ",matrix[y*width + x ]); +// } +// println!() +// } +// println!() +// }