]>
Commit | Line | Data |
---|---|---|
1b8522d6 | 1 | use nihav_core::codecs::*; |
2d90e8b6 KS |
2 | use nihav_core::io::byteio::*; |
3 | ||
4 | struct MaskState<'a> { | |
5 | is_intra: bool, | |
6 | pos: usize, | |
7 | row_pos: usize, | |
8 | row_size: usize, | |
9 | mask: u8, | |
10 | src: &'a [u8], | |
11 | } | |
12 | ||
13 | impl<'a> MaskState<'a> { | |
14 | fn new(is_intra: bool, src: &'a [u8], row_size: usize) -> Self { | |
15 | Self { is_intra, src, pos: 0, row_pos: 0, row_size, mask: 0x01 } | |
16 | } | |
17 | fn get_next(&mut self) -> bool { | |
18 | if self.is_intra { | |
19 | true | |
20 | } else { | |
21 | let res = (self.src[self.pos] & self.mask) == 0; | |
22 | self.mask <<= 1; | |
23 | if self.mask == 0 { | |
24 | self.pos += 1; | |
25 | self.mask = 0x01; | |
26 | } | |
27 | res | |
28 | } | |
29 | } | |
30 | fn reset_row(&mut self) { | |
31 | self.pos = self.row_pos; | |
32 | self.mask = 0x01; | |
33 | } | |
34 | fn next_row(&mut self) { | |
35 | self.row_pos += self.row_size; | |
36 | self.reset_row(); | |
37 | } | |
38 | } | |
39 | ||
40 | struct IndexState<'a> { | |
41 | src: &'a [u8], | |
42 | pos: usize, | |
43 | vec_idx: usize, | |
44 | vec_subidx: usize, | |
45 | } | |
46 | ||
47 | impl<'a> IndexState<'a> { | |
48 | fn new(src: &'a [u8]) -> Self { | |
49 | Self { src, pos: 0, vec_idx: 0, vec_subidx: 0 } | |
50 | } | |
51 | fn get_next(&mut self) -> DecoderResult<()> { | |
52 | validate!(self.pos < self.src.len()); | |
53 | self.vec_idx = self.src[self.pos] as usize; | |
54 | self.vec_subidx = 0; | |
55 | self.pos += 1; | |
56 | Ok(()) | |
57 | } | |
58 | fn get_pred(&self, dtab: &[[u32; 4]; 256]) -> u32 { dtab[self.vec_idx][self.vec_subidx] } | |
59 | fn get_diff16(&mut self, dtab: &[[u32; 4]; 256]) -> DecoderResult<u32> { | |
60 | let pred1 = self.get_pred(dtab); | |
61 | let mut pred = pred1 >> 1; | |
62 | if (pred1 & 1) != 0 { | |
63 | self.get_next()?; | |
64 | if self.vec_idx == 0 { | |
65 | self.get_next()?; | |
66 | let pred2 = self.get_pred(dtab); | |
67 | pred = pred.wrapping_add((pred2 >> 1).wrapping_mul(5)); | |
68 | if (pred2 & 1) != 0 { | |
69 | self.get_next()?; | |
70 | } else { | |
71 | self.vec_subidx += 1; | |
72 | } | |
73 | } | |
74 | } else { | |
75 | self.vec_subidx += 1; | |
76 | } | |
77 | Ok(pred) | |
78 | } | |
79 | fn get_diff16_noesc(&mut self, dtab: &[[u32; 4]; 256]) -> DecoderResult<u32> { | |
80 | let pred1 = self.get_pred(dtab); | |
81 | let pred = pred1 >> 1; | |
82 | if (pred1 & 1) != 0 { | |
83 | self.get_next()?; | |
84 | } else { | |
85 | self.vec_subidx += 1; | |
86 | } | |
87 | Ok(pred) | |
88 | } | |
89 | fn get_diff24(&mut self, dtab: &[[u32; 4]; 256], esctab: &[[u32; 4]; 256]) -> DecoderResult<u32> { | |
90 | let pred1 = self.get_pred(dtab); | |
91 | let mut pred = pred1 >> 1; | |
92 | if (pred1 & 1) != 0 { | |
93 | self.get_next()?; | |
94 | if self.vec_idx == 0 { | |
95 | self.get_next()?; | |
96 | let pred2 = self.get_pred(esctab); | |
97 | pred = pred.wrapping_add(pred2 >> 1); | |
98 | if (pred2 & 1) != 0 { | |
99 | self.get_next()?; | |
100 | } else { | |
101 | self.vec_subidx += 1; | |
102 | } | |
103 | } | |
104 | } else { | |
105 | self.vec_subidx += 1; | |
106 | } | |
107 | Ok(pred) | |
108 | } | |
109 | } | |
110 | ||
111 | struct DeltaTables { | |
112 | ydt: [[u32; 4]; 256], | |
113 | cdt: [[u32; 4]; 256], | |
114 | fat_ydt: [[u32; 4]; 256], | |
115 | fat_cdt: [[u32; 4]; 256], | |
116 | adt: [[u32; 4]; 256], | |
117 | } | |
118 | ||
119 | impl Default for DeltaTables { | |
120 | fn default() -> Self { | |
121 | Self { | |
122 | ydt: [[0; 4]; 256], | |
123 | cdt: [[0; 4]; 256], | |
124 | fat_ydt: [[0; 4]; 256], | |
125 | fat_cdt: [[0; 4]; 256], | |
126 | adt: [[0; 4]; 256], | |
127 | } | |
128 | } | |
129 | } | |
130 | ||
6f263099 | 131 | #[derive(Default)] |
2d90e8b6 | 132 | struct FrameBuf { |
3fc28ece KS |
133 | last16: Option<NAVideoBufferRef<u16>>, |
134 | last24: Option<NAVideoBufferRef<u8>>, | |
2d90e8b6 KS |
135 | } |
136 | ||
137 | impl FrameBuf { | |
3fc28ece KS |
138 | fn set16(&mut self, buf: NAVideoBufferRef<u16>) { self.last16 = Some(buf); } |
139 | fn set24(&mut self, buf: NAVideoBufferRef<u8>) { self.last24 = Some(buf); } | |
140 | fn get16(&mut self) -> Option<NAVideoBufferRef<u16>> { | |
2d90e8b6 KS |
141 | if let Some(ref mut frm) = self.last16 { |
142 | let newfrm = frm.copy_buffer(); | |
3fc28ece KS |
143 | *frm = newfrm.clone().into_ref(); |
144 | Some(newfrm.into_ref()) | |
2d90e8b6 KS |
145 | } else { |
146 | None | |
147 | } | |
148 | } | |
3fc28ece | 149 | fn get24(&mut self) -> Option<NAVideoBufferRef<u8>> { |
2d90e8b6 KS |
150 | if let Some(ref mut frm) = self.last24 { |
151 | let newfrm = frm.copy_buffer(); | |
3fc28ece KS |
152 | *frm = newfrm.clone().into_ref(); |
153 | Some(newfrm.into_ref()) | |
2d90e8b6 KS |
154 | } else { |
155 | None | |
156 | } | |
157 | } | |
158 | fn reset(&mut self) { | |
159 | self.last16 = None; | |
160 | self.last24 = None; | |
161 | } | |
162 | } | |
163 | ||
2d90e8b6 KS |
164 | #[derive(Default)] |
165 | struct TM1Decoder { | |
2422d969 | 166 | info: NACodecInfoRef, |
2d90e8b6 KS |
167 | last_delta_set: usize, |
168 | last_table_idx: usize, | |
169 | delta_tables: DeltaTables, | |
170 | blk_w: usize, | |
171 | blk_h: usize, | |
172 | vert_pred: Vec<u32>, | |
173 | lastframe: FrameBuf, | |
174 | } | |
175 | ||
176 | const RGB555_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RGB(RGBSubmodel::RGB), components: 3, | |
177 | comp_info: [ | |
178 | Some(NAPixelChromaton{ h_ss: 0, v_ss: 0, packed: true, depth: 5, shift: 10, comp_offs: 0, next_elem: 2 }), | |
179 | Some(NAPixelChromaton{ h_ss: 0, v_ss: 0, packed: true, depth: 5, shift: 5, comp_offs: 0, next_elem: 2 }), | |
180 | Some(NAPixelChromaton{ h_ss: 0, v_ss: 0, packed: true, depth: 5, shift: 0, comp_offs: 0, next_elem: 2 }), | |
181 | None, None], | |
182 | elem_size: 2, be: false, alpha: false, palette: false }; | |
183 | const BGR0_FORMAT: NAPixelFormaton = NAPixelFormaton { model: ColorModel::RGB(RGBSubmodel::RGB), components: 3, | |
184 | comp_info: [ | |
185 | Some(NAPixelChromaton{ h_ss: 0, v_ss: 0, packed: true, depth: 8, shift: 0, comp_offs: 2, next_elem: 4 }), | |
186 | Some(NAPixelChromaton{ h_ss: 0, v_ss: 0, packed: true, depth: 8, shift: 0, comp_offs: 1, next_elem: 4 }), | |
187 | Some(NAPixelChromaton{ h_ss: 0, v_ss: 0, packed: true, depth: 8, shift: 0, comp_offs: 0, next_elem: 4 }), | |
188 | None, None], | |
189 | elem_size: 4, be: false, alpha: false, palette: false }; | |
190 | ||
191 | impl TM1Decoder { | |
192 | fn new() -> Self { Self::default() } | |
193 | fn set_delta_tables(&mut self, delta_set: usize, table_idx: usize, is_24bit: bool) { | |
194 | if (self.last_delta_set == delta_set) && (self.last_table_idx == table_idx) { return; } | |
195 | let ydt = &DUCK_Y_DELTAS[delta_set]; | |
196 | let yfdt = DUCK_Y_FAT_DELTAS[delta_set]; | |
197 | let cdt = &DUCK_C_DELTAS[delta_set]; | |
198 | let cfdt = DUCK_C_FAT_DELTAS[delta_set]; | |
199 | let vec = DUCK_VECTABLES[table_idx - 1]; | |
200 | ||
8a7352c0 | 201 | let mut vec_iter = vec.iter(); |
2d90e8b6 KS |
202 | for i in 0..256 { |
203 | let len = (*vec_iter.next().unwrap() as usize) >> 1; | |
204 | for j in 0..len { | |
205 | let pair = vec_iter.next().unwrap(); | |
206 | let lo = (pair >> 4) as usize; | |
207 | let hi = (pair & 0xF) as usize; | |
208 | if !is_24bit { | |
209 | let d_lo = ydt[lo] + (ydt[lo] << 5) + (ydt[lo] << 10); | |
210 | let d_hi = ydt[hi] + (ydt[hi] << 5) + (ydt[hi] << 10); | |
211 | self.delta_tables.ydt[i][j] = ((d_lo + (d_hi << 16)) << 1) as u32; | |
212 | let d_c = cdt[hi] + (cdt[lo] << 10); | |
213 | self.delta_tables.cdt[i][j] = ((d_c + (d_c << 16)) << 1) as u32; | |
214 | let d_a = lo + hi * 5; | |
215 | self.delta_tables.adt[i][j] = ((d_a << 16) << 1) as u32; | |
216 | } else { | |
217 | self.delta_tables.ydt[i][j] = ((ydt [lo] + (ydt [hi] << 8) + (ydt [hi] << 16)) << 1) as u32; | |
218 | self.delta_tables.fat_ydt[i][j] = ((yfdt[lo] + (yfdt[hi] << 8) + (yfdt[hi] << 16)) << 1) as u32; | |
219 | self.delta_tables.cdt[i][j] = ((cdt [hi] + (cdt [lo] << 16)) << 1) as u32; | |
220 | self.delta_tables.fat_cdt[i][j] = ((cfdt[hi] + (cfdt[lo] << 16)) << 1) as u32; | |
221 | } | |
222 | } | |
223 | self.delta_tables.ydt[i][len - 1] |= 1; | |
224 | self.delta_tables.cdt[i][len - 1] |= 1; | |
225 | self.delta_tables.adt[i][len - 1] |= 1; | |
226 | self.delta_tables.fat_ydt[i][len - 1] |= 1; | |
227 | self.delta_tables.fat_cdt[i][len - 1] |= 1; | |
228 | } | |
229 | ||
230 | self.last_delta_set = delta_set; | |
231 | self.last_table_idx = table_idx; | |
232 | } | |
233 | fn decode_16bit(&mut self, dst: &mut [u16], stride: usize, width: usize, height: usize, mask: &mut MaskState<'_>, index: &mut IndexState<'_>) -> DecoderResult<()> { | |
234 | let mut off = 0; | |
235 | index.get_next()?; | |
236 | for y in 0..height { | |
237 | let mut hor_pred: u32 = 0; | |
238 | for x in (0..width).step_by(4) { | |
239 | if mask.get_next() { | |
240 | match y & 3 { | |
241 | 0 => { | |
242 | let dc0 = index.get_diff16(&self.delta_tables.cdt)?; | |
243 | let dy0 = index.get_diff16(&self.delta_tables.ydt)?; | |
244 | hor_pred = hor_pred.wrapping_add(dc0); | |
245 | hor_pred = hor_pred.wrapping_add(dy0); | |
246 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 0]); | |
247 | self.vert_pred[(x >> 1) + 0] = cur; | |
248 | dst[off + x + 0] = cur as u16; | |
249 | dst[off + x + 1] = (cur >> 16) as u16; | |
250 | if self.blk_w == 2 { | |
251 | let dc1 = index.get_diff16(&self.delta_tables.cdt)?; | |
252 | hor_pred = hor_pred.wrapping_add(dc1); | |
253 | } | |
254 | let dy1 = index.get_diff16(&self.delta_tables.ydt)?; | |
255 | hor_pred = hor_pred.wrapping_add(dy1); | |
256 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 1]); | |
257 | self.vert_pred[(x >> 1) + 1] = cur; | |
258 | dst[off + x + 2] = cur as u16; | |
259 | dst[off + x + 3] = (cur >> 16) as u16; | |
260 | }, | |
261 | 1 | 3 => { | |
262 | let dy0 = index.get_diff16(&self.delta_tables.ydt)?; | |
263 | hor_pred = hor_pred.wrapping_add(dy0); | |
264 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 0]); | |
265 | self.vert_pred[(x >> 1) + 0] = cur; | |
266 | dst[off + x + 0] = cur as u16; | |
267 | dst[off + x + 1] = (cur >> 16) as u16; | |
268 | let dy1 = index.get_diff16(&self.delta_tables.ydt)?; | |
269 | hor_pred = hor_pred.wrapping_add(dy1); | |
270 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 1]); | |
271 | self.vert_pred[(x >> 1) + 1] = cur; | |
272 | dst[off + x + 2] = cur as u16; | |
273 | dst[off + x + 3] = (cur >> 16) as u16; | |
274 | }, | |
275 | 2 => { | |
276 | if self.blk_h == 2 { | |
277 | let dc0 = index.get_diff16(&self.delta_tables.cdt)?; | |
278 | let dy0 = index.get_diff16(&self.delta_tables.ydt)?; | |
279 | hor_pred = hor_pred.wrapping_add(dc0); | |
280 | hor_pred = hor_pred.wrapping_add(dy0); | |
281 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 0]); | |
282 | self.vert_pred[(x >> 1) + 0] = cur; | |
283 | dst[off + x + 0] = cur as u16; | |
284 | dst[off + x + 1] = (cur >> 16) as u16; | |
285 | if self.blk_w == 2 { | |
286 | let dc1 = index.get_diff16(&self.delta_tables.cdt)?; | |
287 | hor_pred = hor_pred.wrapping_add(dc1); | |
288 | } | |
289 | let dy1 = index.get_diff16(&self.delta_tables.ydt)?; | |
290 | hor_pred = hor_pred.wrapping_add(dy1); | |
291 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 1]); | |
292 | self.vert_pred[(x >> 1) + 1] = cur; | |
293 | dst[off + x + 2] = cur as u16; | |
294 | dst[off + x + 3] = (cur >> 16) as u16; | |
295 | } else { | |
296 | let dy0 = index.get_diff16(&self.delta_tables.ydt)?; | |
297 | hor_pred = hor_pred.wrapping_add(dy0); | |
298 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 0]); | |
299 | self.vert_pred[(x >> 1) + 0] = cur; | |
300 | dst[off + x + 0] = cur as u16; | |
301 | dst[off + x + 1] = (cur >> 16) as u16; | |
302 | let dy1 = index.get_diff16(&self.delta_tables.ydt)?; | |
303 | hor_pred = hor_pred.wrapping_add(dy1); | |
304 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 1]); | |
305 | self.vert_pred[(x >> 1) + 1] = cur; | |
306 | dst[off + x + 2] = cur as u16; | |
307 | dst[off + x + 3] = (cur >> 16) as u16; | |
308 | } | |
309 | }, | |
310 | _ => unreachable!(), | |
311 | }; | |
312 | } else { | |
8a7352c0 | 313 | let cur = u32::from(dst[off + x + 0]) | (u32::from(dst[off + x + 1]) << 16); |
2d90e8b6 | 314 | self.vert_pred[(x >> 1) + 0] = cur; |
8a7352c0 | 315 | let cur = u32::from(dst[off + x + 2]) | (u32::from(dst[off + x + 3]) << 16); |
2d90e8b6 KS |
316 | hor_pred = cur.wrapping_sub(self.vert_pred[(x >> 1) + 1]); |
317 | self.vert_pred[(x >> 1) + 1] = cur; | |
318 | } | |
319 | } | |
320 | if (y & 3) != 3 { | |
321 | mask.reset_row(); | |
322 | } else { | |
323 | mask.next_row(); | |
324 | } | |
325 | off += stride; | |
326 | } | |
327 | Ok(()) | |
328 | } | |
329 | fn decode_sprite(&mut self, dst: &mut [u16], stride: usize, width: usize, height: usize, mask: &mut MaskState<'_>, index: &mut IndexState<'_>) -> DecoderResult<()> { | |
330 | let mut off = 0; | |
331 | let _ = index.get_next(); | |
332 | for y in 0..height { | |
333 | let mut hor_pred: u32 = 0; | |
334 | for x in (0..width).step_by(4) { | |
335 | let is_tm = !mask.get_next(); | |
336 | let is_sprite = !mask.get_next(); | |
337 | if is_tm { | |
338 | if (y & 3) == 0 { | |
339 | let dc0 = index.get_diff16(&self.delta_tables.cdt)?; | |
340 | hor_pred = hor_pred.wrapping_add(dc0); | |
341 | } | |
342 | let dy0 = index.get_diff16(&self.delta_tables.ydt)?; | |
343 | hor_pred = hor_pred.wrapping_add(dy0); | |
344 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 0]); | |
345 | self.vert_pred[(x >> 1) + 0] = cur; | |
346 | dst[off + x + 0] = cur as u16; | |
347 | dst[off + x + 1] = (cur >> 16) as u16; | |
348 | let dy1 = index.get_diff16(&self.delta_tables.ydt)?; | |
349 | hor_pred = hor_pred.wrapping_add(dy1); | |
350 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 1]); | |
351 | self.vert_pred[(x >> 1) + 1] = cur; | |
352 | dst[off + x + 2] = cur as u16; | |
353 | dst[off + x + 3] = (cur >> 16) as u16; | |
354 | } else if is_sprite { | |
355 | if (y & 3) == 0 { | |
356 | let dc0 = index.get_diff16(&self.delta_tables.cdt)?; | |
357 | hor_pred = hor_pred.wrapping_add(dc0); | |
358 | } | |
359 | let dy0 = index.get_diff16(&self.delta_tables.ydt)?; | |
360 | hor_pred = hor_pred.wrapping_add(dy0); | |
361 | let _da0 = index.get_diff16_noesc(&self.delta_tables.adt)?; | |
362 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 0]); | |
363 | self.vert_pred[(x >> 1) + 0] = cur; | |
364 | dst[off + x + 0] = cur as u16; | |
365 | dst[off + x + 1] = (cur >> 16) as u16; | |
366 | let dy1 = index.get_diff16(&self.delta_tables.ydt)?; | |
367 | hor_pred = hor_pred.wrapping_add(dy1); | |
368 | let _da1 = index.get_diff16_noesc(&self.delta_tables.adt)?; | |
369 | let cur = hor_pred.wrapping_add(self.vert_pred[(x >> 1) + 1]); | |
370 | self.vert_pred[(x >> 1) + 1] = cur; | |
371 | dst[off + x + 2] = cur as u16; | |
372 | dst[off + x + 3] = (cur >> 16) as u16; | |
373 | } else { | |
374 | hor_pred = 0; | |
375 | dst[off + x + 0] = 0; | |
376 | dst[off + x + 1] = 0; | |
377 | dst[off + x + 2] = 0; | |
378 | dst[off + x + 3] = 0; | |
379 | self.vert_pred[(x >> 1) + 0] = 0; | |
380 | self.vert_pred[(x >> 1) + 1] = 0; | |
381 | } | |
382 | } | |
383 | if (y & 3) != 3 { | |
384 | mask.reset_row(); | |
385 | } else { | |
386 | mask.next_row(); | |
387 | } | |
388 | off += stride; | |
389 | } | |
390 | Ok(()) | |
391 | } | |
392 | fn decode_24bit(&mut self, dst: &mut [u8], stride: usize, width: usize, height: usize, mask: &mut MaskState<'_>, index: &mut IndexState<'_>) -> DecoderResult<()> { | |
393 | let mut off = 0; | |
394 | index.get_next()?; | |
395 | for y in 0..height { | |
396 | let mut hor_pred: u32 = 0; | |
397 | for x in (0..width).step_by(2) { | |
398 | if mask.get_next() { | |
399 | match y & 3 { | |
400 | 0 => { | |
401 | let dc0 = index.get_diff24(&self.delta_tables.cdt, &self.delta_tables.fat_cdt)?; | |
402 | let dy0 = index.get_diff24(&self.delta_tables.ydt, &self.delta_tables.fat_ydt)?; | |
403 | hor_pred = hor_pred.wrapping_add(dc0); | |
404 | hor_pred = hor_pred.wrapping_add(dy0); | |
405 | let cur = hor_pred.wrapping_add(self.vert_pred[x + 0]); | |
406 | self.vert_pred[x + 0] = cur; | |
407 | dst[off + x*4 + 0] = cur as u8; | |
408 | dst[off + x*4 + 1] = (cur >> 8) as u8; | |
409 | dst[off + x*4 + 2] = (cur >> 16) as u8; | |
410 | dst[off + x*4 + 3] = 0; | |
411 | if self.blk_w == 2 { | |
412 | let dc1 = index.get_diff24(&self.delta_tables.cdt, &self.delta_tables.fat_cdt)?; | |
413 | hor_pred = hor_pred.wrapping_add(dc1); | |
414 | } | |
415 | let dy1 = index.get_diff24(&self.delta_tables.ydt, &self.delta_tables.fat_ydt)?; | |
416 | hor_pred = hor_pred.wrapping_add(dy1); | |
417 | let cur = hor_pred.wrapping_add(self.vert_pred[x + 1]); | |
418 | self.vert_pred[x + 1] = cur; | |
419 | dst[off + x*4 + 4] = cur as u8; | |
420 | dst[off + x*4 + 5] = (cur >> 8) as u8; | |
421 | dst[off + x*4 + 6] = (cur >> 16) as u8; | |
422 | dst[off + x*4 + 7] = 0; | |
423 | }, | |
424 | 1 | 3 => { | |
425 | let dy0 = index.get_diff24(&self.delta_tables.ydt, &self.delta_tables.fat_ydt)?; | |
426 | hor_pred = hor_pred.wrapping_add(dy0); | |
427 | let cur = hor_pred.wrapping_add(self.vert_pred[x + 0]); | |
428 | self.vert_pred[x + 0] = cur; | |
429 | dst[off + x*4 + 0] = cur as u8; | |
430 | dst[off + x*4 + 1] = (cur >> 8) as u8; | |
431 | dst[off + x*4 + 2] = (cur >> 16) as u8; | |
432 | dst[off + x*4 + 3] = 0; | |
433 | let dy1 = index.get_diff24(&self.delta_tables.ydt, &self.delta_tables.fat_ydt)?; | |
434 | hor_pred = hor_pred.wrapping_add(dy1); | |
435 | let cur = hor_pred.wrapping_add(self.vert_pred[x + 1]); | |
436 | self.vert_pred[x + 1] = cur; | |
437 | dst[off + x*4 + 4] = cur as u8; | |
438 | dst[off + x*4 + 5] = (cur >> 8) as u8; | |
439 | dst[off + x*4 + 6] = (cur >> 16) as u8; | |
440 | dst[off + x*4 + 7] = 0; | |
441 | }, | |
442 | 2 => { | |
443 | if self.blk_h == 2 { | |
444 | let dc0 = index.get_diff24(&self.delta_tables.cdt, &self.delta_tables.fat_cdt)?; | |
445 | let dy0 = index.get_diff24(&self.delta_tables.ydt, &self.delta_tables.fat_ydt)?; | |
446 | hor_pred = hor_pred.wrapping_add(dc0); | |
447 | hor_pred = hor_pred.wrapping_add(dy0); | |
448 | let cur = hor_pred.wrapping_add(self.vert_pred[x + 0]); | |
449 | self.vert_pred[x + 0] = cur; | |
450 | dst[off + x*4 + 0] = cur as u8; | |
451 | dst[off + x*4 + 1] = (cur >> 8) as u8; | |
452 | dst[off + x*4 + 2] = (cur >> 16) as u8; | |
453 | dst[off + x*4 + 3] = 0; | |
454 | if self.blk_w == 2 { | |
455 | let dc1 = index.get_diff24(&self.delta_tables.cdt, &self.delta_tables.fat_cdt)?; | |
456 | hor_pred = hor_pred.wrapping_add(dc1); | |
457 | } | |
458 | let dy1 = index.get_diff24(&self.delta_tables.ydt, &self.delta_tables.fat_ydt)?; | |
459 | hor_pred = hor_pred.wrapping_add(dy1); | |
460 | let cur = hor_pred.wrapping_add(self.vert_pred[x + 1]); | |
461 | self.vert_pred[x + 1] = cur; | |
462 | dst[off + x*4 + 4] = cur as u8; | |
463 | dst[off + x*4 + 5] = (cur >> 8) as u8; | |
464 | dst[off + x*4 + 6] = (cur >> 16) as u8; | |
465 | dst[off + x*4 + 7] = 0; | |
466 | } else { | |
467 | let dy0 = index.get_diff24(&self.delta_tables.ydt, &self.delta_tables.fat_ydt)?; | |
468 | hor_pred = hor_pred.wrapping_add(dy0); | |
469 | let cur = hor_pred.wrapping_add(self.vert_pred[x + 0]); | |
470 | self.vert_pred[x + 0] = cur; | |
471 | dst[off + x*4 + 0] = cur as u8; | |
472 | dst[off + x*4 + 1] = (cur >> 8) as u8; | |
473 | dst[off + x*4 + 2] = (cur >> 16) as u8; | |
474 | dst[off + x*4 + 3] = 0; | |
475 | let dy1 = index.get_diff24(&self.delta_tables.ydt, &self.delta_tables.fat_ydt)?; | |
476 | hor_pred = hor_pred.wrapping_add(dy1); | |
477 | let cur = hor_pred.wrapping_add(self.vert_pred[x + 1]); | |
478 | self.vert_pred[x + 1] = cur; | |
479 | dst[off + x*4 + 4] = cur as u8; | |
480 | dst[off + x*4 + 5] = (cur >> 8) as u8; | |
481 | dst[off + x*4 + 6] = (cur >> 16) as u8; | |
482 | dst[off + x*4 + 7] = 0; | |
483 | } | |
484 | }, | |
485 | _ => unreachable!(), | |
486 | }; | |
487 | } else { | |
8a7352c0 KS |
488 | let cur = u32::from(dst[off + x*4 + 0]) |
489 | | (u32::from(dst[off + x*4 + 1]) << 8) | |
490 | | (u32::from(dst[off + x*4 + 2]) << 16) | |
491 | | (u32::from(dst[off + x*4 + 3]) << 24); | |
2d90e8b6 | 492 | self.vert_pred[x + 0] = cur; |
8a7352c0 KS |
493 | let cur = u32::from(dst[off + x*4 + 4]) |
494 | | (u32::from(dst[off + x*4 + 5]) << 8) | |
495 | | (u32::from(dst[off + x*4 + 6]) << 16) | |
496 | | (u32::from(dst[off + x*4 + 7]) << 24); | |
2d90e8b6 KS |
497 | hor_pred = cur.wrapping_sub(self.vert_pred[x + 1]); |
498 | self.vert_pred[x + 1] = cur; | |
499 | } | |
500 | } | |
501 | if (y & 3) != 3 { | |
502 | mask.reset_row(); | |
503 | } else { | |
504 | mask.next_row(); | |
505 | } | |
506 | off += stride; | |
507 | } | |
508 | Ok(()) | |
509 | } | |
510 | } | |
511 | ||
512 | impl NADecoder for TM1Decoder { | |
01613464 | 513 | fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { |
2d90e8b6 KS |
514 | if let NACodecTypeInfo::Video(vinfo) = info.get_properties() { |
515 | let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(vinfo.get_width(), vinfo.get_height(), false, YUV410_FORMAT)); | |
2422d969 | 516 | self.info = NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()).into_ref(); |
2d90e8b6 KS |
517 | Ok(()) |
518 | } else { | |
519 | Err(DecoderError::InvalidData) | |
520 | } | |
521 | } | |
01613464 | 522 | fn decode(&mut self, _supp: &mut NADecoderSupport, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { |
2d90e8b6 KS |
523 | let src = pkt.get_buffer(); |
524 | validate!(src.len() > 10); | |
525 | let hdr_size = (src[0].rotate_left(3) & 0x7F) as usize; | |
526 | validate!(hdr_size >= 12 && hdr_size < src.len()); | |
527 | let mut hdr: [u8; 127] = [0; 127]; | |
528 | for i in 1..hdr_size { | |
529 | hdr[i - 1] = src[i] ^ src[i + 1]; | |
530 | } | |
531 | let mut mr = MemoryReader::new_read(&hdr[0..hdr_size-1]); | |
532 | let mut br = ByteReader::new(&mut mr); | |
533 | ||
534 | let tm1type = br.read_byte()? as usize; | |
535 | let delta_set = br.read_byte()? as usize; | |
536 | let table_idx = br.read_byte()? as usize; | |
537 | let height = br.read_u16le()? as usize; | |
538 | let width = br.read_u16le()? as usize; | |
539 | let _frameno = br.read_u16le()? as usize; | |
540 | let version = br.read_byte()?; | |
541 | let meta_type = br.read_byte()?; | |
542 | validate!(width > 0 && height > 0); | |
543 | let is_intra; | |
544 | let mut is_sprite = false; | |
545 | let mut spr_xoff = 0; | |
546 | let mut spr_yoff = 0; | |
547 | let mut spr_width = 0; | |
548 | let mut spr_height = 0; | |
549 | if version >= 2 { | |
550 | validate!(meta_type <= 3); | |
551 | if meta_type >= 2 { | |
552 | let frameinfo = br.read_byte()?; | |
553 | let _control = br.read_byte()?; | |
554 | ||
555 | is_intra = ((frameinfo & 0x10) != 0) || ((frameinfo & 0x08) == 0); | |
556 | } else { | |
557 | is_intra = true; | |
558 | } | |
559 | if meta_type == 3 { | |
560 | spr_xoff = br.read_u16le()? as usize; | |
561 | spr_yoff = br.read_u16le()? as usize; | |
562 | spr_width = br.read_u16le()? as usize; | |
563 | spr_height = br.read_u16le()? as usize; | |
564 | is_sprite = true; | |
565 | } | |
566 | } else { | |
567 | is_intra = true; | |
568 | } | |
569 | validate!(tm1type < TM1_COMPR_TYPES.len()); | |
570 | let cinfo = TM1_COMPR_TYPES[tm1type]; | |
571 | if cinfo.is_none() { | |
572 | //check for missing ref | |
573 | let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), NABufferType::None); | |
574 | frm.set_keyframe(false); | |
575 | frm.set_frame_type(FrameType::Skip); | |
171860fc | 576 | return Ok(frm.into_ref()); |
2d90e8b6 KS |
577 | } |
578 | let compr_info = cinfo.unwrap(); | |
579 | let is_24bit = !is_sprite && compr_info.is_24bit; | |
580 | ||
581 | let vec_idx = if ((tm1type & 1) != 0) && (meta_type > 0) { 1 } else { table_idx }; | |
582 | validate!((delta_set < DUCK_Y_DELTAS.len()) && (vec_idx > 0) && (vec_idx <= DUCK_VECTABLES.len())); | |
583 | self.set_delta_tables(delta_set, vec_idx, is_24bit); | |
584 | ||
585 | let out_width = if is_24bit { width >> 1 } else { width }; | |
586 | let mask_row_size = if is_sprite { | |
587 | ((spr_width >> 2) + 3) >> 2 | |
588 | } else if is_intra { | |
589 | 0 | |
590 | } else { | |
591 | ((width >> 2) + 7) >> 3 | |
592 | }; | |
593 | let mask_size = mask_row_size * (if is_sprite { spr_height >> 2 } else { height >> 2 }); | |
594 | let mask_bits = &src[hdr_size..][..mask_size]; | |
595 | let index_bytes = &src[hdr_size+mask_size..]; | |
596 | validate!(src.len() >= hdr_size + mask_size); | |
37952415 | 597 | self.vert_pred.clear(); |
2d90e8b6 KS |
598 | self.vert_pred.resize(out_width, 0); |
599 | ||
600 | if is_intra || is_sprite { | |
601 | let fmt = if is_24bit { BGR0_FORMAT } else { RGB555_FORMAT }; | |
602 | let myinfo = NAVideoInfo::new(out_width, height, false, fmt); | |
8a7352c0 | 603 | let bufinfo = alloc_video_buffer(myinfo, 2)?; |
2d90e8b6 KS |
604 | self.lastframe.reset(); |
605 | if !is_24bit { | |
606 | self.lastframe.set16(bufinfo.get_vbuf16().unwrap()); | |
607 | } else { | |
608 | self.lastframe.set24(bufinfo.get_vbuf().unwrap()); | |
609 | } | |
610 | } | |
611 | ||
612 | self.blk_w = compr_info.block_w; | |
613 | self.blk_h = compr_info.block_h; | |
6f263099 KS |
614 | let mut mask = MaskState::new(is_intra && !is_sprite, mask_bits, mask_row_size); |
615 | let mut index = IndexState::new(index_bytes); | |
2d90e8b6 KS |
616 | let bufinfo; |
617 | if !is_24bit { | |
618 | if let Some(mut buf) = self.lastframe.get16() { | |
619 | let stride = buf.get_stride(0); | |
620 | { | |
1a967e6b | 621 | let data = buf.get_data_mut().unwrap(); |
2d90e8b6 KS |
622 | if !is_sprite { |
623 | self.decode_16bit(data.as_mut_slice(), stride, out_width, height, &mut mask, &mut index)?; | |
624 | } else { | |
625 | validate!(spr_xoff + spr_width <= out_width); | |
626 | validate!(spr_yoff + spr_height <= height); | |
627 | for el in data.iter_mut() { *el = 0; } | |
628 | let dst = &mut data[spr_xoff + spr_yoff * stride..]; | |
629 | self.decode_sprite(dst, stride, spr_width, spr_height, &mut mask, &mut index)?; | |
630 | } | |
631 | } | |
632 | bufinfo = NABufferType::Video16(buf); | |
633 | } else { | |
634 | return Err(DecoderError::MissingReference); | |
635 | } | |
8a7352c0 KS |
636 | } else if let Some(mut buf) = self.lastframe.get24() { |
637 | let stride = buf.get_stride(0); | |
638 | { | |
639 | let data = buf.get_data_mut().unwrap(); | |
640 | self.decode_24bit(data.as_mut_slice(), stride, out_width, height, &mut mask, &mut index)?; | |
2d90e8b6 | 641 | } |
8a7352c0 KS |
642 | bufinfo = NABufferType::VideoPacked(buf); |
643 | } else { | |
644 | return Err(DecoderError::MissingReference); | |
2d90e8b6 KS |
645 | } |
646 | ||
647 | let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo); | |
648 | frm.set_keyframe(is_intra || is_sprite); | |
649 | frm.set_frame_type(if is_intra { FrameType::I } else { FrameType::P }); | |
171860fc | 650 | Ok(frm.into_ref()) |
2d90e8b6 | 651 | } |
f9be4e75 KS |
652 | fn flush(&mut self) { |
653 | self.lastframe.reset(); | |
654 | } | |
2d90e8b6 | 655 | } |
1b8522d6 | 656 | |
7d57ae2f KS |
657 | impl NAOptionHandler for TM1Decoder { |
658 | fn get_supported_options(&self) -> &[NAOptionDefinition] { &[] } | |
659 | fn set_options(&mut self, _options: &[NAOption]) { } | |
660 | fn query_option_value(&self, _name: &str) -> Option<NAValue> { None } | |
661 | } | |
662 | ||
08a1fab7 | 663 | pub fn get_decoder() -> Box<dyn NADecoder + Send> { |
2d90e8b6 | 664 | Box::new(TM1Decoder::new()) |
1b8522d6 KS |
665 | } |
666 | ||
2d90e8b6 KS |
667 | #[cfg(test)] |
668 | mod test { | |
669 | use nihav_core::codecs::RegisteredDecoders; | |
670 | use nihav_core::demuxers::RegisteredDemuxers; | |
ce742854 | 671 | use nihav_codec_support::test::dec_video::*; |
78fb6560 | 672 | use crate::duck_register_all_decoders; |
e64739f8 | 673 | use nihav_commonfmt::generic_register_all_demuxers; |
2d90e8b6 KS |
674 | #[test] |
675 | fn test_tm1() { | |
676 | let mut dmx_reg = RegisteredDemuxers::new(); | |
677 | generic_register_all_demuxers(&mut dmx_reg); | |
678 | let mut dec_reg = RegisteredDecoders::new(); | |
78fb6560 | 679 | duck_register_all_decoders(&mut dec_reg); |
2d90e8b6 | 680 | |
886cde48 | 681 | // sample: https://samples.mplayerhq.hu/V-codecs/DUCK/phant2-940.duk |
16b13997 KS |
682 | test_decoding("avi", "truemotion1", "assets/Duck/phant2-940.duk", Some(12), &dmx_reg, &dec_reg, |
683 | ExpectedTestResult::MD5Frames(vec![ | |
684 | [0x989e62b8, 0x5d85c23c, 0x1cffba6d, 0xe599f1c4], | |
685 | [0xc4231321, 0x25561487, 0x9db11f57, 0x4faeb9a5], | |
686 | [0x36e3a831, 0xdbd21f89, 0x0a446071, 0xf6d31ee7], | |
687 | [0x0af640af, 0x64bc2bac, 0x0e95dd72, 0x9e55360b], | |
688 | [0xbc9c5f8b, 0x6c06f2bc, 0x216f4129, 0x3a421337], | |
689 | [0xd8ea7297, 0xce5f79fc, 0x46071f4c, 0xaed7fb7a], | |
690 | [0x87617060, 0x72ce8df8, 0xde42eaa6, 0x804a6f45], | |
691 | [0xfd8c45b3, 0xf424b683, 0xb4d6a9bd, 0xc622d0b9], | |
692 | [0x6c233746, 0xba8ed68e, 0xc0ed0e85, 0xc99e1dc0], | |
693 | [0x5842aac0, 0xd3d78242, 0x5da21218, 0xea1ed0ad], | |
694 | [0xdea0db20, 0xe2ce3586, 0xf7386649, 0xecc374f9], | |
695 | [0xb80ae9cb, 0x04eb938e, 0xd8a337ee, 0x0054b5ed], | |
696 | [0xf8b80e1d, 0xd8eb3d6c, 0xa99b23ff, 0x562851a1]])); | |
697 | test_decoding("avi", "truemotion1", "assets/Duck/SPRITES.AVI", Some(2), &dmx_reg, &dec_reg, | |
698 | ExpectedTestResult::MD5([0xb89a4275, 0xf9797f5f, 0xe53c1ccd, 0xfa163e02])); | |
2d90e8b6 | 699 | //let file = "assets/Duck/AVI-DUCK-dk3.duk"; |
16b13997 | 700 | //let file = "assets/Duck/phant2-940.duk"; |
2d90e8b6 KS |
701 | //let file = "assets/Duck/bugsampler-m01-16bit.avi"; |
702 | //let file = "assets/Duck/sonic3dblast_intro.avi"; | |
703 | //let file = "assets/Duck/BUTTONS.AVI"; | |
704 | //let file = "assets/Duck/SPRITES.AVI"; | |
705 | //let file = "assets/Duck/TRICORD.AVI"; | |
16b13997 | 706 | //test_file_decoding("avi", file, Some(42), true, false, None/*Some("tm1-")*/, &dmx_reg, &dec_reg); |
2d90e8b6 KS |
707 | } |
708 | } | |
709 | ||
710 | #[derive(Clone,Copy)] | |
711 | struct TM1ComprInfo { | |
712 | is_24bit: bool, | |
713 | block_w: usize, | |
714 | block_h: usize, | |
715 | } | |
716 | ||
717 | const TM1_COMPR_TYPES: [Option<TM1ComprInfo>; 17] = [ | |
718 | None, | |
719 | Some(TM1ComprInfo { is_24bit: false, block_w: 4, block_h: 4 }), | |
720 | Some(TM1ComprInfo { is_24bit: false, block_w: 4, block_h: 4 }), | |
721 | Some(TM1ComprInfo { is_24bit: false, block_w: 4, block_h: 2 }), | |
722 | Some(TM1ComprInfo { is_24bit: false, block_w: 4, block_h: 2 }), | |
723 | Some(TM1ComprInfo { is_24bit: false, block_w: 2, block_h: 4 }), | |
724 | Some(TM1ComprInfo { is_24bit: false, block_w: 2, block_h: 4 }), | |
725 | Some(TM1ComprInfo { is_24bit: false, block_w: 2, block_h: 2 }), | |
726 | Some(TM1ComprInfo { is_24bit: false, block_w: 2, block_h: 2 }), | |
727 | None, | |
728 | Some(TM1ComprInfo { is_24bit: true, block_w: 4, block_h: 4 }), | |
729 | None, | |
730 | Some(TM1ComprInfo { is_24bit: true, block_w: 4, block_h: 2 }), | |
731 | None, | |
732 | Some(TM1ComprInfo { is_24bit: true, block_w: 2, block_h: 4 }), | |
733 | None, | |
734 | Some(TM1ComprInfo { is_24bit: true, block_w: 2, block_h: 2 }), | |
735 | ]; | |
736 | ||
737 | const DUCK_Y_DELTAS: [[i32; 8]; 4] = [ | |
738 | [ 0, -1, 1, -3, 3, -6, 6, -6 ], | |
739 | [ 0, -1, 2, -3, 4, -6, 6, -6 ], | |
740 | [ 2, -3, 10, -10, 23, -23, 47, -47 ], | |
741 | [ 0, -2, 2, -8, 8, -18, 18, -40 ] | |
742 | ]; | |
743 | const DUCK_Y_FAT_DELTA3: [i32; 8] = [ 0, -15, 50, -50, 115, -115, 235, -235 ]; | |
744 | const DUCK_Y_FAT_DELTA4: [i32; 8] = [ 0, 40, 80, -76, 160, -154, 236, -236 ]; | |
745 | const DUCK_Y_FAT_DELTAS: [&[i32]; 4] = [ | |
746 | &DUCK_Y_FAT_DELTA3, &DUCK_Y_FAT_DELTA3, &DUCK_Y_FAT_DELTA3, &DUCK_Y_FAT_DELTA4 | |
747 | ]; | |
748 | ||
749 | const DUCK_C_DELTAS: [[i32; 8]; 4] = [ | |
750 | [ 0, -1, 1, -2, 3, -4, 5, -4 ], | |
751 | [ 0, -1, 1, -2, 3, -4, 5, -4 ], | |
752 | [ 0, -4, 3, -16, 20, -32, 36, -32 ], | |
753 | [ 0, -2, 2, -8, 8, -18, 18, -40 ] | |
754 | ]; | |
755 | const DUCK_C_FAT_DELTA3: [i32; 8] = [ 0, -20, 15, -80, 100, -160, 180, -160 ]; | |
756 | const DUCK_C_FAT_DELTAS: [&[i32]; 4] = [ | |
757 | &DUCK_C_FAT_DELTA3, &DUCK_C_FAT_DELTA3, &DUCK_C_FAT_DELTA3, &DUCK_Y_FAT_DELTA4 | |
758 | ]; | |
759 | ||
760 | const DUCK_VECTBL2: &[u8] = &[ | |
761 | 0x8,0x00,0x00,0x00,0x00, | |
762 | 0x8,0x00,0x00,0x00,0x00, | |
763 | 0x8,0x10,0x00,0x00,0x00, | |
764 | 0x8,0x01,0x00,0x00,0x00, | |
765 | 0x8,0x00,0x10,0x00,0x00, | |
766 | 0x8,0x00,0x01,0x00,0x00, | |
767 | 0x8,0x00,0x00,0x10,0x00, | |
768 | 0x8,0x00,0x00,0x01,0x00, | |
769 | 0x8,0x00,0x00,0x00,0x10, | |
770 | 0x8,0x00,0x00,0x00,0x01, | |
771 | 0x6,0x00,0x00,0x00, | |
772 | 0x6,0x10,0x00,0x00, | |
773 | 0x6,0x01,0x00,0x00, | |
774 | 0x6,0x00,0x10,0x00, | |
775 | 0x6,0x00,0x01,0x00, | |
776 | 0x6,0x00,0x00,0x01, | |
777 | 0x6,0x00,0x00,0x10, | |
778 | 0x6,0x00,0x00,0x02, | |
779 | 0x6,0x00,0x00,0x20, | |
780 | 0x6,0x20,0x10,0x00, | |
781 | 0x6,0x00,0x02,0x01, | |
782 | 0x6,0x00,0x20,0x10, | |
783 | 0x6,0x02,0x01,0x00, | |
784 | 0x6,0x11,0x00,0x00, | |
785 | 0x6,0x00,0x20,0x00, | |
786 | 0x6,0x00,0x02,0x00, | |
787 | 0x6,0x20,0x00,0x00, | |
788 | 0x6,0x01,0x10,0x00, | |
789 | 0x6,0x02,0x00,0x00, | |
790 | 0x6,0x01,0x00,0x02, | |
791 | 0x6,0x10,0x00,0x20, | |
792 | 0x6,0x00,0x01,0x02, | |
793 | 0x6,0x10,0x01,0x00, | |
794 | 0x6,0x00,0x10,0x20, | |
795 | 0x6,0x10,0x10,0x00, | |
796 | 0x6,0x10,0x00,0x01, | |
797 | 0x6,0x20,0x00,0x10, | |
798 | 0x6,0x02,0x00,0x01, | |
799 | 0x6,0x01,0x01,0x00, | |
800 | 0x6,0x01,0x00,0x10, | |
801 | 0x6,0x00,0x11,0x00, | |
802 | 0x6,0x10,0x00,0x02, | |
803 | 0x6,0x00,0x01,0x10, | |
804 | 0x6,0x00,0x00,0x11, | |
805 | 0x6,0x10,0x00,0x10, | |
806 | 0x6,0x01,0x00,0x01, | |
807 | 0x6,0x00,0x00,0x22, | |
808 | 0x6,0x02,0x01,0x01, | |
809 | 0x6,0x10,0x20,0x10, | |
810 | 0x6,0x01,0x02,0x01, | |
811 | 0x6,0x20,0x10,0x10, | |
812 | 0x6,0x01,0x00,0x20, | |
813 | 0x6,0x00,0x10,0x01, | |
814 | 0x6,0x21,0x10,0x00, | |
815 | 0x6,0x10,0x02,0x01, | |
816 | 0x6,0x12,0x01,0x00, | |
817 | 0x6,0x01,0x20,0x10, | |
818 | 0x6,0x01,0x02,0x00, | |
819 | 0x6,0x10,0x20,0x00, | |
820 | 0x6,0x00,0x10,0x02, | |
821 | 0x6,0x00,0x01,0x20, | |
822 | 0x6,0x00,0x02,0x21, | |
823 | 0x6,0x00,0x02,0x20, | |
824 | 0x6,0x00,0x00,0x12, | |
825 | 0x6,0x00,0x00,0x21, | |
826 | 0x6,0x20,0x11,0x00, | |
827 | 0x6,0x00,0x01,0x01, | |
828 | 0x6,0x11,0x10,0x00, | |
829 | 0x6,0x00,0x20,0x12, | |
830 | 0x6,0x00,0x20,0x11, | |
831 | 0x6,0x20,0x10,0x02, | |
832 | 0x6,0x02,0x01,0x20, | |
833 | 0x6,0x00,0x22,0x11, | |
834 | 0x6,0x00,0x10,0x10, | |
835 | 0x6,0x02,0x11,0x00, | |
836 | 0x6,0x00,0x21,0x10, | |
837 | 0x6,0x00,0x02,0x03, | |
838 | 0x6,0x20,0x10,0x01, | |
839 | 0x6,0x00,0x12,0x01, | |
840 | 0x4,0x11,0x00, | |
841 | 0x4,0x00,0x22, | |
842 | 0x4,0x20,0x00, | |
843 | 0x4,0x01,0x10, | |
844 | 0x4,0x02,0x20, | |
845 | 0x4,0x00,0x20, | |
846 | 0x4,0x02,0x00, | |
847 | 0x4,0x10,0x01, | |
848 | 0x4,0x00,0x11, | |
849 | 0x4,0x02,0x01, | |
850 | 0x4,0x02,0x21, | |
851 | 0x4,0x00,0x02, | |
852 | 0x4,0x20,0x02, | |
853 | 0x4,0x01,0x01, | |
854 | 0x4,0x10,0x10, | |
855 | 0x4,0x10,0x02, | |
856 | 0x4,0x22,0x00, | |
857 | 0x4,0x10,0x00, | |
858 | 0x4,0x01,0x00, | |
859 | 0x4,0x21,0x00, | |
860 | 0x4,0x12,0x00, | |
861 | 0x4,0x00,0x10, | |
862 | 0x4,0x20,0x12, | |
863 | 0x4,0x01,0x11, | |
864 | 0x4,0x00,0x01, | |
865 | 0x4,0x01,0x02, | |
866 | 0x4,0x11,0x02, | |
867 | 0x4,0x11,0x01, | |
868 | 0x4,0x10,0x20, | |
869 | 0x4,0x20,0x01, | |
870 | 0x4,0x22,0x11, | |
871 | 0x4,0x00,0x12, | |
872 | 0x4,0x20,0x10, | |
873 | 0x4,0x22,0x01, | |
874 | 0x4,0x01,0x20, | |
875 | 0x4,0x00,0x21, | |
876 | 0x4,0x10,0x11, | |
877 | 0x4,0x21,0x10, | |
878 | 0x4,0x10,0x22, | |
879 | 0x4,0x02,0x03, | |
880 | 0x4,0x12,0x01, | |
881 | 0x4,0x20,0x11, | |
882 | 0x4,0x11,0x10, | |
883 | 0x4,0x20,0x30, | |
884 | 0x4,0x11,0x20, | |
885 | 0x4,0x02,0x10, | |
886 | 0x4,0x22,0x10, | |
887 | 0x4,0x11,0x11, | |
888 | 0x4,0x30,0x20, | |
889 | 0x4,0x30,0x00, | |
890 | 0x4,0x01,0x22, | |
891 | 0x4,0x01,0x12, | |
892 | 0x4,0x02,0x11, | |
893 | 0x4,0x03,0x02, | |
894 | 0x4,0x03,0x00, | |
895 | 0x4,0x10,0x21, | |
896 | 0x4,0x12,0x20, | |
897 | 0x4,0x00,0x00, | |
898 | 0x4,0x12,0x21, | |
899 | 0x4,0x21,0x11, | |
900 | 0x4,0x02,0x22, | |
901 | 0x4,0x10,0x12, | |
902 | 0x4,0x31,0x00, | |
903 | 0x4,0x20,0x20, | |
904 | 0x4,0x00,0x03, | |
905 | 0x4,0x02,0x02, | |
906 | 0x4,0x22,0x20, | |
907 | 0x4,0x01,0x21, | |
908 | 0x4,0x21,0x02, | |
909 | 0x4,0x21,0x12, | |
910 | 0x4,0x11,0x22, | |
911 | 0x4,0x00,0x30, | |
912 | 0x4,0x12,0x11, | |
913 | 0x4,0x20,0x22, | |
914 | 0x4,0x31,0x20, | |
915 | 0x4,0x21,0x30, | |
916 | 0x4,0x22,0x02, | |
917 | 0x4,0x22,0x22, | |
918 | 0x4,0x20,0x31, | |
919 | 0x4,0x13,0x02, | |
920 | 0x4,0x03,0x10, | |
921 | 0x4,0x11,0x12, | |
922 | 0x4,0x00,0x13, | |
923 | 0x4,0x21,0x01, | |
924 | 0x4,0x12,0x03, | |
925 | 0x4,0x13,0x00, | |
926 | 0x4,0x13,0x10, | |
927 | 0x4,0x02,0x13, | |
928 | 0x4,0x30,0x01, | |
929 | 0x4,0x12,0x10, | |
930 | 0x4,0x22,0x13, | |
931 | 0x4,0x03,0x12, | |
932 | 0x4,0x31,0x01, | |
933 | 0x4,0x30,0x22, | |
934 | 0x4,0x00,0x31, | |
935 | 0x4,0x01,0x31, | |
936 | 0x4,0x02,0x23, | |
937 | 0x4,0x01,0x30, | |
938 | 0x4,0x11,0x21, | |
939 | 0x4,0x22,0x21, | |
940 | 0x4,0x01,0x13, | |
941 | 0x4,0x10,0x03, | |
942 | 0x4,0x22,0x03, | |
943 | 0x4,0x30,0x21, | |
944 | 0x4,0x21,0x31, | |
945 | 0x4,0x33,0x00, | |
946 | 0x4,0x13,0x12, | |
947 | 0x4,0x11,0x31, | |
948 | 0x4,0x30,0x02, | |
949 | 0x4,0x12,0x02, | |
950 | 0x4,0x11,0x13, | |
951 | 0x4,0x12,0x22, | |
952 | 0x4,0x20,0x32, | |
953 | 0x4,0x10,0x13, | |
954 | 0x4,0x22,0x31, | |
955 | 0x4,0x21,0x20, | |
956 | 0x4,0x01,0x33, | |
957 | 0x4,0x33,0x10, | |
958 | 0x4,0x20,0x13, | |
959 | 0x4,0x31,0x22, | |
960 | 0x4,0x13,0x30, | |
961 | 0x4,0x01,0x03, | |
962 | 0x4,0x11,0x33, | |
963 | 0x4,0x20,0x21, | |
964 | 0x4,0x13,0x31, | |
965 | 0x4,0x03,0x22, | |
966 | 0x4,0x31,0x02, | |
967 | 0x4,0x00,0x24, | |
968 | 0x2,0x00, | |
969 | 0x2,0x10, | |
970 | 0x2,0x20, | |
971 | 0x2,0x30, | |
972 | 0x2,0x40, | |
973 | 0x2,0x50, | |
974 | 0x2,0x60, | |
975 | 0x2,0x01, | |
976 | 0x2,0x11, | |
977 | 0x2,0x21, | |
978 | 0x2,0x31, | |
979 | 0x2,0x41, | |
980 | 0x2,0x51, | |
981 | 0x2,0x61, | |
982 | 0x2,0x02, | |
983 | 0x2,0x12, | |
984 | 0x2,0x22, | |
985 | 0x2,0x32, | |
986 | 0x2,0x42, | |
987 | 0x2,0x52, | |
988 | 0x2,0x62, | |
989 | 0x2,0x03, | |
990 | 0x2,0x13, | |
991 | 0x2,0x23, | |
992 | 0x2,0x33, | |
993 | 0x2,0x43, | |
994 | 0x2,0x53, | |
995 | 0x2,0x63, | |
996 | 0x2,0x04, | |
997 | 0x2,0x14, | |
998 | 0x2,0x24, | |
999 | 0x2,0x34, | |
1000 | 0x2,0x44, | |
1001 | 0x2,0x54, | |
1002 | 0x2,0x64, | |
1003 | 0x2,0x05, | |
1004 | 0x2,0x15, | |
1005 | 0x2,0x25, | |
1006 | 0x2,0x35, | |
1007 | 0x2,0x45, | |
1008 | 0x2,0x55, | |
1009 | 0x2,0x65, | |
1010 | 0x2,0x06, | |
1011 | 0x2,0x16, | |
1012 | 0x2,0x26, | |
1013 | 0x2,0x36, | |
1014 | 0x2,0x46, | |
1015 | 0x2,0x56, | |
1016 | 0x2,0x66 | |
1017 | ]; | |
1018 | ||
1019 | const DUCK_VECTBL3: &[u8] = &[ | |
1020 | 0x6,0x00,0x00,0x00, | |
1021 | 0x6,0x00,0x00,0x00, | |
1022 | 0x6,0x00,0x00,0x01, | |
1023 | 0x6,0x00,0x00,0x10, | |
1024 | 0x6,0x00,0x00,0x11, | |
1025 | 0x6,0x00,0x01,0x00, | |
1026 | 0x6,0x00,0x01,0x01, | |
1027 | 0x6,0x00,0x01,0x10, | |
1028 | 0x6,0x00,0x01,0x11, | |
1029 | 0x6,0x00,0x10,0x00, | |
1030 | 0x6,0x00,0x10,0x01, | |
1031 | 0x6,0x00,0x10,0x10, | |
1032 | 0x6,0x00,0x10,0x11, | |
1033 | 0x6,0x00,0x11,0x00, | |
1034 | 0x6,0x00,0x11,0x01, | |
1035 | 0x6,0x00,0x11,0x10, | |
1036 | 0x6,0x00,0x11,0x11, | |
1037 | 0x6,0x01,0x00,0x00, | |
1038 | 0x6,0x01,0x00,0x01, | |
1039 | 0x6,0x01,0x00,0x10, | |
1040 | 0x6,0x01,0x00,0x11, | |
1041 | 0x6,0x01,0x01,0x00, | |
1042 | 0x6,0x01,0x01,0x01, | |
1043 | 0x6,0x01,0x01,0x10, | |
1044 | 0x6,0x01,0x01,0x11, | |
1045 | 0x6,0x01,0x10,0x00, | |
1046 | 0x6,0x01,0x10,0x01, | |
1047 | 0x6,0x01,0x10,0x10, | |
1048 | 0x6,0x01,0x10,0x11, | |
1049 | 0x6,0x01,0x11,0x00, | |
1050 | 0x6,0x01,0x11,0x01, | |
1051 | 0x6,0x01,0x11,0x10, | |
1052 | 0x6,0x01,0x11,0x11, | |
1053 | 0x6,0x10,0x00,0x00, | |
1054 | 0x6,0x10,0x00,0x01, | |
1055 | 0x6,0x10,0x00,0x10, | |
1056 | 0x6,0x10,0x00,0x11, | |
1057 | 0x6,0x10,0x01,0x00, | |
1058 | 0x6,0x10,0x01,0x01, | |
1059 | 0x6,0x10,0x01,0x10, | |
1060 | 0x6,0x10,0x01,0x11, | |
1061 | 0x6,0x10,0x10,0x00, | |
1062 | 0x6,0x10,0x10,0x01, | |
1063 | 0x6,0x10,0x10,0x10, | |
1064 | 0x6,0x10,0x10,0x11, | |
1065 | 0x6,0x10,0x11,0x00, | |
1066 | 0x6,0x10,0x11,0x01, | |
1067 | 0x6,0x10,0x11,0x10, | |
1068 | 0x6,0x10,0x11,0x11, | |
1069 | 0x6,0x11,0x00,0x00, | |
1070 | 0x6,0x11,0x00,0x01, | |
1071 | 0x6,0x11,0x00,0x10, | |
1072 | 0x6,0x11,0x00,0x11, | |
1073 | 0x6,0x11,0x01,0x00, | |
1074 | 0x6,0x11,0x01,0x01, | |
1075 | 0x6,0x11,0x01,0x10, | |
1076 | 0x6,0x11,0x01,0x11, | |
1077 | 0x6,0x11,0x10,0x00, | |
1078 | 0x6,0x11,0x10,0x01, | |
1079 | 0x6,0x11,0x10,0x10, | |
1080 | 0x6,0x11,0x10,0x11, | |
1081 | 0x6,0x11,0x11,0x00, | |
1082 | 0x6,0x11,0x11,0x01, | |
1083 | 0x6,0x11,0x11,0x10, | |
1084 | 0x4,0x00,0x00, | |
1085 | 0x4,0x00,0x01, | |
1086 | 0x4,0x00,0x02, | |
1087 | 0x4,0x00,0x03, | |
1088 | 0x4,0x00,0x10, | |
1089 | 0x4,0x00,0x11, | |
1090 | 0x4,0x00,0x12, | |
1091 | 0x4,0x00,0x13, | |
1092 | 0x4,0x00,0x20, | |
1093 | 0x4,0x00,0x21, | |
1094 | 0x4,0x00,0x22, | |
1095 | 0x4,0x00,0x23, | |
1096 | 0x4,0x00,0x30, | |
1097 | 0x4,0x00,0x31, | |
1098 | 0x4,0x00,0x32, | |
1099 | 0x4,0x00,0x33, | |
1100 | 0x4,0x01,0x00, | |
1101 | 0x4,0x01,0x01, | |
1102 | 0x4,0x01,0x02, | |
1103 | 0x4,0x01,0x03, | |
1104 | 0x4,0x01,0x10, | |
1105 | 0x4,0x01,0x11, | |
1106 | 0x4,0x01,0x12, | |
1107 | 0x4,0x01,0x13, | |
1108 | 0x4,0x01,0x20, | |
1109 | 0x4,0x01,0x21, | |
1110 | 0x4,0x01,0x22, | |
1111 | 0x4,0x01,0x23, | |
1112 | 0x4,0x01,0x30, | |
1113 | 0x4,0x01,0x31, | |
1114 | 0x4,0x01,0x32, | |
1115 | 0x4,0x01,0x33, | |
1116 | 0x4,0x02,0x00, | |
1117 | 0x4,0x02,0x01, | |
1118 | 0x4,0x02,0x02, | |
1119 | 0x4,0x02,0x03, | |
1120 | 0x4,0x02,0x10, | |
1121 | 0x4,0x02,0x11, | |
1122 | 0x4,0x02,0x12, | |
1123 | 0x4,0x02,0x13, | |
1124 | 0x4,0x02,0x20, | |
1125 | 0x4,0x02,0x21, | |
1126 | 0x4,0x02,0x22, | |
1127 | 0x4,0x02,0x23, | |
1128 | 0x4,0x02,0x30, | |
1129 | 0x4,0x02,0x31, | |
1130 | 0x4,0x02,0x32, | |
1131 | 0x4,0x02,0x33, | |
1132 | 0x4,0x03,0x00, | |
1133 | 0x4,0x03,0x01, | |
1134 | 0x4,0x03,0x02, | |
1135 | 0x4,0x03,0x03, | |
1136 | 0x4,0x03,0x10, | |
1137 | 0x4,0x03,0x11, | |
1138 | 0x4,0x03,0x12, | |
1139 | 0x4,0x03,0x13, | |
1140 | 0x4,0x03,0x20, | |
1141 | 0x4,0x03,0x21, | |
1142 | 0x4,0x03,0x22, | |
1143 | 0x4,0x03,0x23, | |
1144 | 0x4,0x03,0x30, | |
1145 | 0x4,0x03,0x31, | |
1146 | 0x4,0x03,0x32, | |
1147 | 0x4,0x03,0x33, | |
1148 | 0x4,0x10,0x00, | |
1149 | 0x4,0x10,0x01, | |
1150 | 0x4,0x10,0x02, | |
1151 | 0x4,0x10,0x03, | |
1152 | 0x4,0x10,0x10, | |
1153 | 0x4,0x10,0x11, | |
1154 | 0x4,0x10,0x12, | |
1155 | 0x4,0x10,0x13, | |
1156 | 0x4,0x10,0x20, | |
1157 | 0x4,0x10,0x21, | |
1158 | 0x4,0x10,0x22, | |
1159 | 0x4,0x10,0x23, | |
1160 | 0x4,0x10,0x30, | |
1161 | 0x4,0x10,0x31, | |
1162 | 0x4,0x10,0x32, | |
1163 | 0x4,0x10,0x33, | |
1164 | 0x4,0x11,0x00, | |
1165 | 0x4,0x11,0x01, | |
1166 | 0x4,0x11,0x02, | |
1167 | 0x4,0x11,0x03, | |
1168 | 0x4,0x11,0x10, | |
1169 | 0x4,0x11,0x11, | |
1170 | 0x4,0x11,0x12, | |
1171 | 0x4,0x11,0x13, | |
1172 | 0x4,0x11,0x20, | |
1173 | 0x4,0x11,0x21, | |
1174 | 0x4,0x11,0x22, | |
1175 | 0x4,0x11,0x23, | |
1176 | 0x4,0x11,0x30, | |
1177 | 0x4,0x11,0x31, | |
1178 | 0x4,0x11,0x32, | |
1179 | 0x4,0x11,0x33, | |
1180 | 0x4,0x12,0x00, | |
1181 | 0x4,0x12,0x01, | |
1182 | 0x4,0x12,0x02, | |
1183 | 0x4,0x12,0x03, | |
1184 | 0x4,0x12,0x10, | |
1185 | 0x4,0x12,0x11, | |
1186 | 0x4,0x12,0x12, | |
1187 | 0x4,0x12,0x13, | |
1188 | 0x4,0x12,0x20, | |
1189 | 0x4,0x12,0x21, | |
1190 | 0x4,0x12,0x22, | |
1191 | 0x4,0x12,0x23, | |
1192 | 0x4,0x12,0x30, | |
1193 | 0x4,0x12,0x31, | |
1194 | 0x4,0x12,0x32, | |
1195 | 0x4,0x12,0x33, | |
1196 | 0x4,0x13,0x00, | |
1197 | 0x4,0x13,0x01, | |
1198 | 0x4,0x13,0x02, | |
1199 | 0x4,0x13,0x03, | |
1200 | 0x4,0x13,0x10, | |
1201 | 0x4,0x13,0x11, | |
1202 | 0x4,0x13,0x12, | |
1203 | 0x4,0x13,0x13, | |
1204 | 0x4,0x13,0x20, | |
1205 | 0x4,0x13,0x21, | |
1206 | 0x4,0x13,0x22, | |
1207 | 0x4,0x13,0x23, | |
1208 | 0x4,0x13,0x30, | |
1209 | 0x4,0x13,0x31, | |
1210 | 0x4,0x13,0x32, | |
1211 | 0x4,0x13,0x33, | |
1212 | 0x2,0x00, | |
1213 | 0x2,0x10, | |
1214 | 0x2,0x20, | |
1215 | 0x2,0x30, | |
1216 | 0x2,0x40, | |
1217 | 0x2,0x50, | |
1218 | 0x2,0x60, | |
1219 | 0x2,0x70, | |
1220 | 0x2,0x01, | |
1221 | 0x2,0x11, | |
1222 | 0x2,0x21, | |
1223 | 0x2,0x31, | |
1224 | 0x2,0x41, | |
1225 | 0x2,0x51, | |
1226 | 0x2,0x61, | |
1227 | 0x2,0x71, | |
1228 | 0x2,0x02, | |
1229 | 0x2,0x12, | |
1230 | 0x2,0x22, | |
1231 | 0x2,0x32, | |
1232 | 0x2,0x42, | |
1233 | 0x2,0x52, | |
1234 | 0x2,0x62, | |
1235 | 0x2,0x72, | |
1236 | 0x2,0x03, | |
1237 | 0x2,0x13, | |
1238 | 0x2,0x23, | |
1239 | 0x2,0x33, | |
1240 | 0x2,0x43, | |
1241 | 0x2,0x53, | |
1242 | 0x2,0x63, | |
1243 | 0x2,0x73, | |
1244 | 0x2,0x04, | |
1245 | 0x2,0x14, | |
1246 | 0x2,0x24, | |
1247 | 0x2,0x34, | |
1248 | 0x2,0x44, | |
1249 | 0x2,0x54, | |
1250 | 0x2,0x64, | |
1251 | 0x2,0x74, | |
1252 | 0x2,0x05, | |
1253 | 0x2,0x15, | |
1254 | 0x2,0x25, | |
1255 | 0x2,0x35, | |
1256 | 0x2,0x45, | |
1257 | 0x2,0x55, | |
1258 | 0x2,0x65, | |
1259 | 0x2,0x75, | |
1260 | 0x2,0x06, | |
1261 | 0x2,0x16, | |
1262 | 0x2,0x26, | |
1263 | 0x2,0x36, | |
1264 | 0x2,0x46, | |
1265 | 0x2,0x56, | |
1266 | 0x2,0x66, | |
1267 | 0x2,0x76, | |
1268 | 0x2,0x07, | |
1269 | 0x2,0x17, | |
1270 | 0x2,0x27, | |
1271 | 0x2,0x37, | |
1272 | 0x2,0x47, | |
1273 | 0x2,0x57, | |
1274 | 0x2,0x67, | |
1275 | 0x2,0x77 | |
1276 | ]; | |
1277 | ||
1278 | const DUCK_VECTBL4: &[u8] = &[ | |
1279 | 0x8,0x00,0x00,0x00,0x00, | |
1280 | 0x8,0x00,0x00,0x00,0x00, | |
1281 | 0x8,0x20,0x00,0x00,0x00, | |
1282 | 0x8,0x00,0x00,0x00,0x01, | |
1283 | 0x8,0x10,0x00,0x00,0x00, | |
1284 | 0x8,0x00,0x00,0x00,0x02, | |
1285 | 0x8,0x01,0x00,0x00,0x00, | |
1286 | 0x8,0x00,0x00,0x00,0x10, | |
1287 | 0x8,0x02,0x00,0x00,0x00, | |
1288 | 0x6,0x00,0x00,0x00, | |
1289 | 0x6,0x20,0x00,0x00, | |
1290 | 0x6,0x00,0x00,0x01, | |
1291 | 0x6,0x10,0x00,0x00, | |
1292 | 0x6,0x00,0x00,0x02, | |
1293 | 0x6,0x00,0x10,0x00, | |
1294 | 0x6,0x00,0x20,0x00, | |
1295 | 0x6,0x00,0x02,0x00, | |
1296 | 0x6,0x00,0x01,0x00, | |
1297 | 0x6,0x01,0x00,0x00, | |
1298 | 0x6,0x00,0x00,0x20, | |
1299 | 0x6,0x02,0x00,0x00, | |
1300 | 0x6,0x00,0x00,0x10, | |
1301 | 0x6,0x10,0x00,0x20, | |
1302 | 0x6,0x01,0x00,0x02, | |
1303 | 0x6,0x20,0x00,0x10, | |
1304 | 0x6,0x02,0x00,0x01, | |
1305 | 0x6,0x20,0x10,0x00, | |
1306 | 0x6,0x00,0x12,0x00, | |
1307 | 0x6,0x00,0x02,0x01, | |
1308 | 0x6,0x02,0x01,0x00, | |
1309 | 0x6,0x00,0x21,0x00, | |
1310 | 0x6,0x00,0x01,0x02, | |
1311 | 0x6,0x00,0x20,0x10, | |
1312 | 0x6,0x00,0x00,0x21, | |
1313 | 0x6,0x00,0x00,0x12, | |
1314 | 0x6,0x00,0x01,0x20, | |
1315 | 0x6,0x12,0x00,0x00, | |
1316 | 0x6,0x00,0x10,0x20, | |
1317 | 0x6,0x01,0x20,0x00, | |
1318 | 0x6,0x02,0x10,0x00, | |
1319 | 0x6,0x10,0x20,0x00, | |
1320 | 0x6,0x01,0x02,0x00, | |
1321 | 0x6,0x21,0x00,0x00, | |
1322 | 0x6,0x00,0x02,0x10, | |
1323 | 0x6,0x20,0x01,0x00, | |
1324 | 0x6,0x00,0x22,0x00, | |
1325 | 0x6,0x10,0x02,0x00, | |
1326 | 0x6,0x00,0x10,0x02, | |
1327 | 0x6,0x11,0x00,0x00, | |
1328 | 0x6,0x00,0x11,0x00, | |
1329 | 0x6,0x22,0x00,0x00, | |
1330 | 0x6,0x20,0x00,0x02, | |
1331 | 0x6,0x10,0x00,0x01, | |
1332 | 0x6,0x00,0x20,0x01, | |
1333 | 0x6,0x02,0x20,0x00, | |
1334 | 0x6,0x01,0x10,0x00, | |
1335 | 0x6,0x01,0x00,0x20, | |
1336 | 0x6,0x00,0x20,0x02, | |
1337 | 0x6,0x01,0x20,0x02, | |
1338 | 0x6,0x10,0x01,0x00, | |
1339 | 0x6,0x02,0x00,0x10, | |
1340 | 0x6,0x00,0x10,0x01, | |
1341 | 0x6,0x10,0x01,0x20, | |
1342 | 0x6,0x20,0x02,0x10, | |
1343 | 0x6,0x00,0x00,0x22, | |
1344 | 0x6,0x10,0x00,0x02, | |
1345 | 0x6,0x00,0x02,0x20, | |
1346 | 0x6,0x20,0x02,0x00, | |
1347 | 0x6,0x00,0x00,0x11, | |
1348 | 0x6,0x02,0x10,0x01, | |
1349 | 0x6,0x00,0x01,0x10, | |
1350 | 0x6,0x00,0x02,0x11, | |
1351 | 0x4,0x01,0x02, | |
1352 | 0x4,0x02,0x01, | |
1353 | 0x4,0x01,0x00, | |
1354 | 0x4,0x10,0x20, | |
1355 | 0x4,0x20,0x10, | |
1356 | 0x4,0x20,0x00, | |
1357 | 0x4,0x11,0x00, | |
1358 | 0x4,0x02,0x00, | |
1359 | 0x4,0x12,0x00, | |
1360 | 0x4,0x00,0x21, | |
1361 | 0x4,0x22,0x00, | |
1362 | 0x4,0x00,0x12, | |
1363 | 0x4,0x21,0x00, | |
1364 | 0x4,0x02,0x11, | |
1365 | 0x4,0x00,0x01, | |
1366 | 0x4,0x10,0x02, | |
1367 | 0x4,0x02,0x20, | |
1368 | 0x4,0x20,0x11, | |
1369 | 0x4,0x01,0x10, | |
1370 | 0x4,0x21,0x10, | |
1371 | 0x4,0x10,0x00, | |
1372 | 0x4,0x10,0x22, | |
1373 | 0x4,0x20,0x20, | |
1374 | 0x4,0x00,0x22, | |
1375 | 0x4,0x01,0x22, | |
1376 | 0x4,0x20,0x01, | |
1377 | 0x4,0x02,0x02, | |
1378 | 0x4,0x00,0x20, | |
1379 | 0x4,0x00,0x10, | |
1380 | 0x4,0x00,0x11, | |
1381 | 0x4,0x22,0x01, | |
1382 | 0x4,0x11,0x20, | |
1383 | 0x4,0x12,0x01, | |
1384 | 0x4,0x12,0x20, | |
1385 | 0x4,0x11,0x02, | |
1386 | 0x4,0x10,0x10, | |
1387 | 0x4,0x01,0x01, | |
1388 | 0x4,0x02,0x21, | |
1389 | 0x4,0x20,0x12, | |
1390 | 0x4,0x01,0x12, | |
1391 | 0x4,0x22,0x11, | |
1392 | 0x4,0x21,0x12, | |
1393 | 0x4,0x22,0x10, | |
1394 | 0x4,0x21,0x02, | |
1395 | 0x4,0x20,0x02, | |
1396 | 0x4,0x10,0x01, | |
1397 | 0x4,0x00,0x02, | |
1398 | 0x4,0x10,0x21, | |
1399 | 0x4,0x01,0x20, | |
1400 | 0x4,0x11,0x22, | |
1401 | 0x4,0x12,0x21, | |
1402 | 0x4,0x22,0x20, | |
1403 | 0x4,0x02,0x10, | |
1404 | 0x4,0x02,0x22, | |
1405 | 0x4,0x11,0x10, | |
1406 | 0x4,0x22,0x02, | |
1407 | 0x4,0x20,0x21, | |
1408 | 0x4,0x01,0x11, | |
1409 | 0x4,0x11,0x01, | |
1410 | 0x4,0x10,0x12, | |
1411 | 0x4,0x02,0x12, | |
1412 | 0x4,0x20,0x22, | |
1413 | 0x4,0x21,0x20, | |
1414 | 0x4,0x01,0x21, | |
1415 | 0x4,0x12,0x02, | |
1416 | 0x4,0x21,0x11, | |
1417 | 0x4,0x12,0x22, | |
1418 | 0x4,0x12,0x10, | |
1419 | 0x4,0x22,0x21, | |
1420 | 0x4,0x10,0x11, | |
1421 | 0x4,0x21,0x01, | |
1422 | 0x4,0x11,0x12, | |
1423 | 0x4,0x12,0x11, | |
1424 | 0x4,0x66,0x66, | |
1425 | 0x4,0x22,0x22, | |
1426 | 0x4,0x11,0x21, | |
1427 | 0x4,0x11,0x11, | |
1428 | 0x4,0x21,0x22, | |
1429 | 0x4,0x00,0x00, | |
1430 | 0x4,0x22,0x12, | |
1431 | 0x4,0x12,0x12, | |
1432 | 0x4,0x21,0x21, | |
1433 | 0x4,0x42,0x00, | |
1434 | 0x4,0x00,0x04, | |
1435 | 0x4,0x40,0x00, | |
1436 | 0x4,0x30,0x00, | |
1437 | 0x4,0x31,0x00, | |
1438 | 0x4,0x00,0x03, | |
1439 | 0x4,0x00,0x14, | |
1440 | 0x4,0x00,0x13, | |
1441 | 0x4,0x01,0x24, | |
1442 | 0x4,0x20,0x13, | |
1443 | 0x4,0x01,0x42, | |
1444 | 0x4,0x14,0x20, | |
1445 | 0x4,0x42,0x02, | |
1446 | 0x4,0x13,0x00, | |
1447 | 0x4,0x00,0x24, | |
1448 | 0x4,0x31,0x20, | |
1449 | 0x4,0x22,0x13, | |
1450 | 0x4,0x11,0x24, | |
1451 | 0x4,0x12,0x66, | |
1452 | 0x4,0x30,0x01, | |
1453 | 0x4,0x02,0x13, | |
1454 | 0x4,0x12,0x42, | |
1455 | 0x4,0x40,0x10, | |
1456 | 0x4,0x40,0x02, | |
1457 | 0x4,0x01,0x04, | |
1458 | 0x4,0x24,0x00, | |
1459 | 0x4,0x42,0x10, | |
1460 | 0x4,0x21,0x13, | |
1461 | 0x4,0x13,0x12, | |
1462 | 0x4,0x31,0x21, | |
1463 | 0x4,0x21,0x24, | |
1464 | 0x4,0x00,0x40, | |
1465 | 0x4,0x10,0x24, | |
1466 | 0x4,0x10,0x42, | |
1467 | 0x4,0x32,0x01, | |
1468 | 0x4,0x11,0x42, | |
1469 | 0x4,0x20,0x31, | |
1470 | 0x4,0x12,0x40, | |
1471 | 0x2,0x00, | |
1472 | 0x2,0x10, | |
1473 | 0x2,0x20, | |
1474 | 0x2,0x30, | |
1475 | 0x2,0x40, | |
1476 | 0x2,0x50, | |
1477 | 0x2,0x60, | |
1478 | 0x2,0x70, | |
1479 | 0x2,0x01, | |
1480 | 0x2,0x11, | |
1481 | 0x2,0x21, | |
1482 | 0x2,0x31, | |
1483 | 0x2,0x41, | |
1484 | 0x2,0x51, | |
1485 | 0x2,0x61, | |
1486 | 0x2,0x71, | |
1487 | 0x2,0x02, | |
1488 | 0x2,0x12, | |
1489 | 0x2,0x22, | |
1490 | 0x2,0x32, | |
1491 | 0x2,0x42, | |
1492 | 0x2,0x52, | |
1493 | 0x2,0x62, | |
1494 | 0x2,0x72, | |
1495 | 0x2,0x03, | |
1496 | 0x2,0x13, | |
1497 | 0x2,0x23, | |
1498 | 0x2,0x33, | |
1499 | 0x2,0x43, | |
1500 | 0x2,0x53, | |
1501 | 0x2,0x63, | |
1502 | 0x2,0x73, | |
1503 | 0x2,0x04, | |
1504 | 0x2,0x14, | |
1505 | 0x2,0x24, | |
1506 | 0x2,0x34, | |
1507 | 0x2,0x44, | |
1508 | 0x2,0x54, | |
1509 | 0x2,0x64, | |
1510 | 0x2,0x74, | |
1511 | 0x2,0x05, | |
1512 | 0x2,0x15, | |
1513 | 0x2,0x25, | |
1514 | 0x2,0x35, | |
1515 | 0x2,0x45, | |
1516 | 0x2,0x55, | |
1517 | 0x2,0x65, | |
1518 | 0x2,0x75, | |
1519 | 0x2,0x06, | |
1520 | 0x2,0x16, | |
1521 | 0x2,0x26, | |
1522 | 0x2,0x36, | |
1523 | 0x2,0x46, | |
1524 | 0x2,0x56, | |
1525 | 0x2,0x66, | |
1526 | 0x2,0x76, | |
1527 | 0x2,0x07, | |
1528 | 0x2,0x17, | |
1529 | 0x2,0x27, | |
1530 | 0x2,0x37, | |
1531 | 0x2,0x47, | |
1532 | 0x2,0x57, | |
1533 | 0x2,0x67, | |
1534 | 0x2,0x77 | |
1535 | ]; | |
1536 | ||
1537 | const DUCK_VECTABLES: [&[u8]; 3] = [ DUCK_VECTBL2, DUCK_VECTBL3, DUCK_VECTBL4 ]; |