png-decoder 0.2.0

A pure-Rust, no_std compatible PNG decoder.
Documentation
use criterion::{criterion_group, criterion_main, Criterion};
use image::{codecs::png::PngDecoder, ImageDecoder};

const SCREENSHOT_PNG_BYTES: &[u8] = include_bytes!("../test_pngs/skyline.png");
const TRANSPARENT_TEXTURE_PNG_BYTES: &[u8] = include_bytes!("../test_pngs/512x512_transparent.png");

fn decode_screenshot(c: &mut Criterion) {
    let mut group = c.benchmark_group("Screenshot Decode (1080x1920)");

    group.bench_function("png-decoder", |b| {
        b.iter(|| {
            png_decoder::decode(SCREENSHOT_PNG_BYTES).unwrap();
        });
    });

    group.bench_function("image", |b| {
        b.iter(|| {
            let decoder = PngDecoder::new(SCREENSHOT_PNG_BYTES).unwrap();
            let mut buf: Vec<u8> = vec![0; decoder.total_bytes() as usize];
            decoder.read_image(&mut buf).unwrap();
        });
    });

    group.finish();
}

fn decode_transparent_texture(c: &mut Criterion) {
    let mut group = c.benchmark_group("Transparent Texture Decode (512x512)");

    group.bench_function("png-decoder", |b| {
        b.iter(|| {
            png_decoder::decode(TRANSPARENT_TEXTURE_PNG_BYTES).unwrap();
        });
    });

    group.bench_function("image", |b| {
        b.iter(|| {
            let decoder = PngDecoder::new(TRANSPARENT_TEXTURE_PNG_BYTES).unwrap();
            let mut buf: Vec<u8> = vec![0; decoder.total_bytes() as usize];
            decoder.read_image(&mut buf).unwrap();
        });
    });

    group.finish();
}

criterion_group!(benches, decode_screenshot, decode_transparent_texture);
criterion_main!(benches);