From b7f13619d3a6a4fbd62dfa6da150e8f0bf571b7c Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 5 Apr 2020 12:25:35 +0200 Subject: Use conversion cache for imlib2 and dcraw images --- src/imlib.c | 50 +++++++++++++++++++++++++++++++++----------------- src/options.c | 6 +++--- src/options.h | 2 +- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/imlib.c b/src/imlib.c index 2eeb37d..8baa886 100644 --- a/src/imlib.c +++ b/src/imlib.c @@ -60,10 +60,7 @@ int xinerama_screen; int num_xinerama_screens; #endif /* HAVE_LIBXINERAMA */ -#ifdef HAVE_LIBCURL -// TODO use cache for dcraw and magick conversion results as well -gib_hash* http_cache = NULL; -#endif +gib_hash* conversion_cache = NULL; int childpid = 0; @@ -263,14 +260,14 @@ int feh_load_image(Imlib_Image * im, feh_file * file) file->ed = exif_get_data(tmpname); #endif } - if ((image_source != SRC_HTTP) || (!opt.keep_http && !opt.use_http_cache)) + if (!opt.use_conversion_cache && ((image_source != SRC_HTTP) || !opt.keep_http)) unlink(tmpname); // keep_http already performs an add_file_to_rm_filelist call - else if (opt.use_http_cache && !opt.keep_http) + else if (opt.use_conversion_cache && !opt.keep_http) // add_file_to_rm_filelist duplicates tmpname add_file_to_rm_filelist(tmpname); - if (image_source != SRC_HTTP && !opt.use_http_cache) + if (image_source != SRC_HTTP && !opt.use_conversion_cache) free(tmpname); } @@ -365,14 +362,12 @@ void feh_reload_image(winwidget w, int resize, int force_new) if (force_new) winwidget_free_image(w); -#ifdef HAVE_LIBCURL // if it's an external image, our own cache will also get in your way char *sfn; - if (opt.use_http_cache && (sfn = gib_hash_get(http_cache, FEH_FILE(w->file->data)->filename)) != NULL) { + if (opt.use_conversion_cache && (sfn = gib_hash_get(conversion_cache, FEH_FILE(w->file->data)->filename)) != NULL) { free(sfn); - gib_hash_set(http_cache, FEH_FILE(w->file->data)->filename, NULL); + gib_hash_set(conversion_cache, FEH_FILE(w->file->data)->filename, NULL); } -#endif if ((feh_load_image(&tmp, FEH_FILE(w->file->data))) == 0) { if (force_new) @@ -450,6 +445,13 @@ static char *feh_dcraw_load_image(char *filename) char *sfn; int fd = -1; + if (opt.use_conversion_cache) { + if (!conversion_cache) + conversion_cache = gib_hash_new(); + if ((sfn = gib_hash_get(conversion_cache, filename)) != NULL) + return sfn; + } + basename = strrchr(filename, '/'); if (basename == NULL) @@ -500,6 +502,9 @@ static char *feh_dcraw_load_image(char *filename) weprintf("%s - Conversion took too long, skipping", filename); } + if ((sfn != NULL) && opt.use_conversion_cache) + gib_hash_set(conversion_cache, filename, sfn); + return sfn; } @@ -514,6 +519,13 @@ static char *feh_magick_load_image(char *filename) int status; char created_tempdir = 0; + if (opt.use_conversion_cache) { + if (!conversion_cache) + conversion_cache = gib_hash_new(); + if ((sfn = gib_hash_get(conversion_cache, filename)) != NULL) + return sfn; + } + basename = strrchr(filename, '/'); if (basename == NULL) @@ -632,6 +644,10 @@ static char *feh_magick_load_image(char *filename) } free(argv_fn); + + if ((sfn != NULL) && opt.use_conversion_cache) + gib_hash_set(conversion_cache, filename, sfn); + return sfn; } @@ -671,10 +687,10 @@ static char *feh_http_load_image(char *url) char *basename; char *path = NULL; - if (opt.use_http_cache) { - if (!http_cache) - http_cache = gib_hash_new(); - if ((sfn = gib_hash_get(http_cache, url)) != NULL) + if (opt.use_conversion_cache) { + if (!conversion_cache) + conversion_cache = gib_hash_new(); + if ((sfn = gib_hash_get(conversion_cache, url)) != NULL) return sfn; } @@ -750,8 +766,8 @@ static char *feh_http_load_image(char *url) free(ebuff); fclose(sfp); - if (opt.use_http_cache) - gib_hash_set(http_cache, url, sfn); + if (opt.use_conversion_cache) + gib_hash_set(conversion_cache, url, sfn); return sfn; } else { weprintf("open url: fdopen failed:"); diff --git a/src/options.c b/src/options.c index eb0fbe5..19f8db9 100644 --- a/src/options.c +++ b/src/options.c @@ -76,7 +76,7 @@ void init_parse_options(int argc, char **argv) #ifdef HAVE_INOTIFY opt.auto_reload = 1; #endif /* HAVE_INOTIFY */ - opt.use_http_cache = 1; + opt.use_conversion_cache = 1; feh_getopt_theme(argc, argv); @@ -525,7 +525,7 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun) break; case 'R': opt.reload = atof(optarg); - opt.use_http_cache = 0; + opt.use_conversion_cache = 0; #ifdef HAVE_INOTIFY opt.auto_reload = 0; #endif @@ -831,7 +831,7 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun) opt.x11_class = estrdup(optarg); break; case 250: - opt.use_http_cache = 0; + opt.use_conversion_cache = 0; break; default: break; diff --git a/src/options.h b/src/options.h index 74ef33f..f7bb202 100644 --- a/src/options.h +++ b/src/options.h @@ -49,7 +49,7 @@ struct __fehoptions { unsigned char aspect; unsigned char stretch; unsigned char keep_http; - unsigned char use_http_cache; + unsigned char use_conversion_cache; unsigned char borderless; unsigned char randomize; unsigned char jump_on_resort; -- cgit v1.2.3