blit 0.8.5

Blit sprites on a buffer with a mask
Documentation
use blit::{geom::Size, Blit, BlitOptions, ToBlitBuffer};
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
use criterion_perf_events::Perf;
use perfcnt::linux::{HardwareEventType, PerfCounterBuilderLinux};

const SIZE: usize = 300;

fn criterion_benchmark(c: &mut Criterion<Perf>) {
    let rgb = image::load_from_memory(include_bytes!("../examples/showcase/smiley_rgb.png"))
        .unwrap()
        .into_rgb8();

    let blit = rgb.to_blit_buffer_with_mask_color(0xFF_00_FF);
    let size = blit.size();

    let mut group = c.benchmark_group("blit position");
    for x in [
        -(size.width as i32),
        -(size.width as i32) / 2,
        0,
        SIZE as i32 / 2,
        SIZE as i32 - size.width as i32 / 2,
        SIZE as i32,
    ] {
        let options = BlitOptions::new_position(x, 0);

        group.bench_with_input(BenchmarkId::from_parameter(x), &options, |b, options| {
            let mut buffer: Vec<u32> = vec![0; SIZE * SIZE];

            b.iter(|| {
                blit.blit(
                    &mut buffer,
                    black_box(Size::new(SIZE, SIZE)),
                    black_box(options),
                )
            });
        });
    }
    group.finish();

    let mut group = c.benchmark_group("blit sub rect");
    for x in [
        -(size.width as i32),
        -(size.width as i32) / 2,
        0,
        SIZE as i32 / 2,
        SIZE as i32 - size.width as i32 / 2,
        SIZE as i32,
    ] {
        let options =
            BlitOptions::new_position(x, 0).with_sub_rect((0, 0, size.width / 2, size.height / 2));

        group.bench_with_input(BenchmarkId::from_parameter(x), &options, |b, options| {
            let mut buffer: Vec<u32> = vec![0; SIZE * SIZE];

            b.iter(|| {
                blit.blit(
                    &mut buffer,
                    black_box(Size::new(SIZE, SIZE)),
                    black_box(options),
                )
            });
        });
    }
    group.finish();

    c.bench_function("blit exact fit", |b| {
        let mut buffer: Vec<u32> = vec![0; size.pixels()];

        b.iter(|| {
            blit.blit(&mut buffer, black_box(size), black_box(&BlitOptions::new()));
        });
    });

    c.bench_function("load img with mask", |b| {
        b.iter(|| {
            rgb.to_blit_buffer_with_mask_color(0xFF_00_FF);
        });
    });
}

criterion_group!(
    name = benches;
    config = Criterion::default().with_measurement(Perf::new(PerfCounterBuilderLinux::from_hardware_event(HardwareEventType::Instructions)));
    targets = criterion_benchmark
);
criterion_main!(benches);