pix 1.0.1

Pixel / raster image library
Documentation
#[macro_use]
extern crate criterion;

use criterion::Criterion;
use pix::Raster;
use pix::chan::{Linear, Premultiplied};
use pix::el::Pixel;
use pix::gray::Graya8p;
use pix::matte::Matte8;
use pix::ops::SrcOver;
use pix::rgb::Rgba8p;

fn matte_over_gray(c: &mut Criterion, sz: u32) {
    let s = format!("matte_over_gray_{}", sz);
    c.bench_function(&s, move |b| {
        let mut r = Raster::with_clear(sz, sz);
        let mut m = Raster::<Matte8>::with_clear(sz, sz);
        let c = Graya8p::new(100, 255);
        let sz1 = (sz - 1) as i32;
        *m.pixel_mut(0, 0) = Matte8::new(255);
        *m.pixel_mut(sz1, sz1) = Matte8::new(128);
        b.iter(|| r.composite_matte((), &m, (), c, SrcOver))
    });
}

fn matte_over_gray_16(c: &mut Criterion) {
    matte_over_gray(c, 16);
}

fn matte_over_gray_256(c: &mut Criterion) {
    matte_over_gray(c, 256);
}

fn matte_over_rgba(c: &mut Criterion, sz: u32) {
    let s = format!("matte_over_rgba_{}", sz);
    c.bench_function(&s, move |b| {
        let mut r = Raster::with_clear(sz, sz);
        let mut m = Raster::<Matte8>::with_clear(sz, sz);
        let rgba = Rgba8p::new(100, 50, 150, 255);
        let sz1 = (sz - 1) as i32;
        *m.pixel_mut(0, 0) = Matte8::new(255);
        *m.pixel_mut(sz1, sz1) = Matte8::new(128);
        b.iter(|| r.composite_matte((), &m, (), rgba, SrcOver))
    });
}

fn matte_over_rgba_16(c: &mut Criterion) {
    matte_over_rgba(c, 16);
}

fn matte_over_rgba_256(c: &mut Criterion) {
    matte_over_rgba(c, 256);
}

fn raster_over<P>(c: &mut Criterion, tp: &str, sz: u32)
where
    P: Pixel<Alpha = Premultiplied, Gamma = Linear>,
{
    let s = format!("raster_over_{}_{}", tp, sz);
    c.bench_function(&s, move |b| {
        let mut r0 = Raster::<P>::with_clear(sz, sz);
        let r1 = Raster::with_clear(sz, sz);
        b.iter(|| r0.composite_raster((), &r1, (), SrcOver))
    });
}

fn raster_over_gray_16(c: &mut Criterion) {
    raster_over::<Graya8p>(c, "gray", 16);
}

fn raster_over_gray_256(c: &mut Criterion) {
    raster_over::<Graya8p>(c, "gray", 256);
}

fn raster_over_rgba_16(c: &mut Criterion) {
    raster_over::<Rgba8p>(c, "rgba", 16);
}

fn raster_over_rgba_256(c: &mut Criterion) {
    raster_over::<Rgba8p>(c, "rgba", 256);
}

criterion_group!(
    benches,
    matte_over_gray_16,
    matte_over_gray_256,
    matte_over_rgba_16,
    matte_over_rgba_256,
    raster_over_gray_16,
    raster_over_gray_256,
    raster_over_rgba_16,
    raster_over_rgba_256,
);

criterion_main!(benches);