use num_derive::{FromPrimitive, ToPrimitive};
pub type Pixel = u16;
#[derive(Debug, Clone)]
pub struct Quirc {
pub pixels: Vec<Pixel>,
pub w: usize,
pub h: usize,
pub regions: Vec<Region>,
pub capstones: Vec<Capstone>,
pub grids: Vec<Grid>,
}
impl Default for Quirc {
fn default() -> Self {
Self {
pixels: Vec::new(),
w: 0,
h: 0,
regions: Vec::with_capacity(254),
capstones: Vec::with_capacity(32),
grids: Vec::with_capacity(8),
}
}
}
impl Quirc {
pub fn new() -> Self {
Self::default()
}
pub fn resize(&mut self, width: usize, height: usize) {
if self.w == width && self.h == height {
return;
}
let newdim = width * height;
self.pixels.resize(newdim, 0);
self.w = width;
self.h = height;
}
pub fn num_regions(&self) -> usize {
self.regions.len()
}
pub fn num_capstones(&self) -> usize {
self.capstones.len()
}
pub fn count(&self) -> usize {
self.grids.len()
}
pub fn reset(&mut self) {
self.regions.clear();
self.capstones.clear();
self.grids.clear();
}
}
#[derive(Debug, Copy, Clone, Default)]
pub struct Grid {
pub caps: [usize; 3],
pub align_region: Option<Pixel>,
pub align: Point,
pub tpep: [Point; 3],
pub hscan: i32,
pub vscan: i32,
pub grid_size: i32,
pub c: [f64; 8],
}
#[derive(Debug, Copy, Clone, Default)]
pub struct Point {
pub x: i32,
pub y: i32,
}
impl Point {
pub fn clear(&mut self) {
self.x = 0;
self.y = 0;
}
}
#[derive(Debug, Copy, Clone, Default)]
pub struct Capstone {
pub ring: i32,
pub stone: i32,
pub corners: [Point; 4],
pub center: Point,
pub c: [f64; 8],
pub qr_grid: i32,
}
#[derive(Debug, Copy, Clone, Default)]
pub struct Region {
pub seed: Point,
pub count: i32,
pub capstone: i32,
}
#[derive(Copy, Clone)]
pub struct Code {
pub corners: [Point; 4],
pub size: i32,
pub cell_bitmap: [u8; 3917],
}
impl Default for Code {
fn default() -> Self {
Self {
corners: [Point::default(); 4],
size: 0,
cell_bitmap: [0; 3917],
}
}
}
impl Code {
pub fn clear(&mut self) {
for val in self.corners.iter_mut() {
val.clear();
}
self.size = 0;
for val in self.cell_bitmap.iter_mut() {
*val = 0;
}
}
}
#[derive(Clone)]
pub struct Data {
pub version: usize,
pub ecc_level: EccLevel,
pub mask: i32,
pub data_type: Option<DataType>,
pub payload: Vec<u8>,
pub eci: Option<Eci>,
}
impl Default for Data {
fn default() -> Self {
Self {
version: 0,
ecc_level: Default::default(),
mask: 0,
data_type: None,
payload: Vec::new(),
eci: Default::default(),
}
}
}
pub fn version() -> String {
env!("CARGO_PKG_VERSION").to_string()
}
#[derive(Debug, Copy, Clone, FromPrimitive, ToPrimitive, PartialEq, Eq, Hash)]
pub enum EccLevel {
M = 0,
L = 1,
H = 2,
Q = 3,
}
impl Default for EccLevel {
fn default() -> Self {
EccLevel::M
}
}
#[derive(Debug, Copy, Clone, FromPrimitive, ToPrimitive, PartialEq, Eq, Hash)]
#[repr(i32)]
pub enum DataType {
Numeric = 1,
Alpha = 2,
Byte = 4,
Eci = 7,
Kanji = 8,
}
impl std::fmt::Display for DataType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let x = match self {
DataType::Numeric => "numeric",
DataType::Alpha => "alpha",
DataType::Byte => "byte",
DataType::Eci => "eci",
DataType::Kanji => "kanji",
};
f.write_str(x)
}
}
#[derive(Debug, Copy, Clone, FromPrimitive, ToPrimitive, PartialEq, Eq, Hash)]
pub enum Eci {
Iso8859_1 = 1,
Ibm437 = 2,
Iso8859_2 = 4,
Iso8859_3 = 5,
Iso8859_4 = 6,
Iso8859_5 = 7,
Iso8859_6 = 8,
Iso8859_7 = 9,
Iso8859_8 = 10,
Iso8859_9 = 11,
Windows874 = 13,
Iso8859_13 = 15,
Iso8859_15 = 17,
ShiftJis = 20,
Utf8 = 26,
}