Add n_bytes_out arg to gif bench functions
diff --git a/test/c/mimiclib/gif.c b/test/c/mimiclib/gif.c
index ca3e699..2cb09e1 100644
--- a/test/c/mimiclib/gif.c
+++ b/test/c/mimiclib/gif.c
@@ -31,7 +31,8 @@
}
const char* //
-mimic_gif_decode(wuffs_base__io_buffer* dst,
+mimic_gif_decode(uint64_t* n_bytes_out,
+ wuffs_base__io_buffer* dst,
uint32_t wuffs_initialize_flags,
wuffs_base__pixel_format pixfmt,
wuffs_base__io_buffer* src) {
@@ -74,13 +75,18 @@
struct SavedImage* si = &f->SavedImages[i];
size_t num_src =
(size_t)(si->ImageDesc.Width) * (size_t)(si->ImageDesc.Height);
- size_t num_dst = dst->data.len - dst->meta.wi;
- if (num_dst < num_src) {
- ret = "GIF image's pixel data won't fit in the dst buffer";
- goto cleanup1;
+ if (n_bytes_out) {
+ *n_bytes_out += num_src;
}
- memmove(dst->data.ptr + dst->meta.wi, si->RasterBits, num_src);
- dst->meta.wi += num_src;
+ if (dst) {
+ size_t num_dst = dst->data.len - dst->meta.wi;
+ if (num_dst < num_src) {
+ ret = "GIF image's pixel data won't fit in the dst buffer";
+ goto cleanup1;
+ }
+ memmove(dst->data.ptr + dst->meta.wi, si->RasterBits, num_src);
+ dst->meta.wi += num_src;
+ }
}
cleanup1:;
diff --git a/test/c/std/gif.c b/test/c/std/gif.c
index ca2ea1c..7629b63 100644
--- a/test/c/std/gif.c
+++ b/test/c/std/gif.c
@@ -196,7 +196,8 @@
}
const char* //
-wuffs_gif_decode(wuffs_base__io_buffer* dst,
+wuffs_gif_decode(uint64_t* n_bytes_out,
+ wuffs_base__io_buffer* dst,
uint32_t wuffs_initialize_flags,
wuffs_base__pixel_format pixfmt,
wuffs_base__io_buffer* src) {
@@ -207,6 +208,15 @@
wuffs_base__image_config ic = ((wuffs_base__image_config){});
wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
+
+ uint32_t bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&pixfmt);
+ if (bits_per_pixel == 0) {
+ return "do_run__wuffs_base__image_decoder: invalid bits_per_pixel";
+ } else if ((bits_per_pixel % 8) != 0) {
+ return "do_run__wuffs_base__image_decoder: cannot bench fractional bytes";
+ }
+ uint64_t bytes_per_pixel = bits_per_pixel / 8;
+
CHECK_STATUS("decode_image_config",
wuffs_gif__decoder__decode_image_config(&dec, &ic, src));
@@ -232,8 +242,15 @@
WUFFS_BASE__PIXEL_BLEND__SRC,
g_work_slice_u8, NULL));
- CHECK_STRING(copy_to_io_buffer_from_pixel_buffer(
- dst, &pb, wuffs_base__frame_config__bounds(&fc)));
+ if (n_bytes_out) {
+ uint64_t frame_width = wuffs_base__frame_config__width(&fc);
+ uint64_t frame_height = wuffs_base__frame_config__height(&fc);
+ *n_bytes_out += frame_width * frame_height * bytes_per_pixel;
+ }
+ if (dst) {
+ CHECK_STRING(copy_to_io_buffer_from_pixel_buffer(
+ dst, &pb, wuffs_base__frame_config__bounds(&fc)));
+ }
}
return NULL;
}
@@ -2057,7 +2074,7 @@
.data = g_have_slice_u8,
});
CHECK_STRING(
- wuffs_gif_decode(&have, 0,
+ wuffs_gif_decode(NULL, &have, WUFFS_INITIALIZE__DEFAULT_OPTIONS,
wuffs_base__make_pixel_format(
WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
&src));
@@ -2067,7 +2084,7 @@
.data = g_want_slice_u8,
});
CHECK_STRING(
- mimic_gif_decode(&want, 0,
+ mimic_gif_decode(NULL, &want, WUFFS_INITIALIZE__DEFAULT_OPTIONS,
wuffs_base__make_pixel_format(
WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY),
&src));
@@ -2163,7 +2180,8 @@
// ---------------- GIF Benches
const char* //
-do_bench_gif_decode(const char* (*decode_func)(wuffs_base__io_buffer*,
+do_bench_gif_decode(const char* (*decode_func)(uint64_t*,
+ wuffs_base__io_buffer*,
uint32_t wuffs_initialize_flags,
wuffs_base__pixel_format,
wuffs_base__io_buffer*),
@@ -2186,7 +2204,8 @@
for (i = 0; i < iters; i++) {
have.meta.wi = 0;
src.meta.ri = 0;
- CHECK_STRING(decode_func(&have, wuffs_initialize_flags, pixfmt, &src));
+ CHECK_STRING(
+ decode_func(NULL, &have, wuffs_initialize_flags, pixfmt, &src));
n_bytes += have.meta.wi;
}
bench_finish(iters, n_bytes);