Mercurial > geeqie.yaz
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 { |