1use crate::codec::range_decoder::RangeDecoder;
2use crate::codec::rc_qs_model::RCQsModel;
3use crate::core::front::Front;
4use crate::core::pc_decoder::{PCDecoderDouble, PCDecoderFloat};
5use crate::core::pc_encoder::symbol_count;
6use crate::core::pc_map;
7
8pub(crate) fn decompress_3d_float(
10 decoder: &mut RangeDecoder,
11 data: &mut [f32],
12 nx: i32,
13 ny: i32,
14 nz: i32,
15 bits: u32,
16) {
17 let symbols = symbol_count(bits);
18 let mut model = RCQsModel::with_defaults(false, symbols);
19 let zero_mapped = pc_map::forward_f32(0.0f32, bits);
20 let mut front = Front::<u32>::new(nx, ny, zero_mapped);
21
22 let mut data_index = 0;
23
24 front.advance(0, 0, 1);
25 for _ in 0..nz {
26 front.advance(0, 1, 0);
27 for _ in 0..ny {
28 front.advance(1, 0, 0);
29 for _ in 0..nx {
30 let p = front
31 .get(1, 0, 0)
32 .wrapping_sub(front.get(0, 1, 1))
33 .wrapping_add(front.get(0, 1, 0))
34 .wrapping_sub(front.get(1, 0, 1))
35 .wrapping_add(front.get(0, 0, 1))
36 .wrapping_sub(front.get(1, 1, 0))
37 .wrapping_add(front.get(1, 1, 1));
38
39 let mut pc = PCDecoderFloat::new(decoder, &mut model, bits);
40 let a = pc.decode(p);
41
42 data[data_index] = pc_map::inverse_f32(a, bits);
43 data_index += 1;
44
45 front.push(a);
46 }
47 }
48 }
49}
50
51pub(crate) fn decompress_3d_double(
53 decoder: &mut RangeDecoder,
54 data: &mut [f64],
55 nx: i32,
56 ny: i32,
57 nz: i32,
58 bits: u32,
59) {
60 let symbols = symbol_count(bits);
61 let mut model = RCQsModel::with_defaults(false, symbols);
62 let zero_mapped = pc_map::forward_f64(0.0f64, bits);
63 let mut front = Front::<u64>::new(nx, ny, zero_mapped);
64
65 let mut data_index = 0;
66
67 front.advance(0, 0, 1);
68 for _ in 0..nz {
69 front.advance(0, 1, 0);
70 for _ in 0..ny {
71 front.advance(1, 0, 0);
72 for _ in 0..nx {
73 let p = front
74 .get(1, 0, 0)
75 .wrapping_sub(front.get(0, 1, 1))
76 .wrapping_add(front.get(0, 1, 0))
77 .wrapping_sub(front.get(1, 0, 1))
78 .wrapping_add(front.get(0, 0, 1))
79 .wrapping_sub(front.get(1, 1, 0))
80 .wrapping_add(front.get(1, 1, 1));
81
82 let mut pc = PCDecoderDouble::new(decoder, &mut model, bits);
83 let a = pc.decode(p);
84
85 data[data_index] = pc_map::inverse_f64(a, bits);
86 data_index += 1;
87
88 front.push(a);
89 }
90 }
91 }
92}
93
94pub(crate) fn decompress_4d_float(
96 decoder: &mut RangeDecoder,
97 data: &mut [f32],
98 nx: i32,
99 ny: i32,
100 nz: i32,
101 nf: i32,
102 bits: u32,
103) {
104 let field_size = (nx as usize) * (ny as usize) * (nz as usize);
105 for f in 0..nf as usize {
106 let start = f * field_size;
107 let end = start + field_size;
108 decompress_3d_float(decoder, &mut data[start..end], nx, ny, nz, bits);
109 }
110}
111
112pub(crate) fn decompress_4d_double(
114 decoder: &mut RangeDecoder,
115 data: &mut [f64],
116 nx: i32,
117 ny: i32,
118 nz: i32,
119 nf: i32,
120 bits: u32,
121) {
122 let field_size = (nx as usize) * (ny as usize) * (nz as usize);
123 for f in 0..nf as usize {
124 let start = f * field_size;
125 let end = start + field_size;
126 decompress_3d_double(decoder, &mut data[start..end], nx, ny, nz, bits);
127 }
128}