Add pixel_swizzler benches
diff --git a/test/c/std/wbmp.c b/test/c/std/wbmp.c
index 931e78b..7f1fc30 100644
--- a/test/c/std/wbmp.c
+++ b/test/c/std/wbmp.c
@@ -360,7 +360,135 @@
// ---------------- WBMP Benches
-// No WBMP benches.
+const char* //
+do_bench_wuffs_pixel_swizzler(uint32_t dst_pixfmt_repr,
+ uint32_t src_pixfmt_repr,
+ wuffs_base__pixel_blend pixblend,
+ uint64_t iters_unscaled) {
+ const uint32_t width = 80;
+ const uint32_t height = 60;
+
+ wuffs_base__pixel_format dst_pixfmt =
+ wuffs_base__make_pixel_format(dst_pixfmt_repr);
+ wuffs_base__pixel_format src_pixfmt =
+ wuffs_base__make_pixel_format(src_pixfmt_repr);
+ if ((wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt) & 7) != 0) {
+ return "dst pixfmt has fractional bytes per pixel";
+ }
+ if ((wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt) & 7) != 0) {
+ return "src pixfmt has fractional bytes per pixel";
+ }
+ const uint32_t dst_bytes_per_row =
+ width * wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt) / 8;
+ const uint32_t src_bytes_per_row =
+ width * wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt) / 8;
+
+ if (g_have_slice_u8.len < (dst_bytes_per_row * height)) {
+ return "dst buffer is too short";
+ }
+ wuffs_base__io_buffer src = wuffs_base__slice_u8__writer(g_src_slice_u8);
+ CHECK_STRING(read_file(&src, "test/data/pi.txt"));
+ if (src.meta.wi < (src_bytes_per_row * height)) {
+ return "src data is too short";
+ }
+
+ uint8_t dst_palette[1024];
+ uint8_t src_palette[1024];
+ memcpy(dst_palette, g_src_slice_u8.ptr, 1024);
+ memcpy(src_palette, g_src_slice_u8.ptr, 1024);
+
+ wuffs_base__pixel_swizzler swizzler;
+ CHECK_STATUS(
+ "prepare",
+ wuffs_base__pixel_swizzler__prepare(
+ &swizzler, dst_pixfmt, wuffs_base__make_slice_u8(dst_palette, 1024),
+ src_pixfmt, wuffs_base__make_slice_u8(src_palette, 1024), pixblend));
+
+ bench_start();
+ uint64_t n_bytes = 0;
+ uint64_t i;
+ uint64_t iters = iters_unscaled * g_flags.iterscale;
+ for (i = 0; i < iters; i++) {
+ uint32_t y;
+ for (y = 0; y < height; y++) {
+ wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
+ &swizzler,
+ wuffs_base__make_slice_u8(
+ g_have_slice_u8.ptr + (dst_bytes_per_row * y), dst_bytes_per_row),
+ wuffs_base__make_slice_u8(dst_palette, 1024),
+ wuffs_base__make_slice_u8(
+ g_src_slice_u8.ptr + (src_bytes_per_row * y), src_bytes_per_row));
+ }
+ n_bytes += dst_bytes_per_row * height;
+ }
+ bench_finish(iters, n_bytes);
+ return NULL;
+}
+
+const char* //
+bench_wuffs_pixel_swizzler_bgr_565_rgba_nonpremul_src() {
+ CHECK_FOCUS(__func__);
+ return do_bench_wuffs_pixel_swizzler(WUFFS_BASE__PIXEL_FORMAT__BGR_565,
+ WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL,
+ WUFFS_BASE__PIXEL_BLEND__SRC, 400);
+}
+
+const char* //
+bench_wuffs_pixel_swizzler_bgr_rgba_nonpremul_src() {
+ CHECK_FOCUS(__func__);
+ return do_bench_wuffs_pixel_swizzler(WUFFS_BASE__PIXEL_FORMAT__BGR,
+ WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL,
+ WUFFS_BASE__PIXEL_BLEND__SRC, 500);
+}
+
+const char* //
+bench_wuffs_pixel_swizzler_bgra_non_premul_rgba_nonpremul_src() {
+ CHECK_FOCUS(__func__);
+ return do_bench_wuffs_pixel_swizzler(WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL,
+ WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL,
+ WUFFS_BASE__PIXEL_BLEND__SRC, 8000);
+}
+
+const char* //
+bench_wuffs_pixel_swizzler_bgra_premul_y_src() {
+ CHECK_FOCUS(__func__);
+ return do_bench_wuffs_pixel_swizzler(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL,
+ WUFFS_BASE__PIXEL_FORMAT__Y,
+ WUFFS_BASE__PIXEL_BLEND__SRC, 3000);
+}
+
+const char* //
+bench_wuffs_pixel_swizzler_bgra_premul_indexed_bgra_binary_src() {
+ CHECK_FOCUS(__func__);
+ return do_bench_wuffs_pixel_swizzler(
+ WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL,
+ WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY,
+ WUFFS_BASE__PIXEL_BLEND__SRC, 2000);
+}
+
+const char* //
+bench_wuffs_pixel_swizzler_bgra_premul_rgb_src() {
+ CHECK_FOCUS(__func__);
+ return do_bench_wuffs_pixel_swizzler(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL,
+ WUFFS_BASE__PIXEL_FORMAT__RGB,
+ WUFFS_BASE__PIXEL_BLEND__SRC, 2000);
+}
+
+const char* //
+bench_wuffs_pixel_swizzler_bgra_premul_rgba_nonpremul_src() {
+ CHECK_FOCUS(__func__);
+ return do_bench_wuffs_pixel_swizzler(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL,
+ WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL,
+ WUFFS_BASE__PIXEL_BLEND__SRC, 1000);
+}
+
+const char* //
+bench_wuffs_pixel_swizzler_bgra_premul_rgba_nonpremul_src_over() {
+ CHECK_FOCUS(__func__);
+ return do_bench_wuffs_pixel_swizzler(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL,
+ WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL,
+ WUFFS_BASE__PIXEL_BLEND__SRC_OVER, 300);
+}
// ---------------- Mimic Benches
@@ -394,7 +522,14 @@
proc g_benches[] = {
-// No WBMP benches.
+ bench_wuffs_pixel_swizzler_bgr_565_rgba_nonpremul_src,
+ bench_wuffs_pixel_swizzler_bgr_rgba_nonpremul_src,
+ bench_wuffs_pixel_swizzler_bgra_non_premul_rgba_nonpremul_src,
+ bench_wuffs_pixel_swizzler_bgra_premul_y_src,
+ bench_wuffs_pixel_swizzler_bgra_premul_indexed_bgra_binary_src,
+ bench_wuffs_pixel_swizzler_bgra_premul_rgb_src,
+ bench_wuffs_pixel_swizzler_bgra_premul_rgba_nonpremul_src,
+ bench_wuffs_pixel_swizzler_bgra_premul_rgba_nonpremul_src_over,
#ifdef WUFFS_MIMIC