aboutsummaryrefslogtreecommitdiff
path: root/fastiv-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'fastiv-io.c')
-rw-r--r--fastiv-io.c31
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);