#![cfg(all(feature = "svg", feature = "image"))]
use criterion::{criterion_group, criterion_main, Criterion};
use dotmax::image::{
apply_dithering, auto_threshold, load_svg_from_path, pixels_to_braille, to_grayscale,
DitheringMethod,
};
use std::hint::black_box;
use std::path::Path;
fn bench_small_svg_rasterization(c: &mut Criterion) {
let svg_path = Path::new("tests/fixtures/svg/simple_circle.svg");
c.bench_function("svg_rasterize_small_icon", |b| {
b.iter(|| {
let img = load_svg_from_path(black_box(svg_path), black_box(100), black_box(100))
.expect("Failed to load SVG");
black_box(img);
});
});
}
fn bench_medium_svg_rasterization(c: &mut Criterion) {
let svg_path = Path::new("tests/fixtures/svg/logo.svg");
c.bench_function("svg_rasterize_medium_logo", |b| {
b.iter(|| {
let img = load_svg_from_path(black_box(svg_path), black_box(200), black_box(200))
.expect("Failed to load SVG");
black_box(img);
});
});
}
fn bench_svg_with_gradient(c: &mut Criterion) {
let svg_path = Path::new("tests/fixtures/svg/gradient.svg");
c.bench_function("svg_rasterize_gradient", |b| {
b.iter(|| {
let img = load_svg_from_path(black_box(svg_path), black_box(256), black_box(256))
.expect("Failed to load SVG");
black_box(img);
});
});
}
fn bench_svg_full_pipeline_to_braille(c: &mut Criterion) {
let svg_path = Path::new("tests/fixtures/svg/logo.svg");
c.bench_function("svg_full_pipeline_floyd_steinberg", |b| {
b.iter(|| {
let img = load_svg_from_path(black_box(svg_path), black_box(160), black_box(96))
.expect("Failed to load SVG");
let gray = to_grayscale(&img);
let binary =
apply_dithering(&gray, DitheringMethod::FloydSteinberg).expect("Failed to dither");
let grid = pixels_to_braille(&binary, 80, 24).expect("Failed to map to braille");
black_box(grid);
});
});
}
fn bench_svg_pipeline_with_threshold(c: &mut Criterion) {
let svg_path = Path::new("tests/fixtures/svg/simple_circle.svg");
c.bench_function("svg_pipeline_otsu_threshold", |b| {
b.iter(|| {
let img = load_svg_from_path(black_box(svg_path), black_box(160), black_box(96))
.expect("Failed to load SVG");
let binary = auto_threshold(&img);
let grid = pixels_to_braille(&binary, 80, 24).expect("Failed to map to braille");
black_box(grid);
});
});
}
fn bench_svg_text_heavy(c: &mut Criterion) {
let svg_path = Path::new("tests/fixtures/svg/text_heavy.svg");
c.bench_function("svg_rasterize_text_heavy", |b| {
b.iter(|| {
let img = load_svg_from_path(black_box(svg_path), black_box(300), black_box(100))
.expect("Failed to load text SVG");
black_box(img);
});
});
}
criterion_group!(
svg_benches,
bench_small_svg_rasterization,
bench_medium_svg_rasterization,
bench_svg_with_gradient,
bench_svg_full_pipeline_to_braille,
bench_svg_pipeline_with_threshold,
bench_svg_text_heavy
);
criterion_main!(svg_benches);