blob: 4a67f8185f2937355a966058572af670c9cce1c4 [file]
// Copyright 2025 the Vello Authors
// SPDX-License-Identifier: Apache-2.0 OR MIT
use crate::data::get_data_items;
use criterion::Criterion;
use vello_common::flatten;
use vello_common::flatten::FlattenCtx;
use vello_common::kurbo::Stroke;
use vello_common::kurbo::StrokeCtx;
use vello_cpu::Level;
use vello_cpu::kurbo::Affine;
pub fn flatten(c: &mut Criterion) {
let mut g = c.benchmark_group("flatten");
macro_rules! flatten_single {
($item:expr) => {
let expanded_strokes = $item.expanded_strokes();
g.bench_function($item.name.clone(), |b| {
// Reuse allocations to better simulate real-world use.
let mut line_buf: Vec<flatten::Line> = vec![];
let mut temp_buf: Vec<flatten::Line> = vec![];
let mut flatten_ctx = FlattenCtx::default();
b.iter(|| {
line_buf.clear();
for path in &$item.fills {
flatten::fill(
Level::new(),
&path.path,
path.transform,
&mut temp_buf,
&mut flatten_ctx,
$item.width,
$item.height,
);
line_buf.extend(&temp_buf);
}
for stroke in &expanded_strokes {
flatten::fill(
Level::new(),
stroke,
Affine::IDENTITY,
&mut temp_buf,
&mut flatten_ctx,
$item.width,
$item.height,
);
line_buf.extend(&temp_buf);
}
std::hint::black_box(&line_buf);
})
});
};
}
for item in get_data_items() {
flatten_single!(item);
}
}
pub fn strokes(c: &mut Criterion) {
let mut g = c.benchmark_group("strokes");
macro_rules! expand_single {
($item:expr) => {
g.bench_function($item.name.clone(), |b| {
let mut stroke_ctx = StrokeCtx::default();
b.iter(|| {
let mut paths = vec![];
for path in &$item.strokes {
let stroke = Stroke {
width: path.stroke_width as f64,
..Default::default()
};
flatten::expand_stroke(path.path.iter(), &stroke, 0.25, &mut stroke_ctx);
paths.push(stroke_ctx.output().clone());
}
std::hint::black_box(&paths);
})
});
};
}
for item in get_data_items() {
expand_single!(item);
}
}