example/std-imagedumper: add file size and timer
diff --git a/example/stb-imagedumper/stb-imagedumper.c b/example/stb-imagedumper/stb-imagedumper.c index 11d83d8..95affdf 100644 --- a/example/stb-imagedumper/stb-imagedumper.c +++ b/example/stb-imagedumper/stb-imagedumper.c
@@ -53,7 +53,7 @@ ---- $ stb-imagedumper -braille-art test/data/pjw-thumbnail.png -test/data/pjw-thumbnail.png +test/data/pjw-thumbnail.png (208 bytes, 164 microseconds) ⣿⣿⣿⣿⡿⡋⠉⠉⠉⠙⠻⢿⣿⣿⣿⣿ ⣿⣿⣿⡿⣷⣿⣿⣿⣆⠀⠀⠀⠈⠹⣿⣿ ⣿⣿⠃⢸⡿⢿⣿⣿⣿⠦⠀⠀⠀⠀⢼⣿ @@ -71,6 +71,7 @@ for a C compiler $CC, such as clang or gcc. */ +#include <inttypes.h> #include <stdbool.h> #include <stdio.h> @@ -159,6 +160,51 @@ // ---------------- +#if defined(__unix__) || defined(__MACH__) + +#include <sys/stat.h> +#include <time.h> + +#define WUFFS_EXAMPLE_USE_TIMERS + +uint64_t // +get_filesize(const char* filename) { + struct stat z; + if (stat(filename, &z) == 0) { + return z.st_size; + } + return 0; +} + +bool g_started = false; +struct timespec g_start_time = {0}; + +int64_t // +micros_since_start(struct timespec* now) { + if (!g_started) { + return 0; + } + int64_t nanos = (int64_t)(now->tv_sec - g_start_time.tv_sec) * 1000000000 + + (int64_t)(now->tv_nsec - g_start_time.tv_nsec); + if (nanos < 0) { + return 0; + } + return nanos / 1000; +} + +#else // defined(__unix__) || defined(__MACH__) + +#warning "TODO: stat and timers on non-POSIX systems" + +uint64_t // +get_filesize(const char* filename) { + return 0; +} + +#endif // defined(__unix__) || defined(__MACH__) + +// ---------------- + const uint8_t g_src_ptr__mona_lisa_21_32_th[] = { 0xc3, 0xbe, 0xfe, 0xd1, 0x18, 0x0a, 0x1d, 0x02, 0x78, 0x95, 0x7f, 0x88, 0x87, 0x88, 0x87, 0x88, 0x77, 0x87, 0x47, 0x49, 0x7f, 0xa6, 0x02, 0x17, @@ -599,7 +645,10 @@ #define BYTES_PER_COLOR_PIXEL 32 static void // -handle(const char* filename, const uint8_t* src_ptr, const size_t src_len) { +handle(const char* filename, + uint64_t filesize, + const uint8_t* src_ptr, + const size_t src_len) { int w = 0; int h = 0; int channels_in_file = 0; @@ -607,6 +656,11 @@ (g_flags.ascii_art || g_flags.braille_art) ? STBI_grey : STBI_rgb; unsigned char* pixels = NULL; +#if defined(WUFFS_EXAMPLE_USE_TIMERS) + g_started = true; + clock_gettime(CLOCK_MONOTONIC, &g_start_time); +#endif + if (src_len > 0) { pixels = stbi_load_from_memory(src_ptr, src_len, // &w, &h, &channels_in_file, bytes_per_pixel); @@ -615,6 +669,16 @@ &w, &h, &channels_in_file, bytes_per_pixel); } + int64_t elapsed_micros = 0; +#if defined(WUFFS_EXAMPLE_USE_TIMERS) + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + elapsed_micros = micros_since_start(&now); +#endif + + printf("\n%s (%" PRIu64 " bytes, %" PRIi64 " microseconds)\n", filename, + filesize, elapsed_micros); + if (!pixels) { printf("%s\n", stbi_failure_reason()); return; @@ -687,6 +751,7 @@ fflush(stdout); stbi_image_free(pixels); + printf("\n"); } int // @@ -731,17 +796,14 @@ if (g_flags.demo) { for (size_t c = 0; demos[c].filename != NULL; c++) { - printf("\n%s (%zu bytes)\n", demos[c].filename, demos[c].src_len); - handle(demos[c].filename, demos[c].src_ptr, demos[c].src_len); - printf("\n"); + handle(demos[c].filename, demos[c].src_len, demos[c].src_ptr, + demos[c].src_len); } } for (int c = 0; c < g_flags.remaining_argc; c++) { const char* filename = g_flags.remaining_argv[c]; - printf("\n%s\n", filename); - handle(filename, NULL, 0); - printf("\n"); + handle(filename, get_filesize(filename), NULL, 0); } return 0; }