#![cfg(feature = "decode-rqrr")]
use crate::decode::{DecodedQrCode, GrayPixels, QrDecoder};
use crate::types::{EcLevel, Version};
#[derive(Default, Debug, Clone, Copy)]
pub struct RqrrDecoder;
impl RqrrDecoder {
#[must_use]
pub fn new() -> Self {
Self
}
}
impl QrDecoder for RqrrDecoder {
type Error = rqrr::DeQRError;
fn decode(&self, image: GrayPixels<'_>) -> Result<Vec<DecodedQrCode>, Self::Error> {
let mut prep =
rqrr::PreparedImage::prepare_from_greyscale(image.width() as usize, image.height() as usize, |x, y| {
image.get(x as u32, y as u32)
});
let grids = prep.detect_grids();
let mut out = Vec::new();
for grid in grids {
let mut bytes: Vec<u8> = Vec::new();
let meta = grid.decode_to(&mut bytes)?;
out.push(DecodedQrCode::new(bytes, map_version(meta.version), map_ec(meta.ecc_level)));
}
Ok(out)
}
}
fn map_version(v: rqrr::Version) -> Version {
Version::Normal(v.0 as i16)
}
fn map_ec(level: u16) -> EcLevel {
match level {
0 => EcLevel::M, 1 => EcLevel::L, 2 => EcLevel::H, _ => EcLevel::Q, }
}