comparison src/slideshow.c @ 1281:f539958d7bd8

Speed up random slideshow, startup time decreases from minutes to seconds when amount of images is big. Patch by Kjell Morgenstern.
author zas_
date Wed, 04 Feb 2009 16:47:02 +0000
parents 1646720364cf
children 8b89e3ff286b
comparison
equal deleted inserted replaced
1280:e7152966460a 1281:f539958d7bd8
64 } 64 }
65 65
66 return list; 66 return list;
67 } 67 }
68 68
69 static void ptr_array_add(gpointer data, GPtrArray *array)
70 {
71 g_ptr_array_add(array, data);
72 }
73
74 static void list_prepend(gpointer data, GList **list)
75 {
76 *list = g_list_prepend(*list, data);
77 }
78
79 static GPtrArray *generate_ptr_array_from_list(GList *src_list)
80 {
81 GPtrArray *arr = g_ptr_array_sized_new(g_list_length(src_list));
82
83 g_list_foreach(src_list, (GFunc) ptr_array_add, arr);
84
85 return arr;
86 }
87
88 static void swap(GPtrArray *array, guint index1, guint index2)
89 {
90 gpointer temp = g_ptr_array_index(array, index1);
91
92 g_ptr_array_index(array, index1) = g_ptr_array_index(array, index2);
93 g_ptr_array_index(array, index2) = temp;
94 }
95
96 static void ptr_array_random_shuffle(GPtrArray *array)
97 {
98 guint i;
99 for (i = 0; i < array->len; ++i)
100 {
101 guint p = (double)rand() / ((double)RAND_MAX + 1.0) * array->len;
102 swap(array, i, p);
103 }
104 }
105
69 static GList *generate_random_list(SlideShowData *ss) 106 static GList *generate_random_list(SlideShowData *ss)
70 { 107 {
71 GList *src_list = NULL; 108 GList *src_list;
109 GPtrArray *src_array;
72 GList *list = NULL; 110 GList *list = NULL;
73 GList *work;
74 111
75 src_list = generate_list(ss); 112 src_list = generate_list(ss);
76 113 src_array = generate_ptr_array_from_list(src_list);
77 while (src_list) 114 g_list_free(src_list);
78 { 115
79 gint p = (gdouble)rand() / ((gdouble)RAND_MAX + 1.0) * g_list_length(src_list); 116 ptr_array_random_shuffle(src_array);
80 work = g_list_nth(src_list, p); 117 g_ptr_array_foreach(src_array, (GFunc) list_prepend, &list);
81 list = g_list_prepend(list, work->data); 118 g_ptr_array_free(src_array, TRUE);
82 src_list = g_list_remove(src_list, work->data); 119
83 }
84
85 return list; 120 return list;
86 } 121 }
87 122
88 static void slideshow_list_init(SlideShowData *ss, gint start_index) 123 static void slideshow_list_init(SlideShowData *ss, gint start_index)
89 { 124 {