1 use crate::decode::decode::codestream_ecc;
2 use crate::decode::decode::decode_payload;
3 use crate::decode::decode::read_data;
4 use crate::decode::decode::read_format;
5 use crate::decode::BitGrid;
6 use bmp_monochrome::BmpError;
7 use std::io::Cursor;
8 
9 impl BitGrid for &bmp_monochrome::Bmp {
size(&self) -> usize10     fn size(&self) -> usize {
11         self.width() as usize
12     }
13 
bit(&self, y: usize, x: usize) -> bool14     fn bit(&self, y: usize, x: usize) -> bool {
15         self.get(y as u16, x as u16)
16     }
17 }
18 
19 /// Allows to decode the QR coded in a bmp file
20 pub trait BmpDecode {
21     /// Allows to decode the QR coded in a bmp file
decode(&self) -> Result<Vec<u8>, BmpError>22     fn decode(&self) -> Result<Vec<u8>, BmpError>;
23 }
24 
25 impl BmpDecode for bmp_monochrome::Bmp {
decode(&self) -> Result<Vec<u8>, BmpError>26     fn decode(&self) -> Result<Vec<u8>, BmpError> {
27         let meta = read_format(&self).unwrap();
28         let raw = read_data(&self, &meta);
29         let stream = codestream_ecc(&meta, raw).unwrap();
30         let mut writer = Cursor::new(vec![]);
31         decode_payload(&meta, stream, &mut writer).unwrap();
32         Ok(writer.into_inner())
33     }
34 }
35 
36 #[cfg(test)]
37 mod tests {
38     use crate::decode::decode::{
39         codestream_ecc, decode_payload, read_data, read_format, MetaData, Version,
40     };
41     use crate::decode::BitGrid;
42     use bmp_monochrome::Bmp;
43     use std::fs::File;
44     use std::io::Cursor;
45 
46     #[test]
test_decode()47     fn test_decode() {
48         let bmp = &Bmp::read(File::open("test_data/test.bmp").unwrap()).unwrap();
49         let meta = read_format(&bmp).unwrap();
50         let expected = MetaData {
51             version: Version(1),
52             ecc_level: 0,
53             mask: 2,
54         };
55         assert_eq!(&expected, &meta);
56 
57         let raw = read_data(&bmp, &meta);
58         let stream = codestream_ecc(&meta, raw).unwrap();
59         let mut writer = Cursor::new(vec![]);
60         decode_payload(&meta, stream, &mut writer).unwrap();
61         let out = String::from_utf8(writer.into_inner()).unwrap();
62         assert_eq!("Hello", &out);
63     }
64 
65     #[test]
test_grid()66     fn test_grid() {
67         let expected = r#"
68 #######..####.#######
69 #.....#.....#.#.....#
70 #.###.#.#.#.#.#.###.#
71 #.###.#.#.#...#.###.#
72 #.###.#.##..#.#.###.#
73 #.....#.##.#..#.....#
74 #######.#.#.#.#######
75 ........#.#..........
76 #.#####..#.#..#####..
77 ...#....#..####..##.#
78 ..#####..##.#.##.###.
79 ..#..#.##.#####..##..
80 .###..#####.#..#....#
81 ........#...#..#.#...
82 #######..#.#.#..#.##.
83 #.....#.#.#....#####.
84 #.###.#.#..#.#..#..#.
85 #.###.#.##.#####.#...
86 #.###.#.##..#.##..#..
87 #.....#..#.####.###..
88 #######.##..#...#..#.
89 "#;
90         let mut chars = expected.chars();
91         let bmp = &Bmp::read(File::open("test_data/test.bmp").unwrap()).unwrap();
92         for i in 0..bmp.size() {
93             for j in 0..bmp.size() {
94                 let mut char = chars.next().unwrap();
95                 if char == '\n' {
96                     char = chars.next().unwrap();
97                 }
98                 assert_eq!(char == '#', bmp.bit(i, j));
99             }
100         }
101     }
102 }
103