diff options
Diffstat (limited to 'plugins/gtkui/coverart.c')
-rw-r--r-- | plugins/gtkui/coverart.c | 79 |
1 files changed, 62 insertions, 17 deletions
diff --git a/plugins/gtkui/coverart.c b/plugins/gtkui/coverart.c index 7d042e5f..27c9e953 100644 --- a/plugins/gtkui/coverart.c +++ b/plugins/gtkui/coverart.c @@ -17,43 +17,88 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include <gtk/gtk.h> +#include <sys/time.h> +#include <string.h> +#include <stdlib.h> #include "coverart.h" #include "../artwork/artwork.h" extern DB_artwork_plugin_t *coverart_plugin; +#define MAX_ID 256 +#define CACHE_SIZE 20 + +typedef struct { + struct timeval tm; + char *fname; + int width; + GdkPixbuf *pixbuf; +} cached_pixbuf_t; + +static cached_pixbuf_t cache[CACHE_SIZE]; + void cover_avail_callback (const char *artist, const char *album) { } static GdkPixbuf * get_pixbuf (const char *fname, int width) { + int requested_width = width; + // find in cache + int cache_min = 0; + for (int i = 0; i < CACHE_SIZE; i++) { + if (!cache[i].pixbuf) { + cache_min = i; + } + if (cache[i].pixbuf) { + if (!strcmp (fname, cache[i].fname) && cache[i].width == width) { + gettimeofday (&cache[i].tm, NULL); + return cache[i].pixbuf; + } + } + if (cache[cache_min].pixbuf && cache[i].pixbuf) { + if (cache[cache_min].tm.tv_sec < cache[i].tm.tv_sec) { + cache_min = i; + } + } + } + + printf ("loading image %s\n", fname); GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (fname, NULL); if (!pixbuf) { return NULL; } + int w, h; w = gdk_pixbuf_get_width (pixbuf); h = gdk_pixbuf_get_height (pixbuf); - if (w == width) { - return pixbuf; + if (w != width) { + int height; + if (w > h) { + height = width * h / w; + } + else if (h > w) { + height = width; + width = height * w / h; + } + else { + height = width; + } + GdkPixbuf *scaled = gdk_pixbuf_scale_simple (pixbuf, width, height, GDK_INTERP_BILINEAR); + g_object_unref (pixbuf); + pixbuf = scaled; } - int height; - if (w > h) { - height = width * h / w; + if (cache[cache_min].pixbuf) { + g_object_unref (cache[cache_min].pixbuf); } - else if (h > w) { - height = width; - width = height * w / h; + if (cache[cache_min].fname) { + free (cache[cache_min].fname); } - else { - height = width; - } - printf ("width=%d/%d, height=%d/%d\n", width, w, height, h); - - GdkPixbuf *scaled = gdk_pixbuf_scale_simple (pixbuf, width, height, GDK_INTERP_BILINEAR); - g_object_unref (pixbuf); - return scaled; + cache[cache_min].pixbuf = pixbuf; + cache[cache_min].fname = strdup (fname); + gettimeofday (&cache[cache_min].tm, NULL); + cache[cache_min].width = requested_width; + return pixbuf; } GdkPixbuf * @@ -63,7 +108,7 @@ get_cover_art (DB_playItem_t *it, int width) { } const char *fname = coverart_plugin->get_album_art (it, cover_avail_callback); if (fname) { - printf ("loading %s\n", fname); +// printf ("loading %s\n", fname); return get_pixbuf (fname, width); } return NULL; |