[Goodies-commits] r2986 - ristretto/trunk/src

Stephan Arts stephan at xfce.org
Sun Aug 12 00:57:49 CEST 2007


Author: stephan
Date: 2007-08-11 22:57:49 +0000 (Sat, 11 Aug 2007)
New Revision: 2986

Modified:
   ristretto/trunk/src/thumbnail_viewer.c
Log:
Improve performance issues introduced with last commit (and make the cache work)



Modified: ristretto/trunk/src/thumbnail_viewer.c
===================================================================
--- ristretto/trunk/src/thumbnail_viewer.c	2007-08-11 17:36:52 UTC (rev 2985)
+++ ristretto/trunk/src/thumbnail_viewer.c	2007-08-11 22:57:49 UTC (rev 2986)
@@ -34,15 +34,15 @@
 {
     gint begin;
     gint end;
-    GList *pixmaps; 
+    GSList *pixmaps; 
 };
 
 static gboolean
-rstto_thumbnail_viewer_cache_add (RsttoThumbnailViewerCache *cache, GdkPixmap *pixmap, gint nr);
+rstto_thumbnail_viewer_cache_add (RsttoThumbnailViewerCache *cache, GdkPixbuf *pixbuf, gint nr);
 static gboolean
 rstto_thumbnail_viewer_cache_remove (RsttoThumbnailViewerCache *cache, gint nr);
-static GdkPixmap *
-rstto_thumbnail_viewer_cache_get_pixmap (RsttoThumbnailViewerCache *cache, gint nr);
+static GdkPixbuf *
+rstto_thumbnail_viewer_cache_get_pixbuf (RsttoThumbnailViewerCache *cache, gint nr);
 
 struct _RsttoThumbnailViewerPriv
 {
@@ -255,8 +255,16 @@
     gint i;
     gdk_window_clear(widget->window);
     gint begin = viewer->priv->offset / viewer->priv->dimension;
-    gint end = widget->allocation.width / viewer->priv->dimension - begin;
+    gint end = widget->allocation.width / viewer->priv->dimension + begin;
     GdkPixmap *pixmap = NULL;
+/*
+    g_debug("cache_size: %d: %d:%d|%d:%d", 
+            g_slist_length(viewer->priv->cache->pixmaps), 
+            begin,
+            viewer->priv->cache->begin,
+            end,
+            viewer->priv->cache->end);
+*/
     for(i = begin; i <= end; ++i)
     { 
         RsttoNavigatorEntry *entry = rstto_navigator_get_nth_file(viewer->priv->navigator, i);
@@ -264,13 +272,13 @@
         {
             ThunarVfsInfo *info = rstto_navigator_entry_get_info(entry);
             gchar *filename = thunar_vfs_path_dup_string(info->path);
-            GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size(filename, viewer->priv->dimension - 8, viewer->priv->dimension - 8, NULL);
-            pixmap = rstto_thumbnail_viewer_cache_get_pixmap(viewer->priv->cache, i);
-            if (!pixmap)
+            GdkPixbuf *pixbuf = rstto_thumbnail_viewer_cache_get_pixbuf(viewer->priv->cache, i);
+            if(!pixbuf)
             {
-                pixmap = gdk_pixmap_new(widget->window, viewer->priv->dimension, viewer->priv->dimension, -1);
-                rstto_thumbnail_viewer_cache_add(viewer->priv->cache, pixmap, i);
+                pixbuf = gdk_pixbuf_new_from_file_at_size(filename, viewer->priv->dimension - 8, viewer->priv->dimension - 8, NULL);
+                rstto_thumbnail_viewer_cache_add(viewer->priv->cache, pixbuf, i);
             }
+            pixmap = gdk_pixmap_new(widget->window, viewer->priv->dimension, viewer->priv->dimension, -1);
 
             gdk_draw_rectangle(GDK_DRAWABLE(pixmap),
                                 gc,
@@ -518,18 +526,23 @@
 }
 
 static gboolean
-rstto_thumbnail_viewer_cache_add (RsttoThumbnailViewerCache *cache, GdkPixmap *pixmap, gint nr)
+rstto_thumbnail_viewer_cache_add (RsttoThumbnailViewerCache *cache, GdkPixbuf *pixbuf, gint nr)
 {
     if (cache->begin == -1)
     {
         cache->begin = nr;
         cache->end = nr;
         
-        cache->pixmaps = g_list_prepend(cache->pixmaps, pixmap);
+        cache->pixmaps = g_slist_prepend(cache->pixmaps, pixbuf);
     }   
     else
     {
         /* This is the hard part */
+        cache->pixmaps = g_slist_insert(cache->pixmaps, pixbuf, nr - cache->begin);
+        if (nr < cache->begin)
+            cache->begin--;
+        else
+            cache->end++;
     }
     return TRUE;
 }
@@ -540,10 +553,10 @@
     
 }
 
-static GdkPixmap *
-rstto_thumbnail_viewer_cache_get_pixmap (RsttoThumbnailViewerCache *cache, gint nr)
+static GdkPixbuf *
+rstto_thumbnail_viewer_cache_get_pixbuf (RsttoThumbnailViewerCache *cache, gint nr)
 {
-    if(nr < cache->end && nr > cache->begin)
-        return NULL;
-    return g_list_nth_data(cache->pixmaps, cache->begin - nr);
+    if ((nr >= cache->begin) && (nr <= cache->end))
+        return g_slist_nth_data(cache->pixmaps, nr - cache->begin);
+    return NULL;
 }




More information about the Goodies-commits mailing list