aboutsummaryrefslogtreecommitdiff
path: root/old/dhwt-codec/src/transform.rs
blob: 82bccd1cae379e0120dd6d68c959b73f062a8668 (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
use crate::io::{Value, TWO};
use std::ops::{Index, IndexMut};

pub fn encode<X: Index<usize, Output = Value> + IndexMut<usize, Output = Value>>(
    size: usize,
    a: &mut X,
    b: &mut X,
) {
    let mut k = size;
    while k != 1 {
        k /= 2;
        for i in 0..k {
            let x = a[i * 2];
            let y = a[i * 2 + 1];
            b[i] = x + y;
            b[k + i] = x - y;
        }
        for i in 0..k {
            a[i] = b[i]
        }
    }
}

pub fn decode<X: Index<usize, Output = Value> + IndexMut<usize, Output = Value>>(
    size: usize,
    a: &mut X,
    b: &mut X,
) {
    let mut k = 1;
    while k != size {
        for i in 0..k {
            let avr = a[i] / TWO;
            let spread = a[i + k] / TWO;
            b[i * 2] = avr + spread;
            b[i * 2 + 1] = avr - spread;
        }
        k *= 2;
        for i in 0..k {
            a[i] = b[i]
        }
    }
}