del_canvas_cpu/
texture.rs1pub 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}