diff options
Diffstat (limited to 'fastiv-io.c')
-rw-r--r-- | fastiv-io.c | 31 |
1 files changed, 12 insertions, 19 deletions
diff --git a/fastiv-io.c b/fastiv-io.c index 60c0292..d9588cc 100644 --- a/fastiv-io.c +++ b/fastiv-io.c @@ -118,9 +118,10 @@ fastiv_io_thumbnail_size_get_type(void) return guard; } -#define XX(name, value, dir) {FASTIV_IO_THUMBNAIL_SIZE_ ## name, dir}, -FastivIoThumbnailSizeInfo fastiv_io_thumbnail_sizes[] = { - FASTIV_IO_THUMBNAIL_SIZES(XX) {}}; +#define XX(name, value, dir) {value, dir}, +FastivIoThumbnailSizeInfo + fastiv_io_thumbnail_sizes[FASTIV_IO_THUMBNAIL_SIZE_COUNT] = { + FASTIV_IO_THUMBNAIL_SIZES(XX)}; #undef XX // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1006,17 +1007,8 @@ fail_init: cairo_surface_t * fastiv_io_lookup_thumbnail(const gchar *target, FastivIoThumbnailSize size) { - // TODO(p): Consider having linear enum constants, - // and using a trivial lookup table. This is ridiculous. - int size_index = 0; - while (fastiv_io_thumbnail_sizes[size_index].size && - fastiv_io_thumbnail_sizes[size_index].size < size) - size_index++; - int size_count = size_index; - while (fastiv_io_thumbnail_sizes[size_count].size) - size_count++; - - g_return_val_if_fail(fastiv_io_thumbnail_sizes[size_index].size, NULL); + g_return_val_if_fail(size >= FASTIV_IO_THUMBNAIL_SIZE_MIN && + size <= FASTIV_IO_THUMBNAIL_SIZE_MAX, NULL); GStatBuf st; if (g_stat(target, &st)) @@ -1031,15 +1023,16 @@ fastiv_io_lookup_thumbnail(const gchar *target, FastivIoThumbnailSize size) gchar *sum = g_compute_checksum_for_string(G_CHECKSUM_MD5, uri, -1); gchar *cache_dir = get_xdg_home_dir("XDG_CACHE_HOME", ".cache"); + // The lookup sequence is: nominal..max, then mirroring back to ..min. cairo_surface_t *result = NULL; GError *error = NULL; - for (int i = 0; i < size_count; i++) { - int size_use = size_index + i; - if (size_use >= size_count) - size_use = size_count - i - 1; + for (int i = 0; i < FASTIV_IO_THUMBNAIL_SIZE_COUNT; i++) { + int use = size + i; + if (use > FASTIV_IO_THUMBNAIL_SIZE_MAX) + use = FASTIV_IO_THUMBNAIL_SIZE_MAX - i; gchar *path = g_strdup_printf("%s/thumbnails/%s/%s.png", cache_dir, - fastiv_io_thumbnail_sizes[size_use].directory_name, sum); + fastiv_io_thumbnail_sizes[use].thumbnail_spec_name, sum); result = read_spng_thumbnail(path, uri, st.st_mtim.tv_sec, &error); if (error) { g_debug("%s: %s", path, error->message); |