del_canvas_cpu/
texture.rs

1pub enum Interpolation {
2    Nearest,
3    Bilinear,
4}
5
6pub fn bilinear<const NDIM: usize>(
7    pix: &[f32; 2],
8    tex_shape: &(usize, usize),
9    tex_data: &[f32],
10) -> [f32; NDIM] {
11    let rx = pix[0] - pix[0].floor();
12    let ry = pix[1] - pix[1].floor();
13    let ix0 = pix[0].floor() as usize;
14    let iy0 = pix[1].floor() as usize;
15    let ix1 = ix0 + 1;
16    let iy1 = iy0 + 1;
17    let i00_tex = iy0 * tex_shape.0 + ix0;
18    let i10_tex = iy0 * tex_shape.0 + ix1;
19    let i01_tex = iy1 * tex_shape.0 + ix0;
20    let i11_tex = iy1 * tex_shape.0 + ix1;
21    let mut res = [0f32; NDIM];
22    for idim in 0..NDIM {
23        let v00 = tex_data[i00_tex * NDIM + idim];
24        let v01 = tex_data[i01_tex * NDIM + idim];
25        let v10 = tex_data[i10_tex * NDIM + idim];
26        let v11 = tex_data[i11_tex * NDIM + idim];
27        let v = (1. - rx) * (1. - ry) * v00
28            + rx * (1. - ry) * v10
29            + (1. - rx) * ry * v01
30            + rx * ry * v11;
31        res[idim] = v;
32    }
33    res
34}
35
36pub fn nearest<const NDIM: usize>(
37    pix: &[f32; 2],
38    tex_shape: &(usize, usize),
39    tex_data: &[f32],
40) -> [f32; NDIM] {
41    let iu = pix[0].round() as usize;
42    let iv = pix[1].round() as usize;
43    let i_tex = iv * tex_shape.0 + iu;
44    let mut res = [0f32; NDIM];
45    for i_dim in 0..NDIM {
46        res[i_dim] = tex_data[i_tex * NDIM + i_dim];
47    }
48    res
49}