image/codecs/jpeg/
transform.rs1static CONST_BITS: i32 = 13;
55static PASS1_BITS: i32 = 2;
56
57static FIX_0_298631336: i32 = 2446;
58static FIX_0_390180644: i32 = 3196;
59static FIX_0_541196100: i32 = 4433;
60static FIX_0_765366865: i32 = 6270;
61static FIX_0_899976223: i32 = 7373;
62static FIX_1_175875602: i32 = 9633;
63static FIX_1_501321110: i32 = 12_299;
64static FIX_1_847759065: i32 = 15_137;
65static FIX_1_961570560: i32 = 16_069;
66static FIX_2_053119869: i32 = 16_819;
67static FIX_2_562915447: i32 = 20_995;
68static FIX_3_072711026: i32 = 25_172;
69
70pub(crate) fn fdct(samples: &[u8; 64], coeffs: &mut [i32; 64]) {
71 for y in 0usize..8 {
75 let y0 = y * 8;
76
77 let t0 = i32::from(samples[y0]) + i32::from(samples[y0 + 7]);
79 let t1 = i32::from(samples[y0 + 1]) + i32::from(samples[y0 + 6]);
80 let t2 = i32::from(samples[y0 + 2]) + i32::from(samples[y0 + 5]);
81 let t3 = i32::from(samples[y0 + 3]) + i32::from(samples[y0 + 4]);
82
83 let t10 = t0 + t3;
84 let t12 = t0 - t3;
85 let t11 = t1 + t2;
86 let t13 = t1 - t2;
87
88 let t0 = i32::from(samples[y0]) - i32::from(samples[y0 + 7]);
89 let t1 = i32::from(samples[y0 + 1]) - i32::from(samples[y0 + 6]);
90 let t2 = i32::from(samples[y0 + 2]) - i32::from(samples[y0 + 5]);
91 let t3 = i32::from(samples[y0 + 3]) - i32::from(samples[y0 + 4]);
92
93 coeffs[y0] = (t10 + t11 - 8 * 128) << PASS1_BITS as usize;
95 coeffs[y0 + 4] = (t10 - t11) << PASS1_BITS as usize;
96
97 let mut z1 = (t12 + t13) * FIX_0_541196100;
98 z1 += 1 << (CONST_BITS - PASS1_BITS - 1) as usize;
100
101 coeffs[y0 + 2] = (z1 + t12 * FIX_0_765366865) >> (CONST_BITS - PASS1_BITS) as usize;
102 coeffs[y0 + 6] = (z1 - t13 * FIX_1_847759065) >> (CONST_BITS - PASS1_BITS) as usize;
103
104 let t12 = t0 + t2;
106 let t13 = t1 + t3;
107
108 let mut z1 = (t12 + t13) * FIX_1_175875602;
109 z1 += 1 << (CONST_BITS - PASS1_BITS - 1) as usize;
111
112 let mut t12 = t12 * (-FIX_0_390180644);
113 let mut t13 = t13 * (-FIX_1_961570560);
114 t12 += z1;
115 t13 += z1;
116
117 let z1 = (t0 + t3) * (-FIX_0_899976223);
118 let mut t0 = t0 * FIX_1_501321110;
119 let mut t3 = t3 * FIX_0_298631336;
120 t0 += z1 + t12;
121 t3 += z1 + t13;
122
123 let z1 = (t1 + t2) * (-FIX_2_562915447);
124 let mut t1 = t1 * FIX_3_072711026;
125 let mut t2 = t2 * FIX_2_053119869;
126 t1 += z1 + t13;
127 t2 += z1 + t12;
128
129 coeffs[y0 + 1] = t0 >> (CONST_BITS - PASS1_BITS) as usize;
130 coeffs[y0 + 3] = t1 >> (CONST_BITS - PASS1_BITS) as usize;
131 coeffs[y0 + 5] = t2 >> (CONST_BITS - PASS1_BITS) as usize;
132 coeffs[y0 + 7] = t3 >> (CONST_BITS - PASS1_BITS) as usize;
133 }
134
135 for x in (0usize..8).rev() {
139 let t0 = coeffs[x] + coeffs[x + 8 * 7];
141 let t1 = coeffs[x + 8] + coeffs[x + 8 * 6];
142 let t2 = coeffs[x + 8 * 2] + coeffs[x + 8 * 5];
143 let t3 = coeffs[x + 8 * 3] + coeffs[x + 8 * 4];
144
145 let t10 = t0 + t3 + (1 << (PASS1_BITS - 1) as usize);
147 let t12 = t0 - t3;
148 let t11 = t1 + t2;
149 let t13 = t1 - t2;
150
151 let t0 = coeffs[x] - coeffs[x + 8 * 7];
152 let t1 = coeffs[x + 8] - coeffs[x + 8 * 6];
153 let t2 = coeffs[x + 8 * 2] - coeffs[x + 8 * 5];
154 let t3 = coeffs[x + 8 * 3] - coeffs[x + 8 * 4];
155
156 coeffs[x] = (t10 + t11) >> PASS1_BITS as usize;
157 coeffs[x + 8 * 4] = (t10 - t11) >> PASS1_BITS as usize;
158
159 let mut z1 = (t12 + t13) * FIX_0_541196100;
160 z1 += 1 << (CONST_BITS + PASS1_BITS - 1) as usize;
162
163 coeffs[x + 8 * 2] = (z1 + t12 * FIX_0_765366865) >> (CONST_BITS + PASS1_BITS) as usize;
164 coeffs[x + 8 * 6] = (z1 - t13 * FIX_1_847759065) >> (CONST_BITS + PASS1_BITS) as usize;
165
166 let t12 = t0 + t2;
168 let t13 = t1 + t3;
169
170 let mut z1 = (t12 + t13) * FIX_1_175875602;
171 z1 += 1 << (CONST_BITS - PASS1_BITS - 1) as usize;
173
174 let mut t12 = t12 * (-FIX_0_390180644);
175 let mut t13 = t13 * (-FIX_1_961570560);
176 t12 += z1;
177 t13 += z1;
178
179 let z1 = (t0 + t3) * (-FIX_0_899976223);
180 let mut t0 = t0 * FIX_1_501321110;
181 let mut t3 = t3 * FIX_0_298631336;
182 t0 += z1 + t12;
183 t3 += z1 + t13;
184
185 let z1 = (t1 + t2) * (-FIX_2_562915447);
186 let mut t1 = t1 * FIX_3_072711026;
187 let mut t2 = t2 * FIX_2_053119869;
188 t1 += z1 + t13;
189 t2 += z1 + t12;
190
191 coeffs[x + 8] = t0 >> (CONST_BITS + PASS1_BITS) as usize;
192 coeffs[x + 8 * 3] = t1 >> (CONST_BITS + PASS1_BITS) as usize;
193 coeffs[x + 8 * 5] = t2 >> (CONST_BITS + PASS1_BITS) as usize;
194 coeffs[x + 8 * 7] = t3 >> (CONST_BITS + PASS1_BITS) as usize;
195 }
196}