rxing/pdf417/decoder/
codeword.rs1use std::fmt::Display;
18
19const BARCODE_ROW_UNKNOWN: i32 = -1;
20
21#[derive(Clone, Copy)]
25pub struct Codeword {
26    startX: u32,
27    endX: u32,
28    bucket: u32,
29    value: u32,
30    rowNumber: i32,
31}
32
33impl Codeword {
34    pub fn new(startX: u32, endX: u32, bucket: u32, value: u32) -> Self {
35        Self {
36            startX,
37            endX,
38            bucket,
39            value,
40            rowNumber: BARCODE_ROW_UNKNOWN,
41        }
42    }
43
44    pub fn hasValidRowNumber(&self) -> bool {
45        self.isValidRowNumber(self.rowNumber)
46    }
47
48    pub fn isValidRowNumber(&self, rowNumber: i32) -> bool {
49        rowNumber != BARCODE_ROW_UNKNOWN && self.bucket == (rowNumber as u32 % 3) * 3
50    }
51
52    pub fn setRowNumberAsRowIndicatorColumn(&mut self) {
53        self.rowNumber = ((self.value / 30) * 3 + self.bucket / 3) as i32;
54    }
55
56    pub fn getWidth(&self) -> u32 {
57        self.endX - self.startX
58    }
59
60    pub fn getStartX(&self) -> u32 {
61        self.startX
62    }
63
64    pub fn getEndX(&self) -> u32 {
65        self.endX
66    }
67
68    pub fn getBucket(&self) -> u32 {
69        self.bucket
70    }
71
72    pub fn getValue(&self) -> u32 {
73        self.value
74    }
75
76    pub fn getRowNumber(&self) -> i32 {
77        self.rowNumber
78    }
79
80    pub fn setRowNumber(&mut self, rowNumber: i32) {
81        self.rowNumber = rowNumber;
82    }
83}
84
85impl Display for Codeword {
86    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
87        write!(f, "{}|{}", self.rowNumber, self.value)
88    }
89}