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
//! Bitmap header
//!
//! Information gleaned from [wikipedia](https://en.wikipedia.org/wiki/BMP_file_format) and
//! [this website](http://paulbourke.net/dataformats/bmp/)

use nom::*;

/// Bitmap file type
#[derive(Debug, Clone, PartialEq)]
pub enum FileType {
    /// Default "BM" magic bytes marker for most commonly encountered bitmaps
    BM,
}

/// BMP header information
#[derive(Debug, Clone, PartialEq)]
pub struct Header {
    /// Bitmap file type
    pub file_type: FileType,

    /// Total file size in bytes
    pub file_size: u32,

    /// Reserved field 1
    pub reserved_1: u16,

    /// Reserved field 2
    pub reserved_2: u16,

    /// Byte offset from beginning of file at which pixel data begins
    pub image_data_start: usize,

    /// Image width in pixels
    pub image_width: u32,

    /// Image height in pixels
    pub image_height: u32,

    /// Number of bits per pixel
    pub bpp: u16,

    /// Length in bytes of the image data
    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 >>
        // Remaining header length in bytes
        le_u32 >>
        image_width: le_u32 >>
        image_height: le_u32 >>
        // Number of color planes
        le_u16 >>
        bpp: le_u16 >>
        // Compression method used
        le_u32 >>
        image_data_len: le_u32 >>
        // Omitted: extraneous, unused fields
        (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
        })
    )
);