summaryrefslogtreecommitdiff
path: root/rsvg/benches/box_blur.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rsvg/benches/box_blur.rs')
-rw-r--r--rsvg/benches/box_blur.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/rsvg/benches/box_blur.rs b/rsvg/benches/box_blur.rs
new file mode 100644
index 00000000..876449ad
--- /dev/null
+++ b/rsvg/benches/box_blur.rs
@@ -0,0 +1,61 @@
+use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
+
+use rsvg::{
+ surface_utils::shared_surface::{
+ AlphaOnly, Horizontal, NotAlphaOnly, SharedImageSurface, SurfaceType, Vertical,
+ },
+ IRect,
+};
+
+const SURFACE_SIDE: i32 = 512;
+const BOUNDS: IRect = IRect {
+ x0: 64,
+ y0: 64,
+ x1: 64 + 64,
+ y1: 64 + 64,
+};
+
+fn bench_box_blur(c: &mut Criterion) {
+ let mut group = c.benchmark_group("box_blur 9");
+
+ for input in [(false, false), (false, true), (true, false), (true, true)].iter() {
+ group.bench_with_input(
+ BenchmarkId::from_parameter(format!("{:?}", input)),
+ &input,
+ |b, &(vertical, alpha_only)| {
+ let surface_type = if *alpha_only {
+ SurfaceType::AlphaOnly
+ } else {
+ SurfaceType::SRgb
+ };
+ let input_surface =
+ SharedImageSurface::empty(SURFACE_SIDE, SURFACE_SIDE, surface_type).unwrap();
+
+ let mut output_surface =
+ cairo::ImageSurface::create(cairo::Format::ARgb32, SURFACE_SIDE, SURFACE_SIDE)
+ .unwrap();
+ const KERNEL_SIZE: usize = 9;
+
+ let f = match (vertical, alpha_only) {
+ (true, true) => SharedImageSurface::box_blur_loop::<Vertical, AlphaOnly>,
+ (true, false) => SharedImageSurface::box_blur_loop::<Vertical, NotAlphaOnly>,
+ (false, true) => SharedImageSurface::box_blur_loop::<Horizontal, AlphaOnly>,
+ (false, false) => SharedImageSurface::box_blur_loop::<Horizontal, NotAlphaOnly>,
+ };
+
+ b.iter(|| {
+ f(
+ &input_surface,
+ &mut output_surface,
+ BOUNDS,
+ KERNEL_SIZE,
+ KERNEL_SIZE / 2,
+ )
+ })
+ },
+ );
+ }
+}
+
+criterion_group!(benches, bench_box_blur);
+criterion_main!(benches);