aboutsummaryrefslogtreecommitdiff
path: root/lvc/src/decode.rs
blob: 771cba9cf725a96b2a62cbd52d36356b1b0698c0 (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
use crate::{split::split, Block, Frame, View, P2};
use rayon::join;

pub fn decode(last_frame: &Frame, frame: &mut Frame, view: View, block: &Block) {
    match block {
        Block::Lit(pxs) => frame.import(view, &pxs),
        Block::Split(a, b) => {
            let [av, bv] = split(view);
            let (frame1, frame2) =
                unsafe { (&mut *(frame as *mut Frame), &mut *(frame as *mut Frame)) };
            join(
                || decode(last_frame, frame1, av, &a),
                || decode(last_frame, frame2, bv, &b),
            );
        }
        Block::Ref(r) => {
            for y in view.a.y..view.b.y {
                for x in view.a.x..view.b.x {
                    let p = P2 { x, y };
                    frame[p] = last_frame[p + r.pos_off] + r.color_off
                }
            }
        }
    }
}