Skip to content

Commit

Permalink
Speed up random slideshow, startup time decreases from minutes to sec…
Browse files Browse the repository at this point in the history
…onds when amount of images is big. Patch by Kjell Morgenstern.
  • Loading branch information
Laurent Monin committed Feb 4, 2009
1 parent 474d7e8 commit 932432f
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 11 deletions.
5 changes: 4 additions & 1 deletion README
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
55 changes: 45 additions & 10 deletions src/slideshow.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 932432f

Please sign in to comment.