Author: post
Date: 2010-03-15 18:50:10 +0100 (Mon, 15 Mar 2010)
New Revision: 3260
Modified:
trunk/src/rs-store.c
Log:
Much faster preview generation, by:
1) Disable image re-counting while generating previews.
2) Add name to images at once when they are added, to avoid continuous
re-sorting.
3) Add images in the same order as they are loaded.
Speedup on directories with >1000 images is pretty large (factor of 10).
Modified: trunk/src/rs-store.c
===================================================================
--- trunk/src/rs-store.c 2010-03-14 21:48:45 UTC (rev 3259)
+++ trunk/src/rs-store.c 2010-03-15 17:50:10 UTC (rev 3260)
@@ -112,6 +112,7 @@
gboolean exported;
GtkTreeModel *model;
GtkTreePath *path;
+ gboolean last_icon;
} WORKER_JOB;
/* FIXME: Remember to remove stores from this too! */
@@ -1047,12 +1048,12 @@
rs_cache_load_quick(fullname, &priority, &exported);
/* Add thumbnail to store */
- gtk_list_store_prepend (store->store, &iter);
+ gtk_list_store_append (store->store, &iter);
gtk_list_store_set (store->store, &iter,
METADATA_COLUMN, NULL,
PIXBUF_COLUMN, icon_default,
PIXBUF_CLEAN_COLUMN, icon_default,
- TEXT_COLUMN, g_strdup(""),
+ TEXT_COLUMN, g_strdup(name),
FULLNAME_COLUMN, fullname,
PRIORITY_COLUMN, priority,
EXPORTED_COLUMN, exported,
@@ -1067,6 +1068,7 @@
job->exported = exported;
job->model = g_object_ref(GTK_TREE_MODEL(store->store));
job->path = gtk_tree_model_get_path(GTK_TREE_MODEL(store->store),
&iter);
+ job->last_icon = FALSE;
rs_io_idle_read_metadata(job->filename, METADATA_CLASS, got_metadata,
job);
}
@@ -1078,6 +1080,7 @@
gchar *fullname;
GDir *dir;
gint count = 0;
+ WORKER_JOB *job;
gchar *path_normalized = rs_normalize_path(path);
@@ -1104,6 +1107,13 @@
g_free(fullname);
}
+ /* Build dummy job to signal re-enable priority count */
+ job = g_new(WORKER_JOB, 1);
+ job->last_icon = TRUE;
+ job->store = g_object_ref(store);
+ job->filename = g_strdup("796f7577696c6c6e6576657266696e646d65");
+ rs_io_idle_read_metadata(job->filename, METADATA_CLASS, got_metadata,
job);
+
g_free(path_normalized);
if (dir)
g_dir_close(dir);
@@ -1181,8 +1191,6 @@
gboolean load_8bit = FALSE;
gboolean load_recursive = DEFAULT_CONF_LOAD_RECURSIVE;
gint items=0, n;
- GtkTreePath *treepath;
- GtkTreeIter iter;
g_return_val_if_fail(RS_IS_STORE(store), -1);
if (!path)
@@ -1235,15 +1243,6 @@
NULL);
gtk_tree_sortable_set_sort_column_id(sortable, TEXT_COLUMN,
GTK_SORT_ASCENDING);
- /* unblock the priority count */
- g_signal_handler_unblock(store->store, store->counthandler);
-
- /* count'em by sending a "row-changed"-signal */
- treepath = gtk_tree_path_new_first();
- if (gtk_tree_model_get_iter(GTK_TREE_MODEL(store->store), &iter,
treepath))
- g_signal_emit_by_name(store->store, "row-changed", treepath,
&iter);
- gtk_tree_path_free(treepath);
-
/* set model for all 6 iconviews */
for(n=0;n<NUM_VIEWS;n++)
{
@@ -2397,7 +2396,25 @@
WORKER_JOB *job = user_data;
GdkPixbuf *pixbuf, *pixbuf_clean;
GtkTreeIter iter;
+ GtkTreePath *treepath;
+ /* unblock the priority count */
+ if (job->last_icon)
+ {
+ g_signal_handler_unblock(job->store->store,
job->store->counthandler);
+
+ /* count'em by sending a "row-changed"-signal */
+ treepath = gtk_tree_path_new_first();
+ if (gtk_tree_model_get_iter(GTK_TREE_MODEL(job->store->store),
&iter, treepath))
+ g_signal_emit_by_name(job->store->store, "row-changed",
treepath, &iter);
+ gtk_tree_path_free(treepath);
+
+ g_free(job->filename);
+ g_object_unref(job->store);
+ g_free(job);
+
+ return;
+ }
pixbuf = rs_metadata_get_thumbnail(metadata);
if (pixbuf==NULL)
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit