Skip to main content

fax/
maps.rs

1use crate::{BitReader, Bits};
2
3enum Entry<T: Copy + 'static> {
4    Leaf(u8, &'static [Option<(T, u8)>]),
5    Value(T, u8),
6    Prefix(u8, &'static [Entry<T>]),
7}
8impl<T: Copy> Entry<T> {
9    fn find(&self, reader: &mut impl BitReader) -> Option<T> {
10        match *self {
11            Entry::Value(val, len) => {
12                reader.consume(len).ok()?;
13                Some(val)
14            }
15            Entry::Leaf(width, lut) => {
16                let index = reader.peek(width)?;
17                let (val, len) = lut[index as usize]?;
18                reader.consume(len).ok()?;
19                Some(val)
20            }
21            Entry::Prefix(width, lut) => {
22                let index = reader.peek(width)?;
23                let entry = &lut[index as usize];
24                match *entry {
25                    Entry::Value(val, len) => {
26                        reader.consume(len).ok()?;
27                        Some(val)
28                    }
29                    _ => {
30                        reader.consume(width).ok()?;
31                        entry.find(reader)
32                    }
33                }
34            }
35        }
36    }
37}
38
39pub const EDFB_HALF: Bits = Bits { data: 1, len: 12 };
40pub const EOL: Bits = Bits { data: 1, len: 12 };
41
42#[derive(Copy, Clone, Debug)]
43pub enum Mode {
44    Pass,
45    Horizontal,
46    Vertical(i8),
47    Extension,
48    EOF,
49}
50
51#[cfg(feature="generate_bitmaps")]
52use fax_derive::bitmaps;
53
54#[cfg(feature="generate_bitmaps")]
55bitmaps! {
56    mode <Mode> {
57        0001 => Mode::Pass,
58        001 => Mode::Horizontal,
59        1 => Mode::Vertical(0),
60        011 => Mode::Vertical(1),
61        000011 => Mode::Vertical(2),
62        0000011 => Mode::Vertical(3),
63        010 => Mode::Vertical(-1),
64        000010 => Mode::Vertical(-2),
65        0000010 => Mode::Vertical(-3),
66        0000001 => Mode::Extension,
67        000000000001 => Mode::EOF,
68    },
69    black {
70        0000110111 => 0,
71        010 => 1,
72        11 => 2,
73        10 => 3,
74        011 => 4,
75        0011 => 5,
76        0010 => 6,
77        00011 => 7,
78        000101 => 8,
79        000100 => 9,
80        0000100 => 10,
81        0000101 => 11,
82        0000111 => 12,
83        00000100 => 13,
84        00000111 => 14,
85        000011000 => 15,
86        0000010111 => 16,
87        0000011000 => 17,
88        0000001000 => 18,
89        00001100111 => 19,
90        00001101000 => 20,
91        00001101100 => 21,
92        00000110111 => 22,
93        00000101000 => 23,
94        00000010111 => 24,
95        00000011000 => 25,
96        000011001010 => 26,
97        000011001011 => 27,
98        000011001100 => 28,
99        000011001101 => 29,
100        000001101000 => 30,
101        000001101001 => 31,
102        000001101010 => 32,
103        000001101011 => 33,
104        000011010010 => 34,
105        000011010011 => 35,
106        000011010100 => 36,
107        000011010101 => 37,
108        000011010110 => 38,
109        000011010111 => 39,
110        000001101100 => 40,
111        000001101101 => 41,
112        000011011010 => 42,
113        000011011011 => 43,
114        000001010100 => 44,
115        000001010101 => 45,
116        000001010110 => 46,
117        000001010111 => 47,
118        000001100100 => 48,
119        000001100101 => 49,
120        000001010010 => 50,
121        000001010011 => 51,
122        000000100100 => 52,
123        000000110111 => 53,
124        000000111000 => 54,
125        000000100111 => 55,
126        000000101000 => 56,
127        000001011000 => 57,
128        000001011001 => 58,
129        000000101011 => 59,
130        000000101100 => 60,
131        000001011010 => 61,
132        000001100110 => 62,
133        000001100111 => 63,
134        0000001111 => 64,
135        000011001000 => 128,
136        000011001001 => 192,
137        000001011011 => 256,
138        000000110011 => 320,
139        000000110100 => 384,
140        000000110101 => 448,
141        0000001101100 => 512,
142        0000001101101 => 576,
143        0000001001010 => 640,
144        0000001001011 => 704,
145        0000001001100 => 768,
146        0000001001101 => 832,
147        0000001110010 => 896,
148        0000001110011 => 960,
149        0000001110100 => 1024,
150        0000001110101 => 1088,
151        0000001110110 => 1152,
152        0000001110111 => 1216,
153        0000001010010 => 1280,
154        0000001010011 => 1344,
155        0000001010100 => 1408,
156        0000001010101 => 1472,
157        0000001011010 => 1536,
158        0000001011011 => 1600,
159        0000001100100 => 1664,
160        0000001100101 => 1728,
161        00000001000 => 1792,
162        00000001100 => 1856,
163        00000001101 => 1920,
164        000000010010 => 1984,
165        000000010011 => 2048,
166        000000010100 => 2112,
167        000000010101 => 2176,
168        000000010110 => 2240,
169        000000010111 => 2304,
170        000000011100 => 2368,
171        000000011101 => 2432,
172        000000011110 => 2496,
173        000000011111 => 2560,
174    },
175    white {
176        00110101 => 0,
177        000111 => 1,
178        0111 => 2,
179        1000 => 3,
180        1011 => 4,
181        1100 => 5,
182        1110 => 6,
183        1111 => 7,
184        10011 => 8,
185        10100 => 9,
186        00111 => 10,
187        01000 => 11,
188        001000 => 12,
189        000011 => 13,
190        110100 => 14,
191        110101 => 15,
192        101010 => 16,
193        101011 => 17,
194        0100111 => 18,
195        0001100 => 19,
196        0001000 => 20,
197        0010111 => 21,
198        0000011 => 22,
199        0000100 => 23,
200        0101000 => 24,
201        0101011 => 25,
202        0010011 => 26,
203        0100100 => 27,
204        0011000 => 28,
205        00000010 => 29,
206        00000011 => 30,
207        00011010 => 31,
208        00011011 => 32,
209        00010010 => 33,
210        00010011 => 34,
211        00010100 => 35,
212        00010101 => 36,
213        00010110 => 37,
214        00010111 => 38,
215        00101000 => 39,
216        00101001 => 40,
217        00101010 => 41,
218        00101011 => 42,
219        00101100 => 43,
220        00101101 => 44,
221        00000100 => 45,
222        00000101 => 46,
223        00001010 => 47,
224        00001011 => 48,
225        01010010 => 49,
226        01010011 => 50,
227        01010100 => 51,
228        01010101 => 52,
229        00100100 => 53,
230        00100101 => 54,
231        01011000 => 55,
232        01011001 => 56,
233        01011010 => 57,
234        01011011 => 58,
235        01001010 => 59,
236        01001011 => 60,
237        00110010 => 61,
238        00110011 => 62,
239        00110100 => 63,
240        11011 => 64,
241        10010 => 128,
242        010111 => 192,
243        0110111 => 256,
244        00110110 => 320,
245        00110111 => 384,
246        01100100 => 448,
247        01100101 => 512,
248        01101000 => 576,
249        01100111 => 640,
250        011001100 => 704,
251        011001101 => 768,
252        011010010 => 832,
253        011010011 => 896,
254        011010100 => 960,
255        011010101 => 1024,
256        011010110 => 1088,
257        011010111 => 1152,
258        011011000 => 1216,
259        011011001 => 1280,
260        011011010 => 1344,
261        011011011 => 1408,
262        010011000 => 1472,
263        010011001 => 1536,
264        010011010 => 1600,
265        011000 => 1664,
266        010011011 => 1728,
267        00000001000 => 1792,
268        00000001100 => 1856,
269        00000001101 => 1920,
270        000000010010 => 1984,
271        000000010011 => 2048,
272        000000010100 => 2112,
273        000000010101 => 2176,
274        000000010110 => 2240,
275        000000010111 => 2304,
276        000000011100 => 2368,
277        000000011101 => 2432,
278        000000011110 => 2496,
279        000000011111 => 2560,
280    },
281}
282
283#[cfg(not(feature="generate_bitmaps"))]
284include!("bitmaps.rs");