Updating branch refs/heads/ristretto-0.0 to 4b1c367e21a57eaf0f1785838268f379f22bde89 (commit) from e81a905eac295ffb23214cac5f239e8c0370379d (commit)
commit 4b1c367e21a57eaf0f1785838268f379f22bde89 Author: Stephan Arts <step...@xfce.org> Date: Sat May 2 00:32:50 2009 +0200 Implement image-cache size calculation ChangeLog | 6 ++++++ src/image.c | 14 ++++++++++++++ src/image.h | 1 + src/image_cache.c | 31 +++++++++++++++++++------------ 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3742c2a..dcfc193 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2009-05-02 Stephan Arts <step...@xfce.org> + * src/image,c + src/image.h + src/image_cache.c: Implement image-cache size calculation + +2009-05-02 Stephan Arts <step...@xfce.org> + * src/main_window.c: Add jpeg filter to the open-files dialog 2009-05-01 Stephan Arts <step...@xfce.org> diff --git a/src/image.c b/src/image.c index 1442f64..9c53043 100644 --- a/src/image.c +++ b/src/image.c @@ -791,3 +791,17 @@ cb_rstto_image_update(RsttoImage *image) } return TRUE; } + +guint64 +rstto_image_get_size (RsttoImage *image) +{ + GdkPixbuf *pixbuf = rstto_image_get_pixbuf (image); + if (pixbuf) + { + gint n_channels = gdk_pixbuf_get_n_channels (pixbuf); + gint rowstride = gdk_pixbuf_get_rowstride (pixbuf); + gint height = gdk_pixbuf_get_height (pixbuf); + return rowstride * height *n_channels; + } + return 0; +} diff --git a/src/image.h b/src/image.h index f8f4544..a7866ea 100644 --- a/src/image.h +++ b/src/image.h @@ -88,6 +88,7 @@ rstto_image_pop_transformation (RsttoImage *image, GError **error); /* Should only be used by image-transformation implementations */ void rstto_image_set_pixbuf (RsttoImage *image, GdkPixbuf *pixbuf); +guint64 rstto_image_get_size (RsttoImage *image); G_END_DECLS diff --git a/src/image_cache.c b/src/image_cache.c index 0c2aed6..55f2de3 100644 --- a/src/image_cache.c +++ b/src/image_cache.c @@ -90,10 +90,18 @@ void rstto_image_cache_push_image (RsttoImageCache *cache, RsttoImage *image, gboolean last) { RsttoSettings *settings = rstto_settings_new(); - GValue val = {0, }; + GValue val = {0, }, val_cache_size = {0, }; + guint64 size = 0; + guint64 cache_size = 0; + RsttoImage *c_image; + GList *iter = NULL; g_value_init (&val, G_TYPE_BOOLEAN); + g_value_init (&val_cache_size, G_TYPE_UINT); g_object_get_property (G_OBJECT (settings), "enable-cache", &val); + g_object_get_property (G_OBJECT (settings), "cache-size", &val_cache_size); + + cache_size = g_value_get_uint(&val_cache_size)*1000000; if (cache->cache_list) { @@ -115,24 +123,23 @@ rstto_image_cache_push_image (RsttoImageCache *cache, RsttoImage *image, gboolea { if (g_list_length (cache->cache_list) > 1) { - RsttoImage *c_image = g_list_last (cache->cache_list)->data; + c_image = g_list_last (cache->cache_list)->data; rstto_image_unload (c_image); cache->cache_list = g_list_remove (cache->cache_list, c_image); - g_object_unref (image); } } else { - /** - * TODO: - * Fix the cache-size calculation - */ - if (g_list_length (cache->cache_list) > 3) + for (iter = cache->cache_list->next; iter != NULL; iter = g_list_next (iter)) { - RsttoImage *c_image = g_list_last (cache->cache_list)->data; - rstto_image_unload (c_image); - cache->cache_list = g_list_remove (cache->cache_list, c_image); - g_object_unref (image); + c_image = iter->data; + size += rstto_image_get_size (c_image); + if (size > cache_size) + { + rstto_image_unload (c_image); + cache->cache_list = g_list_remove (cache->cache_list, c_image); + iter = g_list_previous(iter); + } } } g_value_unset (&val); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits