Speed up random slideshow, startup time decreases from minutes to seconds when amount...
authorLaurent Monin <geeqie@norz.org>
Wed, 4 Feb 2009 16:47:02 +0000 (16:47 +0000)
committerLaurent Monin <geeqie@norz.org>
Wed, 4 Feb 2009 16:47:02 +0000 (16:47 +0000)
README
src/slideshow.c

diff --git a/README b/README
index fccaa71..7ce524b 100644 (file)
--- a/README
+++ b/README
@@ -665,7 +665,10 @@ Overlay info format string syntax is: %tag[:max_length][:extra]%
      
      Carles Pina i Estany
          for copy path to clipboard patch
-  
+     Kjell Morgenstern
+         for random slide show speedup patch
+
      And...
          Thanks to the users for finding Geeqie useful.
 
index 4e56057..e3e1100 100644 (file)
@@ -66,22 +66,57 @@ static GList *generate_list(SlideShowData *ss)
        return list;
 }
 
-static GList *generate_random_list(SlideShowData *ss)
+static void ptr_array_add(gpointer data, GPtrArray *array)
 {
-       GList *src_list = NULL;
-       GList *list = NULL;
-       GList *work;
+       g_ptr_array_add(array, data);
+}
 
-       src_list = generate_list(ss);
+static void list_prepend(gpointer data, GList **list)
+{
+       *list = g_list_prepend(*list, data);
+}
+
+static GPtrArray *generate_ptr_array_from_list(GList *src_list)
+{
+       GPtrArray *arr = g_ptr_array_sized_new(g_list_length(src_list));
+
+       g_list_foreach(src_list, (GFunc) ptr_array_add, arr);
+
+       return arr;
+}
 
-       while (src_list)
+static void swap(GPtrArray *array, guint index1, guint index2)
+{
+       gpointer temp = g_ptr_array_index(array, index1);
+       
+       g_ptr_array_index(array, index1) = g_ptr_array_index(array, index2);
+       g_ptr_array_index(array, index2) = temp;
+}
+
+static void ptr_array_random_shuffle(GPtrArray *array)
+{
+       guint i;
+       for (i = 0; i < array->len; ++i)
                {
-               gint p = (gdouble)rand() / ((gdouble)RAND_MAX + 1.0) * g_list_length(src_list);
-               work = g_list_nth(src_list, p);
-               list = g_list_prepend(list, work->data);
-               src_list = g_list_remove(src_list, work->data);
+               guint p = (double)rand() / ((double)RAND_MAX + 1.0) * array->len;
+               swap(array, i, p);
                }
+}
+
+static GList *generate_random_list(SlideShowData *ss)
+{
+       GList *src_list;
+       GPtrArray *src_array;
+       GList *list = NULL;
+
+       src_list = generate_list(ss);
+       src_array = generate_ptr_array_from_list(src_list);
+       g_list_free(src_list);
 
+       ptr_array_random_shuffle(src_array);
+       g_ptr_array_foreach(src_array, (GFunc) list_prepend, &list);
+       g_ptr_array_free(src_array, TRUE);
+       
        return list;
 }