ispc-downsampler 0.4.0

Image downsampler crate using ISPC
Documentation
use criterion::{criterion_group, criterion_main, Criterion};
use ispc_downsampler::{downsample, AlbedoFormat, Image};
use resize::{px::RGB, Type::Lanczos3};
use stb_image::image::{load, LoadResult};
use std::path::Path;

const DOWNSCALE: usize = 4;

pub fn ispc_downsampler(c: &mut Criterion) {
    if let LoadResult::ImageU8(img) = load(Path::new("test_assets/square_test.png")) {
        let src_fmt = if img.data.len() / (img.width * img.height) == 4 {
            AlbedoFormat::Rgba8Unorm
        } else {
            AlbedoFormat::Rgb8Unorm
        };

        let src_img = Image::new(&img.data, img.width as u32, img.height as u32, src_fmt);

        let target_width = (img.width / DOWNSCALE) as u32;
        let target_height = (img.height / DOWNSCALE) as u32;

        c.bench_function("Downsample `square_test.png` using ispc_downsampler", |b| {
            b.iter(|| downsample(&src_img, target_width, target_height))
        });
    }
}

pub fn resize_rs(c: &mut Criterion) {
    if let LoadResult::ImageU8(img) = load(Path::new("test_assets/square_test.png")) {
        let target_width = img.width / DOWNSCALE;
        let target_height = img.height / DOWNSCALE;

        let src = img
            .data
            .chunks(3)
            .map(|v| RGB::new(v[0], v[1], v[2]))
            .collect::<Vec<_>>();

        c.bench_function("Downsample `square_test.png` using resize", |b| {
            b.iter(|| {
                let mut dst = vec![RGB::new(0, 0, 0); target_width * target_height];
                let mut resizer = resize::new(
                    img.width,
                    img.height,
                    target_width,
                    target_height,
                    resize::Pixel::RGB8,
                    Lanczos3,
                )
                .unwrap();
                resizer.resize(&src, &mut dst)
            })
        });
    }
}

criterion_group!(benches, ispc_downsampler, resize_rs);
criterion_main!(benches);