1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use nom::*;
#[derive(Debug, Clone, PartialEq)]
pub enum FileType {
BM,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Header {
pub file_type: FileType,
pub file_size: u32,
pub reserved_1: u16,
pub reserved_2: u16,
pub image_data_start: usize,
pub image_width: u32,
pub image_height: u32,
pub bpp: u16,
pub image_data_len: u32,
}
named!(pub(crate) parse_header<&[u8], Header>,
do_parse!(
tag!("BM") >>
file_size: le_u32 >>
reserved_1: le_u16 >>
reserved_2: le_u16 >>
image_data_start: le_u32 >>
le_u32 >>
image_width: le_u32 >>
image_height: le_u32 >>
le_u16 >>
bpp: le_u16 >>
le_u32 >>
image_data_len: le_u32 >>
(Header{
file_type: FileType::BM,
file_size,
reserved_1,
reserved_2,
image_data_start: image_data_start as usize,
image_width,
image_height,
image_data_len,
bpp
})
)
);