Mercurial > geeqie
diff src/exif-common.c @ 844:efed9a1520d6
implemented generic FileData cache
use it for caching decoded exif data
author | nadvornik |
---|---|
date | Wed, 18 Jun 2008 22:26:52 +0000 |
parents | a7289f9e8d29 |
children | 826d5862f671 |
line wrap: on
line diff
--- a/src/exif-common.c Tue Jun 17 20:25:05 2008 +0000 +++ b/src/exif-common.c Wed Jun 18 22:26:52 2008 +0000 @@ -37,6 +37,7 @@ #include "filedata.h" #include "filefilter.h" +#include "filecache.h" #include "format_raw.h" #include "ui_fileops.h" @@ -520,11 +521,24 @@ return NULL; } + +static FileCacheData *exif_cache; + +void exif_release_cb(FileData *fd) +{ + exif_free(fd->exif); + fd->exif = NULL; +} + ExifData *exif_read_fd(FileData *fd) { gchar *sidecar_path = NULL; if (!fd) return NULL; + + if (!exif_cache) exif_cache = file_cache_new(exif_release_cb, 4); + + if (file_cache_get(exif_cache, fd)) return fd->exif; if (filter_file_class(fd->extension, FORMAT_CLASS_RAWIMAGE)) { @@ -544,11 +558,17 @@ } - // FIXME: some caching would be nice - return exif_read(fd->path, sidecar_path); + fd->exif = exif_read(fd->path, sidecar_path); + return fd->exif; } - +void exif_free_fd(FileData *fd, ExifData *exif) +{ + if (!fd) return; + g_assert(fd->exif == exif); + + file_cache_put(exif_cache, fd, 1); +} /* embedded icc in jpeg */