summaryrefslogtreecommitdiff
path: root/src/label_formats/label_format.rs
blob: 64070970f8e177be8a812b313db7619789817d23 (plain)
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
pub struct LabelFormat {
    pub buffer: Vec<u16>,
    pub width: usize,
    pub height: usize,
}

impl LabelFormat {
    pub fn get_left(&self, x: usize, y: usize) -> Option<u16> {
        if x > 0 {
            return Some(self.buffer[(x-1) + y * self.width]);
        }
        return None;
    }

    pub fn get_right(&self, x: usize, y: usize) -> Option<u16> {
        if (x+1) < self.width {
            return Some(self.buffer[(x+1) + y * self.width]);
        }
        return None;
    }

    pub fn get_up(&self, x: usize, y: usize) -> Option<u16> {
        if y > 0 {
            return Some(self.buffer[x + (y-1) * self.width]);
        }
        return None;
    }

    pub fn get_down(&self, x: usize, y: usize) -> Option<u16> {
        if (y+1) < self.height {
            return Some(self.buffer[x + (y+1) * self.width]);
        }
        return None;
    }

    pub fn display(&self, include_space: bool) {
        for y in 0..self.height {
            for x in 0..self.width {
                print!("{:04X}", self.buffer[x + y*self.width]);
                if include_space {
                    print!(" ");
                }
            }
            println!();
        }
    }

    pub fn dilate(&self) -> LabelFormat {
        let width = self.width;
        let height = self.height;
        let mut output_buffer = vec![0u16; width*height];
        for y in 0..height {
            for x in 0..width {
                let index = x + y * width;
                let current_color = self.buffer[index];
                if current_color != 0 {
                    output_buffer[index] = current_color;
                    continue;
                }
                if let Some(color) = self.get_up(x,y) {
                    if color != 0 {
                        output_buffer[index] = color;
                        continue;
                    }
                }
                if let Some(color) = self.get_right(x,y) {
                    if color != 0 {
                        output_buffer[index] = color;
                        continue;
                    }
                }
                if let Some(color) = self.get_down(x,y) {
                    if color != 0 {
                        output_buffer[index] = color;
                        continue;
                    }
                }
                if let Some(color) = self.get_left(x,y) {
                    if color != 0 {
                        output_buffer[index] = color;
                        continue;
                    }
                }
            }
        }
        LabelFormat {
            buffer: output_buffer,
            width,
            height,
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn dilation_test() {
        const DIM: usize = 6;
        let mut test_data = LabelFormat {
            buffer: vec![0u16; DIM*DIM],
            width: DIM,
            height: DIM,
        };

        test_data.buffer[2+3*DIM] = 1;
        test_data.buffer[3+3*DIM] = 1;
        test_data.display(true);
        println!();
        let dilated = test_data.dilate();
        dilated.display(true);
    }
}