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 */