use super::BarcodeRow;
pub struct BarcodeMatrix {
matrix: Vec<BarcodeRow>,
currentRow: isize,
height: usize,
width: usize,
}
impl BarcodeMatrix {
pub fn new(height: usize, width: usize, compact: bool) -> Self {
let mut matrix = Vec::with_capacity(height);
for _i in 0..height {
if !compact {
matrix.push(BarcodeRow::new((width + 4) * 17 + 1));
} else {
matrix.push(BarcodeRow::new((width + 2) * 17 + 1));
}
}
Self {
matrix,
currentRow: -1,
height,
width: width * 17,
}
}
pub fn set(&mut self, x: usize, y: usize, value: u8) {
self.matrix[y].set(x, value);
}
pub fn startRow(&mut self) {
self.currentRow += 1;
}
pub fn getCurrentRow(&self) -> &BarcodeRow {
&self.matrix[self.currentRow as usize]
}
pub fn getCurrentRowMut(&mut self) -> &mut BarcodeRow {
&mut self.matrix[self.currentRow as usize]
}
pub fn getMatrix(&self) -> Vec<Vec<u8>> {
self.getScaledMatrix(1, 1)
}
pub fn getScaledMatrix(&self, xScale: usize, yScale: usize) -> Vec<Vec<u8>> {
let mut matrixOut = vec![vec![0; self.width * xScale]; self.height * yScale];
let yMax = self.height * yScale;
for i in 0..yMax {
matrixOut[yMax - i - 1] = self.matrix[i / yScale].getScaledRow(xScale);
}
matrixOut
}
}